arcgis批量操作 动态生成表格并导出地图

5 篇文章 0 订阅
3 篇文章 0 订阅

在arcgis输出地图操作中,常常需要将每个图形要素分别导出地图,地图上还需要附有图形要素的属性信息,当需要导出的地图数量少的时候,操作很简单,但是当需要导出的地图是几十张甚至几百张的时候,利用python编写的arcgis脚本工具能帮我们从这重复单一的工作中解脱出来。

动态生成表格:
arcgis中也可以直接插入表格,在插入——对象中选择excel即可,这样插入的表格还可以编辑表格里的数据,但是要是需要更新表格里的数据就要每次都得手动更新。
arcgis中有两种可以生成动态表格的方法。方法一:安装ESRI Producting Mapping扩展插件,这是arcgis自带的扩展,不过由于找不到对应版本的扩展插件安装包,遂放弃方法一;方法二:利用arcpy中的Graphic Element来绘制表格,这个方法需要我们编写脚本来实现。arcpy中有例子讲解怎么使用GraphicElement,主要方法是复制现有的线段并改变他们 图形属性从而绘制成表格。

本文做法如下:
在地图布局中先绘制两条直线,一条竖线,一条横线;添加一个文本。
1、在绘图中选择绘制线段,然后绘制线段,最后添加一个文本,并修改图形属性中的元素名称
图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()

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值