ArcGIS 被忽略的性能损失可能影响巨大
前言:在不为人知的细微之处,汇聚的能量终让人侧目。细微之处
正面的那一定是件好事,但是如果是负面,不仅让人侧目,往往也让人困惑,毕竟细微之处常常被忽略。Arcmap 移动一下界面位置,刷新很缓慢,导出地图,几个小时还在5%,然后电脑直接挂一周才把所有地图导出来。确实因为规范的要求、实际地理地物的需要,制作的地图图层很多,尺寸很大,图斑也很多,但是地图导出这么慢也是没有想到,试过各种方法,都没有啥用,最后的解决方法就是慢慢等着吧。那么到底是什么地方出的差错呢?问题到底在什么细微之处呢?每一个 mxd 文档中,点击 文件 ,再点击下面的 分析地图。
可以看到下面出现当前地图文档中的各种不规范行为导致的警告,双击这些警告一般可以看到建议选项。正如下面显示的,有两种高严重性的警告,一是投影不同,二是数据源没有空间索引。这两个是非常常见的警告,我一开始也是忽略了,觉得没有什么。
那么到底投影不同会有多大的影响呢?性能影响几何?
在解决投影问题后,地图导出速度简直快了100倍!(以前那个很大很多图层的mxd文件,投影不相匹配的很多)。当然这也只是感觉,我们这里使用一些数据量较小的文件来测试一下。0.如何测试手动导出地图,手动计时肯定是不准的,所以这里也借用 python 帮助一下,使用计算机重复导出地图10次,记录下每次的用时,最后取平均值。# -*- coding:utf-8 -*-import arcpyfrom time import timeimport osoutpath = os.path.abspath(os.getcwd())def sample():time1 = time()mxd = arcpy.mapping.MapDocument("CURRENT")arcpy.mapping.ExportToJPEG(mxd,os.path.join(outpath, "res"),resolution=300)return time()- time1if __name__ == '__main__':time_list = []for i in xrange(10):time_list.append(sample())print sum(time_list)/len(time_list)1.测试样本1这是第一个测试的,分析结果如下,所有图层都没有投影问题,仅有一个空间索引,暂时不管空间索引问题:
样本1 地图分析结果运行程序,然后等待,最后平均时间是12.37秒:
2.测试样本2测试样本2是在样本1的基础上,将其中三个图层(共10个)从CGCS2000_3_Degree_GK_Zone_35 改成了 CGCS2000_3_Degree_GK_CM_105E,下面分别简称 35 和 105e。数据框坐标是 35,可以在下面看到测试样本2的分析结果,新增了一项投影不同的警告:
样本2 地图分析结果然后运行结果显示16.02秒:
平均时间从12.37变成了16.02秒,增加了3.65秒,增加了近30%的时间。结论
平均时间从12.37变成了16.02秒,增加了3.65秒,增加了近30%的时间。投影问题不仅影响正常使用时候的图像绘制和刷新,对于地图导出也有影响;影响程度不小(比我以前认为的要大)。为什么性能会降低为什么性能会降低,因为arcgis有一个独特的动态投影功能:projection on air。arcgis有一个数据框的概念,数据框会复制模仿第一个添加进arcmap的矢量(栅格)的坐标系。当你添加第二个投影不一样的矢量(栅格)时 ,arcgis 会自动进行投影转换(数据实际的坐标系不会改变),尽量保证所有图层都用一个坐标系来显示,这也是为什么会出现新添加的数据怎么也找不到,重启再添加就好了的情况,因为数据框坐标系不对。这个功能是一把双刃剑,确实方便但是容易让人困扰,也让我忽略了投影不一致的问题,毕竟看上去很正常。性能损失指数函数有个词叫指数爆炸——多个数字相乘是很恐怖,数值会飞速膨胀。对于非常复杂的 mxd 工程文件、大量的数据,因为投影问题而增加的时间可能就不止是130%。当然对于一般的较小项目没有太大的影响,但是在制作工程文件时最好养成检查各个图层投影系的习惯。荟GIS精粹,关注公众号:GIS荟欢迎交流,更多文章请使用搜索