ArcGIS Engine添加地圖元素的實現

在ArcGIS中,咱們使用的製圖控件除了MapControl以外,還有PageLayoutControl,用於頁面佈局和製圖,生成一幅成品地圖html

PageLayoutControl 封裝了PageLayout對象,提供佈局視圖中控制元素的屬性和方法,其中包括圖形的位置屬性、標尺和對齊網格的設置,以及肯定頁面顯示在屏幕上的方法。框架

咱們將實如今佈局視圖下的添加圖例、指北針、比例尺和文本的操做函數

 

添加地圖元素佈局

 

/// <summary>
/// 添加地圖元素 /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void 添加地圖元素ToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) { //排除數據視圖下不能插入
    if (tabControl1.SelectedIndex == 0) { return; } //使用UID識別操做命令
    UID uid = new UIDClass(); if (e.ClickedItem.Text != "") { //e是鼠標操做所返回的對象, 攜帶了相關的操做信息
        switch (e.ClickedItem.Text) { case "圖例": //定義好UID的樣式爲Carto.legend
                uid.Value = "ESRICarto.legend"; //調用自定義方法AddElementInpageLayer, 下同
 AddElementInPageLayer(uid); break; case "指北針": //定義好UID的樣式爲Carto.MarkerNorthArrow
                uid.Value = "ESRICarto.MarkerNorthArrow"; AddElementInPageLayer(uid); break; case "比例尺": //定義好UID的樣式爲ESRICarto.ScaleLine ??
 AddScalebar(axPageLayoutControl1.PageLayout, axPageLayoutControl1.ActiveView.FocusMap); break; case "文本": TextInput txtInput = new TextInput(); txtInput.ShowDialog(); //調用自定義方法加入圖名
 AddTextElement(axPageLayoutControl1, txtInput.Fontsize, txtInput.ThimaticMapName); break; default: break; } } }

 

 

一、圖例或指北針字體

 

/// <summary>
/// 添加圖例或指北針——根據UID元素添加相應的元素 /// </summary>
/// <param name="uid"></param>
private void AddElementInPageLayer(UID uid) { //提供對控制圖形容器的成員的訪問。
    IGraphicsContainer graphicsContainer = axPageLayoutControl1.PageLayout as IGraphicsContainer; //提供對成員的訪問, 控制map元素的對象, IMapFrame是地圖瀏覽欄對象的默認接口 //經過FindFrame方法, 查找axPageLayoutControl1中屏幕包含指定對象的框架
    IMapFrame mapFrame = graphicsContainer.FindFrame(axPageLayoutControl1.ActiveView.FocusMap) as IMapFrame; //提供對成員的訪問, 控制地圖環繞元素映射的接口, 是附屬物框架的對象的默認接口 //經過CreateSurroundFrame方法建立基於當前地圖框下的一個新地圖環繞元素(如圖例、指北針)
    IMapSurroundFrame mapSurroundFrame = mapFrame.CreateSurroundFrame(uid, null); //IElement是全部圖形元素和框架元素類都要實現的接口 //將mapSurroundFrame強轉成IElement類型
    IElement element = mapSurroundFrame as IElement; //實例化一個包絡線
    IEnvelope envelope = new EnvelopeClass(); //設定座標
    envelope.PutCoords(1, 1, 2, 2); //設置元素中的幾何形狀
    element.Geometry = envelope; try { //提供對控制圖例的成員的訪問。
        ILegend legend = (ILegend)mapSurroundFrame.MapSurround; legend.Title = "圖例"; } catch { } graphicsContainer.AddElement(element, 0); //設置元素將在axPageLayoutControl屏幕上顯示圖形
 element.Activate(axPageLayoutControl1.ActiveView.ScreenDisplay); //部分刷新
    axPageLayoutControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); }

 

 

二、比例尺ui

/// <summary>
/// 添加比例尺 /// </summary>
/// <param name="pageLayout"></param>
/// <param name="map"></param>
private void AddScalebar(IPageLayout pageLayout, IMap map) { if (pageLayout == null || map == null) { return;//當pageLayerout和map爲空時返回
 } //實例化一個包絡線
    IEnvelope envelope = new EnvelopeClass(); //設定座標
    envelope.PutCoords(1, 1, 3, 2); //實例化一個uid
    IUID uid = new UIDClass(); //將uid設置爲ESRICarto.scalebar
    uid.Value = "ESRICarto.scalebar"; //提供對控制圖形容器的成員的訪問
    IGraphicsContainer graphicsContainer = pageLayout as IGraphicsContainer; //查找map中指定對象的框架
    IMapFrame mapFrame = graphicsContainer.FindFrame(map) as IMapFrame; //建立基於當前地圖框下的一個新地圖環繞元素
    IMapSurroundFrame mapSurroundFrame = mapFrame.CreateSurroundFrame(uid as UID, null); //元素屬性
 IElementProperties pElePro; //實例化一個比例尺對象
    IScaleBar markerScaleBar = new AlternatingScaleBarClass(); //能夠有多種比例尺類型
    markerScaleBar.Division = 2; markerScaleBar.Divisions = 2; markerScaleBar.LabelPosition = esriVertPosEnum.esriAbove; markerScaleBar.Map = map; markerScaleBar.Subdivisions = 2; markerScaleBar.UnitLabel = ""; markerScaleBar.UnitLabelGap = 4; markerScaleBar.UnitLabelPosition = esriScaleBarPos.esriScaleBarAbove; //位於比例尺上方
    markerScaleBar.Units = esriUnits.esriKilometers; //公里
    mapSurroundFrame.MapSurround = markerScaleBar; //將mapSurroundFrame強轉爲IElementProperties
    pElePro = mapSurroundFrame as IElementProperties; //設置元素Name屬性
    pElePro.Name = "my scale"; //添加元素至axPageLayoutControl1
    axPageLayoutControl1.AddElement(mapSurroundFrame as IElement, envelope, Type.Missing, Type.Missing, 0); //部分刷新
    axPageLayoutControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, Type.Missing, null); }

 

三、文本spa

/// <summary>
/// 添加文本 /// </summary>
/// <param name="axPageLayoutControl1">目標PageLayoutControl的Name屬性</param>
/// <param name="fontsize">字體尺寸</param>
/// <param name="thimaticMapName">圖名</param>
private void AddTextElement(AxPageLayoutControl axPageLayoutControl1, decimal fontsize, string thimaticMapName) { //建立PageLayout對象
    IPageLayout pPageLayout = axPageLayoutControl1.PageLayout; //將PageLayout強轉成IActiveView
    IActiveView pAV = (IActiveView)pPageLayout; //將PageLayout強轉成IGraphicsContainer
    IGraphicsContainer graphicsContainer = (IGraphicsContainer)pPageLayout; //實例化文本元素
    ITextElement pTextElement = new TextElementClass(); //實例化字體元素
    IFontDisp pFont = new StdFontClass() as IFontDisp; pFont.Bold = true; pFont.Name = "宋體"; pFont.Size = fontsize; //實例化IRgbColor
    IRgbColor pColor = new RgbColorClass(); pColor.Red = 0; pColor.Green = 0; pColor.Blue = 0; //實例化文本符號
    ITextSymbol pTextSymbol = new TextSymbolClass(); pTextSymbol.Color = (IColor)pColor; pTextSymbol.Font = pFont; //賦值元素文本和符號
    pTextElement.Text = thimaticMapName; pTextElement.Symbol = pTextSymbol; //實例化一個點
    IPoint pPoint = new PointClass(); pPoint.X = 1; pPoint.Y = 1; //實例化一個元素
    IElement pElement = (IElement)pTextElement; pElement.Geometry = (IGeometry)pPoint; graphicsContainer.AddElement(pElement, 0); //真正實現部分刷新
    pAV.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); }

 

核心AddElementInPageLayer(UID uid)函數總結:

 謝謝觀看!本人初學GIS二次開發,若是有不對的地方,請多多包涵!code

 

 

 

原文出處:https://www.cnblogs.com/edcoder/p/11790856.htmlhtm

相關文章
相關標籤/搜索