Arcpy批量导出地图
最近有些学习和工作都涉及到地图的输出,利用Arcmap制作专题图虽然较为方便,但是在地图数量非常多的情况下效率较低,因此考虑能不能使用Arcpy来实现地图的批量导出呢。
一、将要素类中的单个要素导出为地图
事先设置好mxd文档中的数据框、图层、布局视图等的样式,这里不赘述了,执行下列代码:
mxd = arcpy.mapping.MapDocument("D:/Desktop/test.mxd")
#图层
lyr = arcpy.mapping.ListLayers(mxd)[1]
#数据框
df = arcpy.mapping.ListDataFrames(mxd)[0]
rows = arcpy.SearchCursor(lyr)
for row in rows:
geo = row.shape
#要素名称字段
name = row.getValue("name")
#数据框范围以当前要素为中心
df.panToExtent(geo.extent)
arcpy.mapping.ExportToPNG(mxd, r"D:/Desktop/tu/" + name + ".png", 300)
对于栅格想要分幅输出可以使用数据驱动页面进行。
二、将文件夹下的多个要素类或栅格导出为地图
事先在mxd文档中设置好地图样式,添加图例、标题等要素:
数据源为中科院火石夜间灯光数据,数据来源:
https://www.zybuluo.com/novachen/note/1741875
- 利用Arcpy批量输出栅格地图,这里实现了图例和标题随数据源变化的更新,以栅格数据示例代码如下:
import arcpy
import arcpy.mapping as mapping
from arcpy import env
import os
def Getrasterfiles():
#数据目录
arcpy.env.workspace = "D:/Desktop/tu"
allfiles = arcpy.ListRasters("*","TIF")
print allfiles
return allfiles
allrasters = Getrasterfiles()
mxd = arcpy.mapping.MapDocument("D:/Desktop/test.mxd")
#上述mxd文档中的第一个数据框
df = arcpy.mapping.ListDataFrames(mxd)[0]
for raster in allrasters:
#第一个图层;样式已事先设计完成;即标准化拉伸
lyr = mapping.ListLayers(mxd)[0]
oname=str(raster)
name=oname.split(".TIF")[0]
lyr.name = name #图层重命名,以在后续地图输出时图例能够动态变化
#更新layer图层中的数据源,即选择文件夹中下一个栅格文件显示
lyr.replaceDataSource("D:/Desktop/tu", "RASTER_WORKSPACE", name)
df.panToExtent(lyr.getSelectedExtent())
#更改标题名称为对应的栅格文件名
for elm in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):
if elm.name == "title":
elm.text = "Test"+"("+name+")"
# 也可更新图层符号
#获取事先设置好的名为leg的图例对象
leg = arcpy.mapping.ListLayoutElements(mxd, "LEGEND_ELEMENT", "leg")[0]
leg.updateItem(lyr)
arcpy.RefreshActiveView()
arcpy.RefreshTOC()
arcpy.mapping.ExportToPNG(mxd, r"D:/Desktop/tu/" + name + ".png","PAGE_LAYOUT",300)
print 'ok'
若想要批量输出要素类专题图,则在上述基础上进行部分修改即可,例如:
arcpy.ListRasters("*","TIF") 修改为 arcpy.ListFeatureClasses()
输出结果:
不足
- 从上图可以看出,图例的标题虽然被修改了,但其渲染值却没有发生变化,且在arcmap中手动更换数据源后,TOC中显示的范围值也不会发生改变:
如果各位能够找到解决办法,希望可以与我交流,谢谢。