摘要
用于提供对已启用“数据驱动页面”的地图文档内管理各个页面的方法和属性的访问。
讨论
可使用 ArcMap 内的数据驱动页面 工具条来创建系列地图,而无需编写任何脚本。反之亦然:可使用 arcpy.mapping 编写系列地图的全部脚本,而无需使用 ArcMap 中的“数据驱动页面”用户界面,但将两种方法相结合的效果更优。ArcMap 的“数据驱动页面”工具条可能没有足够的选项来创建“完美的”系列地图,但启用了“数据驱动页面”的地图文档可利用其固有行为省去多行代码,例如地图文档可自动管理页面范围、比例和动态文本等内容,所以不必写入相应代码。
当文本元素的字符串信息需要使用自定义逻辑进行格式化或需要构建多个字段时,即属上述情形之一。不必为这样一个简单的自定义需求在 arcpy.mapping 中执行所有操作。可通过启用“数据驱动页面”制作地图文档,然后利用 arcpy.mapping 处理自定义的文本元素字符串需求。具体的代码示例如下。
首先必须使用 ArcMap 中的“数据驱动页面”工具条在地图文档 (.mxd) 内启用和制作数据驱动页面,然后才能通过 arcpy.mapping 引用“数据驱动页面”。
DataDrivenPages 类只有一个单独的 exportToPDF 方法,但这并不意味着不能创建其他导出文件。请参阅下面的第一个代码示例。
有关“数据驱动页面”的详细信息,请参阅以下主题:
属性
属性 | 说明 | 数据类型 |
currentPageID (可读写) | currentPageID 属性表示启用了“数据驱动页面”的地图文档 (.mxd) 的活动页面或当前页面。选中“显示页面”后在“数据驱动页面”工具条中显示此值;它代表 y 的第 x 页,共 x 页。 | Long |
dataFrame (只读) | 返回对启用了“数据驱动页面”的地图文档内索引图层所位于的数据框的引用。 | DataFrame |
indexLayer (只读) | 返回对启用了“数据驱动页面”的地图文档中索引图层的引用。 | Layer |
pageCount (只读) | pageCount 属性返回启用了“数据驱动页面”的地图文档 (.mxd) 的总页数。选中“显示页面”后在“数据驱动页面”工具条中显示此值;它代表 y 的第 y 页,共 x 页。 | Long |
pageNameField (只读) | 返回字段对象,它代表设置“数据驱动页面”时在索引要素类中使用的字段。 | Field |
pageRow (只读) | 使用 pageRow 返回索引图层的针对活动页面或当前页面的行对象。随后可根据需要读取和/或修改此索引图层字段。 | Row |
selectedPages (只读) | 返回 Python 索引编号列表,它们表示启用了“数据驱动页面”的地图文档中所选的索引图层要素。 | List |
方法概述
方法 | 说明 |
exportToPDF (out_pdf, {page_range_type}, {page_range_string}, {multiple_files}, {resolution}, {image_quality}, {colorspace}, {compress_vectors}, {image_compression}, {picture_symbol}, {convert_markers}, {embed_fonts}, {layers_attributes}, {georef_info}, {jpeg_compression_quality}, {show_selection_symbology}) | 将启用了“数据驱动页面”的地图文档 (.mxd)的一组指定页面导出为多页面的 PDF 文档 |
getPageIDFromName (page_name) | 基于页面的名称返回“数据驱动页面”索引值 |
printPages ({printer_name}, {page_range_type}, {page_range_string}, {out_print_file}, {show_selection_symbology}) | 以特定打印机打印启用数据驱动页面的地图文档 (.mxd) 中的特定页面 |
refresh () | 刷新现有“数据驱动页面”系列 |
方法
exportToPDF (out_pdf, {page_range_type}, {page_range_string}, {multiple_files}, {resolution}, {image_quality}, {colorspace}, {compress_vectors}, {image_compression}, {picture_symbol}, {convert_markers}, {embed_fonts}, {layers_attributes}, {georef_info}, {jpeg_compression_quality}, {show_selection_symbology})
参数 | 说明 | 数据类型 |
out_pdf | 用于表示输出导出文件的路径和文件名的字符串。 | String |
page_range_type | 此字符串值用于指定页面的打印方式,对于 PDF 文档,类似于 ArcMap 导出地图对话框中的页面选项卡。
(默认值为 ALL) | String |
page_range_string | 如果使用 page_range_type 参数中的 RANGE 选项,则此字符串用于标识要导出的页面(例如:1、3、5-12)。 | String |
multiple_files | 用于控制如何创建输出 PDF 的选项。默认情况下,所有页面都将导出为单个多页文档。您还可以指定使用两个不同的选项导出单个单页 PDF 文档。
(默认值为 PDF_SINGLE_FILE) | String |
resolution | 用于定义导出文件分辨率的整数值,单位为每英寸点数 (dpi)。 (默认值为 300) | Integer |
image_quality | 定义输出图像质量的字符串。
(默认值为 BEST) | String |
colorspace | 用于定义导出文件颜色空间的字符串。
(默认值为 RGB) | String |
compress_vectors | 用于控制输出文件的矢量和文本部分压缩的布尔值。图像压缩单独定义。 (默认值为 True) | Boolean |
image_compression | 用于定义在输出文件中压缩图像或栅格数据时使用的压缩方案的字符串。
(默认值为 ADAPTIVE) | String |
picture_symbol | 用于定义是否将图片标记和图片填充转换为输出上的矢量或栅格化对象的字符串。
(默认值为 RASTERIZE_BITMAP) | String |
convert_markers | 用于控制将基于字符的标记符号转换为面的布尔值。如果符号字体不可用或无法嵌入,则可用于正确显示符号。但是,将此参数设置为 True 将禁用所有基于字符的标记符号的字体嵌入,由此会导致其外观发生变化。 (默认值为 False) | Boolean |
embed_fonts | 用于控制导出文件中的字体嵌入的布尔值。当在未安装所需字体的计算机上查看文档时,可通过字体嵌入正确显示文本和字符标记。 (默认值为 True) | Boolean |
layers_attributes | 用于控制导出文件中包含的 PDF 图层和 PDF 对象数据(属性)的字符串。
(默认值为 LAYERS_ONLY) | String |
georef_info | 用于将每个数据框的坐标系信息导出到输出 PDF 文件中的布尔值。 (默认值为 True) | Boolean |
jpeg_compression_quality | 当 image_compression 设置为 ADAPTIVE 或 JPEG 时,用于控制压缩质量值的数字。有效范围为 1 到 100。jpeg_compression_quality 为 100 时可提供最佳图像质量,但会创建较大的导出文件。推荐范围为 70 到 90。 (默认值为 80) | Integer |
show_selection_symbology | 用于控制选择符号系统是否应显示在输出中的布尔值。 (默认值为 False) | Boolean |
数据驱动页面导出为多页面的 PDF 文档。地图文档必须已启用“数据驱动页面”。PDF 文件可在不同的平台上实现一致的查看和打印效果。它们通常用于在 Web 上分发文档,并且此格式现在为内容传送的标准交换格式。ArcMap PDF 在许多图形应用程序中均可编辑,并且它还保留了 ArcMap 内容列表中地图图层的注记、标注和属性数据。从 ArcMap 中导出的 PDF 支持嵌入字体,因此即使用户尚未安装 Esri 字体也可以正确地显示符号。从 ArcMap 中导出的 PDF 可以通过 CMYK 值或 RGB 值定义颜色。
有关导出地图的详细信息,请参阅 ArcGIS for Desktop 帮助中的导出地图主题。
getPageIDFromName (page_name)
参数 | 说明 | 数据类型 |
page_name | 与用于设置“数据驱动页面”的 Name 字段对应的索引图层中的值 | String |
许多“数据驱动页面”属性和方法都使用内部索引值,而不使用用于创建索引图层的页面的文字名称。索引值是根据 Name 和 Sort 字段自动生成的。哪个索引值代表特定的页面并不明显。getPageIDFromName 方法为这种转化提供了一种机制。
pageID = mxd.dataDrivenPages.getPageIDFromName("HarborView")
mxd.dataDrivenPages.currentPageID = pageID
printPages ({printer_name}, {page_range_type}, {page_range_string}, {out_print_file}, {show_selection_symbology})
参数 | 说明 | 数据类型 |
printer_name | 用于表示本地计算机中的打印机名称的字符串。 (默认值为 None) | String |
page_range_type | 此字符串值用于指定页面的打印方式,对于 PDF 文档,类似于 ArcMap 导出地图对话框中的页面选项卡。
(默认值为 ALL) | String |
page_range_string | 如果使用 page_range_type 参数中的 RANGE 选项,则此字符串用于标识要导出的页面(例如:1、3、5-12)。 | String |
out_print_file | 包含输出打印文件名称的路径。创建的格式取决于打印机。如果使用 PostScript 打印机,则格式将为 PostScript,并且建议提供 .ps 扩展名。如果使用 Windows 打印机,请使用 .prn 扩展名。 (默认值为 None) | String |
show_selection_symbology | 用于控制选择符号系统是否应显示在输出中的布尔值。 (默认值为 False) | Boolean |
ListPrinterNames() 函数是获得 printer_name 参数字符串的一种简单方法。
以下脚本采用本地打印机打印一组特定“数据驱动页面”:
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\ParcelAtlas.mxd")
mxd.dataDrivenPages.printPages(r"\\olyfile\OLYCanon", "RANGE", "1,3,5-12")
refresh ()
如果出现以下情况之一,则需要使用刷新方法:(1) 在索引图层中添加了或删除了要素;(2) 对 Sort 或 Name 字段值进行了编辑;(3) 数据框范围由于缩放、平移或对地图比例进行更改而发生更改;或者 (4) 对驱动当前地理范围的索引图层要素的数据驱动页面所使用的任何字段进行了编辑。在这些情况下,数据驱动页面将保留原始设置,直到执行刷新方法为止。
代码示例
DataDrivenPages 示例 1
以下脚本将“数据驱动页面”系列的每一页导出到单个 PNG 文件中。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\ParcelAtlas.mxd")
for pageNum in range(1, mxd.dataDrivenPages.pageCount + 1):
mxd.dataDrivenPages.currentPageID = pageNum
print "Exporting page {0} of {1}".format(str(mxd.dataDrivenPages.currentPageID), str(mxd.dataDrivenPages.pageCount))
arcpy.mapping.ExportToPNG(mxd, r"C:\Project\OutPut\ParcelAtlas_Page" + str(pageNum) + ".png")
del mxd
DataDrivenPages 示例 2
以下脚本将使用页面名称列表打印一组地图页面,并使用自定义逻辑代码修改文本元素地图标题信息,该自定义逻辑只能在脚本环境中完成(也就是说,标题字符串是基于属性值自定义构建的)。脚本在各已命名页面间循环,并设置相应的 currentPageID。然后从名为 TRS 的索引图层的字段中提取值。接下来,脚本将分析这些值、去掉前导零、重新构建文本元素标题字符串,并将结果发送给打印机。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\ParcelAtlas.mxd")
pageNameList = ["MPB", "PJB", "AFB", "ABB"]
for pageName in pageNameList:
pageID = mxd.dataDrivenPages.getPageIDFromName(pageName)
mxd.dataDrivenPages.currentPageID = pageID
fieldValue = mxd.dataDrivenPages.pageRow.TSR #example values from a field called TSR are "080102", "031400"
TRSTitle = arcpy.mapping.ListLayoutElements(MXD, "TEXT_ELEMENT", "TRSTitle")[0]
township, range, section = fieldValue[:2].strip("0"), fieldValue[2:-2].strip("0"), fieldValue[-2:].strip("0")
if section != "":
TRSTitle.text = "Section {0} T.{1}N. R.{2}W. W.M.".format(section, township, range)
else:
TRSTitle.text = "T.{0}N. R.{1}W. W.M.".format(township, range)
mxd.dataDrivenPages.printPages(r"\\olyfile\SUITE_303", "CURRENT")
del mxd
DataDrivenPages 示例 3
以下脚本仅将所选的索引页面(页面 1-10)导出到各个 PDF 文件中。生成的 PDF 文件会将索引号追加到输出文件名中。
import arcpy
mxd = arcpy.mapping.MapDocument(r"C:\Project\ParcelAtlas.mxd")
ddp = mxd.dataDrivenPages
indexLayer = ddp.indexLayer
arcpy.SelectLayerByAttribute_management(indexLayer, "NEW_SELECTION",
'"PageNumber" >= 1 AND "PageNumber" <= 10')
for indexPage in ddp.selectedPages:
ddp.currentPageID = indexPage
ddp.exportToPDF(r"C:\Project\Output\Page" + str(indexPage) + ".pdf", "CURRENT")
del mxd