有个处理数据的需求是把一个图层中的要素单独显示在底图上,设置固定的比例尺,并打印出图片。
考虑到后续会有重复的大量的数据要处理,决定使用arcpy处理。
首先新建一个mxd底图文档,把需要打印的地图都添加进来。在layout视图配置好出图样式,添加标题比例尺等挂件。标题中设置标识字段,在程序运行过程中会替换掉。
在layout视图下打开Python工具。
运行以下代码:
1 # 第一步,布局打印格式,必须添加标题(插入文本,内容“title”),可以设置比例尺,标注等。必须切换到布局窗口,否则比例尺刷新无效 2 import arcpy 3 import os 4 # 第二步:设置标题显示字段,shp文件的属性字段名称 例如:标题要显示权利人,titlefield就输入"qlr",区分大小写。 5 titlefield="QLR" 6 #设置唯一字段名称 7 objectidfield="FID" 8 #如果唯一字段是数值型的,此处值为 int ,字符型的为“string” 9 objectidfieldtype="int" 10 #文件名称后缀字段 11 filenamezfield="SHAPE_AREA" 12 filenamezfieldtype="int" 13 #设置图层图形字段,shp文件的属性shp名称 例如:shapefield就输入字段shp的名称,区分大小写。 14 shapefield="Shape" 15 #设置图层名称 按gis上图层显示的名称 16 layername="print" 17 #标题默认字符 18 titletext="title" 19 #设置图片存储路径,不能自动创建目录,必须输入已有目录,以双反斜杠为上下级目录间隔,结尾必须为双反斜杠。例如:"C:\Users\l\Desktop\print\"。 20 filepath="C:\Users\l\Desktop\print\" 21 i=1 22 #加载当前工作空间 23 mxd = arcpy.mapping.MapDocument("CURRENT") 24 #加载图层 25 layer=arcpy.mapping.ListLayers(mxd,layername)[0] 26 #定义图层定义查询 27 layer.definitionQuery="1=1" 28 arcpy.RefreshActiveView() 29 #定义图层游标 30 cursor=arcpy.SearchCursor(layername) 31 #遍历游标 32 for row in cursor: 33 text=row.getValue(titlefield) 34 objectid=row.getValue(objectidfield) 35 filenamez=row.getValue(filenamezfield) 36 print(row.getValue(titlefield)) 37 # i<3表示输出2张以作测试 38 if i<100: 39 geo=row.getValue(shapefield) 40 #print(geo) 41 mxd.activeDataFrame.extent=geo.extent 42 titleelm=False 43 for elm in arcpy.mapping.ListLayoutElements(mxd,"TEXT_ELEMENT"): 44 if elm.text==titletext: 45 titleelm=elm 46 elm.text=text 47 try: 48 if objectidfieldtype=="int": 49 where=objectidfield+"= {0}".format(objectid) 50 else: 51 where=objectidfield+"= '{0}'".format(objectid) 52 layer.definitionQuery=where 53 mxd.activeDataFrame.scale=3000 54 arcpy.RefreshActiveView() 55 mxd.save() 56 filename=filepath+text+".jpg" 57 if os.path.exists(filename): 58 if filenamezfieldtype=="int": 59 filename=filepath+text+"({0}).jpg".format(int(filenamez)) 60 else: 61 filename=filepath+text+"({0}).jpg".format(filenamez) 62 arcpy.mapping.ExportToJPEG(mxd, filename,"PAGE_LAYOUT",1753,1241,150) 63 except Exception,ex: 64 print ex 65 finally: 66 if titleelm: 67 titleelm.text=titletext 68 layer.definitionQuery="1=1" 69 arcpy.RefreshActiveView() 70 mxd.save() 71 print i 72 i=i+1 73 74 75 76 #del mxd
所有要素会一一打印,控制台输出打印进度。