ArcgisPro ArcPy (还未)实现缩放至图层
这是一个踩坑记录贴,相关的操作我还没有实现,如果有人知道我哪里搞错了,请不吝赐教,提前拜谢!(后补:已经实现了,具体请翻阅我的另一个新写博客)
在软件上,缩放至图层的操作简单至极,右键点击图层→单击缩放至图层就实现了。我忘记了在旧版的Arcgis中有没有批处理过这个操作,隐约是有,至少是想做来着。用python实现ArcgisPro费了我很多力气都没成功,我能想到的突破口都尝试遍了,只能暂时投降。
目标:使用Arcpy设置多个地图的视角缩放至某图层
特殊:因为我的地图使用了定义查询,这一点给我造成了较大的障碍(唯一一次跑通的情况,只缩放视角到了图层的全范围)
方法:
1、map.defaultCamera.setExtent(arcpy.Describe(cameraLayer).extent)能跑通但是功能不符合预期
文档网址是:https://pro.arcgis.com/zh-cn/pro-app/latest/arcpy/functions/describe.htm
具体来说map.defaultCamera.setExtent()是设置设置视角的(存疑,我没用仔细查看);arcpy.Describe()是获取图层属性的;arcpy.Describe(cameraLayer).extent是获取图层范围的。
勉强跳转了视角,但是对于设置了定义查询的图层,视角还是未设置定义查询的情况。
2、extent = map.getLayerExtent(layer, {selection_only}, {symbolized_extent})跑不通
在map.defaultCamera.setExtent()的基础之上,我感觉只要获取正确的边界范围就可以了。所以我查看了很多地图文档,把目光放在了.getLayerExtent()函数上,我不知道它的上层是什么,设置Map会报错。不是Map而是MapView,可是获取MapView也会报错。官方文档的网址为:https://pro.arcgis.com/zh-cn/pro-app/latest/arcpy/mapping/mapview-class.htm。
extent = mapview.getLayerExtent(layer, {selection_only}, {symbolized_extent})
# layer:引用 Layer 对象
# selection_only:如果为 True,将返回选定要素的范围;如果为 False,将返回所有要素的范围。
# symbolized_extent:如果值为 True,将返回图层的符号化范围;否则将返回几何范围。符号化范围会将符号覆盖的区域考虑在内,因此该区域不会被数据框边界切掉。
它的属性让我感觉有希望,但这个函数不会用,它在官网的实例代码如下:
import arcpy
aprx = arcpy.mp.ArcGISProject(r"C:\Projects\YosemiteNP\Yosemite.aprx")
m = aprx.listMaps("Yose*")[0] # Map
lyr = m.listLayers("Ranger Stations")[0] # Layer
lyt = aprx.listLayouts("Main Attr*")[0] # Layout
mf = lyt.listElements("mapframe_element", "Yosemite National Park")[0] # Element是Layout的地图框
mf.camera.setExtent(mf.getLayerExtent(lyr, False, True)) # 设置视角
aprx.saveACopy(r"C:\Projects\YosemiteNP\Yosemite_Updated.aprx")
del aprx
这里有个很离谱的事情,我要改变数据视图的显示范围,需要从布局视图获取范围?我这个工程没有布局视图啊!!!另外,在ersi社区上,有个和我问题类似的老哥,看了这个示例之后问题解决了。
搞不定,以后更了解这方面之后再来完善吧。
浙公网安备 33010602011771号