
ArcMap中arcpy中python2.7,90%的代码可以移植,使用“针对Pro分析工具(AnalyzeToolsForPro)”自动升级到ArcGIS Pro,如图15-1所示,ArcGIS Pro 2.,6中python是3.6.10,由于编码是UTF8,汉字支持好,可以直接使用汉字做变量,乱码问题少了很多。

图15-1 python源代码升级工具
升级到Pro主要以下几点:
1.print “ok” 修改为 print(”ok”)
2.ArcMap布局只能矩形,Pro可以是圆形,多边形的,ArcMap可以插入元素,Pro中地图不能插入元素,ArcGIS Pro软件可以在线更新。
3.string.split(kkk, ";") 修改kkk.split(";")
4.Pro不需要加 u"没有数据",源码前面一定#coding=utf8
5.ArcMap mystr.decode('utf-8'),Pro不可以。
6.在ArcMap中可以unicode(titlestr) ,Pro不需要。
7.arcpy.CreatePersonalGDB_management(os.path.dirname(out_mdb),os.path.basename(out_mdb)),文件地理数据库10.0和Pro是兼容的。
8.ArcMap是默认是绝对路径,Pro是相对路径。
9.arcmap中filepath+“/Band_1“ ,Pro中filepath+”/Layer_1“ 偶尔出现
10.arcpy.mapping修改arcpy.mp,变化最大就是这个,后面重点介绍。
11.ArcMap中string.atof ,Pro中float。
12.ArcMap中arcpy.ConstructSightLines_3d而Pro中采用: arcpy.ddd.ConstructSightLines
13.arcmap string.find(toolbox,"(") Pro修改toolbox.find(toolbox,"(")
14.Pro没有arcpy.RefreshActiveView()
15.异常处理
lArcMap 代码如下
import arcpy
try:
a=1/0
print(a)
except Exception as e:
arcpy.AddError(e.message)
lPro中写法:
import arcpy
try:
1/0
except Exception as e:
arcpy.AddError(e)
16.增加图层
Pro中增加图层
import arcpy
mxd = arcpy.mp.ArcGISProject("CURRENT")
df = mxd.listMaps()[0]
addLayer = df.addDataFromPath(outFeature)
df.addLayer(addLayer)
Map中增加图层
import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
addLayer = arcpy.mapping.Layer(outFeature)
arcpy.mapping.AddLayer(df, addLayer, "AUTO_ARRANGE")
15.1图层管理
属性 |
说明 |
数据类型 |
activeMap (只读) |
返回与应用程序内部焦点视图相关联的地图对象。如果布局视图处于活动状态,则其将返回与活动地图框相关联的地图。 |
Map |
activeView (只读) |
将返回 MapView 或 Layout,具体取决于当前视图。如果 ArcGIS Pro 工程未打开视图,或者活动视图为地图视图或布局视图之外的其他内容(例如,图表、表格、Model Builder 视图等),则将返回 None。 |
Object |
dateSaved (只读) |
返回报告上次工程保存日期的 Python datetime 对象。 |
DateTime |
defaultGeodatabase (可读写) |
工程的默认地理数据库位置。此字符串必须包含地理数据库的完整路径和文件名称。 |
String |
defaultToolbox (可读写) |
工程的默认工具箱位置。此字符串必须包含工具箱的完整路径和文件名称。 |
String |
documentVersion (只读) |
根据上次保存文档的时间返回文档版本。执行 save 或 saveACopy 将更新文档版本,以匹配应用程序版本。 |
String |
filePath (只读) |
返回报告完全限定的工程路径和文件名的字符串值。 |
String |
homeFolder (可读写) |
工程的主目录文件夹位置。此字符串必须包含所需位置的完整路径。 |
String |
dateSaved (只读) |
返回报告上次工程保存日期的 Python datetime 对象。 |
DateTime |
defaultGeodatabase (可读写) |
工程的默认地理数据库位置。此字符串必须包含地理数据库的完整路径和文件名称。 |
String |
defaultToolbox (可读写) |
工程的默认工具箱位置。此字符串必须包含工具箱的完整路径和文件名称。 |
String |
ArcGISProject方法概述,如表15-2所示。
表15-2 ArcGISProject方法
方法 |
说明 |
importDocument (document_path, {include_layout}, {reuse_existing_maps}) |
将地图文档 (.mxd)、globe 文档 (.3dd) 和 scene 文档 (.sxd) 导入到 ArcGIS Pro 工程中。还可以导入地图文件 (.mapx)、布局文件 (.pagx) 和报表文件 (.rptx) 的内容。 |
listBrokenDataSources () |
返回项目中到所有地图原始源数据的连接存在断开情况的 Layer 和/或 Table 对象的 Python 列表。 |
listLayouts ({wildcard}) |
返回 ArcGIS 工程 (.aprx) 中的 Layout 对象的 Python 列表。 |
listMaps ({wildcard}) |
返回 ArcGIS 工程 (.aprx) 中的 Map 对象的 Python 列表。 |
save () |
将更改保存至 ArcGISProject (.aprx)。 |
15.1.1 打开所有图层
运行界面没有参数,当前工程地图,打开所有图层,代码如下
#coding: UTF-8
import arcpy
import os
import types
import string
def main():
ap=arcpy.mp.ArcGISProject("CURRENT")
pMap=ap.activeMap
for lyr in pMap.listLayers():
lyr.visible=True
if __name__ == '__main__':
main()
15.1.2 关闭所有图层
当前工程地图,关闭所有图层,代码如下:
#coding: UTF-8
#######################
import arcpy
import os
import types
import string
def main():
ap=arcpy.mp.ArcGISProject("CURRENT")
pMap=ap.activeMap
for lyr in pMap.listLayers():
lyr.visible=False
if __name__ == '__main__':
main()
15.1.3 删除所有的图层和表格
当前工程地图,删除所有的图层和表格,代码如下:
#coding: UTF-8
#######################
import arcpy
import os
import types
import string
def main():
ap=arcpy.mp.ArcGISProject("CURRENT")
pMap=ap.activeMap
for lyr in pMap.listLayers():
if lyr!=None:
pMap.removeLayer(lyr)
for table in pMap.listTables():
if table!=None:
pMap.removeTable(table)
if __name__ == '__main__':
main()
15.2 工程导出
15.2.1 当前工程布局导出图片
把当前工程中所有的布局导出图片,导出图片格式可以是PDF、JPG、TIF和分辨率300DPI,导出图片文件名和布局名字一致,如图15-2所示。

图15-2 当前工程导出图片
#coding: UTF-8
#######################
import arcpy
import os
import types
import string
def main():
imgFMT = arcpy.GetParameterAsText(0)
aprx=arcpy.mp.ArcGISProject("current")
out_path=aprx.homeFolder;
for lyt in aprx.listLayouts():#对布局循环
if (imgFMT==".PDF"):
lyt.exportToPDF(out_path+"\\"+lyt.name+".pdf", resolution=300)
elif (imgFMT==".JPG"):
lyt.exportToJPEG(out_path+"\\"+lyt.name+".jpg", resolution=300)
elif (imgFMT==".PNG"):
lyt.exportToPNG(out_path+"\\"+lyt.name+".PNG", resolution=300)
if __name__ == '__main__':
main()
15.2.2 代码实现页面驱动
如图15-3所示,按XZQ记录,固定比例尺1:10万,导出PDF、JPG和PNG格式图片,导出图片位置在工程目录,文件名是唯一值字段值。

图15-3代码实现页面驱动
#coding: UTF-8
#######################
import arcpy
import os
import types
import string
import time
def main():
in_Layer = arcpy.GetParameterAsText(0)
fieldName =("ShAPE@",arcpy.GetParameterAsText(1))
in_Fileext = arcpy.GetParameterAsText(2).upper()
aprx=arcpy.mp.ArcGISProject("current")
list = aprx.listLayouts()
num=len(list)
arcpy.AddMessage("num="+str(num))
if num<1:
arcpy.AddMessage("没有布局视图=======")
return
lyt = aprx.listLayouts()[0]
if lyt==None:
arcpy.AddMessage("没有布局视图")
return
mf = lyt.listElements("MAPFRAME_ELEMENT")[0] #获得地图框
presolution=300
pPath=aprx.homeFolder+"/"
mf.map.clearSelection() #清除选择
arcpy.management.RepairGeometry(in_Layer, "DELETE_NULL", "ESRI") #不修复几何,会自动退出
with arcpy.da.SearchCursor(in_Layer, fieldName) as cursor:
for row in cursor:
try:
pgeo=row[0]
fieldValue=row[1]
pExtent=pgeo.extent
mf.camera.setExtent (pExtent) #设置范围
pscale= mf.camera.scale
myScale=100000
pscale=(int(pscale/myScale)+1)*myScale
arcpy.AddMessage("比例尺:"+str(myScale))
mf.camera.scale=pscale #设置比例尺
time.sleep(10)
if in_Fileext=="PDF":
out_pdf=pPath+fieldValue+".pdf"
arcpy.AddMessage("out_pdf="+out_pdf)
lyt.exportToPDF(out_pdf, resolution=presolution)
elif in_Fileext=="JPG":
out_pdf = pPath + fieldValue + ".jpg"
arcpy.AddMessage("out_pdf=" + out_pdf)
lyt.exportToJPEG(out_pdf, resolution=presolution)
else:
out_pdf = pPath + fieldValue + ".png"
arcpy.AddMessage("out_pdf=" + out_pdf)
lyt.exportToPNG(out_pdf, resolution=presolution)
except arcpy.ExecuteError:
arcpy.AddError(arcpy.GetMessages(2))
if __name__ == '__main__':
main()
15.2.3 地图系列批量打印
布局中有地图系列批量导出图片,输入工程可以自己选择,不选择就是当前工程,不选合并成一个PDF,每个序列导出一个PDF文件,否则合并成一个总的PDF。如图15-4所示。

图15-4 地图系列批量打印
#coding: UTF-8
#######################
import arcpy
import os
import types
import string
def expone(aprx,out_Path):
for l in aprx.listLayouts():
if not l.mapSeries is None:
ms = l.mapSeries #获得地图序列
if ms.enabled:
arcpy.AddMessage(out_Path+"\\"+l.name+".pdf")
ms.exportToPDF(out_Path+"\\"+l.name+".pdf", "ALL", resolution=300)
else:
arcpy.AddMessage(l.name+"没有序列")
def expmany(aprx, out_Path):
for l in aprx.listLayouts():
if not l.mapSeries is None:
ms = l.mapSeries
if ms.enabled:
for pageNum in range(1, ms.pageCount + 1):
ms.currentPageNumber = pageNum #设置当前页
#FieldName=ms.pageNameField.name
#arcpy.AddMessage("ms.pageNameField="+FieldName)
pRow=ms.pageRow #获得当前行
#arcpy.AddMessage(type(pRow))
pageName = pRow[1]
arcpy.AddMessage("pageName=" + str(pageName))
#l.exportToPNG(os.path.join(relpath, "Output", f"Ex2_{ms.pageRow.STATE_NAME}.png"))
arcpy.AddMessage(out_Path+"\\"+l.name+"_"+pageName+".pdf")
ms.exportToPDF(out_Path+"\\"+l.name+"_"+pageName+".pdf", "CURRENT", resolution=300)
else:
arcpy.AddMessage(l.name + "没有序列")
def main():
in_aprx = arcpy.GetParameterAsText(0)
out_Path=arcpy.GetParameterAsText(1)
isone = arcpy.GetParameter(2)
if in_aprx=="": #没有取当前
aprx=arcpy.mp.ArcGISProject("current")
else:
aprx = arcpy.mp.ArcGISProject(in_aprx)
if out_Path=="":
out_Path=aprx.homeFolder
if isone:#合并成一个
expone(aprx,out_Path)
else:
expmany(aprx, out_Path)
if __name__ == '__main__':
main()
文章授权转载:gisoracle
- END-
低代码助力数字孪生城市建设
从实景三维建模到数字孪生建模
从事测绘地信,这些插件和小工具可下载
GIS中拓扑检查和错误修改




