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

在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()

### 实现ArcGIS批量生成地图包含动态表格功能 在ArcGIS中实现批量生成地图包含动态表格的功能,可以借助Python脚本以及`arcpy`模块来完成。以下是具体方法和示例代码: #### 方法概述 通过编写Python脚本来自动化处理地图文档(`.mxd`),设置数据驱动页面(Data Driven Pages)以定义地图范围,使用布局中的动态文本或表控件展示表格内容。 --- #### 示例代码:批量生成带动态表格地图 以下是一个完整的示例代码,用于演示如何在ArcGIS批量生成带有动态表格地图。 ```python import arcpy from arcpy import mapping # 定义输入参数 mxd_path = r"C:\Path\To\Your.mxd" # 地图文档路径 output_folder = r"C:\Path\To\Output\Folder" # 输PDF文件夹 table_layer = "DynamicTableLayer" # 表格层名称 data_driven_pages_enabled = True # 是否启用数据驱动页面 # 打开MXD文档 mxd = arcpy.mapping.MapDocument(mxd_path) # 获取数据框架 df = arcpy.mapping.ListDataFrames(mxd)[0] if data_driven_pages_enabled: # 启用数据驱动页面 ddp = mxd.dataDrivenPages index_layer = ddp.indexLayer # 遍历每一页导出PDF for page_number in range(1, ddp.pageCount + 1): ddp.currentPageID = page_number # 更新动态表格内容 lyr_table = arcpy.mapping.ListLayers(mxd, table_layer, df)[0] query = f"{index_layer.name}.PageName = '{ddp.pageRow.PageName}'" lyr_table.definitionQuery = query # 导出当前页到PDF output_pdf = f"{output_folder}\\Map_{page_number}.pdf" arcpy.mapping.ExportToPDF(mxd, output_pdf) else: # 如果未启用数据驱动页面,则仅导出单张地图 output_pdf = f"{output_folder}\\Single_Map.pdf" arcpy.mapping.ExportToPDF(mxd, output_pdf) del mxd print(f"地图已成功导出至 {output_folder}") ``` 上述代码实现了以下几个核心功能: 1. **加载地图文档**:读取指定的`.mxd`文件[^2]。 2. **启用数据驱动页面**:如果启用了数据驱动页面,则遍历每一页更新动态表格的内容[^1]。 3. **更新表格查询条件**:根据当前页面的数据范围筛选表格内容[^3]。 4. **导出PDF**:将每一幅地图导出为独立的PDF文件[^4]。 --- #### 关键技术点说明 1. **数据驱动页面 (Data Driven Pages)** 数据驱动页面允许用户基于某个要素类的空间范围自动划分地图区域。这非常适合于需要按特定地理单元生成地图的应用场景。 2. **动态表格更新** 使用`definitionQuery`属性过滤表格层的内容,使其只显示与当前地图范围匹配的部分。 3. **PDF导出** `ExportToPDF`函数支持高质量矢量形输,适用于打印或其他高分辨率需求。 --- #### 注意事项 - 确保地图文档中已经设置了数据驱动页面及其关联的索引层。 - 动态表格需作为单独的层添加到地图文档中,确保其字段结构满足业务需求。 - 脚本运行前应验证所有路径的有效性,避免因路径错误导致程序失败。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值