目录
三、使用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)
输出:
结果: