Highlights
1、PNG文件不能内嵌坐标信息;
2、切换变换方法可避免异常拉伸BUG;
3、保存链接表可以简化配准流程;
4、复制外置坐标文件可实现批量配准;
5、通过WMTS服务器可以添加底图;
6、适应显示范围是个神奇的功能;
7、链接中有示例数据和代码。
嗨~多磨,久违的正篇更新,今天分享一个与众不同的配准方法,主要用于将地图截获器【2018-002】输出的栅格数据批量配准到正确的坐标上。感谢韩泽华同学留言提出栅格配准的问题,并特别鸣谢GISer学习团公众号(非商业互吹还不快去关注一波)的张云金老师,本文介绍的配准方法是在张老师作品的启发下产生的。(登录公众平台发现素材编辑页面的表情按钮不见了正文里暂时就不插入表情了,让干货的纯度再提高一点儿吧)
【常规的栅格配准三部曲】
【步骤1:准备参照物】简单介绍一下常规的栅格配准操作,首先,需要有一个待配准的栅格,然后需要有一个作为配准目标的参照物,可以是电子地图图层(强力推荐!文末会演示如何在ArcGIS中添加电子地图的,比SimpleGIS插件速度更快哦~)或者已经配准好的其他数据。准备好这两个东西后,将待配准的栅格和参照物添加到ArcMap中并在栅格图层属性的显示选项卡中将透明度调整一下(图1)。
图1 添加待配准栅格
(横屏查看可放大动图,下同~)
【步骤2:建立位移链接】在菜单栏空白处单击右键调出【地理配准】工具条(【空间校正】工具条是用于配准矢量要素的,两个工具的操作方式很相似),打开链接表窗口放在旁边备用,点击【地理配准】工具条上的添加控制点按钮,点击栅格上的位置A,然后点击参照物上的对应位置A‘(读作A撇),建立一条位移链接,切换一下变化方法(这是为了避免BUG,后文有相关演示),并继续添加位移链接,一般添加2-3个链接就可以较好地配准了(图2)。如果配准效果不理想,可以试着添加更多链接,添加足够多的链接就能切换到更复杂的变化方法,具体效果可以结合ArcGIS帮助文件的“地理配准栅格数据集的基础知识”词条自行尝试(总之就是配到你满意为止啦)。
图2 建立位移链接
【步骤3:输出配准结果】然后点击【地理配准】工具条的地理配准-校正,选择输出的目录(这里需要注意的是,如果你想输出到D:\2019_017路径下,那么需要在其上一级目录,即D:\路径下选中2019_017文件夹并点击添加才可以,不太好描述,仔细看动图吧),选择一个合适的压缩方式(TIFF文件推荐LZW)以便减小输出文件的体积,点击保存即可(图3)。
这里之所以采用TIFF格式输出,是因为该格式的坐标信息是内嵌在.tif文件里的,而PNG格式栅格的坐标信息则外置于一个.xml文件中(该结论可能仅在ArcGIS环境下成立,QGIS用什么存储PNG坐标我就不知道了)。坐标信息是否内嵌的一个重要区别体现在文件的管理上,TIFF格式栅格的分享仅需拷贝.tif一个文件(比如我分享的建筑栅格数据【2019-016】时刻不忘打广告),分享PNG格式栅格则需要拷贝.png和.xml两个文件,万一把.xml文件弄丢了,那就麻烦大啦(后文会反过来利用这一点带你见证奇迹)。
图3 完成校正并输出TIFF
【敲黑板】刚才有一步切换变换方法的操作,这里演示一下“正常”操作可能会引发的BUG(图4)。
图4 栅格配准时出现异常拉伸
为了更好地看清楚位移链接的问题,点击地理配准-重置变换,重置栅格位置后可以看到链接1没有问题,而链接2的起点位置并不在原栅格的路口处(图5),正确的链接应该是图6的样子。
图5 错误的配准链接(请点开大图查看)
图6 正确的配准链接(请点开大图查看)
这说明,地理配准工具的自动校正功能错误地判断了第二个链接的坐标来源,以至于链接2的原坐标和目标坐标都是基于参照物计算的,造成了栅格的异常拉伸。解决办法有两个,方法一如图2所示,输入完第一个链接之后将变换方法切换至零阶多项式,然后切回一阶多项式即可;方法二是先关闭自动校正功能,输入完全部链接后再勾选自动校正查看配准效果。(尚不确定该BUG是否仅限于ArcGIS 10.2.2,请自行测试一下~)
【常规栅格配准的简化】
常规配准也是可以近似批量化的(实为配准操作的部分简化),点击链接表窗口的保存按钮(图7),可以把当前的链接保存为文本,以便后续栅格配准时直接加载,用起来的效果大概是图8的样子。
图7 链接表可将链接保存为文本
图8 简化后的配准操作
对于需要配准多张栅格的情况,此方法确实可以大幅提高操作效率,然而,这个方法也存在一种可能不太适用的情况,那就是待配准栅格数量过多(比如几十甚至上百张,嗯?你说没有这种情景?等0.6Beta版的地图截获器发布,你就会知道这是什么情景了,先卖个关子~),一种可行的办法是使用【数据管理工具】-【投影和变换】-【栅格】-【从文件变换】工具,配合ArcGIS模型构建器的循环模块实现自动化水平极高的批量化配准,这个流程当然也可以通过使用Python调用arcpy来实现(这可能也是最好的解决办法,也许以后会单独写一篇)。可是呢,如果我既不想学模型构建器,更不想碰Python,还想尽可能减少重复劳动(毕竟保存链接表也只简化了一部分),有这么好的办法么?
【批量配准栅格的邪道办法】
办法当然是有滴,不然也没这篇推文了。PNG+XML文件对于ArcGIS来说与单个的TIFF文件其实没什么区别,既然已经有了PNG,是否可以干脆不生成TIFF呢?【地理配准】工具条确实提供了这样的功能,输入完所有的位移链接后,点击地理配准-更新地理配准即可将当前的坐标信息写入对应的XML文件(图9),并且不生成额外的栅格数据,效果如图10所示,更新过地理配准的PNG文件已经记住了正确的位置。
图9 更新地理配准
图10 更新地理配准后的效果
我们还知道,PNG文件的坐标信息全都存放在XML文件中,那么对于同一组需要配准的PNG文件来说,逐一配准后,它们的XML文件应该也是一样的,所以呢,邪道办法就来了(嘿嘿嘿),对第一张栅格进行配准后,将其XML文件复制多个,并按照其余栅格的文件名逐一修改,这不就完事儿了么!赶紧动手改一个(图11),再放到ArcMap中瞅瞅(图12)。
图11 复制and改名
图12 添加进来就配准好啦!
如果你连复制和改名都嫌麻烦的话……这回就没有太邪道的方法了,稍微学点儿Python吧,代码如下
import os
root=os.getcwd()+'\\'
PNGlist=[]
t=''
for i in os.listdir(root):
if i[-4:]=='.png':
PNGlist.append(i)
elif i[-4:]=='.xml':
t=open(root+i).read()
if len(t)>0:
for png in PNGlist:
if os.path.isfile(root+png+'.png.aux.xml')==False:
xml=open(root+png+'.aux.xml','w')
xml.write(t)
xml.close()
raw_input('XML files copying finished, press ENTER to quit')
else:
raw_input('No XML files founded, press ENTER to quit')
把代码复制到TXT文本文档中并保存,然后将后缀名从.txt修改为.py,放到存放PNG的目录下运行,其效果如图13所示,将处理过的PNG加载到ArcMap的效果如图14所示。
图13 学点儿Python真的不亏
图14 见证奇迹!
【栅格配准的其他注意事项】
最后再补充三则注意事项。其一,作为参照物的电子地图图层可以通过ArcMap目录窗口的添加WMTS服务器来添加(ArcGIS 10.0好像只支持WMS服务器,可以自行搜索相关的服务器URL),双击添加WMTS服务器,在URL一栏中输入http://xdc.at/map/wmts/并点击确定,然后双击目录中刚刚添加的那个服务器(请无视链接错误的小红叉),展开后就能查看可用的电子地图了,将所需的图层拖动到内容列表即可(图15),在此特别感谢该服务器的搭建者谢栋灿的分享。(其实撰文时已经不记得出处了,所以临发布前专门查了一下,原作者那里还有好多硬核内容啊,特附上原文地址供同学们查阅https://i.xdc.at/2017/10/28/add-google-map-to-arcmap/)
图15 添加WMTS服务器
(实际加载没这么快,中间剪掉了一段)
其二,如果有同学还在坚持使用百度地图截获器矢量版1.0Beta,那么在参考此方法进行批量配准之前,请删除矢量版输出的栅格附带的.pgw文件,如果带着这个文件进行操作,那么批量配准时不仅需要复制XML文件,也需要复制.pgw文件,留着它反而会凭添麻烦。
其三(紧接着第二条),对于单独的PNG文件而言,加载到ArcMap后默认会出现在坐标原点附近,差不多是在加纳首都阿克拉正南方向的几内亚湾海面,那么如何快速地把栅格定位到目标区域呢,这个也很简单,添加好待配准栅格和电子地图后,首先缩放到配准的目标区域,然后点击地理配准-适应显示范围,即可将待配准栅格立刻适配到当前窗口(图16),后续的配准操作参考本文开头的三部曲即可(好的,首尾呼应了)~
图16 适应显示范围效果演示
【后记】
开启三连更模式,今天先更批量配准的邪道流程,周二中午更新例行的建筑栅格数据(也该给正篇更新让一回路了),周三中午更新ArcGIS导出三维模型效率测试与备选方法,至此,最基础的一些铺垫内容可能就差不多了,下个月会发布0.6Beta版的地图截获器,上线交通拥堵状态的定时循环截图,可以配合今天分享的邪道批量配准方法进行处理。
【全文3294字,撰文耗时9h40m】