在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 == )
{
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(, , , );
//设置元素中的几何形状
element.Geometry = envelope;
try
{
//提供对控制图例的成员的访问。
ILegend legend = (ILegend)mapSurroundFrame.MapSurround;
legend.Title = "图例";
}
catch
{ }
graphicsContainer.AddElement(element, );
//设置元素将在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(, , , );
//实例化一个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 = ;
markerScaleBar.Divisions = ;
markerScaleBar.LabelPosition = esriVertPosEnum.esriAbove;
markerScaleBar.Map = map;
markerScaleBar.Subdivisions = ;
markerScaleBar.UnitLabel = "";
markerScaleBar.UnitLabelGap = ;
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, );
//部分刷新
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 = ;
pColor.Green = ;
pColor.Blue = ;
//实例化文本符号
ITextSymbol pTextSymbol = new TextSymbolClass();
pTextSymbol.Color = (IColor)pColor;
pTextSymbol.Font = pFont;
//赋值元素文本和符号
pTextElement.Text = thimaticMapName;
pTextElement.Symbol = pTextSymbol;
//实例化一个点
IPoint pPoint = new PointClass();
pPoint.X = ;
pPoint.Y = ;
//实例化一个元素
IElement pElement = (IElement)pTextElement;
pElement.Geometry = (IGeometry)pPoint;
graphicsContainer.AddElement(pElement, );
//真正实现部分刷新
pAV.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
核心AddElementInPageLayer(UID uid)函数总结:

谢谢观看!本人初学GIS二次开发,如果有不对的地方,请多多包涵!

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

  1. C#+ArcGIS Engine 获取地图中选中的要素

    转自 C#+ArcGIS Engine 获取地图中选中的要素 C#+ArcGIS Engine 获取地图中选中的要素 提供一种简单遍历获取地图中选中要素的方法,代码如下: List<IFeatu ...

  2. Arcgis Engine 添加一个Symbol符号样式步骤

    public static void DrawPictureMarkerSymbol(IGlobe globe, String layerName) { //添加一个图层 ESRI.ArcGIS.Ca ...

  3. arcgis engine - 添加图例,指北针.

    esri帮助提供了使用比例尺的方法: Working with map surrounds 主要代码为: public void AddMapSurround(IPageLayout pageLayo ...

  4. ArcGIS Engine 添加SDE数据库

    public void AddSDELayer(bool ChkSdeLinkModle){  //定义一个属性   IPropertySet propset = new PropertySetCla ...

  5. ArcGIS Engine开发之地图基本操作(3)

    地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...

  6. 《ArcGIS Engine+C#实例开发教程》第六讲 右键菜单添加与实现

    原文:<ArcGIS Engine+C#实例开发教程>第六讲 右键菜单添加与实现 摘要:在这一讲中,大家将实现TOCControl控件和主地图控件的右键菜单.在AE开发中,右键菜单有两种实 ...

  7. 《ArcGIS Engine+C#实例开发教程》第二讲 菜单的添加及其实现

    原文:<ArcGIS Engine+C#实例开发教程>第二讲 菜单的添加及其实现 摘要:在上一讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下.在“属性”选项卡中,我们 ...

  8. 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发

    原文 http://blog.csdn.net/flexmapserver/article/details/5868882 用Windows Form进行ArcGIS Engine二次开发时常见的形式 ...

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

    ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...

随机推荐

  1. springboot启动后自动退出

    有时新建的springboot启动后自动退出运行,如图所示: 此种情况大都数是因为pom文件加入了tomcat的依赖,与springboot内嵌的tomcat冲突导致,所以只需将pom文件中的tomc ...

  2. Flask基础(05)-->路由的基本定义

    # 导入Flask from flask import Flask # 创建Flask的应用程序 app = Flask(__name__) # http://127.0.0.1:5000/123或者 ...

  3. JAVA TCP/IP网络通讯编程(二)

    一个实例通过client端和server端通讯 客户端通过TCP/IP传输资源文件,比如图片,文字,音频,视频等..... 服务端接受到文件存入本地磁盘,返回接受到:“收到来自于"+s.ge ...

  4. (转) websocket 和 socket 剖析

    Socket 与 WebSocket 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文 ...

  5. Spring Cloud Feign 性能优化

    #### 1.替换 tomcat 首先,把 tomcat 换成 undertow,这个性能在 Jmeter 的压测下,undertow 比 tomcat 高一倍 **第一步,pom 修改去除tomca ...

  6. 【TencentOS tiny】深度源码分析(8)——软件定时器

    软件定时器的基本概念 TencentOS tiny 的软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,本质上软件定时器的使用相当 ...

  7. Java动手动脑第四讲课堂作业

    动手动脑1 完全“手写代码实现”随机数生成 纯随机数发生器

  8. 使用TryGetComponent取代GetComponent以避免Editor中的内存分配

    作为Unity开发人员,可能或多或少都会遇到过一个常见的Unity的GC分配问题——在Editor中使用GetComponent方法来获取一个不存在的Component时会分配额外的内存.就像下图 需 ...

  9. samba文件共享服务部署

    1.安装samaba服务程序 yum install -y samba 2.查看smaba文件,由于注释空行较多,选择过滤 egrep -v "#|;|^$" /etc/samba ...

  10. msf各种弱口令爆破

    Msf: 写的很乱 记录下msf各个爆破弱口令的模块 run post/windows/gather/arp_scanner RHOSTS=10.10.10.0/24 使用arp_scanner模块 ...