赞
踩
最近有些学习和工作都涉及到地图的输出,利用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
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()
输出结果:
如果各位能够找到解决办法,希望可以与我交流,谢谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。