本节书摘来自异步社区《基于ArcGIS的Python编程秘笈(第2版)》一书中的第2章,第2.6节,作者: 【美】Eric Pimpler(派普勒) 更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.6 缩放至所选要素
创建选择集是ArcMap中常见的操作,选择集通常由属性查询或空间查询来创建,也可以由用户手动选择要素或其他方式来实现。为了更好地显示选择集,用户经常需要将视图缩放至所选要素的范围。Python有几种方法可以程序化地实现这一功能。本节将介绍如何在数据框和单独的图层中缩放至所选要素。
2.6.1 准备工作
DataFrame.zoomToSelectedFeatures()方法可以缩放至所有选择要素的范围,这些要素来自数据框的所有图层。在本质上,这个方法执行的操作与在ArcMap的菜单栏上单击“Selection | Zoom to Selected Features”所执行的操作是一样的。其中一个区别是,如果没有选中的要素,DataFrame.zoomToSelectedFeatures()方法会缩放至所有图层的全部范围(相当于全图显示)。
在一个单独图层中缩放至所选要素的范围,需要使用Layer对象。Layer对象包含的getSelectedExtent()方法,可以缩放至所选记录的范围。它同时返回一个Extent对象,该对象可以作为参数传递给DataFrame.panToExtent()方法。
2.6.2 操作方法
下面按步骤介绍如何获取和设置ArcMap中活动的数据框和活动的视图。
(1)在ArcMap中打开C:ArcpyBookCh2Crime_Ch2.mxd。
(2)查看ArcMap的“Table Of Contents”窗口,确保Crime是活动的数据框。
(3)单击“Table Of Contents”窗口中的“List By Selection”按钮。
(4)单击“Bexar County Boundaries”图层名称右边的“toggle”按钮,如图2-2所示,设置图层为“unselectable”(不可选)状态。
(5)单击“Table Of Contents”窗口中的“List By Source”按钮。使用“Select Features”工具,用鼠标光标在Northside ISD区域的边界内拖曳出一个矩形框,矩形框包围一部分盗窃点集,即可选中一个特定学校区域的边界和一些盗窃点,如图2-3所示。
(6)单击ArcMap“标准”工具条上的“Python”按钮。
(7)导入arcpy.mapping模块。
import arcpy.mapping as mapping
(8)引用当前活动的地图文档(Crime_Ch2.mxd),把该引用赋值给变量。
mxd = mapping.MapDocument("CURRENT")
(9)获取活动的数据框(Crime),缩放至所选要素。
mxd.activeDataFrame.zoomToSelectedFeatures()
(10)如果没有选择要素,调用 zoomToSelectedFeatures()方法会缩放至数据框中所有要素的范围。单击“Selection | Clear Selected Features”,清除所选要素。此时,再执行相同的代码,比较清除操作前后zoomToSelectedFeatures()方法的执行结果。
mxd.activeDataFrame.zoomToSelectedFeatures()
(11)现在即将执行的步骤是缩放至特定图层上所选要素的范围。使用“Select Features”工具,在Northside ISD区域的边界内拖曳出一个矩形框,矩形框包围一部分盗窃点集。
(12)首先,获取对Crime数据框的引用。调用ListDataFrames()函数,传入Crime通配符参数,用来返回一个包含单独项的Python列表。使用[0]取出列表中的第一项元素,也就是这个返回的列表中唯一的一项元素。
df = mapping.ListDataFrames(mxd, "Crime")[0]
(13)其次,获取对Burglaries图层的引用,该图层包含所选要素。下面的代码使用通配符(*)搜索Crime数据框中的“Burglaries in 2009”图层。ListLayers()函数返回一个Python列表,使用[0]取出列表中的第一项元素,即一个名称中包含Burglaries字符的图层。
layer = mapping.ListLayers(mxd,"Burglaries*",df)[0]
(14)最后,通过获取图层中所选要素的范围来设置数据框的范围。
df.extent = layer.getSelectedExtent()
(15)缩放至所选要素的完整代码如下所示,也可以查看C:ArcpyBookcodeCh2ZoomSelectedExtent.py解决方案文件来检查代码。
import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
df = mapping.ListDataFrames(mxd, "Crime")[0]
layer = mapping.ListLayers(mxd,"Burglaries*",df)[0]
df.extent = layer.getSelectedExtent
2.6.3 工作原理
本节介绍了如何缩放至一个数据框的所有图层或特定图层中所选要素的范围。
缩放至一个数据框的所有图层中所选要素的范围,只需要引用当前活动的数据框,并调用zoomToSelectedFeatures()方法即可。
缩放至一个数据框的特定图层中所选要素的范围,需要编写的代码更复杂一些。首先,在导入arcpy.mapping模块后,获取对地图文档和Crime数据框的引用。然后,使用ListLayers()函数,传入对数据框的引用参数和通配符参数,搜索名称以Burglaries开头的图层。ListLayers()函数返回一个Python列表。因为本节使用的数据中只有一个图层符合通配符的搜索条件,所以取出列表中的第一个图层,并将其赋值给layer变量。最后,使用layer.getSelectedExtent()方法设置数据框的范围。