1. 程式人生 > >基於arcpy實現工作中需要實現功能的經驗和代碼總結:

基於arcpy實現工作中需要實現功能的經驗和代碼總結:

命名 parameter gem 叠代器 aps .... pri 工具箱 文件夾

不知道從哪兒總結起,就按時間順序整理吧。

關鍵詞:arcgis,python,批量,字段,地圖發布

1.給不同的要素添加不同的批量字段(例如:給“閥門”要素添加“本點號”、“點類型”、“狀態”等字段):

1.1直接在arcmappython窗口中寫入腳本逐個添加,一次性運行:

import arcpy,os

arcpy.AddField_management("閥門","本點號","TEXT","","","","","NULLABLE","NON_REQUIRED")

arcpy.AddField_management("閥門","點類型","TEXT","","","","","NULLABLE","NON_REQUIRED")

arcpy.AddField_management("閥門","狀態","TEXT","","","","","NULLABLE","NON_REQUIRED")

1.2利用ARCToolbox工具,新建一個工具,設置好參數,然後導入腳本:

參數設置:

打開界面:

腳本:

#導入arcpyos模塊

import arcpy,os

layerList=arcpy.GetParameterAsText(0).split(";")

for lyr in layerList:

arcpy.AddField_management(lyr,"本點號","TEXT","","","","","NULLABLE","NON_REQUIRED")

arcpy.AddField_management(lyr,"點類型","TEXT","","","","","NULLABLE","NON_REQUIRED")

arcpy.AddField_management(lyr,"口徑","TEXT","","","","","NULLABLE","NON_REQUIRED")

arcpy.AddField_management(lyr,"狀態","TEXT","","","","","NULLABLE","NON_REQUIRED")

2.多要素添加相同的批量字段:

2.1利用ARCToolbox工具,新建一個工具,設置好參數,然後導入腳本:

參數設置:

打開界面:

腳本:

import arcpy,os

#定義變量

#對應的第一個“輸入表”的參數,將多個圖層用“;”分開

layerList=arcpy.GetParameterAsText(0).split(";")

#對應的第二個“字段名”的參數,後面的依次類推

fieldName=arcpy.GetParameterAsText(1)

fieldType=arcpy.GetParameterAsText(2)

fieldPrecision=arcpy.GetParameterAsText(3)

fieldScale=arcpy.GetParameterAsText(4)

fieldLength=arcpy.GetParameterAsText(5)

fieldAlias=arcpy.GetParameterAsText(6)

fieldIsNullable=arcpy.GetParameterAsText(7)

fieldIsRequired=arcpy.GetParameterAsText(8)

fieldDomain=arcpy.GetParameterAsText(9)

#遍歷每一個表,將傳入工具箱中有關字段的參數傳入AddField_management()函數中

for lyr in layerList:

arcpy.AddField_management(lyr,fieldName,fieldType,fieldPrecision,fieldScale,fieldLength,fieldAlias,fieldIsNullable,fieldIsRequired,fieldDomain)

3.批量發布*.mxd地圖文檔(發布之前確保地圖文檔符合發布的要求):

3.1將要發布的批量地圖文檔放在同一文件夾下,然後在arcpy的窗口中導入腳本:

腳本:

import arcpy.mapping as mapping

import os

#地圖文檔存放的路徑

folder=r‘C:\Users\46243\Desktop\PublishTest‘

#遍歷每一個地圖文檔

files=os.listdir(folder)

for f in files:

service=f.replace(".mxd","")

mxdpath=os.path.join(folder,f)

sddraft=mxdpath.replace(".mxd",".sddraft")

mxd=mapping.MapDocument(mxdpath)

mapping.CreateMapSDDraft(mxd,sddraft,service)

analysis=mapping.AnalyzeForSD(sddraft)

sd=mxdpath.replace(".mxd",".sd")

insever="GIS 服務器/myServerConnection"

if analysis[‘errors‘]=={}:

arcpy.StageService_server(sddraft,sd)

arcpy.UploadServiceDefinition_server(sd,insever)

else:

print(analysis[‘errors‘])

(註意地圖文檔用英文命名,用中文會報錯,應該是字符編碼導致的問題)

3.2利用ARCToolbox工具,新建一個工具,設置好參數,然後導入腳本:

參數設置:

打開界面:

腳本:

import arcpy.mapping as mapping

import os

#傳入變量

mxdPaths=arcpy.GetParameterAsText(0).split(";")

insever=arcpy.GetParameterAsText(1)

for mxdpath in mxdPaths:

sddraft=mxdpath.replace(".mxd",".sddraft")

f=mxdpath.split("\\")[-1]

service=f.replace(".mxd","")

mxd=mapping.MapDocument(mxdpath)

mapping.CreateMapSDDraft(mxd,sddraft,service)

analysis=mapping.AnalyzeForSD(sddraft)

sd=mxdpath.replace(".mxd",".sd")

if analysis[‘errors‘]=={}:

arcpy.StageService_server(sddraft,sd)

arcpy.UploadServiceDefinition_server(sd,insever)

else:

print(analysis[‘errors‘])

未完待續......

(模型構建器裏的叠代器也是個實現批量處理的好東西,等下次再寫這個東西。)

基於arcpy實現工作中需要實現功能的經驗和代碼總結: