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)进行空间数据 ...
随机推荐
- ORM组件LogORM使用指北
LogORM是一个对数据库进行对象关系映射的ORM组件.当对数据库进行增删改操作时,组件会自动进行日志记录. 该组件支持.Net平台和.NetCore平台,支持SQL Server.Oracle.My ...
- windows下tomcat启动日志乱码
在windows下用startup.bat启动时,控制台里显示乱码,如图: 解决方案: 修改conf文件下的logging.properties文件,将控制台输出的编码修改为GBK: java.uti ...
- 阿里云服务器CentOS6.9 nexus私服使用
exus安装成功之后,我们开始使用. 登录nexus: 访问地址:http:ip地址:8081/nexus 默认登录账号:admin 密码:admin123 登录成功之后页面: 点击[Reposito ...
- 非对称加密openssl协议在php7实践
据网上资料,RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商务中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(RON RIVEST).阿迪·萨莫尔(ADI SHAMIR)和伦纳德· ...
- 关于CSS书写规范、顺序
关于CSS的书写规范和顺序,是大部分前端er都必须要攻克的一门关卡,如果没有按照良好的CSS书写规范来写CSS代码,会影响代码的阅读体验.这里总结了一个CSS书写规范.CSS书写顺序供大家参考,这些是 ...
- Vue入门教程 第一篇 (概念及初始化)
注:为了本教程的准确性,部分描述引用了官网及网络内容. 安装Vue 1.使用npm安装vue: npm install vue 2.下载使用js文件: https://vuejs.org/js/vue ...
- mongodb完整安装
在线下载安装依赖包 yum -y install gcc gcc-c++ yum -y install gcc gcc-c++ ncurses ncurses-devel cmake bison yu ...
- MRP进程起不来, 报错:ORA-00600: internal error code, arguments: [2619], [227424], [], [], [], [], [], [], [], [], [], []
问题背景:客户数据库服务架构为一主一备,某日备库操作系统意外重启,重启后Oracle MRP进程起不来,报错:ORA-00600: internal error code, arguments: [2 ...
- stm32填坑之旅 - stm32f103c8t6点亮板载贴片蓝色LED
转载请注明:https://www.cnblogs.com/rockyf/p/11691622.html 开篇 开篇一定要精彩,不然路人不理睬!下述是笔者作为arm小白的填坑之旅 没错,这个之前一直从 ...
- MAC 上的Phantomjs的安装和配置
1.下载 http://phantomjs.org/download.html 选择mac版本下载 2.下载完成后,解压缩,然后放到自己的一个目录下面 例如:/usr/local/Phantomjs/ ...