赞
踩
在很多GIS项目中会遇到自动制图的需求,第一时间想到的就是esri强大的arcpy。关于arcpy自动制图的文章也有很多大佬写过,但搜了很多文章都是利用arcp.mapping API开发的,而arcpy.mapping是基于ArcGIS Desktop的mxd地图文档进行制图的。要知道,强大的esri已经将桌面产品更新至pro好几代了,在埋头拉车时也要跟近技术哈。
有关arcpy.mapping迁移至arcpy.mp的详细说明请前往官网查看:从 arcpy.mapping 迁移至 ArcGIS Pro
arcpy.mapping主要是对.mxd地图文档进行处理,而arcpy.mp主要是对pro创建的.aprx工程文件进行处理。arcpy.mp在arcpy.mapping的基础上添加和更新了很多接口。但具体是使用.mapping还是.mp还得根据个人需求。
光说不练~来,下面呢我举个简单的栗子: 我这里呢有五个省的行政边界shp数据,分别用arcpy.mapping和arcpy.mp自动制作省级边界图。
先理一下思路,我是这样想的,先用某个省的数据制作.mxd地图文档和.aprx工程文件,用同一个模板,然后替换图层数据源,最后出图。emmm~~~听起来好简单,那就操作起来吧!
1. .mxd制图模板
怎么用arcmap制作.mxd地图文档这项技能作为一个搞GIS的应该没的说,看看我做的一个粗糙的.mxd布局模板。
仔细看上图,每个省的专题图标题肯定不同,这里我还加了制图日期,所以要注意,在制作模板时,将标题和制图日期的文本框元素名称要做以修改,以便于区分和代码实现内容的修改。
2. 代码实现图层数据源的修改和地图相关内容的修改
这里我不多说,直接码代码,相关说明见注释。
#coding=utf-8
import arcpy, os
from datetime import datetime
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
path = u"E:/省份"
names = []
#遍历.shp文件名
file_list = os.listdir(path)
for file in file_list:
if os.path.splitext(file)[1] == ".shp":
names.append(file)
#加载地图文档
mxd_path = u"E:/省份/City.mxd"
mxd = arcpy.mapping.MapDocument(mxd_path)
#获取图层
layer = arcpy.mapping.ListLayers(mxd, "省份")[0]
for name in names:
#修改数据源
layer.replaceDataSource(path, "SHAPEFILE_WORKSPACE", name[0:3])
#更新布局视图范围
df = arcpy.mapping.ListDataFrames(mxd)[0]
df.extent = layer.getExtent()
#修改标题
title = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "标题")[0]
title.text = "%s边界图" % name[0:3]
#修改下标日期
day_title = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "日期")[0]
day_title.text = "%s年%s月%s日制" % (datetime.today().year, datetime.today().month, datetime.today().day)
export_path = "E:/省级边界图/%s.png" % name[0:3]
arcpy.mapping.ExportToPNG(mxd, export_path, resolution=300)
del mxd
3. 运行结果
1. 准备.aprx工程文件
利用arcgis pro制作地图模板,虽然与arcmap有所不同,但制图,,,就不用说了吧,如果不会,看看培训视频。
这里还是和制作.mxd地图文档时需要注意将标题和制图日期的文本框元素名称要做以修改。
2. 代码实现图层数据源的修改,图层符号和地图相关内容的修改
在这里呢会看到我将图层符号进行了修改,为啥arcpy.mapping中我没做修改呢,这个问题我留到总结时说吧。
import arcpy, os
from datetime import datetime
path = "E:/省份"
names = []
#遍历.shp文件名
file_list = os.listdir(path)
for file in file_list:
if os.path.splitext(file)[1] == ".shp":
names.append(file)
#加载工程文件
aprx_path = "E:/省份/City/City.aprx"
aprx = arcpy.mp.ArcGISProject(aprx_path)
#获取图层
layer = aprx.listMaps("map")[0].listLayers("省份")[0]
R, G, B, A = 255, 210, 110, 100
for name in names:
#修改数据源
replace_dict = {"database": path,
"dataset": name,
"workspace_factory": "Shape File"}
layer.updateConnectionProperties(layer.connectionProperties, replace_dict)
#修改符号颜色
R = R - 20
G = G - 20
B = B + 20
symbol_color = {'RGB' : [R, G, B, A]}
symbol = layer.symbology
symbol.renderer.symbol.color = symbol_color
layer.symbology = symbol
layout = aprx.listLayouts()[0]
#更新布局视图范围
mf = layout.listElements('MAPFRAME_ELEMENT')[0]
mf.camera.setExtent(mf.getLayerExtent(layer))
#修改标题
title = layout.listElements("TEXT_ELEMENT", "标题")[0]
title.text = "%s边界图" % name[0:3]
#修改下标日期
day_title = layout.listElements("TEXT_ELEMENT", "日期")[0]
day_title.text = "%s年%s月%s日制" % (datetime.today().year, datetime.today().month, datetime.today().day)
export_path = "E:/省级边界图/%s.png" % name[0:3]
layout.exportToPNG(export_path, resolution=300)
del aprx
3. 运行结果
仔细看代码,会发现arcpy.mapping和arcpy.mp里面的类还是发生了很大变化的,但其整体处理思路是一样的。在这里有个很大的也很突出的问题:为啥arcpy.mapping出图后的专题图都是同一个颜色呢,而arcpy.mp可以改变图层颜色呢。
这个问题很重要,在查看arcpy.mapping接口文档时你会发现它对图层符号是不允许赋值更改的。
但是呢,你可以通过StylelItem接口来修改图层符号样式,同时如果对应的symbologyType类型是受支持的,可以通过修改属性对象内部来实现,我这里是单一符号进行符号化的,所以无法更改属性值。
但是arcpy.mp就不一样了,它完全支持图层符号属性的修改,代码中也用到了,symbology不再是只读了,你可以随意修改。
同时arcpy.mapping只能用python2,arcpy.mp只能用python3开发,.aprx工程文件在Linux下是没法解析的,而.mxd文件是可以完美解析的,所以暂时来说arcpy.mapping与arcpy.mp各有用武之地,不过arcpy.mp更加完美。
这篇文章只是对一小部分的内容进行说明,还有很多技术等着发掘哦~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。