解析xml修改切片原点绕开工具的坑

我们可以通过工具 Generate Map Server Cache Tiling Scheme 来生成自定义的切片方案,无论是ArcMap还是ArcGIS Pro ,无论是栅格切片还是矢量切片,都屡试不爽。

前段时间,为了方便 ArcGIS Pro 的自动化工作,我尝试用python调用这个功能,然而后面在使用其生成的切片方案(.xml)文件时,会发现切片原点总是默认值,例如地理坐标系统下是“-400,400”。

1
2
3
<TileOrigin xsi:type="typens:PointN">
<X>-400</X><Y>400</Y>
</TileOrigin>

arcpy.GenerateMapServerCacheTilingScheme_server (in_map, tile_origin, output_tiling_scheme, num_of_scales, scales, dots_per_inch, tile_size) 中,tile_origin这个参数标识为point对象,可是无论如何传参都无效。

这样会导致切片创建以及更新的一系列问题,在当时也是排查了很久才定位到这个问题。我的是测试环境是 ArcGIS Pro 2.0.x。值得欣慰的是,这个问题在 ArcMap的arcpy中没有问题,可以正确识别参数。

经过与esri美国工程师的沟通确认,此问题为arcpy for ArcGIS Pro的bug,暂时没有官方解决方法。

  • BUG-000110503 : Changing the tile origin parameter when using arcpy.server.GenerateMapServerCacheTilingScheme does not actually change the tile origin

绕行办法:

既然xml已经生成了,只有切片原点信息是错误,那就自己来解析xml修改对应参数即可。在自己的脚本中额外增加一个解析xml的逻辑吧,跳过这个坑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import xml.dom.minidom as DOM
# Modify Scheme File to Avoid the tile_Origin Specification Bug of the Pro Tool
def modifyTilingSchemeFile(tileScheme,x_origin,y_origin):
try:
doc = DOM.parse(tileScheme)
tileOriginX = doc.getElementsByTagName('X')
tileOriginY = doc.getElementsByTagName('Y')
tileOriginX[0].firstChild.data = x_origin
tileOriginY[0].firstChild.data = y_origin
f = open(tileScheme, 'w+')
doc.writexml(f)
f.close()
return True
except:
arcpy.AddMessage("tile scheme XML file does not exist.")