ArcGisPro Python 批量缩放地图视角至图层
基本情况
- 任务:对使用python基于模板批量生成的地图,批量将每个地图的视角定位至某一个图层,目前只试过缩放至矢量图层
- 特殊:地图中的图层定义过“定义查询”对图层元素进行筛选
- 核心语句:
yourMap.defaultCamera.setExtent()
:设置默认的地图视角,设置之后需要重新打开地图才能查看到视角的改变;其参数为新的视角范围yourMapView.getLayerExtent()
:返回图层中所有要素或仅仅所选要素的图层范围。;参数:layer
为引用 Layer 对象、selection_only
(默认值为 True)如果为 True,将返回选定要素的范围;如果为 False,将返回所有要素的范围、symbolized_extent
(默认值为 True)如果值为 True,将返回图层的符号化范围;否则将返回几何范围。符号化范围会将符号覆盖的区域考虑在内,因此该区域不会被数据框边界切掉。arcpy.Describe(yourLayer).extent
:可描述数据元素并返回包含多个属性。 该对象的属性是动态的,这意味着根据所描述的数据类型,会有不同的描述属性可供使用。这里返回Layer的范围属性,注意图层范围不是经过定义查询的范围。
坑点
1.MapView类
是设置Map的视角,与之并列的有Layout和LayoutElement的视角;很多示例只使用后者举例,容易造成混淆,使用时需要自己迁移。
2.getLayerExtent()
语句不能使用PyCharm软件外部连接,会报超时的错误;使用时需要使用ArcGISPro软件的python编辑器,并且定位项目使用arcpy.mp.ArcGISProject("CURRENT")
同时随意激活一个地图才能使用。
功能实现
1.在ArcGISPro中实现,稍微麻烦一点,同时无法跨工程项目进行批量操作
aprx = arcpy.mp.ArcGISProject("CURRENT") # 必须在ArcGISPro打开python编辑界面,使用"CURRENT"读取当前工程;同时必须至少打开任意一个地图
mapView = aprx.activeView
map_list = aprx.listMaps()
print(map_list)
for map in map_list:
mapName = map.name
region = ""
# 重设视角
mv=mapView
cameraLayerName = ""
cameraLayer = map.listLayers(cameraLayerName)[0]
extent=mv.getLayerExtent(cameraLayer, True,True) # 有定义查询,必须在软件环境使用,无法跨工程使用
# extent=arcpy.Describe(cameraLayer).extent # 无定义查询,无限制
map.defaultCamera.setExtent(extent)
aprx.save()
2.在软件外(PyCharm)中实现,可以项目进行批量操作
只是理论上可以,但我还没实际去尝试。
具体思路为,使用要素查询语句,查询要筛选的矢量要素。导出为新图层,使用arcpy.Describe(yourLayer).extent
获取图层范围,然后设置。有更方便的获取图层筛选要素范围的方法更好。现在方法一够用了,思路二以后有需要再试。