Python之Arcpy按位置選擇批處理(SelectLayerByLocation)

工作中,往常使用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!'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章