摘要
地图文档 (.mxd) 中找到的用于访问多个数据框属性的 DataFrame 对象。对 DataFrame 对象的引用经常作为多个函数的参数使用,以便在特定数据框中过滤图层或表格。
讨论
DataFrame 对象可用于访问重要的数据框属性。ListDataFrames 函数返回 DataFrame 对象的 Python 列表。随后,必须遍历列表中的每个项目,或指定一个索引号以引用具体的 DataFrame 对象。该对象根据正在使用的属性来使用地图单位和页面单位。例如,该对象可用于设置地图范围、比例、旋转以及如诸如空间参考之类的项目。也可使用页面单位确定 DataFrame 对象在布局上的位置和大小。通过 DataFrame 对象也可以访问信息项(如制作者名单和描述)。
当尝试引用其他对象时,引用至数据框同样有很大帮助。例如,ListLayers 函数可提供一个名为 data_frame 的可选参数,以便可在单个数据框中搜索图层,而不在整个地图文档中搜索。也可将 DataFrame 对象用作可选参数来区分打印或导出数据框和页面布局。因此,为方便引用特定数据框,对每个数据框采用唯一命名非常重要。
数据框范围坐标基于布局视图中的数据框范围,而不是数据视图中的数据框范围。这是因为数据视图中的数据框形状与布局视图中的数据框形状的横纵比不同。
elementPositionX 和 elementPositionY 取决于元素的锚点位置;元素的锚点位置可通过 ArcMap 中“元素属性”对话框的大小和位置选项卡进行设置。
页面单位只能在 ArcMap 中通过自定义 > ArcMap 选项 > 布局视图选项卡来更改。
属性
属性 | 说明 | 数据类型 |
credits (可读写) | 用于获取或设置数据框配额信息。 | String |
description (可读写) | 用于获取或设置数据框描述信息。 | String |
displayUnits (可读写) | 用于获取或设置数据框距离单位。 | String |
elementHeight (可读写) | 元素的高度(以页面单位计)。分配或报告的单位为页面单位。 | Double |
elementPositionX (可读写) | 数据框元素的锚点位置对应的 X 位置。分配或报告的单位为页面单位。 | Double |
elementPositionY (可读写) | 数据框元素的锚点位置对应的 Y 位置。分配或报告的单位为页面单位。 | Double |
elementWidth (可读写) | 元素的宽度(以页面单位计)。分配或报告的单位为页面单位。 | Double |
extent (可读写) | 用于获取或以地图坐标(即地图单位)设置数据框的地图范围。修改范围对象的属性之前必须先为其创建副本。然后,使用修改后的副本设置新范围属性。注意:如果尝试仅通过参考 Extent 对象来设置范围,则无法保存更改。例如,df.extent.xMin = 某个值无效。 如果范围的横纵比与数据框的形状不匹配,则会将最终范围调整为适合数据框形状的新范围。换而言之,即使您输入了明确的 X、Y 坐标,之后再试图读取时,返回的值可能也与之前输入的不同。 注意:默认情况下,帮助系统中 Extent 对象的属性为只读。而 arcpy.mapping 脚本环境属于一个特例,允许在地图自动处理期间更改范围。
| Extent |
geographicTransformations (可读写) | 用于获取或设置数据框地理变换。此属性将以列表的形式返回变换的名称。只能使用现有的、预定义的变换名称(或者其相应代码值)设置地理变换。 可在 ArcGIS Resource Center 中找到变换及代码值的完整列表。 geographicTransformations 属性不能用于创建自定义变换。只能参考预定义的方法。 始终会默认为地图文档加载一种地理变换:NAD_1927_To_NAD_1983_NADCON。设置新列表后可将其覆盖。也可以设置一个空列表将地理变换清除。 下面的示例将使用名称字符串设置两种变换方法。第一个从 NAD27 到 NAD 83,第二个从 NAD83 到 HARN。第二个示例同样是进行变换,但使用的是变换代码。
| String |
mapUnits (只读) | 将返回报告当前数据框地图单位的字符串值。地图单位基于数据框的当前坐标系。 | String |
name (可读写) | 用于在数据框出现在地图文档的内容列表中时获取或设置其名称,同时还用于获取或设置布局内的实际元素名称。 | String |
referenceScale (可读写) | 用于获取或设置数据框参考比例。数据框中的所有符号和文本的大小都会使用此处的参考比例。 | Double |
rotation (可读写) | 用于获取或设置数据框的旋转值。用于表示数据框将从正北方向开始按逆时方向针旋转的度数。要顺时针旋转,可使用负值。 | Double |
scale (可读写) | 用于获取或设置活动数据框的当前比例。必须使用数值(双精度值)。 | Double |
spatialReference (可读写) | 提供对数据框 SpatialReference 的访问权限。空间参考包含有关坐标系和单位的信息。 | SpatialReference |
time (只读) | 返回 DataFrameTime 对象,此对象可用于访问已启用时间属性的图层的显示控制操作。 | DataFrameTime |
type (只读) | 返回任何给定页面布局元素的元素类型。
| String |
方法概述
方法 | 说明 |
panToExtent (extent) | 使用新 Extent 对象可平移和居中数据框,而无需更改数据框的比例 |
zoomToSelectedFeatures () | 更改数据框范围以匹配数据框中所有图层的当前所选要素的范围 |
方法
panToExtent (extent)
此方法非常适用于数据框比例不变的情况。无需设置范围以及每次都重置比例,panToExtent 保持比例不变,并且只需使当前地图框在新范围中居中即可。
以下示例将通过传入特定图层所选要素的范围来平移数据框的范围。此时,可使用 Layer 类 getSelectedExtent 方法。
df.panToExtent(lyr.getSelectedExtent())
zoomToSelectedFeatures ()
由此将执行与选择 > 缩放至所选要素相同的 ArcMap 操作。不同之处在于:如果未选择任何要素,则将缩放至所有图层的全图范围。如果要缩放至特定图层所选要素的范围,请尝试使用 Layer.getSelectedExtent 方法。
以下示例将缩放至所有选定要素的范围:
df.zoomToSelectedFeatures()
以下示例将缩放至特定图层所选要素的范围。本示例将针对 Layer 对象使用此方法。
df.extent = lyr.getSelectedExtent()
代码示例
DataFrame 示例 1
在将数据框名称属性用作输出文件名的情况下,以下脚本将在导出每个数据框至单独的输出 TIFF 文件之前,将每个数据框的 旋转属性设置为 0,同时将 比例属性设置为 1:24000。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
for df in arcpy.mapping.ListDataFrames(mxd):
df.rotation = 0
df.scale = 24000
outFile = r"C:\Project\Output\\" + df.name + ".tif"
arcpy.mapping.ExportToTIFF(mxd, outFile, df)
del mxd
DataFrame 示例 2
以下脚本会将数据框的范围设置为图层中所选要素的范围。通过与比例相乘,将 10% 的缓冲区添加至该范围。该示例针对图层对象使用 getSelectedExtent 方法。该脚本使用 CURRENT 关键字,而非提供至地图文档的路径,在 ArcMap 内的交互式窗口中运行。
import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
accidentLayer = arcpy.mapping.ListLayers(mxd, "accidents", df)[0]
arcpy.SelectLayerByAttribute_management(accidentLayer, "NEW_SELECTION", "\"Accidents\" > 5")
df.extent = accidentLayer.getSelectedExtent(False)
df.scale = df.scale * 1.1
arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Output\FrequentAccidents.pdf", df)
arcpy.RefreshActiveView()
del mxd
DataFrame 示例 3
以下脚本将修改特定数据框在布局上的位置和大小。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
df.elementPositionX, df.elementPositionY = 1, 1
df.elementHeight, df.elementWidth = 5, 6.5
mxd.save()
del mxd
DataFrame 示例 4
以下脚本将数据框的范围对象转换为面要素,以便其能够与 SelectLayerByLocation_management 函数配合使用。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "Transportation")[0]
lyr = arcpy.mapping.ListLayers(mxd, "Accidents", df)[0]
#The DataFrame extent object is converted into a polygon feature so it can be used with the SelectLayerByLocation function.
dfAsFeature = arcpy.Polygon(arcpy.Array([df.extent.lowerLeft, df.extent.lowerRight, df.extent.upperRight, df.extent.upperLeft]),
df.spatialReference)
arcpy.SelectLayerByLocation_management(lyr, "INTERSECT", dfAsFeature, "", "NEW_SELECTION")
mxd.save()
del mxd