在GIS數據處理中,選擇數據是十分頻繁的操作,常用的是"按屬性選擇"和"按位置選擇",這兩個功能雖然比較強大,但有時也不能滿足實際需求。比如可能時常會遇到這樣一種情景:將指定OID(假設3和6)的要素選擇出來。
1、按屬性SQL選擇
最容易想到的是使用按屬性選擇構造WHERE子句("OBJECTID=3 OR OBJECTID=6")即可通過SQL選擇出來。
2、屬性連接
那么問題來了,如果給定的ID有100個,而且它們沒有什么規律,構造SQL語句會不會手軟呢?這也不難辦,使用屬性連接也可以選擇出來。
3、自定義選擇工具
有沒有簡便一點的、可重復使用的方式,不用連接、不用手動構造SQL子句,那就用代碼自動來構造查詢語句吧。
很簡單很實用的工具,代碼如下:
# -- coding:cp936 -- # --------------------------------------------------------------------------- # Fun : SelectFeatures # Author: gisweis # Date : 2020.10.25 # Email : # Notes : # --------------------------------------------------------------------------- import os import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import arcpy import string try: #參數1:輸入的圖層或表 table=arcpy.GetParameterAsText(0) #參數2:輸入的字段名稱 field=arcpy.GetParameterAsText(1) #參數2:輸入的編號文本 txt=arcpy.GetParameterAsText(2) oid_fieldname = arcpy.Describe(table).OIDFieldName L=[] with open(txt, "r") as f: for line in f.readlines(): line = line.strip('\n') if len(line) >0: L.append(' '+field+'=' + line + ' OR') L.append(' '+ oid_fieldname +'<0') where=''.join(L) arcpy.AddMessage(where) arcpy.SelectLayerByAttribute_management(table,"NEW_SELECTION",where) except arcpy.ExecuteError: arcpy.GetMessages()
4、兼容字符串類型
上面的代碼寫得匆忙,只考慮了數字型,沒有考慮字符串型號的,有不同學在問,其實也很簡單啦,加一個引號就行。效果如下:
非字符串就不加引號:
代碼如下:
# -- coding:cp936 -- # --------------------------------------------------------------------------- # Fun : SelectFeatures # Author: gisweis # Date : 2020.10.25 # Email : # Notes : 按屬性列表選擇指定要素 # --------------------------------------------------------------------------- import string import arcpy import os import sys reload(sys) sys.setdefaultencoding("utf-8") try: #參數1:輸入的圖層或表 table = arcpy.GetParameterAsText(0) #參數2:輸入的字段名稱 field = arcpy.GetParameterAsText(1) #參數2:輸入的編號文本 txt = arcpy.GetParameterAsText(2) #獲取 oid_fieldname = arcpy.Describe(table).OIDFieldName L = [] #判斷是否字符串類型 sep='' fieldType = arcpy.ListFields(table,field)[0] if(fieldType.type=="String"): sep="'" with open(txt, "r") as f: for line in f.readlines(): line = line.strip('\n') if len(line) > 0: L.append(' {0}={1}{2}{1} OR '.format(field,sep,line)) L.append(' {0}<0'.format(oid_fieldname)) where = ''.join(L) arcpy.AddMessage(where) arcpy.SelectLayerByAttribute_management(table, "NEW_SELECTION", where) except arcpy.ExecuteError: arcpy.GetMessages()