ArcGIS Python指令碼七之查詢和選擇資料
目錄
三、使用Select Layer by Attribute工具選擇要素和行
四、使用Select Layer by Location工具選擇要素
從地理圖層中選擇要素或者從獨立屬性表中選擇行是最常見的GIS操作之一。
可以通過構造查詢條件來選擇要素,如屬性查詢或空間查詢:
- 屬性查詢 —— 使用SQL語句來選擇要素或行
- 空間查詢 —— 根據要素之間的空間關係來選擇要素
此外,也可以同時使用屬性查詢和空間查詢。
一、構造正確的屬性查詢語句
①需要注意完整的查詢語句應該用單引號引起來:
qry = '"SVCAREA" = \'North\''
②"NULL"值與“0”是不一樣的,"NULL"值表明資料為空,而“0”值表明資料的值為0。
③SQL萬用字元:
- 個人地理資料庫中 —— 使用" * "字元代替多個字元,使用" ? "字元代替單個字元。
- 除個人地理資料庫以外 —— 使用" %
二、建立要素圖層和表檢視
在單獨的Python指令碼中呼叫”Select Layer by Attribute“或"Select Layer by Location”工具時,要求建立一個中間資料集,而不是直接使用要素類或表。
這些中間資料集是臨時性的,被稱為要素圖層或表檢視。
與要素類和表不同,這些臨時的資料集並不是磁碟上或地理資料庫中實際的檔案,而是要素類和表在記憶體中的表示。
它們只有在Python指令碼中執行時才是有效的,在工具執行完成後就會從記憶體中移除。
“Make Feature Layer”工具用於生成要素類的記憶體副本,生成的臨時要素圖層(記憶體副本)可以用來構造查詢、選擇集和連線表等。
“Make Table View”工具用於建立表的記憶體副本。
除了通過Python指令碼呼叫,也可以在工具箱中找到該工具:
使用“Make Feature Layer"工具的語法如下所示:
使用"Make Table View”工具的語法如下所示:
示例:
import arcpy # 匯入arcpy站點包
arcpy.env.workspace = "C:\ArcpyBook\data\CityOfSanAntonio.gdb" # 設定工作空間
try:
flayer = arcpy.MakeFeatureLayer_management("Burglary", "Burglary_Layer")
except Exception as e:
print(e.message)
示例:
import arcpy # 匯入arcpy站點包
arcpy.env.workspace = "C:\ArcpyBook\data\CityOfSanAntonio.gdb" # 設定工作空間
try:
tView = arcpy.MakeTableView_management("Crime2009Table", "Crime2009TView")
except Exception as e:
print(e.message)
“Make Feature Layer"和"Make Table View"工具分別建立了要素類和表的記憶體副本。
當在Python指令碼中呼叫"Select Layer by Attribute"和"Select Layer by Location"工具時,都需要將這些臨時記憶體副本作為引數。
三、使用Select Layer by Attribute工具選擇要素和行
"Select Layer by Attribute"工具需要使用要素圖層或表檢視和選擇型別等引數來選擇記錄。
預設情況下,選擇型別是"NEW SELECTION",即建立新選擇集。此外還有一些其他的選擇型別:
示例:
import arcpy # 匯入arcpy站點包
""" 將工作空間設定為CityOfSanAntonio地理資料庫 """
arcpy.env.workspace = "C:\ArcpyBook\data\CityOfSanAntonio.gdb"
try:
qry = '"SVCAREA" = \'North\''
flayer = arcpy.MakeFeatureLayer_management("Burglary", "Burglary_Layer") # 建立Burglary要素類的記憶體副本
""" 呼叫“Select Layer by Attribute”工具,傳入剛建立的要素圖層、選擇型別和查詢語句等3個引數 """
arcpy.SelectLayerByAttribute_management(flayer, "NEW_SELECTION", qry)
""" 使用"Get Count"工具獲取圖層中選擇記錄的總數並將其輸出。"""
cnt = arcpy.GetCount_management(flayer)
print("The number of selected records is: " + str(cnt))
except Exception as e:
""" 新增except語句和輸出錯誤資訊的程式碼行 """
print(e.message)
四、使用Select Layer by Location工具選擇要素
當使用"Select Layer by Location"工具選擇要素時,可以指定不同的空間關係型別來獲取滿足條件的要素:
在"Select Layer by Location"視窗中,只有輸入要素圖層這一個必選引數,其他都是可選引數,如空間關係、搜尋距離、選擇要素(用於選擇輸入要素圖層中的要素)和選擇型別等。
示例:
import arcpy # 匯入arcpy站點包
arcpy.env.workspace = "C:\ArcpyBook\data\CityOfSanAntonio.gdb" # 設定工作空間
try:
""" 建立要素類的記憶體副本"""
flayer = arcpy.MakeFeatureLayer_management("Burglary", "Burglary_Layer")
""" 呼叫SelectLayerbyLocation工具"""
arcpy.SelectLayerByLocation_management(flayer, "COMPLETELY_WITHIN", "C:\ArcpyBook\Ch7\EdgewoodSD.shp")
""" 呼叫Get Count工具獲取圖層中選擇記錄的總數並將其輸出"""
cnt = arcpy.GetCount_management(flayer)
print("The number of selected records is: " + str(cnt))
except Exception as e:
""" 輸出錯誤資訊 """
print(e.message)
在上述示例中,沒有定義可選的搜尋距離和選擇型別引數。在預設情況下,選擇型別是“NEW SELECTION"。而搜尋距離沒有預設值,需要使用者來定義。
現在指定一個搜尋距離來說明它是如何工作的:
import arcpy # 匯入arcpy站點包
arcpy.env.workspace = "C:\ArcpyBook\data\CityOfSanAntonio.gdb" # 設定工作空間
try:
""" 建立要素類的記憶體副本"""
flayer = arcpy.MakeFeatureLayer_management("Burglary", "Burglary_Layer")
""" 呼叫SelectLayerbyLocation工具"""
arcpy.SelectLayerByLocation_management(flayer, "WITHIN_A_DISTANCE", "C:\ArcpyBook\Ch7\EdgewoodSD.shp", "1 MILES")
""" 呼叫Get Count工具獲取圖層中選擇記錄的總數並將其輸出"""
cnt = arcpy.GetCount_management(flayer)
print("The number of selected records is: " + str(cnt))
except Exception as e:
""" 輸出錯誤資訊 """
print(e.message)
另外,可以呼叫"Copy Features"工具將臨時圖層寫入一個新的要素類中:
import arcpy # 匯入arcpy站點包
arcpy.env.workspace = "C:\ArcpyBook\data\CityOfSanAntonio.gdb" # 設定工作空間
try:
""" 建立要素類的記憶體副本"""
flayer = arcpy.MakeFeatureLayer_management("Burglary", "Burglary_Layer")
""" 呼叫SelectLayerbyLocation工具"""
arcpy.SelectLayerByLocation_management(flayer, "WITHIN_A_DISTANCE", "C:\ArcpyBook\Ch7\EdgewoodSD.shp", "1 MILES")
""" 呼叫Copy Features工具將臨時圖層寫入到一個新的要素類中"""
arcpy.CopyFeatures_management(flayer, "C:\ArcpyBook\Ch7\EdgewoodBurglaries.shp")
except Exception as e:
""" 輸出錯誤資訊 """
print(e.message)
五、結合空間查詢和屬性查詢選擇要素
有些情況下,需要結合屬性查詢和空間查詢兩種查詢條件來選擇要素。例如,要選擇Edgewood學校星期一發生的所有盜竊案,就需要依次使用"Select Layer by Location"和"Select Layer by Attribute"工具並應用"SUBSET_SELECTION"選擇型別。
示例:
import arcpy # 匯入arcpy站點包
""" 設定工作空間 """
arcpy.env.workspace = "C:\ArcpyBook\data\CityofSanAntonio.gdb"
try:
qry = '"DOW" = \'Mon\''
""" 建立要素圖層 """
flayer = arcpy.MakeFeatureLayer_management("Burglary", "Burglary_Layer")
""" 執行Select Layer by Location工具 """
arcpy.SelectLayerByLocation_management(flayer, "COMPLETELY_WITHIN", "C:\ArcpyBook\Ch7\EdgewoodSD.shp")
""" 執行Select Layer by Attribute工具, 查詢與之前定義的qry查詢變數相匹配的所有盜竊案,這是一個子集查詢"""
arcpy.SelectLayerByAttribute_management(flayer, "SUBSET_SELECTION", qry)
""" 輸出選擇記錄的總數 """
cnt = arcpy.GetCount_management(flayer)
print("The total number of selected records is: " + str(cnt))
except Exception as e:
print(e.message)
輸出:
結果: