工作中,往常使用FME批量壓蓋選取不同城市的Link、Node數據(存儲於GDB地理數據庫),能否通過Python引用Arcpy順利實現上述功能?
已知Arcgis中的手動操作步驟:
1、使用城市範圍tile.shp按位置選擇Link.shp,導出城市範圍選擇出的Link.shp
2、使用城市範圍選擇出的Link.shp,按位置選擇導出本城市的Node.shp
記錄下嘗試過程及思考:
1、 預處理——GDB地理數據庫導出Shapefile
Feature Class To Shapefile (multiple),得到包含不同城市數據的Link.shp和Node.shp
2、 按位置選擇——SelectLayerByLocation_management()函數
使用說明書:Arcigis幫助,搜索想要使用的工具,函數的參數及用法示例很詳細。
注意:SelectLayerByLocation_management()函數的輸入參數需要lyr文件,而不能使用現有的shp文件。所以必須先做一步轉換——利用MakeFeatureLayer_management ()函數,使*.shp生成對應的*.lyr文件。
思考:查找資料首選正規詳盡的官方資料,養成這種習慣,省時省力。
3、 創建要素圖層——MakeFeatureLayer_management ()函數
繼續使用說明書,ARCGIS官網十分好用,搜索工具,這裏介紹詳盡。此函數根據輸入要素類或圖層文件創建要素圖層:
MakeFeatureLayer_management (in_features, out_layer, {where_clause}, {workspace}, {field_info})
注意:該工具創建的圖層是臨時圖層(過程文件,類似於函數的局部變量),如果不將此圖層主動保存,該圖層在會話結束後將不會繼續存在。
4、複製要素——CopyFeatures_management()
將處於選中狀態的Link\Node數據圖層複製爲新要素類,即提取出了某城市的Link.shp和Node.shp數據。
例:arcpy.CopyFeatures_management(LINK_lyr, CUT_Link)#複製要素:如果輸入是具有選定內容的圖層,則僅複製所選要素
注意:批量選擇出的城市Link\Node的Shapefile數據,*.dbf數據大小過大。在Arcgis中打開可以發現,屬性表中有大量冗餘字段值。相比FME的提取效果,還需進一步分析改進。
以2城市批處理爲例,實現代碼如下:
#coding='UTF-8'
#SelectLayerByLocation
import arcpy
arcpy.env.workspace = 'D:/PythonCode_inWork/07SelectLayerByLocation/01_LinkNode'
#以2城市測試
city_names={#配合arcpy包使用python2.7,注意語法
u'三亞':'SANYA',
u'東莞':'DONGGUAN'}#,
##u'中山':'ZHONGSHAN',
##u'烏魯木齊':'WULUMUQI',
##u'佛山':'FOSHAN',
##u'保定':'BAODING',
##u'蘭州':'LANZHOU',
##u'南京':'NANJING',
##u'南寧':'NANNING',
##u'南昌':'NANCHANG'
##u'南通':'NANTONG',
##u'廈門':'XIAMEN',
##u'台州':'TAIZHOU',
##u'合肥':'HEFEI',
##u'呼和浩特':'HUHEHAOTE',
##u'哈爾濱':'HAERBIN',
##u'唐山':'TANGSHAN',
##u'大連':'DALIAN',
##u'天津':'TIANJIN',
##u'太原':'TAIYUAN',
##u'寧波':'NINGBO',
##u'常州':'CHANGZHOU',
##u'徐州':'XUZHOU',
##u'惠州':'HUIZHOU',
##u'成都':'CHENGDU',
##u'揚州':'YANGZHOU',
##u'無錫':'WUXI',
##u'昆明':'KUNMING',
##u'杭州':'HANGZHOU',
##u'柳州':'LIUZHOU',
##u'武漢':'WUHAN',
##u'泉州':'QUANZHOU',
##u'濟南':'JINAN',
##u'海口':'HAIKOU',
##u'溫州':'WENZHOU',
##u'濰坊':'WEIFANG',
##u'煙臺':'YANTAI',
##u'珠海':'ZHUHAI',
##u'鹽城':'YANCHENG',
##u'石家莊':'SHIJIAZHUANG',
##u'福州':'FUZHOU',
##u'秦皇島':'QINHUANGDAO',
##u'紹興':'SHAOXING',
##u'蕪湖':'WUHU',
##u'蘇州':'SUZHOU',
##u'西寧':'XINING',
##u'西安':'XIAN',
##u'貴陽':'GUIYANG',
##u'鄭州':'ZHENGZHOU',
##u'重慶':'CHONGQING',
##u'金華':'JINHUA',
##u'銀川':'YINCHUAN',
##u'長春':'CHANGCHUN',
##u'長沙':'CHANGSHA',
##u'青島':'QINGDAO',
##u'瀋陽':'SHENYANG',
##u'廣州':'GUANGZHOU',
##u'上海':'SHANGHAI',
##u'深圳':'SHENZHEN',
##u'北京':'BEIJING'
##}
###GDB轉爲shp批量——要素類轉 Shapefile (轉換)
##arcpy.FeatureClassToShapefile_conversion (GDBspace, GDB_to_SHP)
#select overlap——按位置選擇
num = 0
GDBtoLinkNode = 'D:/PythonCode_inWork/07SelectLayerByLocation/01_LinkNode/GDBtoLinkNode/'
LINK = GDBtoLinkNode + 'RD_LINK.shp'
NODE = GDBtoLinkNode + 'RD_NODE.shp'
for city_k,city_v in city_names.items():
# Local variables:
RD_LINK = 'RD_LINK.shp'
RD_NODE = 'RD_NODE.shp'
CUT_CITY = city_v+'.shp'
LINK = arcpy.env.workspace + '/GDBtoLinkNode/' + RD_LINK
NODE = arcpy.env.workspace + '/GDBtoLinkNode/' + RD_NODE
CUT = arcpy.env.workspace + '/CUT/' + CUT_CITY
#清除已有'LINK_lyr'和'NODE_lyr'
#或每個城市'LINK_lyr'和'NODE_lyr'區分命名
LINK_lyr = city_v+'LINK_lyr'
NODE_lyr = city_v+'NODE_lyr'
CUT_lyr = city_v+'CUT_lyr'
# Process: SelectLayerByLocation_management
arcpy.MakeFeatureLayer_management(LINK, LINK_lyr)#參數必須爲內存圖層,不能用硬盤上的shp,否則會報錯
arcpy.MakeFeatureLayer_management(NODE, NODE_lyr)
arcpy.MakeFeatureLayer_management(CUT, CUT_lyr)
arcpy.SelectLayerByLocation_management(LINK_lyr, "INTERSECT", CUT_lyr, "", 'NEW_SELECTION')
arcpy.SelectLayerByLocation_management(NODE_lyr, "INTERSECT", LINK_lyr, "", 'NEW_SELECTION')
CUT_Link = arcpy.env.workspace + '/CUT_LinkNode/' + city_v+ '/'+RD_LINK
CUT_Node = arcpy.env.workspace + '/CUT_LinkNode/' + city_v+ '/'+RD_NODE
arcpy.CopyFeatures_management(LINK_lyr, CUT_Link)#複製要素:如果輸入是具有選定內容的圖層,則僅複製所選要素
arcpy.CopyFeatures_management(NODE_lyr, CUT_Node)
print city_v+' RD_LINK&NODE is OK!'
num += 1
print str(num)+'cities are OK!'