利用 ArcMap 的 MXD 布局视图以及ArcPy 脚本实现批量自动生成油井点之记并导出 PDF(实操+亲测)
文章目录
- 1、思路(点之记基于 MXD 模板)
- 2、实现步骤
- 2.1、程序具体流程:
- 2.2、MXD 模板设计要点
- 2.3、代码
- 3、运行并输出效果
最近项目中有这样一个需求:某油田有上千口油气井,每口井需要按照一定的模板单独生成pdf格式的点之记文件;井口的数据是shp文件形式;本文利用 ArcMap 的 MXD 布局视图(Layout View) 来生成点之记;直接在 ArcPy 脚本里批量导出 PDF,每个点都生成一份独立的 点之记 PDF 文件。
点之记模板pdf如下:
1、思路(点之记基于 MXD 模板)
-
准备一个 MXD 模板文件
-
打开 ArcMap,切换到 Layout View(布局视图)。
-
在布局中插入 两个 Data Frame(数据框):
-
大比例尺视图(比如 1:2,000,显示点的细节)MainView。
-
小比例尺视图(比如 1:50,000,显示点的大环境)Overview。
-
在布局上预留文本框(点号、坐标、高程、施工信息等),可以用 动态文本(Dynamic Text) 或者后续用 ArcPy 替换。
-
保存为well.mxd。
上述为Arcmap创建的well模板。
2、实现步骤
使用ArcGIS安装后自带的Python中的ArcPy 脚本进行编程实现:
2.1、程序具体流程:
-
打开 well.mxd。
-
遍历点要素:
-
设置主数据框(MainView)的中心到点坐标,并缩放到指定比例尺。
-
设置副数据框(Overview)的中心到点坐标,并缩放到另一个比例尺。
-
更新布局中的文本元素(比如点号、高程)。
-
导出为 PDF 或 PNG(每个点一份)。
-
2.2、MXD 模板设计要点
-
数据框(Data Frame):
-
给两个数据框命名,例如 MainView 和 Overview,方便在脚本里定位。
-
布局文本(Text Element):
-
在布局里插入三个 文本框(Text Element),命名为 PointID、Coords、Height。
-
ArcPy 可以用 ListLayoutElements() 按名字更新内容。
-
比例尺:
-
主视图:1:2000
-
副视图:1:50000
-
可根据需求调整。
-
模板中有两个 Data Frame(大比例尺、小比例尺),分别命名为 MainView 和 Overview
模板中有三个 文本框(Text Element),名字分别是 PointID、Coords、Height
2.3、代码
# -*- coding: utf-8 -*-
import arcpy
import os# 输入参数
shp_path = r"F:\python_project\web_demo_flask\data\well.shp"
mxd_template = r"F:\ADNOC_3D\Survey2025\Mxdfiles\well.mxd"
output_dir = r"F:\ADNOC_3D\Survey2025\output_pdf"if not os.path.exists(output_dir):os.makedirs(output_dir)# 打开模板 MXD
mxd = arcpy.mapping.MapDocument(mxd_template)# 获取数据框
df_main = None
df_overview = None
for df in arcpy.mapping.ListDataFrames(mxd):if df.name == "MainView":df_main = dfelif df.name == "Overview":df_overview = dfif not df_main or not df_overview:raise Exception("请确认 MXD 模板中包含 MainView 和 Overview 数据框!")# 遍历点数据
with arcpy.da.SearchCursor(shp_path, ["PointName", "X", "Y"]) as cursor:for row in cursor:PointName, X, Y = row# 设置主视图范围(大比例尺)df_main.extent = arcpy.Extent(X - 0.001, Y - 0.001, X + 0.001, Y + 0.001)df_main.scale = 2000 # 可调整比例尺# 设置副视图范围(小比例尺)df_overview.extent = arcpy.Extent(X - 0.01, Y - 0.01, X + 0.01, Y + 0.01)df_overview.scale = 10000# 更新文本框for elm in arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT"):if elm.name == "PointID":elm.text = "点号:{}".format(PointName)elif elm.name == "Coords":elm.text = "X={:.3f}, Y={:.3f}".format(X, Y)# 导出 PDFout_pdf = os.path.join(output_dir, u"点之记_{}.pdf".format(PointName))arcpy.mapping.ExportToPDF(mxd, out_pdf)print(u"已导出: {}".format(out_pdf))print("所有点之记 PDF 已批量生成!")
del mxd
3、运行并输出效果
打开ArcGIS—IDLE(Python GUI)
运行后,在 D:\project\output_docs\ 里生成:
点之记_1.pdf
点之记_2.pdf
点之记_3.pdf
...
每份 PDF 都会包含:
一个大比例尺视图(放大到点位附近)
一个小比例尺视图(显示整体位置)
自动填充的点号、坐标、高程信息等信息;
“人的一生会经历很多痛苦,但回头想想,都是传奇”。