如何用Python将ArcMap的Extent、Scale和RefreshView适配到ArcPro
ArcPro (Python 3) 适配:修改图层定义查询后缩放至图层范围并批量导出PDF
我用Python 2.7写ArcMap脚本多年,现在要转成ArcPro的Python 3版本,大部分适配已经完成,但卡在修改图层定义查询后缩放至图层范围的代码改写上。
现有环境:
- 地图名称:
Mailing List Map - 导出PDF用的布局:
Irrigation_Services_Maps - 数据源:
irrStats表,包含Customer Name和Frequency字段 - 需求:批量生成PDF地图,每个PDF以客户名为标题,只显示对应客户的灌溉点
原ArcMap Python 2.7代码片段(关键部分)
mxd = arcpy.mapping.MapDocument("CURRENT") df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0] lyr = arcpy.mapping.ListLayers(mxd, "Irrigation_Points", df)[0] # 设置定义查询 lyr.definitionQuery = "\"Customer Name\" = '{}'".format(cust_name) ##### 以下是需要改写的部分 ##### df.extent = lyr.getSelectedExtent() df.scale = df.scale * 1.1 # 放大10%留边 arcpy.RefreshActiveView() arcpy.RefreshTOC() ##### 改写结束 ##### # 导出PDF arcpy.mapping.ExportToPDF(mxd, output_pdf, "Irrigation_Services_Maps")
ArcPro Python 3适配方案
ArcPro使用arcpy.mp模块替代旧的arcpy.mapping,缩放逻辑需要基于地图的相机对象实现,完整适配后的代码如下:
import arcpy import os # 获取当前项目、地图、布局对象 aprx = arcpy.mp.ArcGISProject("CURRENT") map_obj = aprx.listMaps("Mailing List Map")[0] layout = aprx.listLayouts("Irrigation_Services_Maps")[0] lyr = map_obj.listLayers("Irrigation_Points")[0] # 遍历irrStats表中的所有客户 with arcpy.da.SearchCursor("irrStats", ["Customer Name"]) as cursor: for row in cursor: cust_name = row[0] # 构造输出PDF路径(自行替换为你的实际路径) output_pdf = os.path.join(r"C:\Your\Output\Dir", f"{cust_name}_Irrigation_Map.pdf") # 设置图层定义查询 lyr.definitionQuery = f"\"Customer Name\" = '{cust_name}'" ##### 适配ArcPro的缩放与刷新逻辑 ##### # 获取图层可见范围(需确保查询后有要素) lyr_extent = lyr.getExtent() if lyr_extent is not None: # 操作地图相机控制视图 camera = map_obj.defaultCamera camera.setExtent(lyr_extent) # 放大10%留边(scale值越大视图范围越小) camera.scale = camera.scale * 1.1 # 刷新布局 layout.refresh() ##### 适配结束 ##### # 导出PDF layout.exportToPDF(output_pdf) # 清理对象 del aprx
关键差异说明
- 用
arcpy.mp.ArcGISProject替代旧的arcpy.mapping.MapDocument,统一管理项目资源 - 通过地图的
defaultCamera对象控制视图范围和缩放比例,替代ArcMap中DataFrame的extent/scale属性 - 刷新视图直接调用
layout.refresh(),无需单独刷新TOC和活动视图 - 导出PDF直接调用布局对象的
exportToPDF()方法,无需传入布局名称参数
注意事项
- 确保
Irrigation_Points图层在Mailing List Map中存在,字段名拼写完全匹配 - 若定义查询后图层无要素,
getExtent()会返回None,需添加判断避免报错 - 处理客户名称中的特殊字符(如空格、引号),避免导出路径或查询语句出错
内容的提问来源于stack exchange,提问作者Bonneroo
相关产品推荐
相关产品推荐

