ArcGIS Engine添加地图元素的实现

在ArcGIS中,我们使用的制图控件除了MapControl之外,还有PageLayoutControl,用于页面布局和制图,生成一幅成品地图。

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;
        }
    }
}

1、图例或指北针

/// <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);
}

2、比例尺

/// <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);
}

3、文本

/// <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二次开发,如果有不对的地方,请多多包涵!

原文地址:https://www.cnblogs.com/edcoder/p/11790856.html

时间: 2024-10-10 04:35:04

ArcGIS Engine添加地图元素的实现的相关文章

ArcGIS Engine开发之地图基本操作(2)

地图数据的加载 1.加载地图文档 ArcGIS Engine支持加载多种类型的数据,有矢量数据的Coverage.Shapefile.dwg/dxf文件,栅格数据的BMP.GRID.控件数据库等.很多情况下加载通过ArcGIS桌面制作的地图文档是最合适的(*.mxd格式). 加载地图的第三种方式: 使用IMAPControl接口的LoadMxfile方法加载. 通过IMAPDocument接口加载. 使用ArcGIS Engine中封装好的类库资源ControlsOpenDocCommandCl

ArcGIS Engine中添加点、线、面元素

转自原文ArcGIS Engine中添加点.线.面元素 //画点 IPoint pt = axMapControl1.ToMapPoint(e.x, e.y); IMarkerElement pMarkerElement = new MarkerElementClass(); IElement pElement = pMarkerElement as IElement; pElement.Geometry = pt; IGraphicsContainer pGraphicsContainer =

《ArcGIS Engine+C#实例开发教程》第四讲 状态栏信息的添加与实现

原文:<ArcGIS Engine+C#实例开发教程>第四讲 状态栏信息的添加与实现 摘要:在上一讲中,我们完成了 MapControl 和PageLayoutControl两种视图的同步工作,本讲我们将完成状态栏信息的添加与实现.应用程序的状态栏一般用来显示程序的当前状态,当前所使用的工具. GIS应用程序一般也在状态栏显示当前光标的坐标.比例尺等信息.学习完本讲内容,您将学会状态栏编程的基本方法,并且能够在我们的程序的状态栏中添加且显示以下信息:当前所用工具信息.当前比例尺.当前坐标.  

ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新

ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 来自:http://blog.csdn.net/freewaywalker/article/details/23703863 分类: ArcNotes2014-04-14 20:56 1781人阅读 评论(0) 收藏 举报 1. 要素的添加 ArcGIS Engine中,主要有两个方法用于要素的添加: Using IFeatureClass.CreateFeature followed by IFeature.Store

ArcGIS Engine开发之地图基本操作(4)

ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据的存储和管理,它将不同的数据统一纳入Access文件中,便于数据的管理与迁移,容量限制为2GB.个人地理数据库支持单用户编辑,不支持版本管理.在进行ArcGIS软件操作和开发的学习过程中,一般建议采用个人地理数据库进行数据的 组织和存储,同时也便于直接导到ArcSDE空间数据库中.加载个人地理数据库

利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

原文:利用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方法和步骤. 你可以在下面的目录下找到相应的样例程序: <安装目录>\DeveloperKit\Samples\Developer_Guide_Scenarios\ ArcGIS_Engine\Building_an_ArcGIS_Control_Application\Map_Viewer 注:ArcGIS样

ArcGIS Engine开发前基础知识(1)

ArcGIS二次开发是当前gis领域的一项重要必不可少的技能.下面介绍它的基本功能 一.ArcGIS Engine功能 在使用之前首先安装和部署arcgis sdk,(在这里不在赘述相关知识)可以实现的功能主要有地图的基本操作.信息查询.专题地图制作.数据编辑.网络分析.空间统计分析.三维分析等. 1.地图的基本操作 地图的基本操作主要包括加载矢量.栅格数据,浏览缩放地图,保存地图,在地图上显示文本注记,绘制点线面几何体等. 2.信息查询 信息查询主要通过矩形圆形或多边形来选中地图上的要素,或者

ArcGIS Engine开发前基础知识(2)

ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutControl,TOCControl.ToolbarControl,GlobeControl,和SceneControl等 MapControl控件 MapControl控件对应于ARCMap中的数据视图,主要用于显示.操作和分析地理数据.它封装了Map对象,可以加载已有的地图文档(*mxd文档)或者直接添加矢

ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

原文 ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他类库提供服务的组件.System类库中定义了大量开发者可以实现的接口.AoInitializer对象就是在System类库中定义的,所有的开发者必须使用这个对象来初始化ArcGISEngine和解除ArcGIS Engine的初始化.开发者不能扩展这个类库,但可以通过实现这个类库中包含的接口来扩展A