大数跨境
0
0

Arcpy升级到ArcGIS Pro

Arcpy升级到ArcGIS Pro GIS前沿
2022-12-06
0

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图层管理

arcpy.mp.ArcGISProject (aprx_path),aprx_path:包含现有 ArcGIS 工程 (.aprx) 的完整系统路径和文件名的字符串或包含 CURRENT 关键字的字符串,CURRENT是当前工程ArcGISProject属性,如表15-1所示。
表15-1 ArcGISProject的属性

属性

说明

数据类型

activeMap

(只读)

返回与应用程序内部焦点视图相关联的地图对象。如果布局视图处于活动状态,则其将返回与活动地图框相关联的地图

Map

activeView

(只读)

将返回 MapView 或 Layout,具体取决于当前视图。如果 ArcGIS Pro 工程未打开视图,或者活动视图为地图视图或布局视图之外的其他内容(例如,图表、表格、Model Builder 视图等),则将返回 None。

Object

dateSaved

(只读)

返回报告上次工程保存日期的 Python datetime 对象。

DateTime

defaultGeodatabase

(可读写)

工程的默认地理数据库位置。此字符串必须包含地理数据库的完整路径和文件名称。

String

defaultToolbox

(可读写)

工程的默认工具箱位置。此字符串必须包含工具箱的完整路径和文件名称。

String

documentVersion

(只读)

根据上次保存文档的时间返回文档版本。执行 savesaveACopy 将更新文档版本,以匹配应用程序版本。

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- 

ArcGIS Python 矢量数据批量裁剪
低代码助力数字孪生城市建设
从实景三维建模到数字孪生建模
从事测绘地信,这些插件和小工具可下载
GIS中拓扑检查和错误修改

【声明】内容源于网络
0
0
GIS前沿
分享测绘地信资讯,交流行业软件技巧。
内容 4549
粉丝 0
GIS前沿 分享测绘地信资讯,交流行业软件技巧。
总阅读68
粉丝0
内容4.5k