ArcGIS Python编程案例(8)-数据查询和选择

第七章 创建自定义地理处理工具 ||| 第九章 ArcPy数据访问模块


我们将在本章中介绍以下案例:

  • 构建正确的属性查询语句
  • 创建要素类和表视图
  • 使用按属性选择图层工具(Select Layer by Attribute)选择要素和行
  • 使用按位置选择图层工具(Select Layer by Location)选择要素
  • 结合使用空间查询和属性查询

引言

从地理图层中选择要素或从独立的表中选择行数据是最为普遍的GIS操作。属性查询或空间查询能够完成这样的选择操作。属性查询是通过数据集中的一个或多个字段或列使用SQL语句来选择要素或行数据。比如“选择价值大于500000美元的所有地块”。空间查询是基于某些空间关系来选择要素。比如“选择与一个洪泛区相交的所有地块”或者“选择完全位于德州Travis县的所有街道”。也有可能需要结合属性查询和空间查询,比如“选择与一个洪泛区相交且价值大于500000美元的所有地块”。

构建正确的属性查询语句

构建正确的属性查询语句对于能否成功创建用于查询要素和表的地理处理脚本来说是至关重要的。针对要素类和表的所有查询语句都需要符合正确的SQL语法,也需要遵循多种规则,而这些规则又依赖于你所要执行查询操作的数据类型。

Getting ready

创建属性查询语句即需要编写能够与按属性选择工具(Select by Attributes)中的查询语句结合使用的Python脚本。这些查询语句都是基本的SQL语句以及一些你需要掌握的其他特性。如果你已经对ArcMap中创建查询语句有很好的理解或是在其他编程语言中有过创建SQL语句的经验,那么构建属性查询语句对你来讲就会相对容易些。除了需要创建正确的SQL语句,你还需要注意一些特定的Python语法以及由于数据类型差异引起的语句格式的变化。在本案例中,你将学习如何构建正确的查询语句以及了解不同的数据类型在语法上和特定的Python语句结构上的细微差别。

How to do it...

我们一开始会先看一下如何在ArcMap中构建查询语句,这样你就可以感受一下如何构建查询语句:
1.在ArcMAP中打开C:\ArcpyBook\Ch8\Crime_Ch8.mxd文件。
2.右键单击Burglaries in 2009图层选择打开属性表(Open Attribute Table)。你看到类似于下图的属性表弹出。我们要使用SVCAREA字段进行查询:

3.在打开的属性表中,选择表选项(Table Option)按钮,选择按属性选择(Select by Attributes)弹出一个对话框来让你构建一个属性查询语句。
你会看到在查询对话框中的Select * FROM Burglary WHERE:语句(如下图所示)。这是一个基本的SQL语句用来返回Burglary in 2009属性表中满足我们定义的条件的所有数据。星号(*)表示所有的字段都会返回:

4.确认方法(Method)下拉列表中选中了创建新的选择内容(Create a new selection)项。这将会创建一个新的选择数据集。
5.双击字段列表中的SVCAREA,将其添加到SQL语句中,如下图所示:

6.点击“=”按钮。
7.点击获取唯一值(Get Unique Values)按钮。
8.生成的值列表中,双击'North'完成SQL语句,如下图所示:

9.点击应用(Apply)按钮执行查询。查询结果会选择7520条记录。许多人会误认为只要简单地将这种方式创建的查询语句粘贴到Python脚本中就可以了。事实上并非如此。接下来我们会介绍一些重要的差别。
10.关闭按属性选择窗口和Burglaries in 2009属性表。
11.点击选择|清除所选要素(Selection|Clear Selected Features)来清除所选要素。
12.打开Python窗口,导入arcpy模块:

import arcpy

13.创建一个新的变量来保存查询语句,将之前创建的语句添加到代码中:

qry = "SVCAREA" = 'North'

14.按下键盘上的回车键,你会看到类似于下面的错误消息:

Runtime error SyntaxError: can't assign to literal (<string>, line  1)

Python将SVCAREANorth解释为字符串,但是两者之间的等号并不能当做字符串的部分来给qry变量赋值。因此编写一个对于Python解释器来讲语法正确的语句前你需要先处理几个问题来。
你需要特别注意一件重要的事情。查询语句中使用的字段需要用双引号括起。在本案例中,SVCAREA字段是查询语句中唯一使用的字段,而且已经被双引号括起。当你处理shapefiles,文件地理数据库或ArcSDE地理数据库的时候都可以这样处理。不过这里有一个小的问题。如果你处理的是个人地理数据库的数据,如下示例代码所示,字段名称就需要使用方括号而不是双引号括起。这一点肯定会让开发人员感到困惑。

qry = [SVCAREA] = 'North'

现在我们需要处理'North'两侧的单引号。通过一个文本类型的字段查询数据时,字符串值必须使用引号括起。查看原始的查询语句,你会注意到我们已经将North使用引号括起来了,一切都没问题啊?不过这对于Python来讲就没有这么简单。引号以及一些其他字符必须在该字符前使用反斜线(\)进行转义。在本案例中,转义序列则是'。
1.使用转义序列修改查询语句:

qry = "SVCAREA" = \'North\'

2.最后,这个查询语句需要用引号括起:

qry ='"SVCAREA" = \'North\''

除了用于测试相等的等号(=)之外,你还可以在字符串和数值数据中使用其他一些运算符,包括不等于(<>),大于(>),大于等于(>=),小于(<)以及小于等于(<=)。
针对shapefile文件,文件地理数据库和ArcSDE地理数据库,还可以包含%_的通配符。其中%表示任意数量的字符。LIKE运算符经常与通配符一起来执行部分字符串匹配。比如,下面的查询语句会查找服务区名称以N开头的所有记录。

qry = '"SVCAREA" LIKE \'N%\''

下划线(_)用于表示任意单个字符。对于个人地理数据库来讲,星号(*)用于表示任何数量的字符而()用于表示单个字符。
你还可以查询缺失的数据,也就是NULL值。NULL值通常会误认为是零值,但实际上并不是。NULL表示数据缺失,这与零值是有区别的。Null运算符包括IS NULLIS NOT NULL。下面的示例代码会查找SVCAREA字段为空的所有记录:

qry = '"SVCAREA' IS NULL'

该部分中,我们说明的最后一个问题就是当需要匹配多个查询条件时,如何使用运算符来组合多个表达式。AND运算符要求查询结果要满足所有的查询条件。OR运算符则要求查询结果至少满足一个查询条件。

How it works...

创建语法正确的查询语句是在ArcGIS中使用Python编程具有挑战性的工作之一。不过你一旦理解了基本的规则,就会变得容易些。在该部分内容中,我们会总结一些规则。其中较为重要的一项就是要注意个人地理数据库的字段引用使用方括号,而其他数据集使用双引号。
你还可以使用AddFieldDelimiters()函数来为不同的数据源添加正确的字段分隔符,只要将数据源作为参数传递给函数即可。该函数语法如下:
AddFieldDelimiters(datasource,field)
此外对于大多数人,尤其是刚接触Python编程的新人来讲,会受困于在查询语句中如何为字符串值添加单引号。在Python中,引用引号时必须在引号前使用反斜线来实现字符转义。使用转义序列可以保证Python将其当做一个引号而不是字符串结束符。
最后,你需要花点时间来熟悉一下通配符。除了个人地理数据库,其他数据集使用百分号(%)字符表示多个字符而下划线(_)字符来表示单个字符。如果你当前使用的是个人地理数据库,那么星号(*)字符用于匹配多个字符而问号()字符来匹配单个字符。显而易见,个人地理数据库与其他数据集在语法上的差异会导致一些困惑。

创建要素图层和表视图

要素图层和表视图会作为临时存储在内存上的中间数据集,来专门用于像按位置选择和按属性选择工具的一类工具。尽管这些临时数据集可以保存,不过大多数情况下都不需要。

Getting ready

要素类是地理数据的物理表现,并以文件形式(shapefiles,个人地理数据库以及文件地理数据库)或在地理数据库形式存储。ESRI将要素类定义为“具有相同几何属性(点,线或面),属性表和空间参考的要素的集合。”
要素类中包含了默认字段和用户自定义字段。默认字段包括SHAPEOBJECTID字段。这些字段由ArcGIS自动维护并更新。SHAPE字段记录地理要素的几何表达,而OBJECTID字段则记录每一个要素的唯一识别码。其他的默认字段依赖于要素类的数据类型。线要素会包含一个SHAPE_LENGTH字段。面要素则会包含SHAPE_LENGTHSHAPE_AREA两个字段。
ArcGIS用户创建的字段不能通过GIS自动进行字段更新。这些字段包含了要素类相关的属性信息,可以通过脚本进行更新。
表是作为独立的DBF文件或保存在地理数据库中属性表的物理表达。表和要素类都包含属性信息。不过表只包含属性信息,不包括SHAPE字段,有可能包含一个OBJECTID字段。
调用按位置选择按属性选择工具的Python脚本会要求你创建一个中间数据集,这些中间数据集是称为要素图层(Feature Layers)表视图(Table Views)的临时文件。不同于要素类和表,这些临时数据集不能表达真实存储在硬盘或地理数据库中的文件。相反,它们是要素类和表在内存中的表现形式。只有当脚本运行时这些数据集才被激活。脚本执行完成后会从内存中清除。不过,如果脚本是在ArcGIS中作为脚本工具来执行的话,这些临时图层可以通过右键选择保存图层文件(Save As Layer File)或简单地保存地图文档文件来保存到硬盘中。
你在脚本中调用按属性选择按位置选择工具之前,必须先单独创建要素图层和表视图。创建要素图层(Make Feature Layer)工具会生成要素类在内存中的表现形式,之后可用于创建查询和选择数据集以及关联表。完成以上操作之后,你就可以调用按属性选择按位置选择工具了。类似的,创建表视图(Make Table View)工具用于创建表在内存中的表现形式。该工具的功能与创建要素图层工具一样。创建要素图层创建表视图工具都需要一个输入数据集,一个输出图层名称以及一个可选的查询表达式参数,其中查询表达式可用来限制输出图层中的要素或行数据。另外,创建表视图工具和创建要素图层工具都位于Data Management工具箱下面。
以下是创建要素图层工具语法:
arcpy.MakeFeatureLayer_management(<input feature class>,<output layer name>,{where clause})
以下是创建表视图工具语法:
arcpy.MakeTableView_management(<input table>,<output table name>,{where clasue})
在本案例中,你将学习如何使用创建要素图层工具和创建表视图工具。案例中的脚本会在ArcGIS中完成,这样你就可以看到图层在内存中的备份。

How to do it...

按照以下步骤来学习如何使用创建要素图层工具和创建表视图工具:
1.在ArcMap中打开C:\ArcpyBook\Ch8\Crime_Ch8.mxd文件。
2.打开Python窗口。
3.导入arcpy模块:

import arcpy

4.设置工作空间路径:

arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"

5.添加try语句块:

try:

6.使用创建要素图层工具创建Burglary要素类在内存中的备份。确保以下代码的缩进以位于try语句块中:

flayer = arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")

7.添加except语句块并添加一行代码来打印错误消息:

except:
    print "An error occurred during creation"

8.完整代码如下:

import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
try:
    flayer = arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")
except:
    print "An error occurred during creation"

9.保存脚本至“C:/ArcpyBook/Ch8/CreateFeatureLayer.py”文件。
10.运行脚本。新创建的Burglary_Laye图层添加到ArcMap中的内容列表中:

11.创建表视图工具与创建要素图层工具功能一致。区别在于前者处理独立表数据而不是要素类。
12.删除下面的一行代码:

flayer = arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")

13.用下面的代码替换:

tView=arcpy.MakeTableView_management("Crime2009Table","Crime2009TView")

14.运行脚本查看添加到ArcMap内容列表中的表视图。

How it works...

创建要素图层工具和创建表视图工具分别创建要素类和表在内存中的表现形式。在脚本中调用按属性选择工具和按位置选择工具都需要这些保存在内容中的临时数据作为输入参数。两个工具也都要求为这些临时的数据结构赋名称。

There's more...

你还可以在创建要素图层工具和创建表视图工具中应用一个查询条件来限制返回到要素图层或表视图中的记录。这在调用工具时通过where语句来完成。该查询语句的功能与你通过图层属性|定义查询(Layer Properties|Definition Query)中相同。
以下是添加查询条件的语法:
MakeFeatureLayer(in_feature,out_layer,where_clause)
MakeTableView(in_table,out_view,where_clause)

使用按属性选择图层工具(Select Layer by Attribute)选择要素和行

使用按属性选择图层(Select Layer by Attribute)工具可对要素类或表执行属性查询操作。该工具内的包含了可以筛选属性查询条件以及不同选择类型的where语句参数。

Getting ready

如下图所示,按属性选择图层工具会基于你定义的查询条件来选择要素类或表中的记录。我们在之前的案例中已经介绍了查询主题的内容。现在应该已经了解创建查询的基本概念。你已经学习了如何创建要素类或表临时保存在内存的表现形式,这也是使用按属性选择按位置选择工具的前提条件。

按属性选择工具利用要素图层或表视图以及查询条件和选择类型来选择记录。默认情况下,选择类型设置为创建一个新选择内容。其他的选择类型包括”添加到当前选择内容“,”从当前选择内容中移除“,”从当前选择内容中选择“,”切换选择内容“以及”清除选择内容“等。下面总结了每种选择类型:
NEW_SELECTION:创建一个新选择内容,默认选择方式。
ADD_TO_SELECTION:根据查询条件,将选择内容添加到现有的选择内容中。
REMOVE_FROM_SELECTION:根据查询条件,将选择内容从现有的选择内容中移除。
SUBSET_SELECTION:将选择内容与现有的选择内容组合,返回相同的选择内容。
SWITCH_SELECTION:选择未选择内容,移除已选择的内容。
CLEAR_SELECTION:移除所有选择内容。

以下是按属性选择工具的语法:
arcpy.SelectLayerByAttribute_management(<input feature layer or table view>,{selection method},{where clasuse})
本案例中,你会学习如何使用按属性选择图层工具从要素类中选择要素。你会使用在之前案例中学习到的技巧来构建查询语句,创建一个要素图层,最后调用按属性选择图层工具。

How to do it...

按照以下步骤来学习如何使用按属性选择工具从要素类或表中选择记录;
1.打开IDLE,创建一个新的脚本窗口。
2.保存脚本至C:\ArcpyBook\Ch8\SelectLayerByAttribute.py
3.导入arcpy模块:

import arcpy

4.设置工作空间路径:

arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"

5.添加try语句块:

try:

6.创建本章第一个案例中的查询语句。该语句会作为工具的where语句参数来选择North服务区的所有记录:

qry = '"SVCAREA" = \'North\''

7.创建一个Burglary要素类在内存中的备份:

flayer = arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")

8.调用按属性选择工具,并将刚创建的要素图层传递给该工具。定义创建新选择内容并将查询条件传递给该工具:

arcpy.SelectLayerByAttribute_management(flayer,"NEW_SELECTION",qry)

9.调用获取计数(Get Count)工具,打印选择的记录数量:

cnt = arcpy.GetCount_management(flayer)
print "The number of selected records is : " + str(cnt)

10.添加except语句块并添加一行代码来打印错误消息:

except:
    print "An error occurred during selection"

11.完整代码如下。需要注意tryexcept语句块内的缩进:

import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
try:
    qry = '"SVCAREA" = \'North\''
    flayer = arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")
    arcpy.SelectLayerByAttribute_management(flayer,"NEW_SELECTION",qry)
    cnt = arcpy.GetCount_management(flayer)
    print "The number of selected records is:" + str(cnt)
except:
    pirnt "An error occurred during selection"

12.保存脚本。
13.运行脚本。如果没有任何问题,你应该会看到输出的消息中显示7520条记录被选中:

The number of selected records is:7520
How it works...

按属性选择图层工具要求要素图层或表视图作为第一个参数。在本案例中,我们将创建要素图层工具新创建的要素图层传递给按属性选择图层工具。调用创建要素图层工具从Burglary要素类中创建了一个要素图层,该要素图层赋值给变量flayer,并作为按属性选择图层工具的第一个参数。在脚本中,我们还传递了用来指明创建一个新选择内容的选择类型参数以及where语句参数。where语句参数指定了qry变量,该变量保存了一个查询条件来选择North服务区的所有要素。

使用按位置选择图层(Select Layer by Location)工具选择要素

如下图所示,按位置选择图层工具基于某类型的空间关系来选择要素。由于涉及到空间关系,因此该工具仅应用于要素类以及与之关联的位于内存中的要素图层。

Getting ready

你在使用按位置选择图层工具时可以选择多种不同类型的空间关系,其中包括相交(intersect),包含(contains),包含于(with),边界接触(boundary touches),一致性(is identical)及其他类型。如果没有指定空间关系,默认值为相交关系。输入要素图层是唯一的必选参数,可选参数包括空间关系,搜索距离,与输入要素图层进行空间关系检测的选择要素或图层以及选择类型。在本案例中,你会学习如何在Python脚本中调用按位置选择工具来根据空间关系选择要素。你会使用该工具来选择发生在Edgewood学区内的盗窃案件。

How to do it...

按照以下步骤来学习如何使用按位置选择图层工具来执行空间查询;
1.打开IDLE,创建一个新的脚本窗口。
2.保存脚本至C:\ArcpyBook\Ch8\SelectLayerByLocation.py
3.导入arcpy模块:

import arcpy

4.设置工作空间路径:

arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"

5.添加try语句块:

try:

6.创建一个Burglary要素类在内存中的备份:

flayer = arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")

7.调用按位置选择图层工具,并将刚创建的要素图层传递给该工具。空间关系选择COMPLETE_WITHIN,也就意味着我们要查找完全位于比较图层范围的所有盗窃案。我们将EdgewoodSD.shp文件作为比较图层:

arcpy.SelectByLocation_management(flayer,"COMPLETELY_WITHIN","C:/ArcpyBook/Ch8/EdgewoodSD.shp")

8.调用获取计数(Get Count)工具,打印选择的记录数量:

cnt = arcpy.GetCount_management(flayer)
print "The number of selected records is : " + str(cnt)

9.添加except语句块并添加一行代码来打印错误消息:

except:
    print "An error occurred during selection"

10.完整代码如下。需要注意tryexcept语句块内的缩进:

import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
try:
    flayer = arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")
    arcpy.SelectByLocation_management(flayer,"COMPLETELY_WITHIN","C:/ArcpyBook/Ch8/Edgewood.shp")
    cnt = arcpy.GetCount_management(flayer)
    print "The number of selected records is:" + str(cnt)
except:
    print "An error occurred during slection"

11.保存脚本。
12.运行脚本。如果没有任何问题,你应该会看到输出的消息中显示1470条记录被选中:

The number of selected records is:1470

在本案例中,我们并没有定义搜索距离和选择类型参数。选择类型参数默认值为创建一个新选择内容。我们在本案例中没有指定距离参数,现在我们来说明搜索距离参数如何工作。
1.将调用按位置选择工具的代码更新为以下代码:

arcpy.SelectByLocation_management(flayer,"WITHIN_A_DISTANCE","C:/ArcpyBook/Ch8/EdgewoodSD.shp","1 MILES")

2.保存脚本。
3.运行脚本。如果没有任何问题,你应该会看到消息显示2976条记录被选中。工具选择了位于Edgewood学区1英里范围内所有的盗窃案记录:

The number of selected records is:2976

你在该部分练习中最后要做的就是调用复制要素(Copy Feature)工具将临时图层写入到一个新的要素类中。
1.注释以下代码:

## cnt = arcpy.GetCount(flayer)
## print "The number of selected records is:" + str(cnt)

2.增加一行代码来调用复制要素工具。该行代码需要位于调用按位置选择图层工具的代码下方。复制要素工具接受一个要素图层作为其第一个输入参数以及一个输出要素类参数,在本案例中输出要素类设置为EdagewoodBurglaries.shp文件:

arcpy.CopyFeatures_management(flayer,"C:/ArcpyBook/Ch8/EdgewoodBurglaries.shp")

3.完整代码如下。需要注意tryexcept语句块内的缩进:

import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
try:
    flayer= arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")
    arcpy.SelectByLocation_management(flayer,"WITHIN_A_DISTANCE", "C:/ArcpyBook/Ch8/EdgewoodSD.shp","1 MILES")    
    arcpy.CopyFeatures_managemet(flayer,"C:/ArcpyBook/Ch8/EdgewoodBurglaries.shp")

    ## cnt = arcpy.GetCount_management(flayer)
    ## print "The number of selected records is:" + str(cnt)
except:
    print "An error occurred during slection"

4.保存脚本。
5.运行脚本。
6.查看C:\ArcpyBook\Ch8文件夹下的输出的shapefile文件:

How it works...

按位置选择图层工具要求要素图层作为第一个参数。在本案例中,我们将创建要素图层工具创建的要素图层传递给按位置选择图层工具。调用创建要素图层工具从Burglary要素类中创建了一个要素图层,该要素图层赋值给变量flayer,并作为按位置选择图层工具第一个参数。最后,我们还定义了一个源图层同输入的要素图层进行空间关系比较,指定空间关系的参数。其他可选参数还包括搜索距离和选择类型。

结合使用空间查询和属性查询

你也许有时候需要属性和空间查询结合在一起使用来选择要素。举个例子,你可能需要选择周一发生在Edgewood学区内的所有盗窃案。这可以通过依次调用按位置选择工具和按属性选择工具,然后应用SUBSET SELECTION选择类型来实现。

Getting ready

本案例会要求你创建一个在按位置选择图层工具和按属性选择图层工具中使用的临时要素图层。按位置选择图层工具将查找所有发生在Edgewood学区内的盗窃案,并生成一个选择内容。按属性选择图层工具相同的临时要素图层并使用where语句来查找发生在周一的盗窃案。此外,按属性选择图层工具还会指定从按位置选择图层工具所选择内容中进行选择。最后,你将结合空间查询和属性查询的选择结果的数量打印出来。

How to do it...

1.打开IDLE,创建一个新的脚本窗口。
2.保存脚本至C:\ArcpyBook\Ch8\SpatialAttributeQuery.py
3.导入arcpy模块:

import arcpy

4.设置工作空间路径:

arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"

5.添加try语句块:

try:

6.创建一个查询语句变量用来定义where语句:

qry = '"DOW" = \'Mon\''

7.创建要素图层:

flayer =  arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")

8.调用按位置选择工具来查找所有发生在Edgewood学区内的盗窃案:

arcpy.SelectLayerByLocation_management(flayer,"COMPLETELY_WITHIN","C:/ArcpyBook/Ch8/EdgewoodSD.shp")

9.调用按属性选择图层工具来查找满足查询条件的所有盗窃案。同时将选择类型指定为SUBSET_SELECTION

arcpy.SelectLayerByAttribute(flayer,"SUBSET_SELECTION",qry)

10.打印选择结果的记录数:

cnt = arcpy.GetCount_management(flayer)
print "The number of selected records is:" + str(cnt)

11.添加except语句块:

except:
    print "Error in selection"

12.完整代码如下:

import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data/CityOfSanAntonio.gdb"
try:
    qry = '"DOW"= \'Mon\''
    flayer = arcpy.MakeFeatureLayer_management("Burglary","Burglary_Layer")
    arcpy.SelectLayerByLocation_management(flayer,"COMPLETELY_WITHIN", "C:/ArcpyBook/Ch8/EdgewoodSD.shp")
    arcpy.SelectLayerByAttribute_management(flayer,"SUBSET_SELECTION",qry)
    cnt = arcpy.GetCount_management(flayer)
    print "The number of selected records is:" + str(cnt)
except:
    print "Error in selection"

13.保存运行脚本。如果没有任何问题,你应该会看到消息显示197条记录被选中。工具选择了周一发生在Edgewood学区内的所有盗窃案。

The number of selected records is:197
How it works...

调用创建要素图层工具创建了一个新的要素图层并赋值给变量flayer。该临时图层作为输入参数在按工具选择图层工具中使用,该工具同时使用了COMPLETELY_WITHIN空间运算来查找所有发生在Edgewood学区内的盗窃案。之后将已经存在选择内容的要素图层flayer作为按属性选择图层工具的输入参数。按属性选择图层工具除接受要素图层之外,还接受了一个定义选择类型参数以及where条件语句参数。其中选择类型参数指定为SUBSET_SELECTION,即创建一个新的选择内容后在于已存在的选择内容比较,两个选择内容中相同的部分被选择出来。where语句作为工具的第三个参数定义了用来查找所有发生在周一的盗窃案的属性查询条件。查询语句中使用DOW字段来查找Mon值。最后调用获取计数工具获取了flayer图层中被选择的记录数,并且打印到屏幕上。


第七章 创建自定义地理处理工具 ||| 第九章 ArcPy数据访问模块

推荐阅读更多精彩内容