ArcObjects SDK开发 013 MapFrame
1、如何获取MapFrame
打开一个Mxd文件,可能包含一个或多个Map,每个Map都会放到一个MapFrame中,加载到PageLayout上。我们可以通过PageLayout继承的IGraphicsContainer循环判断获取各MapFrame对象。也可以调用IGraphicsContainer的FindFrame函数,传入对应的Map获取MapFrame对象。
2、MapFrame与Map如何匹配
MapFrame除了地图格网外,可设置的内容并不多。我们平常经常会设置的主要有边框、大小以及其要显示的坐标范围。设置的几种模式,我们可以在ArcMap的MapFrame属性界面中看到。

自动、固定比例尺以及固定范围,分别对应SDK中IMapFrame接口ExtentType属性的ExtentDefault、ExtentScale和ExtentBounds。
第一种模式是ArcMap默认的模式, MapFrame显示的地图范围、地图的显示比例尺以及MapFrame的大小都是可以随意调的。
第二种模式就是固定比例尺,固定后MapFrame的大小可以调节、显示的地图范围可以调节,但地图的比例尺是固定不变的。
第三种模式是固定地图显示范围,但MapFrame的大小是可以调节的,但只能等比例调节。调节MapFrame的大小调节后,因为显示的地图范围固定,所以比例尺会做对应的变化。
以上三种模式均可以在ArcMap上测试,看设置后,ArcMap有什么变化。例如第二种模式设置后,工具栏上的比例尺显示框以及和放大缩小相关的按钮都变成了不可用的灰色,,地图只能平移,不能放大缩小。第三种模式下,地图就被固定住了,只能显示指定范围,地图既不能放大缩小,也不能平移,大小也只能按照比例调整。
一般在用代码精确出图的时候,我习惯使用第三种模式,即在固定比例尺的情况下,设置要出图的地理范围,然后用范围乘以比例尺,计算出MapFrame需要呈现的大小,设置给MapFrame。这样就可以得到最合适大小的MapFrame,还可以精确的把出图范围固定住,并防止用户误操作,把地图放大缩小或平移。
很多时候,我们会先计算出主MapFrame的大小,然后四个方向扩2-5cm,得到Page的大小。例如我们计算出MapFrame,高为15cm,宽为20cm,上部留5cm放标题和指北针,下方留5cm放比例尺和图例等,左右各留3cm的空白。那么Page的大小可设置为高为25cm,宽为26cm,而MapFrame的位置设置为3,5。这样MapFrame就位于了Page的正中间,且距上下左右的距离分别位5cm、5cm、3cm和3cm。如下图所示。

由于本图,我们设置的Page的单位是mm,所以设置值的时候,设置的是30和50。我们修改的Page的边界样式为蓝色虚线,默认位黑色实线。
3、MapGrid
MapFrame继承了IMapGrids接口,该接口为IMapGrid集合,管理在MapFrame上的绘制的格网,包括经纬网、公里网等。MapFrame可以同时显示多个地图网格。
IMapGrid包含的可设置信息比较多,但一般设置的时候,我们主要关心格网周边的标注、网格线以及网格间隔值。我们在ArcMap中为一个MapFrame设置网格,并打开其属性信息,如下图所示。

平常我们使用,并且关心的包括Axex、Labels、Lines以及Intervals四个标签,分别是轴信息、文字标注信息、网格线信息以及间隔信息。
回到SDK,和网格相关的几个比较重要的接口包括IMapGrid和IMeasuredGrid。IMapGrid定义如下。

基本上IMapGrid涵盖了Axex、Labels、Lines三个标签的信息。IMapGrid接口定义的属性基本上能和三个标签页中的设置框对应的上。IMeasuredGrid接口主要用来设置起始计算坐标以及网格间隔。该接口定义如下。

该接口和Intervals标签页中设置的内容是对应着的。添加经纬网的代码如下。
IGraphicsContainer myGraphicsContainer = pPageLayout as IGraphicsContainer;
IActiveView myActiveView = pPageLayout as IActiveView;
IMap myMap = myActiveView.FocusMap;
IMapFrame myMapFrame = myGraphicsContainer.FindFrame(myMap) as IMapFrame;
IMapGrids myMapGrids = myMapFrame as IMapGrids;
myMapGrids.ClearMapGrids(); if (this._MapGrid is IMgrsGrid == false && this.GridType == 0)
{
this._MapGrid = new GraticuleClass();
}
else if (this._MapGrid is IProjectedGrid == false)
{
this._MapGrid = new MeasuredGridClass();
(this._MapGrid as IProjectedGrid).SpatialReference = this.BToLayoutDesign.MapFrameItem.SpatialReference;
} this._MapGrid.Name = "MapGrid";
this._MapGrid.Visible = this.IsVisible; this._MapGrid.SetTickVisibility(this.IsShowTick, this.IsShowTick, this.IsShowTick, this.IsShowTick);
if (this.IsShowTick == true)
{
this._MapGrid.TickLength = this.TickLength;
ICartographicLineSymbol myTickLineSymbol = new CartographicLineSymbolClass();
myTickLineSymbol.Cap = esriLineCapStyle.esriLCSButt;
myTickLineSymbol.Width = this.TickWidth;
myTickLineSymbol.Color = ColorHelper.ConvertWPFToEngine(this.TickColor);
this._MapGrid.TickLineSymbol = myTickLineSymbol;
} ICartographicLineSymbol myGridLineSymbol = new CartographicLineSymbolClass();
myGridLineSymbol.Cap = esriLineCapStyle.esriLCSButt;
myGridLineSymbol.Width = this.GridLineWidth;
myGridLineSymbol.Color = ColorHelper.ConvertWPFToEngine(this.GridLineColor);
this._MapGrid.LineSymbol = myGridLineSymbol; IMeasuredGrid myMeasuredGrid = this._MapGrid as IMeasuredGrid;
myMeasuredGrid.FixedOrigin = true;
myMeasuredGrid.XOrigin = this.XOrigin;
myMeasuredGrid.YOrigin = this.YOrigin;
myMeasuredGrid.XIntervalSize = this.XInterval;
myMeasuredGrid.YIntervalSize = this.YInterval; IGridLabel myGridLabel = this._MapGrid.LabelFormat;
IFontDisp myFontDisp = myGridLabel.Font;
myFontDisp.Size = (decimal)this.LabelFontSize;
myGridLabel.Font = myFontDisp;
myGridLabel.Color = ColorHelper.ConvertWPFToEngine(this.LabelFontColor);
myGridLabel.LabelOffset = this.LabelOffset;
myGridLabel.LabelAlignment[esriGridAxisEnum.esriGridAxisLeft] = !this.IsLRLabelVertical;
myGridLabel.LabelAlignment[esriGridAxisEnum.esriGridAxisRight] = !this.IsLRLabelVertical;
this.UpdateLabelFormat(myGridLabel);
this._MapGrid.LabelFormat = myGridLabel;
myMapGrids.AddMapGrid(this._MapGrid);
添加后的效果如下。

ArcObjects SDK开发 013 MapFrame的更多相关文章
- Kinect for Windows SDK开发学习相关资源
Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ...
- 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...
- 高拍仪拍照SDK开发(良田影像S300L|S500L)
高拍仪拍照SDK开发下载地址:点击下载 本SDK适用于:良田影像S300L|S500L 高拍仪如图: SDN开发包安装之后找到安装目录,如图: 大家找到各自需要的版本即可,需要注意的是如果需要上传图片 ...
- TortoiseSVN安装以及淘宝 TAE SDK 开发环境的搭建
一.TortoiseSVN 的下载和安装 1.进入TortoiseSVN 官网下载地址http://tortoisesvn.net/downloads.html,根据自己的操作系统位数下载相应最新版本 ...
- SDK开发断点失效
做SDK开发,一般会创建一个静态库工程,然后添加一个app的Target 可是,Xcode7创建的工程,app的Target中断点有效,能断住,为什么静态库的Target中的断点断不住呀. 断点断住发 ...
- Vmware Vsphere WebService SDK开发(第一讲)-基本知识学习
刚开始这方面开发的时候,不知道如何下手,能够查到的资料特别少,而且看到很多网友和我一样也在找这方面的资料.接下来的一段时间我就结合自己所参与的项目,完成关于Vmware Vsphere WebServ ...
- 【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...
- ArcObjects SDK(AE)10.1在vs2012安装的方法
ArcObjects SDK(以下简称AO)10.1只支持vs2010,如果装了vs2012,再安装AO会提示一串鸡肠(英文),意思是AO10.1只支持vs2010 想在2012下安装,可以通过修改注 ...
- 微信公众账号 Senparc.Weixin.MP SDK 开发教程
http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html 微信公众账号 Senparc.Weixin.MP SDK ...
- Kinect for Windows SDK开发入门(一):开发环境配置
[译]Kinect for Windows SDK开发入门(一):开发环境配置 前几天无意中看到微软发布了Kinect for windows sensor,进去看了一下Kinect应用的例子,发现K ...
随机推荐
- MySQL配置不当导致Sonarqube出错的一次经历:Packet for query is too large (16990374 > 13421568)
公司里部署了Jenkins + Sonarqube对项目代码进行构建和代码质量扫描. 某个大型项目报告项目构建失败.进jenkins看,该项目构建日志中的报错信息是这样的: 通过错误堆栈中的信息可以判 ...
- NetworkPolicy网络策略以及举例说明
网络策略(NetworkPolicy)是一种关于pod间及pod与其他网络端点间所允许的通信规则的规范.NetworkPolicy 资源使用标签选择pod,并定义选定pod所允许的通信规则. 前提 网 ...
- 02_快捷键及常用DOS命令
快捷键 一. 电脑快捷键 Ctrl + C:复制 Ctrl+ V:粘贴 Ctrl+ A:全选 Ctrl+ S:保存 Ctrl+ Z:撤销 Ctrl+ X:剪切 Alt + F4:关闭窗口 Shift ...
- PAT (Basic Level) Practice 1007 素数对猜想 分数 20
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数."素数对猜想"认为"存在无穷多对相邻且差为2的 ...
- [题解] Codeforces 1268 D Invertation in Tournament 结论,兰道定理
题目 本题需要用到的结论: 一.兰道定理 二.如果\(n\geq4\),那么\(n\)个点的强连通竞赛图存在\(n-1\)个点的强连通子图. 证明: 现在有一个n-1个点的竞赛图(不一定强连通,称其为 ...
- Linux Block模块之deadline调度算法代码解析
1 总体说明 Deadline调度器对一个请求的多方面特性进行权衡来进行调度,以期望既能满足块设备扇区的顺序访问又能兼顾到一个请求不会在队列中等待太久导致饿死.Deadline调度器为了兼顾这两个方面 ...
- java 新特性之 Stream API
强大的 Stream API 一.Stream API 的概述 Stream到底是什么呢? 是数据渠道,用于操作数据源(集合.数组等)所生成的元素序列. "集合讲的是数据,Stream讲的是 ...
- 一步一图带你深入理解 Linux 虚拟内存管理
写在本文开始之前.... 从本文开始我们就正式开启了 Linux 内核内存管理子系统源码解析系列,笔者还是会秉承之前系列文章的风格,采用一步一图的方式先是详细介绍相关原理,在保证大家清晰理解原理的基础 ...
- 斑马打印机二维码标签制作(.prn文件)基础简单快速上手
在工厂生产中,经常需要一线员工在电脑上输入订单号的情况.订单号往往很长,手输容易出错,并且浪费时间,所以常常使用扫码枪扫描二维码的方式输入订单号,本篇就是记录斑马打印机.prn标签模板的制作和使用. ...
- Spring Boot 应用的热部署配置
前言 所谓热部署,简单来说,就是代码修改后不需重启项目就可自动加载出新的内容. 注意:热部署在 debug 调试模式下才生效! IDEA 配置 在 IDE(IDEA)中开启相关项目自动构建选项 开启编 ...