基于ArcGIS的Python编程秘笈笔记(三):自动化地图制图和打印

引言

本篇博客介绍如何使用arcpy.mapping模块来实现多个与地图生产和打印有关的地理处理任务。

ArcGIS10推出的arcpy.mapping模块提供了许多与自动化地图生产相关的功能。
arcpy.mapping模块可用于自动化地图生产,创建地图册,导出为图像或PDF文件以及创建并管理PDF文件。

1、创建布局元素的python列表

在地理处理脚本中,自动化地图生产的第一步通常是生成一个页面布局元素的列表。举个例子,你可能想在地图打印或创建PDF文件之前修改地图的标题。在本案例中,标题内容保存在一个文本元素中(text element)。你可以先生成一个地图页面视图中的文本元素列表然后再修改地图标题,其中第一步就是生成文本元素列表。

在arcpymapping模块中,每个布局元素都用布局元素类来表示。以下是一些布局元素类:

每一个元素赋唯一的元素名称,这样就可以在程序中访问这些元素。名称是在ArcMap中定义的。arcpy.mapping模块提供了一个ListLayoutElements()函数来返回包含所有页面布局元素的列表。在本案例中,你将学习如何使用ListLayoutElements()函数来生成页面布局元素列表。 

import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
for el in mapping.ListLayoutElements(mxd):
    if el.name != "":
        print el.name

打印结果:

Crime_Inset
Alternating Scale Bar
Legend Test Performance
Crime Legend
North Arrow
Inset_Map
Test_Performance
Crime

2、为布局元素指定唯一的名称

当需要用地理处理脚本访问并更改一个特定的元素时,使用arcmap为所有的布局元素指定唯一的名称就显得尤为重要。比如,你可能需要更新公司logo的图标。不需要人工来更新所有的地图文档文件,你只需要编写一个地理处理脚本通过程序的方式让所有地图文档文件中使用新的图标。不过要实现这一想法,你就需要为页面布局元素赋予唯一名称,这样你就可以访问单个页面布局元素了。

3、使用ListLayoutElements()函数限制返回的页面布局元素

页面布局中会包含大量的页面布局元素,对于某个特定的地处理脚本而言,许多页面元素不需要的。ListLayoutElements()函数通过两个参数来限制返回的页面布局元素。第一个参数用来定义需要返回的元素类型,第二个参数使用通配符来查找要返回的元素。

import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
for el in mapping.ListLayoutElements(mxd,"LEGEND_ELEMENT","*Crime*"):
    print el.name

ListLayoutElements()函数可使用以下元素类型筛选关键字参数:DATAFRAME_ELEMENT,GRAPHIC_ELEMENT,LEGEND_ELEMENT,MAPSURROUND_ELEMENT,PICTURE_ELEMENT,TEXT_ELEMENT

4、更新布局元素的属性 

页面布局元素的类型包括图形,图例,文本,地图以及图片等。每一个页面布局元素都对应了arcpy.mapping包中的一个类。你可以利用这些类提供的不同属性在程序中来更改元素。

DataFrame提供了访问地图文档中数据框属性的功能。该对象可使用地图单位也可以使用页面布局单位。比如像位置和大小等这类的页面布局属性可以通过elementPositionX,elementPositionY,elementWidth,elementHeight属性来设置。
GraphicElement是一个更为通用的元素类型,像插入表,图,轮廓线,标记,线以及多边形等图形都可以添加到页面布局中。如果你想通过Python脚本来访问每一个图形元素的话,你需要为每一个图形元素设置name属性(其他的页面布局元素同理)。
LegendElement提供调整图例位置和修改图例标题的功能,同时也提供访问图例项以及关联的父数据框的功能。LegendElement对象仅与单个数据框有关联。
MapsurroundElement包括指北针,图示比例尺以及文本比例尺,与LegendElement一样也是与单个数据框有关联。该对象包含的属性可以用于重新调整其在页面布局中的位置。
PictureElement指页面布局中的栅格或图片。该对象最常用的属性是获取并设置数据源,当你需要在多个地图文档中更新某个图片(比如说logo)的时候就会相当有帮助。比如,你可以编写脚本遍历所有的地图文档文件将当前的图片替换为新的logo图片。你还可以重新定位或缩放对象。
TextElement是指页面布局中的文本信息,包括插入的文本,注释,文本框以及标题等,但不包括图例标题以及插入图表中的文本。该对象提供的属性可用于修改文本字符串内容,这在需要在页面布局多个位置或多个地图文档中修改相同文本字符串的时候会极为有用。当然,该对象也支持重新定位文本的功能。

页面布局中的返回的每一个元素都是某类元素对象的一个实例。下述示例通过程序使用Legend对象中的title属性来更改Crime图例的标题并获取图例项所引用的图层对象列表。

import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
elLeg = mapping.ListLayoutElements(mxd, "LEGEND_ELEMENT","*Crime*")[0]
elLeg.title = "Crimes by School District"
for item in elLeg.listLegendItemLayers():
    print item.name

打印结果:

Burglaries in 2009
Crime Density by School District

每个页面布局元素均提供了一组属性和方法。在上述案例中,使用了Legend对象的title属性。此外,Legend对象的其他属性可以用于设置元素的宽度和高度,位置以及其他属性。而该对象的方法可以用于调整图例显示的列数,列出元素项以及移除和更新元素项等。

5、导出地图为pdf文件

  • 将页面布局导出为PDF文件
import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
mapping.ExportToPDF(mxd,r"c:\ArcpyBook\Ch4\Map_PageLayout.pdf")
  • 从已有的地图文档文件中打印一个特定的数据框
import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
for df in mapping.ListDataFrames(mxd):
    if df.name == "Crime":
        df.referenceScale = df.scale
        mapping.ExportToPDF(mxd,r"c:\ArcpyBook\Ch4\DataFrameCrime.pdf",df)

ExportToPDF()函数接受两个必选参数,包括一个地图文档文件的引用参数以及输出的PDF文件参数。

第一个脚本中,函数接受了地图文档引用参数和输出的PDF文件参数。我们并没有传递用来指定输出的数据框的可选参数,因此ExportToPDF()函数会输出地图页面布局。该函数还接受许多可选参数,包括一个指定的数据框参数以及许多与输出内容和输出文件的质量有关的参数。

第二个脚本就指定了要导出的数据框参数。你可以参考ArcGIS帮助页面来获取每一个可选参数的详细信息。

6、导出地图为图像文件 

arcpy.mapping模块除了提供了将数据框和地图页面布局导出为PDF文件的功能外,还提供了许多可用于将地图内容导出为图片文件的函数。支持导出的图片格式包括AI,BMP,EMF,EPS,GIF,JPEG,SVG以及TIFF。每个函数接受的参数取决于所创建的图片类型。这些函数中就包括ExportToJPEG(),ExportToGIF()以及ExportToBMP()等。

import arcpy.mapping as mapping
mxd = mapping.MapDocument("CURRENT")
for df in mapping.ListDataFrames(mxd):
    if df.name == "Crime":
        mapping.ExportToJPEG(mxd,r"c:\ArcpyBook\Ch4\DataFrameCrime.jpg",df)

7、使用数据驱动页面和Arcpy制图模块构建地图册

桌面ArcGIS提供了使用数据驱动页面(Data Driven Pages)和arcpy.mapping模块高效创建地图册的功能。

步骤:

(1)在单个地图文档文件中,使用“数据驱动页面”工具条设置布局视图中的索引图层和操作数据,可以创建基础的系列地图。

参考链接:https://malagis.com/arcgis-mapping-works-6-make-atlas.html

(2)使用arcpy.mapping模块可以自动导出系列地图以及为单个地图册文档追加辅助文件等。

import arcpy
import os

# Create an output directory variable
outDir = r"C:\ArcpyBook\Ch4"  

# Create a new, empty pdf document in the specified output directory
finalpdf_filename = outDir + r"\MapBook.pdf"
if os.path.exists(finalpdf_filename):
  os.remove(finalpdf_filename)
finalPdf = arcpy.mapping.PDFDocumentCreate(finalpdf_filename)

# Add the title page to the pdf
print("Adding the title page  \n")
finalPdf.appendPages(outDir + r"\TitlePage.pdf")

# Add the index map to the pdf
print "Adding the index page  \n"
finalPdf.appendPages(outDir + r"\MapIndex.pdf")

# Export the Data Driven Pages to a temporary pdf and then add it to the
# final pdf. Alternately, if your Data Driven Pages have already been
# exported, simply append that document to the final pdf.
mxdPath = outDir + r"\Topographic.mxd"
mxd = arcpy.mapping.MapDocument(mxdPath)
print("Creating the data driven pages \n")
ddp = mxd.dataDrivenPages
temp_filename = outDir + r"\tempDDP.pdf"

if os.path.exists(temp_filename):
  os.remove(temp_filename)
ddp.exportToPDF(temp_filename, "ALL")
print("Appending the map series  \n")
finalPdf.appendPages(temp_filename)

# Update the properties of the final pdf
finalPdf.updateDocProperties(pdf_open_view="USE_THUMBS",
                             pdf_layout="SINGLE_PAGE")

# Save your result
finalPdf.saveAndClose()

# remove the temporary data driven pages file
if os.path.exists(temp_filename):
    print("Removing the temporary map series file")
    os.remove(temp_filename)

# Delete variables
#del finalPdf, mxd, ddp

通常使用arcpy.mapping模块中的PDFDocument类来创建地图册。上述示例首先使用PDFDocumentCreate()函数,并传入输出的PDF文件的全路径,创建一个PDFDocument的实例;

其次,在PDFDocument实例中,两次调用PDFDocument.appendPages()方法,将已存在的标题页和地图索引文件插入到PDF中。

接着,从地图文档中检索dataDrivenPages对象,将该对象的每一页导出到单独的pdf文档中。

然后,将该文档追加到包含标题页和地图索引页的最终的pdf文件中。

最后,使用“USE_THUMBS”和"SINGLE_PAGE"参数更新PDFDocument的属性,保存整个文件,并删除临时的数据驱动页面文档。

参考链接:

https://www.jianshu.com/p/f8685f9f6cc1 

 

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值