☰
ArcMap数据框四至经纬度标注:三种实操方法详解
2026/10/1 1:41:25 网站建设 项目流程

做过ArcMap制图的同行应该都有这种体会:图面内容、比例尺、指北针、图例都摆得整整齐齐了,结果成果交上去,审核一句话就给你打回来——“数据框的四至经纬度没标”。这个问题在标准分幅图、勘测定界图、用地预审图这些正式成果里几乎绕不开。所谓数据框四至经纬度,就是把当前数据框显示范围的东、西、南、北四个边界点的经纬度值,以注记形式标在图廓外。很多新手在Arcmap里翻半天菜单,发现软件并没有一个按钮直接生成四至经纬度,网上资料又零散,最后只能手动查坐标再往图里敲文字,图幅一改又全部作废。

这篇文章我就把自己实际用过的三种做法整理出来:手动查值、ArcPy脚本一键生成、以及脚本工具化批量出图。从原理到代码再到避坑,一次性说清楚。适合刚接触ArcMap制图出图、被四至标注折腾过、或者想提高批量出图效率的小伙伴参考。

1. 搞清楚数据框范围,才知道四至标的是哪个值

很多人一上来就找“四至”功能按钮,结果找不到。其实问题不在软件,而在对“数据框”这个概念的理解上。ArcMap里的数据框(Data Frame)不是一个普通图框,它对应的是一个真实的坐标范围,四至经纬度标的就是这个范围的边界值。

1.1 什么是数据框的四至经纬度

四至经纬度,指的是当前这个数据框视口所覆盖的地理范围的四个边界坐标。具体来说就是:

  • 东至(East):数据框右边界对应的经度
  • 西至(West):数据框左边界对应的经度
  • 南至(South):数据框下边界对应的纬度
  • 北至(North):数据框上边界对应的纬度

这里面有一个很容易忽略的坑:四至值跟数据框的“显示范围”有关,跟图层要素实际范围并不一定是同一回事。比如你加载了一个县界图层,但切换到布局视图后手动调整过数据框的大小和范围,那么四至值就是调整后显示出来的那个范围,而不是县界图层的原始范围。换句话说,你眼睛在屏幕上看到的图廓边界,才是四至的真正来源。

这一点往深了说,还涉及数据框范围与图廓的关系。ArcMap里,数据框在布局视图中的矩形外框就是图廓,图廓内显示的地理范围,就是数据框的属性里“数据框”选项卡中的那个范围值。所以四至经纬度,本质上是把数据框的空间范围和地理坐标系统一做关联。

1.2 不同出图方式下四至值的来源

标准分幅的地形图,图廓四角通常会标注经纬度,这时四至值来自图幅分幅边界。而勘测定界图、建设用地预审图这类图件,四至更常标在数据框外框的中间位置或四角,表示当前这块制图区域的东西南北边界。两者虽然应用场景不同,但落到ArcMap里,四至值都跟数据框的Extent(空间范围)直接相关。

所以我的习惯是,接到一个制图任务时,先不急着标注四至,而是先把数据框的坐标系、显示范围、页面大小这些基础设置确认好。坐标系不对,后面算出来的四至全是错的;范围没固定,图幅动一下,四至就跟着飘。

1.3 动手前先确认三件事

我在做这类标注前,通常按下面三步确认:

  1. 确认数据框坐标系:是地理坐标系(单位是度)还是投影坐标系(单位是米)。这一步决定了四至值到底是直接用经纬度,还是要先把投影坐标换算成经纬度。
  2. 确认数据框显示范围:在数据框属性 -> 数据框 选项卡中,查看“范围”一栏。默认是“自动”,表示范围随内容变化;出图前建议按标准图幅要求设为固定范围,或者手动输入精确的边界值。
  3. 确认页面单位和排版位置:四至注记放在图廓外哪个位置,上下左右哪个方向,都要在布局视图里先规划好,免得标注生成后挤到一起。

这三件事里,坐标系影响最大。我就见过有同事拿投影坐标系的数据框直接读XMin、XMax当经度用,结果四至值写出来是七位数,审核一眼就看出不对。

2. 最快上手:手动读取数据框范围并填写四至

如果你只是临时出一张图,或者项目时间紧不想折腾脚本,手动方式最快。这个方法的核心就是:从数据框属性里把四至数值读出来,经过单位换算后手动填写到图面上。

2.1 在数据框属性里直接查看四至数值

操作路径很简单:

  1. 在内容列表中右键点击数据框名称(默认叫“Layers”),选择“属性”。
  2. 切换到“数据框”选项卡。
  3. 在“范围”区域中,查看“左”、“右”、“上”、“下”四个值。这四个值就是当前数据框的X方向最小、最大,Y方向最小、最大值。

这里需要特别注意单位。如果数据框坐标系是WGS84这种地理坐标系,左、右、上、下直接就是经纬度的十进制度,比如左=108.2103、右=108.2304、下=38.6521、上=38.6615。但如果数据框坐标系是投影坐标系,比如CGCS2000 3度带高斯投影,这四个值就是米,需要额外计算经纬度。

对于投影坐标系,我的做法是先在内容列表里右键图层,打开“属性 -> 源”选项卡,看看图层自身的坐标系信息,然后用ArcMap自带的“计算几何”或者一个小脚本把四个角点投影成经纬度。手动操作的话,也可以用“搜索”找到“Project”工具,把四个角点坐标批量转换成经纬度。这步相对麻烦,一次出图还能忍受,批量出图就建议直接用下一章的脚本方案。

2.2 把十进制度换算成度分秒字符串

从数据框属性里读出来的是十进制度,比如108.2103度。但制图成果中四至通常用度分秒标注,比如“108°12′37″E”。换算公式是:

  • 度 = 整数部分
  • 分 = 小数部分 × 60 后的整数部分
  • 秒 = 再取小数部分 × 60

举个实例:108.2103度,整数度是108;0.2103 × 60 = 12.618,整分是12;0.618 × 60 = 37.08,秒约等于37。所以结果是108°12′37″。

实际操作中,我一般不会手动算,而是打开Windows计算器或者直接在Excel里写公式换算。如果电脑里装了ArcMap,也可以在Python窗口里直接算,几行代码就完成,下一章会给出完整函数。

2.3 把注记放到图廓外合适位置

拿到四至字符串后,接下来就是在布局视图里添加文字。具体操作:

  1. 点击左下角的“布局视图”按钮,切换到页面视图。
  2. 在菜单栏选择“插入 -> 文本”,在图廓外的相应位置绘制一个文本框。
  3. 输入刚才换算好的四至文本,比如“东至 108°12′37″E”。
  4. 调整字体、字号、位置,让它跟图廓线保持适当距离。

手动方法最大的问题是不能联动。数据框范围一调整,四至文本不会自动更新,必须重新查值、重新填写。只适合一次性出图,或者出图范围完全冻结的项目。

3. 方案二:用ArcPy脚本一键生成四至经纬度

如果你经常跟正式图件打交道,或者负责几个乡镇、几个地块批量出图,那一定要学会用ArcPy脚本。ArcMap自带的Python窗口就能直接跑,不需要额外装环境。这套方案能自动读取数据框范围、自动换算经纬度、自动生成度分秒字符串,还能把文本直接添加到布局上。

3.1 获取当前数据框的Extent

ArcPy读取数据框范围非常简单。在ArcMap菜单栏点击“地理处理 -> Python”,打开Python窗口,输入以下代码:

import arcpy mxd = arcpy.mapping.MapDocument("CURRENT") df = arcpy.mapping.ListDataFrames(mxd)[0] ext = df.extent print("XMin:", ext.XMin) print("XMax:", ext.XMax) print("YMin:", ext.YMin) print("YMax:", ext.YMax)

注意“CURRENT”这个参数,它代表当前打开的ArcMap文档。脚本要放在ArcMap的Python窗口里运行,或者在ArcMap里打开一个脚本工具去运行,否则拿不到当前文档对象。

df.extent返回的坐标单位取决于数据框坐标系。如果数据框坐标系是地理坐标,那XMin、XMax就是经度,YMin、YMax就是纬度。如果是投影坐标,单位是米,需要下一步换算。

3.2 将投影坐标换算成经纬度

当数据框是投影坐标系时,四至值不能直接用。我的做法是把四个角点构造成点几何,然后用projectAs方法投影到WGS84地理坐标系。

import arcpy mxd = arcpy.mapping.MapDocument("CURRENT") df = arcpy.mapping.ListDataFrames(mxd)[0] ext = df.extent sr_df = df.spatialReference sr_wgs = arcpy.SpatialReference(4326) def project_pt(x, y): pt = arcpy.Point(x, y) geom = arcpy.PointGeometry(pt, sr_df) geom_wgs = geom.projectAs(sr_wgs) return geom_wgs.centroid.X, geom_wgs.centroid.Y if geom_wgs else (None, None) west_lon, south_lat = project_pt(ext.XMin, ext.YMin) east_lon, south_lat2 = project_pt(ext.XMax, ext.YMin) west_lon2, north_lat = project_pt(ext.XMin, ext.YMax) east_lon2, north_lat2 = project_pt(ext.XMax, ext.YMax) print("西至经度:", west_lon, "东至经度:", east_lon) print("南至纬度:", south_lat, "北至纬度:", north_lat)

需要注意的是,projectAs方法要求源坐标系正确定义,如果数据框坐标系是“未知”或者只是图层动态投影,结果可能不准确。所以我在实际项目中,都会先在数据框属性里把坐标系明确设置为目标投影坐标系,再运行脚本。

还有一个细节:2526等大地坐标系在实际业务中非常常用,它的WKT定义在ArcMap里可能显示为“CGCS2000_3_Degree_GK_Zone_40”,投影后经纬度结果也没有问题。但如果数据框坐标系是“Web墨卡托”(3857),也建议统一转到4326或4490这样的地理坐标系,再输出经纬度。

3.3 把角度转换成度分秒并写入文本元素

得到十进制度的经纬度后,要输出成“108°12′37″E”这样的字符串。我封装了一个函数:

def dms(value, is_lon): if value is None: return "" abs_value = abs(value) deg = int(abs_value) minutes_full = (abs_value - deg) * 60 minutes = int(minutes_full) seconds = (minutes_full - minutes) * 60 if seconds >= 59.95: minutes += 1 seconds = 0.0 if minutes == 60: minutes = 0 deg += 1 direction = "" if is_lon: direction = "E" if value >= 0 else "W" else: direction = "N" if value >= 0 else "S" return "%.0f°%02d′%02d″%s" % (deg, minutes, round(seconds), direction)

这段代码里我处理了一个容易踩坑的细节:秒数四舍五入后可能变成60,需要进位到分;分钟满60要进位到度。如果直接处理秒数,经常出现“108°12′60″”这种不合规范的字符串。这个小坑我当年踩过,打印出来才发现进位问题。

有了这个函数,就可以把四个方向的四至字符串准备好,然后添加到布局视图。添加文本元素的核心代码是:

def add_text(df, text, pos_x, pos_y): txt = arcpy.mapping.TextElement() txt.text = text txt.elementPositionX = pos_x txt.elementPositionY = pos_y df.addElement(txt)

elementPositionX和elementPositionY的单位是页面单位,默认可能是英寸或毫米,取决于文档的页面设置。建议先在“文件 -> 页面和打印设置”里把页面单位设为“毫米”,再布局坐标,数值更容易控制。文本添加后,如果位置不理想,可以在布局视图中直接拖动微调。

3.4 完整脚本示例与运行步骤

把上面几段拼起来,就是一套完整可用的脚本:

import arcpy mxd = arcpy.mapping.MapDocument("CURRENT") df = arcpy.mapping.ListDataFrames(mxd)[0] ext = df.extent sr_df = df.spatialReference sr_wgs = arcpy.SpatialReference(4326) def project_pt(x, y): pt = arcpy.Point(x, y) geom = arcpy.PointGeometry(pt, sr_df) geom_wgs = geom.projectAs(sr_wgs) return geom_wgs.centroid.X, geom_wgs.centroid.Y def dms(value, is_lon): if value is None: return "" abs_value = abs(value) deg = int(abs_value) minutes_full = (abs_value - deg) * 60 minutes = int(minutes_full) seconds = (minutes_full - minutes) * 60 if seconds >= 59.95: minutes += 1 seconds = 0.0 if minutes == 60: minutes = 0 deg += 1 direction = "" if is_lon: direction = "E" if value >= 0 else "W" else: direction = "N" if value >= 0 else "S" return "%.0f°%02d′%02d″%s" % (deg, minutes, round(seconds), direction) west_lon, south_lat = project_pt(ext.XMin, ext.YMin) east_lon, _ = project_pt(ext.XMax, ext.YMin) _, north_lat = project_pt(ext.XMin, ext.YMax) west_text = "西至 " + dms(west_lon, True) east_text = "东至 " + dms(east_lon, True) south_text = "南至 " + dms(south_lat, False) north_text = "北至 " + dms(north_lat, False) # 根据页面单位调整坐标,这里示例假设页面单位为毫米 add_text(df, west_text, 10, 100) add_text(df, east_text, 100, 100) add_text(df, south_text, 50, 10) add_text(df, north_text, 50, 190) print("四至注记已添加") print(west_text) print(east_text) print(south_text) print(north_text)

运行步骤很简单:

  1. 在ArcMap中打开你的工程文档,切换到布局视图。
  2. 打开“地理处理 -> Python”窗口。
  3. 粘贴上述代码,按回车运行。
  4. 查看Python窗口输出的四至字符串,并到布局视图检查文本元素位置。

第一步不建议直接在代码里写死坐标,而是先运行一遍打印四至文本,确认经纬度正确后,再调整文本坐标参数,减少反复调试。

3.5 脚本生成的标注如何随页面自动调整

这种脚本生成的文本是静态文本,不会自动跟随数据框范围变化更新。如果你的项目后续会调整图幅范围,有两个解决办法:

一是每次调整范围后,重新运行一遍脚本,覆盖旧文本。由于脚本会重复添加新文本,所以要么先清空旧的四至文本,要么把脚本写成一个删除旧元素再添加新元素的版本。清空思路是遍历所有文本元素,如果文本以“东至”“西至”“南至”“北至”开头,就删除:

for el in df.elements: if el.type == "TEXT_ELEMENT" and el.text.startswith(("东至", "西至", "南至", "北至")): df.removeElement(el)

二是把四至做成动态文本。ArcMap原生的动态文本并不支持直接读取数据框Extent的四至属性,所以严格来说,想要完全联动更新,单靠原生功能做不到,还是要借助脚本。实际工作中,我更推荐脚本工具加数据驱动页面的组合方式,下一章展开讲。

4. 方案三:做成脚本工具,批量出图也能用

如果是一次出一张图,Python窗口跑脚本就够了。但项目往往不是一张图,而是一个乡镇几十个村、一个区县上百个地块。这时候每次打开工程再复制粘贴脚本,效率太低。我会把脚本封装成自定义工具,再结合数据驱动页面批量出图。

4.1 把脚本封装成ArcToolBox脚本工具

在ArcMap里做自定义脚本工具,流程不复杂:

  1. 在ArcToolBox窗口中右键任意工具箱或文件夹,选择“添加 -> 工具箱”,新建一个个人工具箱。
  2. 右键新建的工具箱,选择“添加 -> 脚本”,打开“添加脚本”向导。
  3. 给脚本取个名字,比如“四至经纬度注记生成”,然后指定脚本文件路径(把上一章的代码保存为.py文件)。
  4. 在“参数”页面,可以添加一个可选参数,比如“数据框名称”,默认填空即可,脚本里直接取第一个数据框。

这里有一个关键设置:在脚本工具属性中,“常规”选项卡里有一个“存储相对路径名(替代绝对路径)”选项,勾选上。如果你要把工具箱发给同事,或者换计算机工作,这个选项能避免工具因路径失效打不开。

封装好之后,在ArcMap里双击工具就可以运行,也可以右键“批处理”批量运行多个文档。这个方案把Python窗口里的临时脚本变成了一个可复用的生产工具,很多跟我配合的内业同事都靠这个工具省了大量重复劳动。

4.2 结合数据驱动页面批量标注四至

数据驱动页面(Data Driven Pages)是ArcMap里批量出图的重要功能。它的逻辑是:用一个索引图层把整个工作区分成很多个页面,每个页面显示一个格网范围,自动出图。四至经纬度的标注如果跟数据驱动页面配合好,就能做到每一页自动标出当前页范围的四至。

思路是这样的:先准备一个索引格网图层(渔网),每一格代表一张图的出图范围,然后用脚本遍历索引图层的每个要素,把页面切换到对应范围后读取数据框Extent,生成四至注记。批量生成后,生成的成果就是一套每页都带正确四至注记的图幅。

不过这里有个实际项目里要注意的问题:数据驱动页面切换范围时,df.extent读取的是当前页面的范围,但如果页面设置了固定比例尺,那么实际显示范围可能比页面范围大一点或小一点。我的做法是优先保证比例尺正确,以“固定范围”为准来取四至值,这样打印出来的图廓跟标注一致。

4.3 批量场景下的隐患:注记重叠与性能

批量出图时,最容易出现的问题是四至文本互相重叠。图廓范围小、四至字符串又长,四个注记在页面四边很容易挤在一起。我的处理习惯是:

  • 根据图幅尺寸调整字号,A4页面用8到9磅,A3可以放大到10到11磅。
  • 东西方向注记放在图廓外中间偏上一点,南北方向注记放在图廓外中间偏左一点,避免四角汇聚。
  • 实在放不下,可以把四至合并成一行文本,标在“图郭外上方”,写成“东至... 西至... 南至... 北至...”的格式,也能满足成果要求。

性能方面,数据驱动页面几十页甚至上百页时,每次添加文本元素都会增加文档体积,建议出完图后把四至文本转成图形或者直接导出PDF归档,避免后续打开工程卡顿。

5. 常见问题速查与避坑指南

我把这几年做四至经纬度标注时遇到的典型问题整理成了一张表,按坐标、格式、脚本、输出四个类别列出,方便你排查。

5.1 四至经纬度与图廓线对不上

这个问题的根源通常有两个。一是数据框显示范围改动了,但手动填写的四至文本没更新;二是数据框坐标系和计算经纬度所使用的坐标系不一致。例如把投影坐标系的XMin直接当成经度输出,数字自然错得离谱。

判断办法:运行一次脚本,对比打印出来的西至、东至数值,如果经度是七位数,说明没有做投影转地理坐标的步骤。如果经度数值合理但和图廓边缘明显不匹配,重点检查数据框的固定范围设置。

5.2 标注出来是小数的度,不是“度分秒”

四至经纬度在成果图件里通常要求用度分秒格式,但脚本输出却是十进制度。这个问题的原因就是少了度分秒转换函数。上一章的dms函数可以直接复制使用,注意进位逻辑不要漏掉。

如果你需要输出到Excel做台账,十进制度反而更方便。我的习惯是图面注记用度分秒,台账用十进制度,两边各留一份,审核要哪种就交哪种。

5.3 脚本报“PointGeometry”或“projectAs”错误

这类错误大多是坐标系对象没有正确获取。比如数据框坐标系为Unknown,或者sr_df为空。解决的思路是去掉动态获取,直接在数据框属性里手工指定坐标系,然后脚本里用arcpy.SpatialReference(4490)或arcpy.SpatialReference(4326)这类明确的坐标系编码。

另外,ArcMap版本较老时,PointGeometry对象没有projectAs方法的情况也存在。如果遇到,可以改用arcpy.Project_management工具,把点要素类投影到目标坐标系后再读取坐标。老版本环境下这是更稳妥的方法。

5.4 动态文本里能不能直接用四至?

我在前面提过,ArcMap原生的“插入 -> 动态文本”并不支持直接读取数据框的四至经纬度。动态文本里可以插入数据框名称、当前比例尺、当前日期等变量,但没有XMin、XMax这类属性。所以想靠动态文本实现四至联动,在ArcMap原生功能里行不通。

如果你用的是ArcGIS Pro,情况会好一些,Pro的动态文本也仍然不直接提供四至,但Pro配合Arcade表达式可以做到更灵活的动态标注。如果还在用ArcMap,老老实实走脚本方案是最靠谱的。

5.5 导出PDF后注记丢失或变形

这个问题遇到过几次。布局视图里看着好好的四至注记,导出PDF后字体变了或者直接消失。原因通常是字体没有嵌入PDF,或者字体在目标计算机上不存在。解决办法是:

  1. 四至注记统一用Windows系统常见字体,比如宋体、黑体、Arial。
  2. 导出PDF时,在“选项”里勾选“嵌入所有文档字体”。
  3. 如果成果要打印,优先导成高分辨率图片格式,比如TIF,300DPI以上。

如果图件要提交ArcGIS Server发布,文本元素在制图表达时也可能被简化,建议把四至注记转成图形或掩膜,确保在线地图和离线打印效果一致。

6. 最后分享一点个人经验

四至经纬度这个事,看着小,但在成果审核里却非常显眼。我早期做勘测定界图,四至都是手动填,每次图廓微调都要重新查一遍坐标,不仅烦,还容易漏改一个方向。后来写了一套脚本工具,才彻底解放出来。

我的建议是:如果你只出三五张图,手动方法完全够用;如果后续要持续出图,哪怕一个月只有十张,也值得花半小时把脚本跑通。脚本的代码逻辑并不复杂,核心就是读取Extent、投影转换、度分秒格式化、添加文本四步,但对出图效率的提升非常明显。

另外提醒一句,如果用的是CGCS2000坐标系的地形图成果,四至经纬度输出前一定要确认椭球参数是否正确。很多地方的成果要求是CGCS2000坐标系,输出经纬度时如果默认使用WGS84椭球,虽然两者差异极小,但审核标准和精度要求高的项目仍然会挑出问题。只要项目指定了CGCS2000,脚本里的投影目标坐标系就写arcpy.SpatialReference(4490),不要直接套4326。

字数不多,但每一步都实操过。希望这篇内容能帮你少走些弯路,下次再有人问“ArcMap数据框四至经纬度怎么标”,你也可以直接把方案丢过去。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询