赞
踩
在arcgis输出地图操作中,常常需要将每个图形要素分别导出地图,地图上还需要附有图形要素的属性信息,当需要导出的地图数量少的时候,操作很简单,但是当需要导出的地图是几十张甚至几百张的时候,利用python编写的arcgis脚本工具能帮我们从这重复单一的工作中解脱出来。
动态生成表格:
arcgis中也可以直接插入表格,在插入——对象中选择excel即可,这样插入的表格还可以编辑表格里的数据,但是要是需要更新表格里的数据就要每次都得手动更新。
arcgis中有两种可以生成动态表格的方法。方法一:安装ESRI Producting Mapping扩展插件,这是arcgis自带的扩展,不过由于找不到对应版本的扩展插件安装包,遂放弃方法一;方法二:利用arcpy中的Graphic Element来绘制表格,这个方法需要我们编写脚本来实现。arcpy中有例子讲解怎么使用GraphicElement,主要方法是复制现有的线段并改变他们 图形属性从而绘制成表格。
本文做法如下:
在地图布局中先绘制两条直线,一条竖线,一条横线;添加一个文本。
1、在绘图中选择绘制线段,然后绘制线段,最后添加一个文本,并修改图形属性中的元素名称
2、确定表格的位置,在地图布局中确定表格放置的位置,并确定表格左上角坐标(左上角坐标决定了表格的位置),表格的坐标是arcgis中的页面坐标(位于地图右下角靠右的是页面坐标),注意arcgis中的页面y坐标是从上往下递减的。
3、确定表格的大小。制作表格前需确定表格的行数列数、行高列宽。
4、编写脚本。本文是编写python工具箱的脚本,只提供执行的代码,详细python工具箱使用方法自行查找。
一、 编写一个生成表格的方法。(根据给定的参数,可生成对应的表格线)
#生成表格的主要方法 def drawTable(self,hLine,vLine,aName,tText,numRow,numCols,X,Y,cWidth,rHeight): numrows=numRow numcolumns=numCols numcloumns=2 rowHeight=rHeight #行高 colWidth=cWidth #列宽 upperX = X #表格左上角横坐标 upperY = Y #表格左上角竖坐标 vLine.elementPositionX = upperX vLine.elementPositionY = upperY-(rowHeight * numrows)#arcgis中纵坐标小的点为线段起始点,Y坐标大的点为线段终点,因此需要用左上角纵坐标减去表格的高度得到初始纵线起始点坐标 vLine.elementHeight = (rowHeight * numrows) #纵线的长度 x=upperX#竖线初始横坐标,绘制竖线的时候只有横坐标变化 #绘制竖线 for vert in range(1,numcolumns+1) x=x+colWidth vert_Clone=vertLine.clone("_atrr") vert_Clone.elementPositionX=x hLine.elementPositionX=upperX hLine.elementPositionY = upperY hLine.elementWidth=colWidth*numcolumns#横线的长度 y=upperY#横线绘制的初始坐标,横线绘制的时候只有竖坐标发生变化 for hori in range(1,numrows+1): y=y-rowHeight hori_Clone=horiLine.clone("_atrr") hori_Clone.elementPositionY=y tText.clone("_atrr") tText.text=attributeName[0] tText.elementPositionY=upperY-rowHeight/2#绘制文本 tText.elementPositionX=upperX+6#字段名称的横坐标 #绘制列名 for attri in range(1,numRow): tText.clone("_atrr") tText.text=str(aName[attri]) tText.elementPositionY=tText.elementPositionY-rowHeight tText.elementPositionX=upperX+6 return
二、利用数据驱动页面绘制表格,动态生成表格内容并输出地图图片
1、需要动态生成表格的主要目的是自动更新表格里的内容,此处根据图层属性表里的记录内容动态生成文本。
2、输出地图图片
def execute(self, parameters, messages): try: #先列出已在地图布局中绘制好的两条直线及文本 horiLine=arcpy.mapping.ListLayoutElements(mxd, "GRAPHIC_ELEMENT","horizontalLine")[0]#绘制表格线及字段名称 vertLine=arcpy.mapping.ListLayoutElements(mxd, "GRAPHIC_ELEMENT","verticalLine")[0] tableText = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "tabletext")[0] #调用绘制表格的方法 self.drawTable(horiLine,vertLine,attributeName,tableText,numRow,X,Y,tableWidth,tableHeight) for pageNum in range(1,mxd.dataDrivenPages.pageCount+1): mxd.dataDrivenPages.currentPageID=pageNum current_row = mxd.dataDrivenPages.pageRow current_id = current_row.getValue(id) #动态生成表格内容 for filed in attributeName: tableText = tableText.clone("_clone") tableText.text=current_row.getValue(filed) tableText.elementPositionY=y-tableHeight tableText.elementPositionX=x folderpath = outworkspace+"\\"+str(current_id)+".jpg" arcpy.mapping.ExportToJPEG(mxd,folderpath) except arcpy.ExecuteError: print arcpy.GetMessages()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。