ArcGIS 被忽略的性能损失可能影响巨大
前言:在不为人知的细微之处,汇聚的能量终让人侧目。 |
细微之处
正面的那一定是件好事,但是如果是负面,不仅让人侧目,往往也让人困惑,毕竟细微之处常常被忽略。
Arcmap 移动一下界面位置,刷新很缓慢,导出地图,几个小时还在5%,然后电脑直接挂一周才把所有地图导出来。
确实因为规范的要求、实际地理地物的需要,制作的地图图层很多,尺寸很大,图斑也很多,但是地图导出这么慢也是没有想到,试过各种方法,都没有啥用,最后的解决方法就是慢慢等着吧。
那么到底是什么地方出的差错呢?问题到底在什么细微之处呢?
每一个 mxd 文档中,点击 文件 ,再点击下面的 分析地图。
可以看到下面出现当前地图文档中的各种不规范行为导致的警告,双击这些警告一般可以看到建议选项。
正如下面显示的,有两种高严重性的警告,一是投影不同,二是数据源没有空间索引。这两个是非常常见的警告,我一开始也是忽略了,觉得没有什么。
那么到底投影不同会有多大的影响呢?
性能影响几何?
在解决投影问题后,地图导出速度简直快了100倍!(以前那个很大很多图层的mxd文件,投影不相匹配的很多)。当然这也只是感觉,我们这里使用一些数据量较小的文件来测试一下。
0.如何测试
手动导出地图,手动计时肯定是不准的,所以这里也借用 python 帮助一下,使用计算机重复导出地图10次,记录下每次的用时,最后取平均值。
import arcpy
from time import time
import os
outpath = 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()- time1
if __name__ == '__main__':
time_list = []
for i in xrange(10):
time_list.append(sample())
print sum(time_list)/len(time_list)
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的分析结果,新增了一项投影不同的警告:
然后运行结果显示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%。
当然对于一般的较小项目没有太大的影响,但是在制作工程文件时最好养成检查各个图层投影系的习惯。