基於arcpy實現工作中需要實現功能的經驗和代碼總結:
不知道從哪兒總結起,就按時間順序整理吧。
關鍵詞:arcgis,python,批量,字段,地圖發布
1.給不同的要素添加不同的批量字段(例如:給“閥門”要素添加“本點號”、“點類型”、“狀態”等字段):
1.1直接在arcmap的python窗口中寫入腳本逐個添加,一次性運行:
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工具,新建一個工具,設置好參數,然後導入腳本:
參數設置:
打開界面:
腳本:
#導入arcpy和os模塊
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實現工作中需要實現功能的經驗和代碼總結: