1. 程式人生 > >ArcGIS Python指令碼七之查詢和選擇資料

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)

    輸出:

    結果: