Arcpy的mp模块用于处理Arcgis Pro项目中的地图、图层和布局。他是用来替换ArcMap中的mapping模块。使用mp模块可以帮助我们自动化和大规模的更新地图。
本章的文件夹中有一个.aprx的项目文件,该项目包括两个地图和一个布局,布局如下所示,通过这一章的学习要使用Arcpy将下图的布局进行一些更改和优化。
经过本章的学习后可以将上面的布局通过Arcpy调整成下面这样,并且可以进行导出
1 创建项目对象
1.1 创建项目对象
不同于Arcmap使用地图文档.mxd管理数据,Pro使用项目文件.aprx对所有的地图和布局进行管理。将项目读取到内存中后才能进一步对里面的图层和布局进行操作,那么怎么在内存中创建项目对象呢。
使用mp模块的ArcGISProject类即可实例化项目对象。ArcGISProject类示例化项目对象是需要一个aprx_path参数,有两种传递方式。
- 传递.aprx文件的路径:将实例化指定路径的项目文件的内存对象。
project = arcpy.mp.ArcGISProject(r".\Chapter7.aprx") # 此处使用相对路径,也可以使用绝对路径
type(project) # <class 'arcpy._mp.ArcGISProject'>
- 传递”CURRENT”关键字:将实例化当前项目的内存对象,但是只能在ArcGIS Pro内部的 Jupyter Notebook环境中使用。
project = arcpy.mp.ArcGISProject('CURRENT')
type(project) # <class 'arcpy._mp.ArcGISProject'
本章将主要使用第二种方式,因为我们主要对当前的项目对象进行操作并希望在当前地图或布局直接刷新我们的操作。
1.2 保存项目和锁
在对项目进行修改后我们需要对修改后的操作进行保存。
- ArcGISProject.save()方法:作用于当前ArcGISProject对象,并将更改保存到当前的ArcGISProject对象。
- ArcGISProject.saveACopy()方法:将当前ArcGISProject对象另存为.aprx文件,需要给出路径。
在脚本中引入项目时会对项目加锁防止其他人同时对项目进行更改。解除锁的方式是在完成操作后使用del删除ArcGISProject对象。
2 更新和修复数据源
涉及的知识点:
- ArcGISProject对象
- listMaps ({wildcard})方法:将通配符匹配的地图对象作为列表返回
- listLayers ({wildcard})方法:将通配符匹配的图层对象作为列表返回
- layer对象
- isBroken属性:返回bool值,图层损坏了则返回Ture,否则返回False
- connectionProperties属性
- 返回图层的引用数据源字典包含以下键值对:
- dataset:数据源的名称
- workspace_factory:数据源组织形式的可以是shapfile、File Geodatabase和SDE
- connection_info:字典键值对的个数取决于workspace_factory参数
- 对于shpfile和File Geodatabase:只包含database建,取值为shp所在的文件夹或File Geodatabase的完整路径
- 对于SDE:包含更多的键值对
- updateConnectionProperties (current_connection_info, new_connection_info, {auto_update_joins_and_relates}, {validate}, {ignore_case})方法:更新图层的引用数据源
地图中的图层都引用了对应的数据源,出现以下两种情况时我们需要对图层引用的数据源进行更新:
- 主动更新图层的数据源,如做系列地图。
- 数据位置发生了变化,我们需要更新引用否则会出现本工程文件中的情况。
我们首先查看一下丢失数据源图层的情况。
# 实例化当前的项目对象
project = arcpy.mp.ArcGISProject('CURRENT')
mapName = "Map" # 出现数据源丢失的地图的名称
m = project.listMaps(mapName)[0] # 获取名为Map的地图
layers = m.listLayers() # 获取地图的所有图层
for layer in layers:
# 图层损坏才打印
if layer.isBroken:
print(layer.name)
print(layer.connectionProperties)
print("-----------")
# 输出
UniqueStops_Summer21
{'dataset': 'UniqueStops_Summer21', 'workspace_factory': 'File Geodatabase', 'connection_info': {'database': 'C:\\PythonBook\\Chapter7_old\\Chapter7\\TransitData.gdb'}}
-----------
Summer21RouteShape
{'dataset': 'Summer21RouteShape', 'workspace_factory': 'File Geodatabase', 'connection_info': {'database': 'C:\\PythonBook\\Chapter7_old\\Chapter7\\TransitData.gdb'}}
可以看到列出了两个损坏图层的名称和内容列表显示的一直,并且由于我们不存在路径’C:\PythonBook\Chapter7_old\Chapter7\TransitData.gdb’所以图层数据源丢失了,那么接下来我们将对损坏的图层进行修复。
# 当前数据库的位置
newLinkPath = r".\TransitData.gdb"
for layer in layers:
# 图层损坏才更新引用
if layer.isBroken:
# 通过原来的引用信息进行更新
newConnProp = layer.connectionProperties
newConnProp["connection_info"]["database"] = newLinkPath
layer.updateConnectionProperties(layer.connectionProperties, newConnProp)
# 保存并关闭项目对象
project.save()
del project
运行代码后可以看到名为Map的地图中两个损坏的图层已被修复
3 图层使用
3.1 添加移动和删除图层
涉及的知识点:
- Map对象
- addBasemap (basemap_name)方法:虽然叫addBasemap但实际上是对底图进行更新,因为每个地图都会自带一个底图
- addDataFromPath (data_path, {web_service_type}, {custom_parameters})方法:将本地数据或URL添加到图层
- addLayer (add_layer_or_layerfile, {add_position})方法:将图层文件或其他地图中的图层加入当前地图对象的指定位置
- AUTO_ARRANGE:基于图层权重规则和geometry自动放置
- BOTTOM:放到最下面
- TOP:放到最上面
(1)更改底图
addBasemap方法的basemap_name参数取决于你当时登录的portal有哪些地图,我这里登录的Online的开发者账号所以有以下底图可选。
project = arcpy.mp.ArcGISProject('CURRENT')
m = project.listMaps(mapName)[0]
m.addBasemap("Streets")
(2)给map添加本地数据
cpadUnits = r"E:\study\Arcpy\python3\Chapter7\Chapter7\CPAD_2020b_Units.shp" # 向地图添加一个shp数据
m.addDataFromPath(cpadUnits)
此处只能使用绝对路径使用相对路径(cpadUnits = r".\CPAD_2020b_Units.shp")报错
(3)给map添加layer对象并调整位置
oaklandBerkeley = r"E:\study\Arcpy\python3\Chapter7\Chapter7\\OaklandBerkeley_RaceHispanic_Place.lyrx"
addLyr = arcpy.mp.LayerFile(oaklandBerkeley)
m.addLayer(addLyr, "BOTTOM")
由于位置参数是”BOTTOM”直接将其放到了底图的下面,我们调整一下这个图层的顺序。
# 将oaklandBerkeley插入到AlamedaCounty_RaceHispanic_Tract之前
refLayer = m.listLayers("AlamedaCounty_RaceHispanic_Tract")[0] # 创建Layer对象
oakBerkLyr = m.listLayers("OaklandBerkeley_RaceHispanic_Place")[0] # 创建Layer对象
m.moveLayer(refLayer, oakBerkLyr, "BEFORE")
(4)插入一个其他地图中的图层
将Map1地图中的CPAD_2020b_Units_Oakland图层加入到Map中
# 创建名为Map1的地图对象
m2 = project.listMaps("Map1")[0]
for layer in m2.listLayers():
print(layer.name)
# 输出
CPAD_2020b_Units_Oakland
World Topographic Map
World Hillshade
insertLyr = m2.listLayers("CPAD_2020b_Units_Oakland")[0]
# 将Map1的CPAD_2020b_Units_Oakland插入到Map的OaklandBerkeley_RaceHispanic_Place后
m.insertLayer(oakBerkLyr, insertLyr, "AFTER") # <arcpy._mp.Layer object at 0x0000017F966780D0>
(5)删除图层
for layer in m.listLayers():
print(layer.name)
# 输出
CPAD_2020b_Units
OaklandFVeg
UniqueStops_Summer21
Summer21RouteShape
OaklandBerkeley_RaceHispanic_Place
CPAD_2020b_Units_Oakland
AlamedaCounty_RaceHispanic_Tract
World Street Map
# 删除指定图层
cpadUnits = m.listLayers("CPAD_2020b_Units")[0]
cpadOakland = m.listLayers("CPAD_2020b_Units_Oakland")[0]
oakBerRaceHis = m.listLayers("OaklandBerkeley_RaceHispanic_Place")[0]
removeList = [cpadUnits, cpadOakland, oakBerRaceHis]
for layer in removeList:
m.removeLayer(layer)
# 保存编辑并删除project对象
project.save()
del project
3.2 图层符号系统
使用Pro的mp模块可以快速的创建图层的符号系统并进行更改操作。使用符号系统类的渲染器和着色器更改要素图层和栅格图层的符号系统。
- 渲染器(Renderer)—>要素图层
- 着色器(Colorizer)—>栅格图层
注意
Arcmap中的mapping模块对图层的符号系统进行更新比较麻烦,需要使用所需的符号系统创建图层文件,再将图层的符号系统更新为图层文件的符号系统。并无法使用mapping模块访问Arcmap中的大多数符号系统设置。
3.2.1 渲染器和着色器
到Arcgis Pro 3.1 软件支持以下五种渲染器,和三种着色器参考文档。
(1) 要素图层的渲染器类型
- SimpleRenderer:只用一个符号进行渲染
- UniqueValueRenderer:唯一值渲染
- GraduatedColorsRenderer:分级色彩渲染
- GraduatedSymbolsRenderer:分级符号渲染
- UnclassedColorsRenderer:未归类的颜色
(2)栅格图层的着色器类型
- RasterUniqueValueColorizer:唯一值渲染
- RasterClassifyColorizer:分类渲染
- RasterStretchColorizer:离散渲染
注意
和目前软件产品比起来,mp模块能使用的渲染器和着色器还未完全覆盖。为了使用渲染器和着色器,可以使用hsaattr()方法检测图层和栅格是否支持它。
- 桌面产品中可用的渲染器
- 桌面产品中可用的着色器
接下来的代码将分别检测Map地图中的三个图层是否有渲染器或着色器属性,并更改其渲染器或着色器
project = arcpy.mp.ArcGISProject("CURRENT")
mapName = "Map"
m = project.listMaps(mapName)[0]
# 列出要进行符号化的数据
census = "AlamedaCounty_RaceHispanic_Tract"
busRoute = "Summer21RouteShape"
vegRaster = "OaklandFVeg"
# 创建图层对象
censusLyr = m.listLayers(census)[0]
busRouteLyr = m.listLayers(busRoute)[0]
vegRasterLyr = m.listLayers(vegRaster)[0]
# 查看每个符号系统的渲染器/着色器
censusLyrSym = censusLyr.symbology
print(hasattr(censusLyrSym, "renderer")) # True
print(censusLyrSym.renderer.type) # SimpleRenderer
busRouteLyrSym = busRouteLyr.symbology
print(hasattr(busRouteLyrSym, "renderer")) # True
print(busRouteLyrSym.renderer.type) # SimpleRenderer
vegLyrSym = vegRasterLyr.symbology
print(hasattr(vegLyrSym, "colorizer")) # True
print(vegLyrSym.colorizer.type) # RasterStretchColorizer
3.2.2 唯一值渲染器
使用唯一值渲染器渲染Summer21RouteShape图层,唯一值渲染器至少需要两个参数,字段和值的颜色。
- 字段是一个列表,因为可以使用多个字段进行符号化
- 颜色可以使用if语句将特定的颜色应用于每一个唯一值字段,或使用色带,这里将使用色带
# 打印出所有可用色带
print(len(project.listColorRamps())) # 465
for ramp in project.listColorRamps():
print(ramp.name)
# 输出
Accent (3 Classes)
Accent (4 Classes)
Accent (5 Classes)
Accent (6 Classes)
Accent (7 Classes)
Accent (8 Classes)
Aspect
Basic Random
Bathymetric Scale
...
这些色带和软件符号系统中的颜色方案对应
# 更新符号系统对象中的渲染器为唯一值渲染器
busRouteLyrSym.updateRenderer("UniqueValueRenderer")
busRouteLyrSym.renderer.fields = ["PUB_RTE"]
busRouteLyrSym.renderer.colorRamp = project.listColorRamps("Basic Random")[0]
# 使用新的符合系统更新图层的符合系统
busRouteLyr.symbology = busRouteLyrSym
3.2.3 分级色彩渲染器
使用分级色彩渲染器 渲染AlamedaCounty_RaceHispanic_Tract图层。
# 更新符号系统对象中的渲染器为分级色彩渲染器
censusLyrSym.updateRenderer("GraduatedColorsRenderer")
censusLyrSym.renderer.classificationField = "percent_minority" # 设置分类字段
censusLyrSym.renderer.breakCount = 4 # 设置中断数
censusLyrSym.renderer.colorRamp = project.listColorRamps("Condition Number")[0] # 设置色带
# 将符号系统对象应用于图层
censusLyr.symbology = censusLyrSym
在使用分级色彩渲染器时,还可以选择不同的分类方法classificationMethod
- DefinedInterval:定义分类方案,设置区间长度 然后根据数据范围进行分类
- EqualInterval:等间隔分类方案,设置类的数量 然后根据数据自动划分为等间隔的类
- GeometricInterval:几何区间分类方案,区间大小基于一种算法,可以确保类中有大致相同数量的值,并且区间之间的变化在某种程度是一致的
- ManualInterval:自定义分类方案
- NaturalBreaks:自然断点法
- Quantile:分位数分类方案
- StandardDeviation:标准差分类方案
但是上面的代码中我们并未对classificationMethod参数进行设置,可以看出他应该是使用了默认值,那么默认值是什么呢?
# 查看默认的分类方法
print(censusLyrSym.renderer.classificationMethod) # NaturalBreaks
前面章节的数据处理过程中,我们将人口为0的区域,少数族裔比例设置为了-999以标识这里没有人居住,但是在分类时他将-999也显示了出来,需要我们进一步进行设置
breakvalue = 25
firstVal = 0
for brk in censusLyrSym.renderer.classBreaks:
brk.upperBound = breakvalue
brk.label = "{}-{}".format(str(firstVal), str(breakvalue))
breakvalue += 25
firstVal += 25
censusLyr.symbology = censusLyrSym
censusLyr.transparncy = 40
因为修改了间断值,分级色彩渲染器的classificationMethod也将从默认值的NaturalBreaks变成ManualInterval
print(censusLyrSym.renderer.classificationMethod) # ManualInterval
3.2.4 唯一值着色器
使用唯一值着色器 为OaklandFVeg栅格图层着色
# 更新符号系统对象中的着色器为唯一值着色器
vegLyrSym.updateColorizer("RasterUniqueValueColorizer")
vegLyrSym.colorizer.field = "WHR10NAME"
vegLyrSym.colorizer.colorRamp = project.listColorRamps("Basic Random")[0]
# 将符号系统对象应用于图层
vegRasterLyr.symbology = vegLyrSym
使用随机色为土地利用类型 分配颜色并不合适 我们对城市和水体的颜色进行更改
for group in vegLyrSym.colorizer.groups:
for item in group.items:
if item.label == "Water":
item.color = {"RGB": [0, 0, 255, 100]}
elif item.label == "Urban":
item.color = {"RGB": [153, 153, 153, 100]}
# 将符号系统对象应用于图层
vegRasterLyr.symbology = vegLyrSym
4 布局
接下来介绍在布局页面中修改布局元素以及最后将地图导出到文件(PDF、JPG、PNG等)。
4.1 图层
对于图层我们已经了解到了对其进行更改数据源、在地图中添加、删除移动图层以及更改图层的符号系统,这里介绍如何显示和关闭图层以及对图层进行定义查询。
(1)查看个编辑图层的可见性
# 查看Map中所有图层的可见性
project = arcpy.mp.ArcGISProject('CURRENT')
m = project.listMaps('Map')[0]
layers = m.listLayers()
for l in layers:
print(l.name, l.visible)
# 输出
OaklandFVeg True
UniqueStops_Summer21 False
Summer21RouteShape True
AlamedaCounty_RaceHispanic_Tract True
World Street Map True
# 编辑可见性
target_l = m.listLayers('OaklandFVeg')[0] # 要关闭的图层
target_l.visible = False
(2)对图层进行定义查询
由于制图需求我们只需要在地图中显示所有的跨湾公交线路,而所有的跨湾公路以数字开头[‘F’, ‘G’, ‘J’, ‘L’, ‘LA’, ‘NL’, ‘NX’, ‘O’, ‘P’, ‘U’, ‘V’, ‘W’],此时我们需要使用到图层的定义查询功能,只显示图层中满足查询条件的要素。
# 查询跨湾公交线路
busRouteLyr = m.listLayers('Summer21RouteShape')[0]
busRouteLyr.definitionQuery = "PUB_RTE In ('F', 'G', 'J', 'L', 'LA', 'NL', 'NX', 'O', 'P', 'U', 'V', 'W')"
注意:
使用完定义查询后,地图和布局中的内容已经进行了更新但是 地图中的图例还是显示的定义查询之前的内容。要对图例进行更新需要使用到布局元素。
4.2 布局元素
4.2.1 重要属性和方法
布局对象有很多可供修改的属性和方法,如name、pageUnits、pageHeight、pageWidth等属性和listElements()方法以访问布局中的所有布局元素。它有两个参数
listElements ({element_type}, {wildcard})
element_type布局元素类型
- GraphicElement:以列表形式返回布局页面中的所有图形元素,包括地图上绘制的任何线或多边形元素。
- LegendElement:以列表形式返回布局页面中的所有图例元素。
- MapFrame:以列表形式返回布局页面中的所有地图框元素。
- MapsurroundElement:以列表形式返回布局页面中的所有地图环绕元素,包括比例尺、指北针和整齐线。
- PictureElement:以列表形式返回布局页面中的所有图片元素,如jpg或png。
- TextElement:以列表形式返回布局页面中的所有文本元素,包括任何标题和副标题。
wildcard通配符
注意:
pageUnits必须是CENTIMETER、INCH、MILLIMETER和POINT中的一个而pageHeight和pageWidth是基于pageUnits的。
project = arcpy.mp.ArcGISProject("CURRENT")
layoutName = "AlamedaCounty"
layout = project.listLayouts(layoutName)[0]
print(layout.name, layout.pageUnits, layout.pageHeight, layout.pageWidth) # AlamedaCounty INCH 8.5 11.0
# 更改layout的mc
layout.name = "AlamedaCountyTransbayBus"
# 打印布局视图中所有布局元素的名称和类型
lyElems = layout.listElements()
for elem in lyElems:
print("{} is a {} element".format(elem.name, elem.type))
# 输出
Text is a TEXT_ELEMENT element
Legend is a LEGEND_ELEMENT element
Scale Bar is a MAPSURROUND_ELEMENT element
North Arrow is a MAPSURROUND_ELEMENT element
Map Frame is a MAPFRAME_ELEMENT element
4.2.2 文本元素
# 进一步更改布局元素的名称 使其指向性更明确
textElem = layout.listElements("TEXT_ELEMENT", "TEXT")[0]
textElem.name = "Title"
4.2.3 图例元素
LegendElement对象的属性众多具体参考官方文档重要的属性如下:
- mapFrame:图例引用的地图(必须是MapFrame对象)
- elementPositionX:锚点位置的x位置,单位与pageUnits一致
- elementPositionY:锚点位置的y位置,单位与pageUnits一致
elementPositionX和elementPositionY都是通过锚点设置的,而锚点只能在Pro中进行设置。
- elementHeight:元素的高度,单位与pageUnits一致
- elementWidth:元素的宽度,单位与pageUnits一致
- fittingStrategy:图例的拟合策略包括AdjustFontSize、AdjustColumns、AdjustColumnsAndFont、AdjustFrame、ManualColumns。
- columnCount:图例中的列数,只有当fittingStrategy为AdjustFontSize、AdjustFrame和ManualColumns时才生效
- title:图例的标题
- showTitle:一个布尔值,True显示标题,False不显示
- items:以列表形式返回LegendItem类,并可以通过使用LegendItem类来修改图例项的属性。
图例元素还有以下重要的方法
- addItem (layer, {add_position}):向图例添加一个Layer对象,add_position可以是图层堆栈的“TOP”(默认)或”BUTTOM”
- moveItem (reference_item, move_item, {move_position}):将一个图例元素移动到指定的图例元素之后”BEFORE”(默认)或之前”AFTER”
- removeItem (remove_item):删除图例元素
LegendElement对象的items属性,以列表形式返回LegendItem表示图例中的每一个项目,他们都可以通过Python对其属性进行查看或编辑。
- arrangement:图例项的排列
- column:图例项所在的列,只有当 fittingstrategy为ManualColumns时生效
- name:只读属性,想更改图例项的name需要直接更改图例项引用的图层的名称
- patchHeight:图例项的高度单位是points
- patchWidth:图例项的宽度单位是points
- showFeatureCount:布尔值,True在图例旁边显示要素的数量,False不显示
- showVisibleFeatures:布尔值,True只显示可见的要素(这就是为什么使用定义查询后图例没更新),False显示所有要素
- visible:布尔值,True显示图例项,False不显示
- visible:返回类型即LEGEND_ITEM
目前的图例元素存在一些问题
- 公交车线路数据在地图框地图框中只显示了跨湾线路(定义查询),但是图例中还是显示的所有公交车线路
- 目前的图例元素显示不下AlamedaCounty_RaceHispanic_Tract(图例右下角的…)
(1)查看图例的属性
legend = layout.listElements('LEGEND_ELEMENT', "Legend")[0]
print(legend.title)
print(legend.showTitle)
print(legend.elementHeight)
print(legend.elementWidth)
print(legend.fittingStrategy) # 拟合策略
# 输出
Legend
False
1.51
6.28
AdjustColumnsAndFont
(2)更改图例的属性
legend.fittingStrategy = "AdjustFontSize" # 更换图例元素的拟合策略 可以看到比之前还差所有更换回原来的值
# 更换回原来的拟合策略
legend.fittingStrategy = "AdjustColumnsAndFont"
# 在图例元素中找到Summer21RouteShape图例项并让其只显示可见要素
for item in legend.items:
if item.name == "Summer21RouteShape":
item.showVisibleFeatures = True
# 图例元素中的Summer21RouteShape图例项名称为PUB_RTE不合适 进行更改
# 但是图例项的名称属性只能读不可写 符号系统对象的组对象进行更改
m = project.listMaps("Map")[0]
busRouteLyr = m.listLayers("Summer21RouteShape")[0]
busRouteLyrSym = busRouteLyr.symbology
for group in busRouteLyrSym.renderer.groups:
print(group.heading)
if group.heading == "PUB_RTE":
group.heading = "Transbay Routes"
busRouteLyr.symbology = busRouteLyrSym
要在Pro中将Summer21RouteShape图例项的属性做如下设置才能更改正确
人口普查数据使用的是GraduatedColorsRenderer渲染器没有组对象 直接更改图层名称
censusLyr = m.listLayers("AlamedaCounty_RaceHispanic_Tract")[0]
censusLyr.name = "Percent Minority by Tract"
image-20231030233842016
这里Percent Minority by Tract和Transbay Routes字体大小有差异 在12章中将介绍在Pro中如何更好的设置图例
移动图例元素位置:图例的锚点设置在左上角使用elementPointX和elementPointY可以通过锚点进行移动
legend.elementPositionX = 0.7
legend.elementPositionY = 0.7
4.2.4 比例尺和指北针
比例尺和指北针元素可以通过Arcpy调整有限的属性,无法通过Arcpy更改其类型,只能在Pro中手动更该
文本元素可以实现移动、更新文本内容和字体大小,无法通过Arcpy更改其字体,只能在Pro中手动更该
scalebar = layout.listElements("MAPSURROUND_ELEMENT", "Scale Bar")[0]
northArrow = layout.listElements("MAPSURROUND_ELEMENT", "North Arrow")[0]
title = layout.listElements("TEXT_ELEMENT", "Title")[0]
(1)移动比例尺元素的位置 锚点在右下角
scalebar.elementPositionX = 10.4
scalebar.elementPositionY = 0.6
(2)调整指北针的位置 指北针锚点位于底部中间
northArrow.elementPositionX = scalebar.elementPositionX - (scalebar.elementWidth/2)
northArrow.elementPositionY = scalebar.elementPositionY + scalebar.elementHeight + 0.25
(3)修改文本图例元素的内容
4.3 导出布局
支持多种导出的格式 具体参考:
此处对常见的JPEG、PNG和PDF格式进行导出操作
import os
outputLoc = r".\res"
project = arcpy.mp.ArcGISProject("CURRENT")
layouts = project.listLayouts()
(1)将项目的所有layout导出为JPG
for layout in layouts:
name = layout.name
jpgName = os.path.join(outputLoc, name + ".jpg")
layout.exportToJPEG(jpgName, resolution=250)
(2)将项目的所有layout导出为PNG
for layout in layouts:
name = layout.name
pngName = os.path.join(outputLoc, name + ".png")
layout.exportToPNG(pngName, resolution=250)
(3)将项目的所有layout导出为PDF
for layout in layouts:
name = layout.name
pdfName = os.path.join(outputLoc, name + ".pdf")
layout.exportToPDF(pdfName, resolution=250)
5 总结
可以看到通过本章的学习将一开始不符合制图要求的数据进行图层的调整,符号系统的调整以及最后对布局元素进行修改并导出到文件。形成了一个相对完整的自动化制图的入门案例。