1. 从一次「标点不显示」说起:百度地图 Web 经纬度标点到底难在哪
百度地图 Web 端经纬度标点,说白了就是给你一串{lng, lat}坐标,让它在网页地图上变成一个个带编号的小图钉。听起来简单,但真正动手时,新手最容易卡在三件事上:第一,BMapGL 的 AK 申请和引用方式变了,老教程里的api.map.baidu.com/api?v=2.0已经不吃香;第二,标点数据从后端来、地图脚本从前端来,跨域和路径问题一叠加就白屏;第三,本地file://打开能跑,一放到服务器用 nginx 托管就 404 或 AK 校验失败。
这篇就按「一次跑通标点展示 + Key 调用链路」的目标来写。适合谁:会一点 JavaScript、想把经纬度数据画到百度地图上、并且准备用 nginx 部署的前后端同学。核心检索词先摆出来——百度地图、web 经纬度标点、nginx、JavaScript、BMapGL,这五个词会贯穿全文。我试过把标点、编号、卫星图、nginx 反代、统一 Key 通道串成一条线,下面直接给可复制的骨架。
2. TaoToken 前置:统一 Key 与 API 通道怎么摆
在讲地图代码之前,先把 Key 这条链路理清。百度地图的 AK 是给 BMapGL 用的,而如果你还想在同一个项目里调用大模型能力(比如让模型根据经纬度生成标点描述、或者做地址语义解析),就会多出一套 Key 管理。TaoToken 在这里的角色是统一 Key / API 通道:官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口 https://taotoken.net/api 。
你需要提前准备的东西:
- 百度地图开放平台申请一个浏览器端 AK,白名单填你的域名或
*(调试期)。 - TaoToken 侧创建一个 API Key,用于后续模型对话或编码类调用。
- 一台能跑 nginx 的机器(本地虚拟机或云主机都行),用来托管
demo.html和做反向代理。
注意:百度地图 AK 和 TaoToken Key 是两套体系,别混用。地图标点走 BMapGL + 百度 AK;模型能力走 TaoToken 通道。本文的重点是让这两条链路在同一个 nginx 配置下都能通。
如果你后面要做长期编码或 Agent 类任务,可以了解 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。只是验证模型通不通,用模型对话页更快:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。
3. 可复制配置:BMapGL 标点代码 + nginx.conf + settings.json 骨架
3.1 标点初始化代码(BMapGL + JavaScript)
先给一份能直接跑的demo.html。关键点:引用 BMapGL 时用type=webgl&v=1.0,标点用BMapGL.Marker,编号用BMapGL.Label挂在 marker 上,卫星图用map.setMapType(BMAP_EARTH_MAP)。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style> html, body, #allmap { width: 100%; height: 100%; margin: 0; overflow: hidden; } </style> <!-- 注意:ak 换成你自己的浏览器端密钥 --> <script src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=你的百度AK"></script> </head> <body> <div id="allmap"></div> <script> var map = new BMapGL.Map('allmap'); map.centerAndZoom(new BMapGL.Point(114.305, 30.593), 12); map.enableScrollWheelZoom(true); map.setMapType(BMAP_EARTH_MAP); // 卫星图 // 经纬度标点数据,实际项目可从后端接口拉 var points = [ { lng: 114.305, lat: 30.593, data: 1 }, { lng: 114.320, lat: 30.580, data: 2 }, { lng: 114.290, lat: 30.610, data: 3 } ]; for (var i = 0; i < points.length; i++) { var marker = new BMapGL.Marker(new BMapGL.Point(points[i].lng, points[i].lat)); map.addOverlay(marker); var label = new BMapGL.Label(String(points[i].data), { offset: new BMapGL.Size(-8, -28) }); label.setStyle({ background: 'none', color: '#fff', border: 'none', fontSize: '14px' }); marker.setLabel(label); } </script> </body> </html>这段代码里,centerAndZoom的第一个参数是中心点,第二个是缩放级别;offset控制编号相对图钉的偏移,负值往上往左,避免盖住图钉尖。数据换成你的经纬度数组即可。
3.2 nginx.conf 骨架
把demo.html放到/root/workspace,nginx 配置如下。这里同时演示了静态托管和一条/api/反向代理,方便你后续把 TaoToken 的 API 调用也走同域,避免跨域。
user root; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; server { listen 8090 default_server; listen [::]:8090 default_server; server_name _; root /root/workspace; index demo.html; location / { try_files $uri $uri/ /demo.html; } # 统一 API 通道反向代理,前端同域调用 location /api/ { proxy_pass https://taotoken.net/api/; proxy_set_header Host taotoken.net; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_ssl_server_name on; } } }try_files保证刷新不 404;proxy_pass末尾的斜杠要和location匹配,否则路径会拼错。proxy_ssl_server_name on在代理 HTTPS 上游时建议加上。
3.3 settings.json 骨架
如果你用 VS Code 或类似编辑器做本地调试,可以放一个settings.json管理端口和 Key 占位,避免硬编码。
{ "map": { "ak": "你的百度AK", "center": { "lng": 114.305, "lat": 30.593 }, "zoom": 12, "mapType": "BMAP_EARTH_MAP" }, "api": { "baseUrl": "/api", "key": "你的TaoTokenKey" }, "server": { "port": 8090, "root": "/root/workspace" } }这个文件本身不参与运行,是给你自己对照参数用的。真正上线时,Key 建议放环境变量或后端下发,别写进前端。
4. 验证请求:从本地到远端,确认标点和 Key 链路都通
4.1 本地先跑通标点
把demo.html用浏览器直接打开,或者用 Live Server 起一个本地服务。如果弹出「百度未授权使用地图API」,说明 AK 没填对或白名单没放行。填对 AK 后,你应该看到卫星图上出现三个带编号的图钉。
4.2 nginx 启动与远端访问
nginx -t # 测试配置语法 nginx -s reload # 重载配置然后在浏览器访问http://你的服务器IP:8090。如果页面出来但地图空白,按 F12 看 Network,重点看 BMapGL 的 JS 是否 200、AK 校验接口是否报错。
4.3 验证 API 通道
在页面控制台或后端发一个请求,确认/api/反代通:
curl -i http://你的服务器IP:8090/api/你的接口路径返回非 502/504,且响应头正常,说明 nginx 到 TaoToken 的通道打通了。Key 的具体用法和接入细节看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,Key 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。
5. 本篇常见错排查:标点、AK、nginx 三类问题
标点不显示:先看points数组有没有数据,再看lng/lat是不是数字类型。字符串坐标 BMapGL 有时不报错但也不画。另外map.addOverlay(marker)别漏。
编号盖住图钉或偏移不对:调BMapGL.Size(-8, -28)里的两个值,第一个是水平偏移,第二个是垂直偏移。图钉默认锚点在底部,编号往上挪才好看。
AK 报错「APP 服务被禁用」:去百度地图控制台检查 AK 类型是不是「浏览器端」,白名单有没有包含你的访问域名或 IP。本地调试可以临时填*,上线务必收紧。
nginx 403/404:确认root路径下真有demo.html,权限别是 700。index指令和try_files要一致。
反代 502:多半是proxy_pass地址写错或上游不可达。先用curl在服务器上直接访问上游,确认网络通,再查 nginx error.log。
跨域:如果前端直接请求 TaoToken 而不是走/api/反代,浏览器会拦。用本文的 nginx 同域方案最省事。
6. 把 Key 和标点链路固定下来
到这里,标点展示和 Key 调用链路应该都跑通了。我的建议是:把百度 AK 和 TaoToken Key 都从代码里抽出来,前端只拿后端下发的临时凭证,nginx 层统一做反代和限流。这样以后换 Key、加模型、扩标点数据量,都不用动前端。
需要继续接入或排障的,从 API Keys 和接入文档入手:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 、https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。想先验证模型输出再决定怎么用,去模型对话页试:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。长期做编码或 Agent 的,直接看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。