在很多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布局模板。
#coding=utf-8import arcpy, osfrom datetime import datetimeimport sysreload(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地图文档时需要注意将标题和制图日期的文本框元素名称要做以修改。
import arcpy, osfrom datetime import datetimepath = '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, 100for 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接口文档时你会发现它对图层符号是不允许赋值更改的。
这篇文章只是对一小部分的内容进行说明,还有很多技术等着发掘哦~~~
联系客服