利用 ArcMap 的 MXD 布局视图以及ArcPy 脚本实现批量自动生成油井点之记并导出 PDF(实操+亲测) - 教程

最近项目中有这样一个需求:某油田有上千口油气井,每口井需要按照一定的模板单独生成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 = df
elif df.name == "Overview":
df_overview = df
if 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)
# 导出 PDF
out_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 都会包含:

一个大比例尺视图(放大到点位附近)

一个小比例尺视图(显示整体位置)

自动填充的点号、坐标、高程信息等信息;

在这里插入图片描述


“人的一生会经历很多痛苦,但回头想想,都是传奇”。


posted @ 2025-10-31 13:56  clnchanpin  阅读(171)  评论(0)    收藏  举报