ArcMap数据框四至经纬度标注:三种实操方法详解
发布时间:2026/10/1 1:41:32 锦皓数字建站

做过ArcMap制图的同行应该都有这种体会图面内容、比例尺、指北针、图例都摆得整整齐齐了结果成果交上去审核一句话就给你打回来——“数据框的四至经纬度没标”。这个问题在标准分幅图、勘测定界图、用地预审图这些正式成果里几乎绕不开。所谓数据框四至经纬度就是把当前数据框显示范围的东、西、南、北四个边界点的经纬度值以注记形式标在图廓外。很多新手在Arcmap里翻半天菜单发现软件并没有一个按钮直接生成四至经纬度网上资料又零散最后只能手动查坐标再往图里敲文字图幅一改又全部作废。这篇文章我就把自己实际用过的三种做法整理出来手动查值、ArcPy脚本一键生成、以及脚本工具化批量出图。从原理到代码再到避坑一次性说清楚。适合刚接触ArcMap制图出图、被四至标注折腾过、或者想提高批量出图效率的小伙伴参考。1. 搞清楚数据框范围才知道四至标的是哪个值很多人一上来就找“四至”功能按钮结果找不到。其实问题不在软件而在对“数据框”这个概念的理解上。ArcMap里的数据框Data Frame不是一个普通图框它对应的是一个真实的坐标范围四至经纬度标的就是这个范围的边界值。1.1 什么是数据框的四至经纬度四至经纬度指的是当前这个数据框视口所覆盖的地理范围的四个边界坐标。具体来说就是东至East数据框右边界对应的经度西至West数据框左边界对应的经度南至South数据框下边界对应的纬度北至North数据框上边界对应的纬度这里面有一个很容易忽略的坑四至值跟数据框的“显示范围”有关跟图层要素实际范围并不一定是同一回事。比如你加载了一个县界图层但切换到布局视图后手动调整过数据框的大小和范围那么四至值就是调整后显示出来的那个范围而不是县界图层的原始范围。换句话说你眼睛在屏幕上看到的图廓边界才是四至的真正来源。这一点往深了说还涉及数据框范围与图廓的关系。ArcMap里数据框在布局视图中的矩形外框就是图廓图廓内显示的地理范围就是数据框的属性里“数据框”选项卡中的那个范围值。所以四至经纬度本质上是把数据框的空间范围和地理坐标系统一做关联。1.2 不同出图方式下四至值的来源标准分幅的地形图图廓四角通常会标注经纬度这时四至值来自图幅分幅边界。而勘测定界图、建设用地预审图这类图件四至更常标在数据框外框的中间位置或四角表示当前这块制图区域的东西南北边界。两者虽然应用场景不同但落到ArcMap里四至值都跟数据框的Extent空间范围直接相关。所以我的习惯是接到一个制图任务时先不急着标注四至而是先把数据框的坐标系、显示范围、页面大小这些基础设置确认好。坐标系不对后面算出来的四至全是错的范围没固定图幅动一下四至就跟着飘。1.3 动手前先确认三件事我在做这类标注前通常按下面三步确认确认数据框坐标系是地理坐标系单位是度还是投影坐标系单位是米。这一步决定了四至值到底是直接用经纬度还是要先把投影坐标换算成经纬度。确认数据框显示范围在数据框属性 - 数据框 选项卡中查看“范围”一栏。默认是“自动”表示范围随内容变化出图前建议按标准图幅要求设为固定范围或者手动输入精确的边界值。确认页面单位和排版位置四至注记放在图廓外哪个位置上下左右哪个方向都要在布局视图里先规划好免得标注生成后挤到一起。这三件事里坐标系影响最大。我就见过有同事拿投影坐标系的数据框直接读XMin、XMax当经度用结果四至值写出来是七位数审核一眼就看出不对。2. 最快上手手动读取数据框范围并填写四至如果你只是临时出一张图或者项目时间紧不想折腾脚本手动方式最快。这个方法的核心就是从数据框属性里把四至数值读出来经过单位换算后手动填写到图面上。2.1 在数据框属性里直接查看四至数值操作路径很简单在内容列表中右键点击数据框名称默认叫“Layers”选择“属性”。切换到“数据框”选项卡。在“范围”区域中查看“左”、“右”、“上”、“下”四个值。这四个值就是当前数据框的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度整数度是1080.2103 × 60 12.618整分是120.618 × 60 37.08秒约等于37。所以结果是108°12′37″。实际操作中我一般不会手动算而是打开Windows计算器或者直接在Excel里写公式换算。如果电脑里装了ArcMap也可以在Python窗口里直接算几行代码就完成下一章会给出完整函数。2.3 把注记放到图廓外合适位置拿到四至字符串后接下来就是在布局视图里添加文字。具体操作点击左下角的“布局视图”按钮切换到页面视图。在菜单栏选择“插入 - 文本”在图廓外的相应位置绘制一个文本框。输入刚才换算好的四至文本比如“东至 108°12′37″E”。调整字体、字号、位置让它跟图廓线保持适当距离。手动方法最大的问题是不能联动。数据框范围一调整四至文本不会自动更新必须重新查值、重新填写。只适合一次性出图或者出图范围完全冻结的项目。3. 方案二用ArcPy脚本一键生成四至经纬度如果你经常跟正式图件打交道或者负责几个乡镇、几个地块批量出图那一定要学会用ArcPy脚本。ArcMap自带的Python窗口就能直接跑不需要额外装环境。这套方案能自动读取数据框范围、自动换算经纬度、自动生成度分秒字符串还能把文本直接添加到布局上。3.1 获取当前数据框的ExtentArcPy读取数据框范围非常简单。在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)运行步骤很简单在ArcMap中打开你的工程文档切换到布局视图。打开“地理处理 - Python”窗口。粘贴上述代码按回车运行。查看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里做自定义脚本工具流程不复杂在ArcToolBox窗口中右键任意工具箱或文件夹选择“添加 - 工具箱”新建一个个人工具箱。右键新建的工具箱选择“添加 - 脚本”打开“添加脚本”向导。给脚本取个名字比如“四至经纬度注记生成”然后指定脚本文件路径把上一章的代码保存为.py文件。在“参数”页面可以添加一个可选参数比如“数据框名称”默认填空即可脚本里直接取第一个数据框。这里有一个关键设置在脚本工具属性中“常规”选项卡里有一个“存储相对路径名替代绝对路径”选项勾选上。如果你要把工具箱发给同事或者换计算机工作这个选项能避免工具因路径失效打不开。封装好之后在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或者字体在目标计算机上不存在。解决办法是四至注记统一用Windows系统常见字体比如宋体、黑体、Arial。导出PDF时在“选项”里勾选“嵌入所有文档字体”。如果成果要打印优先导成高分辨率图片格式比如TIF300DPI以上。如果图件要提交ArcGIS Server发布文本元素在制图表达时也可能被简化建议把四至注记转成图形或掩膜确保在线地图和离线打印效果一致。6. 最后分享一点个人经验四至经纬度这个事看着小但在成果审核里却非常显眼。我早期做勘测定界图四至都是手动填每次图廓微调都要重新查一遍坐标不仅烦还容易漏改一个方向。后来写了一套脚本工具才彻底解放出来。我的建议是如果你只出三五张图手动方法完全够用如果后续要持续出图哪怕一个月只有十张也值得花半小时把脚本跑通。脚本的代码逻辑并不复杂核心就是读取Extent、投影转换、度分秒格式化、添加文本四步但对出图效率的提升非常明显。另外提醒一句如果用的是CGCS2000坐标系的地形图成果四至经纬度输出前一定要确认椭球参数是否正确。很多地方的成果要求是CGCS2000坐标系输出经纬度时如果默认使用WGS84椭球虽然两者差异极小但审核标准和精度要求高的项目仍然会挑出问题。只要项目指定了CGCS2000脚本里的投影目标坐标系就写arcpy.SpatialReference(4490)不要直接套4326。字数不多但每一步都实操过。希望这篇内容能帮你少走些弯路下次再有人问“ArcMap数据框四至经纬度怎么标”你也可以直接把方案丢过去。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。