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 == )
{
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添加地图元素的实现的更多相关文章
- C#+ArcGIS Engine 获取地图中选中的要素
转自 C#+ArcGIS Engine 获取地图中选中的要素 C#+ArcGIS Engine 获取地图中选中的要素 提供一种简单遍历获取地图中选中要素的方法,代码如下: List<IFeatu ...
- Arcgis Engine 添加一个Symbol符号样式步骤
public static void DrawPictureMarkerSymbol(IGlobe globe, String layerName) { //添加一个图层 ESRI.ArcGIS.Ca ...
- arcgis engine - 添加图例,指北针.
esri帮助提供了使用比例尺的方法: Working with map surrounds 主要代码为: public void AddMapSurround(IPageLayout pageLayo ...
- ArcGIS Engine 添加SDE数据库
public void AddSDELayer(bool ChkSdeLinkModle){ //定义一个属性 IPropertySet propset = new PropertySetCla ...
- ArcGIS Engine开发之地图基本操作(3)
地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...
- 《ArcGIS Engine+C#实例开发教程》第六讲 右键菜单添加与实现
原文:<ArcGIS Engine+C#实例开发教程>第六讲 右键菜单添加与实现 摘要:在这一讲中,大家将实现TOCControl控件和主地图控件的右键菜单.在AE开发中,右键菜单有两种实 ...
- 《ArcGIS Engine+C#实例开发教程》第二讲 菜单的添加及其实现
原文:<ArcGIS Engine+C#实例开发教程>第二讲 菜单的添加及其实现 摘要:在上一讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下.在“属性”选项卡中,我们 ...
- 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发
原文 http://blog.csdn.net/flexmapserver/article/details/5868882 用Windows Form进行ArcGIS Engine二次开发时常见的形式 ...
- ArcGIS Engine开发之地图基本操作(4)
ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...
随机推荐
- Spring MVC-从零开始-view-向页面传递data(ModelAndView)
1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...
- JsonConfig的jsonConfig.setExcludes的用法
1.问题描述 在项目中经常会有两个类存在一对多或者多对一的关联关系,这样在查询多的一方时,会深入查询关联的一方,而我们可能并不需要去深入查询那些数据,此时使用JsonConfig的jsonConfig ...
- Shell之命令执行的判断依据
目录 Shell之命令执行的判断依据 参考 Shell之命令执行的判断依据
- C++——指针
目录 一.地址和指针 1.1内存 1.2针和指针变量 二.指针变量 2.1始化 2.2赋值 2.3指针类型算术运算 2.4指针类型关系运算 2.5指向指针的指针 三.指针与数组 3.1指针运算 3.2 ...
- bootstrap具体知识点(2)
3.以移动设备为优先 <meta name=”viewport” content=”width=device-width,initial-scale=1,user-scalable=no”> ...
- ng form组件(表单)
tip: 数据的双向绑定(数据的双向绑定只是针对表单) 实现数据的双向绑定需要在app_module.ts(根模块)中进行注册一些东西 import {FormsModule} from '@angu ...
- 安装sublime插件安装不上遇到的各种坑
为了学习VUE , 发现没有高亮代码, 百度原来需要安装插件,安装过程中遇到了各种坑,记录下来避免大家踩坑, 首先用代码安装快捷键 ctrl+` 粘贴代码 import urllib.reque ...
- 控制器向视图传参ModelAndView、Model和Map
ModelAndView类 ModelAndView在spring-webmvc-4.3.18.RELEASE.jar包下,当然其他版本也有,所在包如下 对于那些返回String等类型的处理方法,sp ...
- spring-boot-plus XSS跨站脚本攻击处理
XSS跨站脚本攻击处理 XSS:Cross Site Scripting 跨站脚本攻击(XSS),是目前最普遍的Web应用安全漏洞.这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当 ...
- vue常见问题随笔集
1.vuex操作对应关系 设置 触发/获取 action <-> dispatch mutations <-> commit getters <-> ...