如何从百度地图获取经纬度并打印:四种方法详解

📅 发布时间:2026/9/10 12:44:32
如何从百度地图获取经纬度并打印:四种方法详解
做地点经纬度打印这件事说大不大但真到需要的时候很多人会被卡住。比如外业考察要记录点位、户外活动要打印集合点坐标、GIS作图要提取图斑经纬度范围、甚至只是想在纸质地图上给朋友标一个精确位置——如果你打开百度地图第一反应往往是界面压根不显示经纬度。这个项目就是在解决“如何从百度地图拿到某个地点的经纬度并且把它打印出来”这件事。我最早被这个问题缠上是帮一个做测绘的朋友导一批样板间的定位数据。他要求每个地点输出经纬度还要排版成纸质表格供外勤同事使用。当时我也是一头雾水试过截图再对着坐标拾取器一个一个抄效率低到崩溃。后来索性把地图网页版的请求和渲染机制翻了个底朝天整理出了一套从获取坐标到打印输出的完整路子。这篇文章就是把整套思路、代码和踩坑记录完整分享一下适合做地理信息整理、户外记录、小型GIS项目、活动物料编排的读者参考也适合那些只是偶尔需要“打印一个地点的经纬度”但不想装重型软件的人。1. 项目整体设计与思路拆解1.1 核心需求解析地图界面为什么不显示经纬度百度地图网页版的设计目标是“给人看”而不是“给机器读”所以默认界面不会像专业GIS软件那样把经纬度直接摊在屏幕上。地点名称、地址、电话、营业时间这些字段会展示得很充分唯独坐标信息被藏在内部数据里。这背后的原因不复杂普通用户用地图只关心“怎么去”“附近有什么”不关心“这个点在坐标上到底是多少”。但一旦我们需要将地点录入GPS设备、导入GIS软件、或者做打印标记坐标就成了最核心的信息。所以这个项目的本质是把“地图产品故意隐藏的数据”用一种可复现的方式挖出来转成可打印的文本或表格。整个过程不需要破解、不需要抓包工具只要会用浏览器自带的开发者工具就能稳定拿到百度地图网页版内部的经纬度数据。1.2 方案选型为什么用浏览器开发者工具而不是其他办法方案大致有四类地图自带API、第三方坐标拾取器、抓包解析、前端控制台代码注入。我最终选的是“前端控制台代码注入 Network面板验证”原因有三点。第一地图API虽然很正统但需要注册开发者账号、创建应用、拿密钥对一个“只要能打印几十个地点坐标”的人来说成本太高属于典型的杀鸡用牛刀。第二坐标拾取器适合查单个点但如果是几十上百个POI逐个在地图上找点再复制速度太慢还容易手抖点错。第三抓包解析虽然信息全但初次使用的人容易在几百条请求里迷失方向。而直接在浏览器控制台执行JavaScript相当于让百度地图自己把坐标“说”出来。这个方案不需要任何额外安装也不依赖API密钥兼容性极好尤其适合批量处理。后面会提到用这种方法还可以顺手实现“点击地图任意位置立刻打印该点经纬度”的小工具一劳永逸。2. 准备工作与核心原理解读2.1 前期准备你需要哪些“装备”实际操作只需要三样东西一台能联网的电脑建议用 Chrome 或 Edge 浏览器这两个浏览器的开发者工具对JavaScript执行的支持最顺手一个百度地图的网页版地址pc端直接访问 map.baidu.com最基本的 JavaScript 复制粘贴能力不需要会写代码只要能粘贴回车就可以。如果你想做得更精细还可以准备一个文本编辑器比如记事本或 VS Code来整理打印内容以及一个用来排版打印的 Word 或 Excel。但核心流程中这些都不是必需项。2.2 地图坐标系拿到的经纬度为什么是那串数在动手之前有必要花几十秒理解地图坐标系否则后面打印出来对不上实景会一头雾水。国内日常使用的地图常见坐标系有三种坐标系全称使用场景特点WGS-84国际标准GPS坐标系GPS设备、Google Earth全球统一卫星定位原始坐标GCJ-02火星坐标系高德、腾讯地图等在WGS-84基础上加密偏移BD-09百度坐标系百度地图在GCJ-02基础上二次加密百度地图网页版获取到的经纬度基本都是BD-09格式和手机GPS直接读出来的WGS-84会有几十米到几百米的偏差。这种偏差是人为加密导致的不属于错误而是国内民用地图的通行规则。所以当你打印出百度地图的坐标之后要分清楚这份坐标是给谁用的。如果是导入百度自家生态或直接按“百度地图坐标”搜索那直接打印即可。如果是导入ArcGIS做底图配准或者放到GPS手持机里导航那就要先做一次坐标转换把BD-09转成WGS-84或者GCJ-02。这个在后面常见问题里会展开讲。2.3 核心思路让地图自己交出坐标百度地图网页版的本质是一个JavaScript应用地图上所有POI数据都存放在内存对象中。传统开发模式下这些数据来自后端接口但经过前端处理后会挂载在某个全局变量或响应对象中。我们的核心思路就是两件事第一监听地图的点击事件或从DOM元素上拿到当前地点的信息第二从信息对象中提取经纬度字段用console.log打印到控制台。只要拿到打印结果就可以复制出来做后续的排版和输出。这个思路换个角度看等于在“用户操作层”和“地图渲染层”之间开了一个后门。它不破坏任何功能也不修改地图代码只是把地图自己已经计算好的坐标再显示一遍。所以无论百度地图界面怎么改版只要底层的BMap命名空间还在这个方法就大概率还能用。3. 实操四种方法打印经纬度3.1 方法一坐标拾取器适合单点快速查询如果你只需要查询一两个地点的经纬度最稳妥的办法不是控制台而是百度地图官方提供的坐标拾取器。打开浏览器访问百度地图开放平台的“坐标拾取器”页面左侧是地图右侧会实时显示鼠标所在点的经纬度。这个方案最大的好处是零门槛。我通常的操作流程是打开坐标拾取器页面在搜索框输入地点名称比如“北京南站”点击搜索结果地图会定位到该地点在右侧面板复制对应的经纬度把坐标粘贴到打印文档中。需要注意这里拿到的是GCJ-02坐标系高德系还是BD-09坐标系取决于拾取器页面调用的地图版本。如果页面标题里带了百度字样默认是百度坐标系。打印前可以先用一个已知地点测一下偏移做到心里有数。这个方法不推荐批量使用因为每查一个点都要手动操作一次效率太低。而且遇到地图上没有明确POI的点位比如野外一棵树、桥墩下的小路搜索框根本搜不到那就得切换到方法二或方法三。3.2 方法二控制台注入代码点击任意处打印坐标这是我在实际项目中最常用的方法也是本篇文章的核心。它适合直接在百度地图网页版上通过点击地图任意位置实时打印出经纬度。操作步骤如下用 Chrome 或 Edge 打开 map.baidu.com按F12打开开发者工具切到Console控制台选项卡将下面的代码粘贴进去按回车var map new BMap.Map(container); // 如果页面里已经初始化了地图直接用即可 // 下面的代码模拟点击事件 map.addEventListener(click, function(e){ console.log(经度:, e.latlng.lng); console.log(纬度:, e.latlng.lat); });如果你打开的是新版百度地图页面DOM结构里不一定会有一个叫container的容器此时直接找页面已有的地图实例稍微麻烦。更实用的做法是用下面这段兜底代码尝试从全局变量中获取地图对象var mapInstance null; // 尝试找到百度地图实例的常见全局字段 if (window.MapInstance) { mapInstance window.MapInstance; } else if (window.map) { mapInstance window.map; } if (mapInstance) { mapInstance.addEventListener(click, function(e){ console.log(经度:, e.latlng.lng, 纬度:, e.latlng.lat); }); console.log(监听成功点击地图即可打印经纬度); } else { console.log(未找到地图实例请改用方法三抓取请求); }如果执行后控制台显示“监听成功”那你再点击地图任意位置控制台就会输出对应经纬度。这个方案的本质是给地图添加一个临时事件监听器只保存在当前页面内存中刷新页面就失效所以不用担心对系统产生持久影响。这个方法的强大之处在于它可以配合循环批量操作你点一个地点复制一行坐标再点下一个复制下一行。配合文本编辑器很快就能积累一批坐标数据。3.3 方法三利用地点详情请求打坐标适合指定POI如果你已经知道地点名称而且地点在百度的POI库里比如餐厅、商场、学校那可以直接搜出来以后用Network面板找出坐标。我的习惯流程是打开百度地图网页版按F12进入开发者工具切到Network网络选项卡并在筛选框中输入json或place之类的关键词在搜索框输入目标地点并回车等结果加载完成后观察网络请求列表找一个名称像是地点详情或place search的XHR请求点开它在Response或Preview标签页里搜索location或lng、lat就能看到经纬度。这里的关键是学会快速过滤请求。我一般会先清空网络列表点那个禁止标志再执行搜索这样请求列表里新出现的数据就都是这次搜索产生的缩小范围后会非常好找。不同版本的百度地图返回的JSON结构略有差异但经纬度字段名通常都会包含lng和lat。把这个值复制到文本里后面直接用于打印即可。这个方法的好处是稳定不容易受地图实例变量名变化的影响。缺点是步骤多一点而且每次只能拿一个POI的数据适合数量较少、对准确性要求高的场景。3.4 方法四用纯DOM操作拿到当前POI面板的坐标有时候地图实例不好找Network面板又嫌麻烦还有一个“野路子”从页面上的地点信息面板中解析坐标。当你在百度地图上点击一个地点标记时左下角或侧边栏会弹出一个信息窗口里面往往有“分享”按钮。点开分享会生成一条短链接。这条短链接里经常带有srcid或center参数有些版本甚至直接把经纬度拼接在链接里。虽然这种方式不够通用但胜在快。我遇到地图实例搞不定的老版本页面时就会试着点分享看看链接里有没有带坐标。如果有直接提取链接中的数字即可如果没有再退回去用Network面板。这个方法适合“应急”不适合流水线作业。不过作为多一个备选方案关键时刻真能救命。4. 打印与输出经纬度如何变成一张能用的纸4.1 控制台打印当前地图中心点坐标有些场景下你并不需要点击某个POI而是想获取当前地图视野中心的坐标。比如你正在移动地图希望随时记下某一屏的中心位置。这时候可以注册一个moveend事件监听器var map /* 获取地图实例 */; map.addEventListener(moveend, function(){ var center map.getCenter(); console.log(当前中心点:, center.lng, center.lat); });每次拖动或缩放地图结束后控制台都会自动打印新的中心点坐标。我经常用这个方法来快速采集一条路线上的多个节点把地图中心对准路口停下来复制坐标接着拖动到下一个路口。整个过程只需要10分钟就能采完几十个点。4.2 把批量坐标整理成打印清单拿到控制台输出的一堆坐标后打印前最好先整理成固定格式。最简单的方式是直接复制控制台里的输出粘贴到文本编辑器然后再手工处理成一行一对坐标。例如地点A,116.404098,39.915025 地点B,116.410269,39.910589如果你想省事可以在监听器里直接输出成CSV友好的格式map.addEventListener(click, function(e){ console.log(e.latlng.lng , e.latlng.lat); });这样控制台每一行输出就是“经度,纬度”批量复制到Excel后用分列功能按逗号切分就能得到两列表格。加一个地点名称列一张经纬度打印清单基本就成型了。从易用性角度我更推荐把数据粘贴到Excel里处理然后调整列宽、字体加一个标题行再通过CtrlP打印。这样胜在排版自由还能顺便加边框、设置每页显示行数。4.3 自定义坐标精度与格式很多新手会问经纬度到底要保留几位小数我的经验是如果是日常定位、导航、户外记录保留6位小数已经足够大约相当于0.1米的精度如果是打印出来发给别人做参考保留4到5位小数也够如果只是为了打印在纸上做粗略标注3位小数约百米级反而更好读。另外中国地区经度范围大致在73°E到135°E纬度范围在3°N到53°N所以正常情况下打印出来的经度应该是7开头或1开头纬度应该是2开头或3开头例如116.404098,39.915025。如果看到很离谱的数字比如经度超过180说明你取错字段了。如果你需要度分秒格式也可以写一个小函数转换function toDMS(degree){ var d Math.floor(degree); var mTemp (degree - d) * 60; var m Math.floor(mTemp); var s ((mTemp - m) * 60).toFixed(2); return d ° m s ; } console.log(toDMS(116.404098)); // 输出度分秒打印在纸质地图上做标注时度分秒格式通常比小数格式更直观尤其对于习惯传统测绘的人。5. 常见问题与排查技巧实录5.1 为什么获取的坐标和实际位置对不上这是被问得最多的问题。去掉坐标系加密因素后最大的可能性是你获取坐标的方式有误差。比如你使用方法二点击地图获取坐标但点击的位置和真实地点之间隔着一个POI图标地图事件可能把坐标解析到图标底部的定位点上这个点离你脑海中“这个地点”的位置可能偏离几十米。另外如果你搜索到某个地点后地图自动定位到了建筑轮廓的中心而这个中心不一定是你想打印的入口坐标。排查时我建议把获取到的坐标反向输入百度地图的搜索框看看定位点是否落在你预期的位置。如果偏差几十米内通常是坐标系或视觉误差如果偏差几百上千米那就要检查是不是取到了地图中心点而不是点击点。5.2 地图拖动后坐标没更新如果你用了moveend事件却始终只输出一个坐标大概率是事件绑定没有成功或者地图实例不止一个监听器绑到了别的隐藏地图上。我遇到过一次页面里有两个地图实例一个显示给用户看一个用于某种计算。这时要手动指定正确实例。可以在控制台先打印一下地图实例的容器尺寸、ID等属性确认你绑的是不是可视的那个。还有一个低级错误代码执行顺序。如果你在地图还没初始化完之前就尝试绑定事件地图实例可能是undefined。解决方法是把代码放到setTimeout里等2秒再执行。setTimeout(function(){ // 绑定监听 }, 2000);5.3 控制台报错或者找不到地图实例新版百度地图可能会对全局变量做混淆导致你找不到window.map。这时候不要死磕控制台获取实例直接改用方法三看Network请求或者换用坐标拾取器页面。还有一种更神奇的情况某些地图页面是自适应的地址栏域名带map.baidu.com但页面实际渲染的是尊享版、货车版等不同前端框架地图实例挂载位置并不统一。这时候判断标准就一个能最快拿到坐标的方法就是好方法不要拘泥于某一种固定的脚本。5.4 把经纬度表格打印成PDF或纸质文件的注意点从网页控制台复制出来的坐标是纯文本直接打印会显得凌乱。更靠谱的流程是先在Excel里整理好数据再打印或另存为PDF。具体操作中我会把经度和纬度分成两列列标题写清楚坐标系BD-09 / GCJ-02 / WGS-84避免拿到纸质坐标的人用错坐标系。打印前在Excel里选中打印区域设置好页面方向横向或纵向然后使用“打印预览”确认边框和字号。如果你要批量打印很多地点的经纬度我还建议在表格末尾加一列“备注”用来写“门牌号”“入口特征”等说明。这样一来这张打印纸不只是一串数字而是一份实地可用、可以直接对标物确认位置的物料。6. 应用场景延伸与我的实操心得6.1 给活动组织和外业人员做经纬度定位单很多户外活动、现场勘测、市场调研场景并不需要每个人打开地图App搜索地点只需要发一张打印好的表格上面有地点名称、经纬度、集合时间就能办事。我帮朋友做过一次城市定向活动的点位表就是用百度地图控制台采集坐标再在Excel里排成两栏打印出来A4纸能放下20个点位折叠后可以直接放口袋里实用程度远超手机截图。6.2 与ArcGIS/QGIS联动的坐标范围获取热词里有一条是“arcgis字段计算器获取图斑的经纬度范围”这说明不少人在做GIS分析时需要把地图上的某个范围提取成经纬度最小外接矩形。如果你手头只有百度地图没有专业软件也可以先用控制台采集矩形四个角的坐标然后计算出经纬度范围再拿去ArcGIS里做数据框范围设置或图斑属性计算。这本质上是把百度地图当作一个临时的“坐标采集前端”用浏览器控制台代替GPS设备给专业软件提供输入数据。精度虽然没有测量级设备高但用在前期规划、快速验证阶段绰绰有余。6.3 与3D打印模型定位结合的巧用你可能会觉得“百度地图打印经纬度”和“3D打印”八竿子打不着。但热词里有“3d打印机械臂毕业设计”“3d打印g代码详解”。2024年我接的一个小项目是给学校做一个地球仪模型想在底座上蚀刻几个城市名称和经纬度铭牌。刻之前我就用本文的方法把城市经纬度采集出来再转成WGS-84坐标用OpenSCAD生成刻字模型最后走3D打印流程。经纬度数据准确与否直接决定了模型底座上铭牌的位置会不会歪。这一细节提醒我经纬度打印并不只是“把数据打印到纸上”很多时候它指的是把经纬度信息以某种形式“输出”到其他媒介上——纸质表格、PDF、标签贴纸、雕刻模型本质都是同一条路先获取坐标再指定输出格式。6.4 最后的经验总结先判断需求颗粒度再选择获取方式踩过很多次坑之后我的习惯变得更简单。如果你只是偶尔要一个坐标直接打开坐标拾取器不要折腾控制台如果你要采一批点位用控制台事件监听法如果你要处理的是搜索出来的某个固定POI用Network抓请求最省事如果以上都不行再考虑用地图的分享链接提取坐标。这个排序背后核心逻辑是“最小成本解决问题”。地图产品更新迭代快谁也不能保证某一种方案能用一辈子。但只要你理解了“地图页面背后藏着数据浏览器开发者工具能帮你把数据拿出来”这一层思路无论界面怎么改你都能随机应变。这也是我写这篇文章最想传递的经验而不是某一段具体代码。说到底打印经纬度只是一个手段。它服务的永远是你真正想做的事标注一个地点、规划一条路线、记录一次探索、完成一个模型。把这些工具性的技能掌握好下次再有人问“百度地图怎么打印地点经纬度”你不仅可以给出答案还能顺手帮他排好一张可以直接上打印机的表格。