使用python制作ArcGIS插件(6)案例分析
目录
利用ArcPy制作航空制图插件
By 李远祥
这是笔者两年多前写的一个面向航路图做的一个插件,基本上将航路图的制作进行流程化,制作成为可交互的插件,只要有航路和机场的信息,就可以直接生成一个航路图,每个图的时间成本大概为3分钟左右。
整个插件都是使用Python进行制作,其设计思路是做好制图模版,剩下的工作就交给插件结合ArcPy调用ArcGIS工具进行数据的生成和处理,直到最后出图。得益于ArcGIS的强大功能,整个插件加上注释换行等才400行代码便实现其功能。大家可以感受一下ArcGIS Python开发的魅力吧。
插件开发目标
航空制图插件的开发目标是减少制图的工作量,提升制图效率,简化操作流程;改变以往全手动的制图方式,改为全自动和半自动的制图方式;减少GIS部分操作,尽量屏蔽GIS术语,符合航空制图业务人员的理解;符号和图面展示符号航空图要求;制图插件安装部署简易。
航空制图插件功能介绍
航空图的制图要求
航空图主要以机场和航路为主,绘制的内容包括世界底图、机场点、航路点、航线、迫降区及地图整饰要素(如比例尺、图例、经纬网、地图坐标系等)五部分。每个部分都有其特殊的要求。
世界底图:由于航线的跨度非常大,小则跨省、大则跨国或者跨洋,因此在选择底图时不需要更多的要素,基本上将洲界、国界及海洋面即可。底图需要陆地和海洋显示分明,因此,采用灰白的效果进行显示,同时也因为灰白效果能够更好的现实其他主要要素,如机场、航路及迫降区等。世界底图使用的是WGS84坐标系,由于航空公司提供的数据为经纬度数据,因此使用WGS84坐标作为工作坐标系。
机场点:
机场点实际为一系列文本数据,为了方便查看,航空公司通过其他系统将其转为Excel数据格式,提供的是经纬度描述,非十进制方式。机场点Excel结构如下图
机场点具有其特殊的符号,如下图所示
航路点和航路
航路点是航线中的几个重要的位置,一般使用红色的三角符号表示。航路一般是分段的,分段的航路段一般是以黑色的两个或多个航路点组成,其符号为黑色三角符号。航路则使用使用黑色的折线将所有的航路点连接起来。如下图所示
航路点也是从航空公司的系统导出Excel数据,其格式基本上与机场点Excel相同,如下图所示
迫降区:
迫降区一般由机场点数据生成。飞机在飞离其始发机场后,如遇到紧急事故需要迫降,会根据当前所在的位置查找最近的可降落的机场。如果飞机当前位置在某个迫降区范围内,则首选这个迫降区的对应的机场降落。
迫降区以机场点为中心,分别进行两圈的缓冲,内圈为450海里,外圈为1300海里;内圈为红色实线表示,外圈为红色虚线表示;这两圈都分别需要在圈内沿线标注,标注的内容为【缓冲距离+”/”+机场代码】,圈内必须重复标注两次,如下图所示
地图整饰:
地图整饰要素包括图框、比例尺、图例、文字说明、经纬网、地图投影等。
比例尺一般有系统自动读取,但有一定的格式,其格式如下图所示
图框,图框样式没有特别的要求。
经纬网必须采用绿色线条标注,并且经纬网不能压盖图面上的机场点、航路点、航路、迫降区及其他标注。并且必须注明其经纬度,如下图所示
地图坐标系
由于航线的特殊性,有可能是跨省、跨国或者跨洋,因此,需要不同的地图坐标显示。例如跨省航线,直接使用WGS84坐标即可;如中国至欧洲航线,则使用墨卡托分瓣投影或者WGS84坐标,中美航线则可考虑极地坐标系。如下图是中国到美国芝加哥航线,使用的就是极地坐标系,这样航线才能具备连贯性,如下图所示:
如果这样的跨洋航线使用WGS84坐标系,则会导致航线表示不符合人类认知水平,如下图为WGS84坐标系中美航线,
航空制图插件的技术路线
根据航空图的制图要求,需要对Excel数据进行地理空间化,其标注、地图整饰、打印出图等方面需要依赖ArcGIS Desktop软件,因此,航空制图插件使用ArcGIS Desktop10.2 + Python+地图模版 的方式进行插件式开发。
插件式开发优势
插件式开发能够充分利用ArcGIS Desktop成熟的功能和工具,减少开发工作量,制图系统稳定且高效。基于Add-In方式开发,开发和安装部署非常容易。
ArcGIS Desktop10.2的优势
由于用户数据为非地理空间数据,提交的为Excel数据,因此使用ArcGIS版本为10.2及以上,ArcGIS Desktop10.2开始提供Excel to Table 工具,可以很好的读取Excel数据并转为ArcGIS的Table格式,能够充分利用ArcGIS的接口对Table和基于Table转换后的地理数据进行操作。
Python优势
Python语言是解析性语言,其黏性非常好,几乎可以将所有代码和程序在Python环境下运行,而且Python的扩展性和跨平台性能非常好。ArcGIS平台支持Python环境,并将大部分的功能封装在ArcPy包中,实现大粒度的GP工具调用和小粒度的制图和数据读取接口。Esri还提供了addin_assistant界面编辑工具,可以行方便的在ArcGIS平台家搭建插件的界面元素和界面交互。基于ArcPy包的制图流程,还可以直接迁移到ArcGIS Server中,实现平滑的从C/S的制图流程到B/S的制图过渡(后续版本可以迁移到ArcGIS
Server中)。
制图模版的优势
利用ArcGIS的制图模版方式,可以将航空制图的特定需求固化下来,形成稳定的图层,例如图层的顺序,机场点、航路点、航路及迫降区的符号显示,迫降区标注表达式和重复标注,比例尺样式和经纬网样式等等,都可以预先在地图模版中定制下来,减少开发代码。如果有特别的航空需求,还可以针对模版进行调整,而不需要专门修改插件代码。针对多种航线要求,可以通过定制制图模版来满足。
航空制图插件的思路
航空制图插件的主要体思想是通过插件形式,封装ArcGIS的地图操作,尽可能少的出现原生的ArcGIS数据处理和GP调用,将整个制图处理的几十个操作步骤简化为几个按钮操作。航空制图所用到的常用操作,如地图旋转、坐标转换,则抽取其需要的部分,减少使用通用工具的多个选择。例如,坐标系的选择,目前则固定使用WGS84和极地坐标系,通过下拉菜单选择,不需要在众多坐标系中检索。
数据处理部分
数据处理部分分为【新建工程】、【导入机场点】、【导入航路点】、【生成迫降区】四部分。
【新建工程】部分,主要是创建新的Geodatabase用于保存新生成的航空数据,获取模版的各个图层信息。
【导入机场点】部分,主要是通过读取机场点的Excel文件,将其转换为地理数据,处理过程分为以下几步:
-
读取Excel数据,利用Excel to Table工具将其转换为Tabel数据。
-
针对Table中的精度和纬度的文字说明,转换为十进制的经纬度。其思路是使用字段计算的GP工具CalculateField_management,结合VBA的方式进行处理
-
使用添加XY数据的GP工具MakeXYEventLayer_management将处理后的表格数据导入到地图中,生成点坐标数据。
-
将XY图层转换为机场点数据,利用FeatureClassToFeatureClass_conversion工具转换成为FeatureClass
-
将制图模版中的机场点图层替换数据源为上一部生成的机场点FeatureClass,使用图层的replaceDataSource接口实现
通过这几步复杂的处理,完成了机场点的生成和显示。其关键的难度是在在Table中转换经纬度描述为十进制的经纬度,字段计算器的规则结合了VBA进行操作。这也是前面所说到的Python的优势之一,可以黏合其他的编程语言进行使用。
【导入航路点】部分,主要分成两个部分,一是通过航路点的Excel生成航路点的FeatureClass(此处与生成机场点类似,但坐标转换有不一样),而是通过航路点生成航路。其主要关键步骤如下:
-
读取航路点Excel数据,利用Excel to Table工具将其转换为Tabel数据。
-
针对Table中的精度和纬度的文字说明,转换为十进制的经纬度。其思路是使用字段计算的GP工具CalculateField_management,结合VBA的方式进行处理
-
使用添加XY数据的GP工具MakeXYEventLayer_management将处理后的表格数据导入到地图中,生成航路点坐标数据。
-
将XY图层转换为航路点数据,利用FeatureClassToFeatureClass_conversion工具转换成为FeatureClass
-
将制图模版中的航路点图层替换数据源为上一步生成的航路点FeatureClass,使用图层的replaceDataSource接口实现
-
利用点集转线工具PointsToLine_management根据航路点数据生成航路FeatureClass
-
将地图模版中的航路线数据图层替换为上一步生成的航路线FeatureClass,使用图层的replaceDataSource接口实现。
【生成迫降区】部分,针对的是机场点数据,生成两个缓冲区,并将缓冲区生成线。此步需要分别针对机场点生成450NM和1300NM的缓冲区,对缓冲区转换为线图层,但为了后续标注可以在缓冲线圈里面显示,必须再分布生成420NM和1270NM两个线圈,这两个线圈会结合Maplex技术沿线标注迫降区的标注信息。其操作步骤如下:
-
读取航空图的显示坐标信息,将使用Project_management工具机场点的FeatureClass转换为相同坐标系。因为机场点是用Excel文件转换过来,而提供的信息是经纬度信息,因此初始转换时使用的是WGS84坐标,如果制图坐标系不是WGS84,则需要将原来坐标系为WGS84的机场点转换为与制作坐标系一致。(如果不转换坐标的话,在像极地坐标这样的坐标系中,做缓冲区分析,出来的缓冲区域不是正圆,因此必须先对数据进行坐标转换);
-
利用缓冲区工具Buffer_analysis,分别生成4个缓冲区,对应为内圈450NM,外圈1300NM,内圈标注420NM,外圈标注1270NM;
-
利用面转线PolygonToLine_management工具,分别将这几个缓冲面转换为线要素;
-
利用替换图层接口replaceDataSource,分别替换迫降区相关的四个图层的数据源。
此步的重要操作是必须先将机场点数据转换坐标系为制图显示的坐标系,不然缓冲区生成就失去意义了。
图层处理部分
图层处理必须针对航空制图创建必要的符号库、制作图层渲染、图层标注显示设置等。
【符号库设计】针对航空制图的要求,需要制作相应的展示符号,如机场点、航路点、航路线及标注样式。部分符号为了显示不模糊,使用FontCreator软件针对符号重新制作字体,如机场点符号。
【图层渲染】除了航路点数据之外,所有图层均使用单一渲染方式。航路点数据使用的是唯一值渲染,通过Type字段来表示航路点和航路名,分别为红色和黑色等边三角形。
【标注显示】整个制图过程均使用Maplex标注引擎进行标注显示。其中迫降区的标注显示图层颜色为不可见,标注位置使用沿线分布;航路点标注针对Type字段进行分组显示标注,红色为航路点,黑色为航路名。
其他处理部分
其他部分处理基本上集中在地图整饰,比例尺及纸张选择和打印
【地图整饰】地图整饰部分需要增加经纬网的显示,而经纬网必须不能掩盖机场点、航路点及航线。如果采用ArcGIS 特有的经纬网(在dataFrame创建的那种),经纬网会叠加在所有图层的最上层,从而压盖所有要素。如下图绿色为经纬网,其压盖了航路点。为了不压盖航空要素,单独按照航空制图的5度划分创建经纬网,并加载在航空要素的底层,从而解决压盖问题。
【比例尺】位置固定在左上角,并由ArcGIS Desktop自动维护。
【纸张和打印】纸张和打印设置,不在插件生成,用户最终图层调用ArcGIS Desktop原生工具。主要考虑到原生工具已经的交互已经做得比较优秀,用户能够掌握其操作。
航空制图插件的操作流程
航空制图插件的操作非常简单,大于分为安装部署、插件使用、打印出图三大部分。
安装部署
-
安装ArcGIS Desktop。航空插件需要依赖于ArcGIS Desktop软件,因此,在部署之前必须安装ArcGIS Desktop。ArcGIS Desktop安装和授权不在此文档中说明。
-
安装航空制图插件。直接双击插件文件AirMap.esriaddin,运行安装。如下图所示
双击运行后选择Install Add-In,如下图
显示如下图则安装成功
-
安装符号字体
选择【航空制图字体】,点击安装按钮,则完成字体安装。如下图所示
插件使用
航空制图插件的使用非常简单,需配合ArcMap操作。
-
工具调用
双击运行【航空制图模版.mxd】,打开其制图模版,如下图所示
注:其中经纬网、洲际面和海洋面,可以根据实际需要替换底图,这个不影响插件使用。而左侧图例框中带叹号的图层不可删除,在操作完数据后其数据源会自动关联上。
-
调用插件工具条。在【自定义】–【工具条】中选择【航空制图插件】,如下图所示
工具条显示如下图所示
工具从左到右分别为【新建工程】、【导入机场点】、【导入航路点】、【生成迫降区】、【旋转地图】、【选择坐标系】。
-
制图操作流程。
-
制图的流程首要步骤 :选择坐标系,设置地图旋转。确定好其地图显示区域
如下图所示,已经选择了北极坐标系,并旋转地图为75度
-
新建工程。点击新建工程按钮,弹出工程保存路径,选择一个目录进行保存,如下图所示
提示工程创建完成后,可以在对应的目录找到一个后缀名为.gdb的文件,这就是工程数据保存的目录。
如下图所示
-
导入机场点数据。点击按钮,选择机场点Excel,点击确定后经过短暂的等待,即可生成机场点数据,并可在地图中查看到。如下图所示
-
添加航路点。点击导入航路点按钮,选择航路点Excel,确定后经过短暂的操作,即在地图上生成航路点和航线,并且给航路点和航路名标注。如下图所示
-
生成迫降区。点击生成迫降区按钮,经过短暂等待后,及生成迫降区并在地图上进行迫降区的标注。如下图所示
执行完此步,基本上数据处理和图面显示已经完成。
打印出图
地图的打印的纸张设置和打印设置,则使用ArcGIS Desktop自带的打印功能。
打开【文件】–【页面和打印设置】,如下图所示
在地图页面中设定纸张和打印布局,然后确定,如下图所示
然后切换到状态栏的布局面板,如下图
通过标准工具条的缩放工具和平移工具,调整地图的在纸张的范围,如下图所示
调整后好可以直接导出地图,在【文件】–【导出地图】选项,弹出导出地图设置框,可以在对话框中选择导图地图的格式和dpi,如下图所示
设置好后点击保存按钮即可导出地图。一般默认DPI为96,如果需要打印更大更高清的图,建议设置更高的DPI。高DPI设置会导致导出地图缓慢,需要更多的等待时间。
转载自:https://blog.csdn.net/liyuanxiang1984/article/details/52774304