底图替换实现方案SfNstu TyphoonLab · BASEMAP PLAN星数流光旗下企划
这份文件解决什么
《免责说明》第五条第 3 款写明:地图瓦片如无法取得相应服务授权,将替换为自建或公共领域瓦片,或改用纯矢量底图。本文件说明这句话具体怎么做——三条可执行的路线、各自要改哪里、代价是什么。
三条路线任选其一即可,不必全做。它们不是并列关系,而是"先试省事的,退到最稳的"。
一、先划三条底线
换底图不是"把图片地址换成另一个",而是要同时满足三件事,缺一件都不算解决:
- 边界画法要合规。在我国境内公开使用的地图,边界、岛礁画法必须与国家主张一致,以自然资源部"标准地图服务"发布的版本为准,并按规定报送审核、标注审图号。底图提供方怎么画,不代表本站就能这么画。
- 瓦片要按规矩取。应经服务方官方接口 + 授权凭证(Key)调用,而不是直接连别人的瓦片端点。直连一般不符合服务条款,量大了会被限流、封禁。
- 供给要能长期稳定。"现在没人管"不是理由——访问量涨上来之后,问题会集中暴露。
一句话:底图合规 = 边界合规 + 授权合规 + 供给稳定。下面三条路线,就是在这三个约束下挑不同的解法。
二、路线一:改用有审图号的官方底图改动最小
怎么做
- 改用国家地理信息公共服务平台(天地图)的底图。它由主管部门主导,提供矢量、影像、地形等多种底图,本身带审图号,可在其网站上免费注册并申请调用凭证。
- 把前端底图清单里的地址换成天地图的官方接口(一种标准地图服务格式,参数里带凭证),署名改为其规定的字样。
- 服务器响应头里的图片白名单,把允许来源换成天地图的域名。
两个容易踩的细节
- 注记是单独一层。天地图的地名、行政标注不和底图在同一张图上,要"底图 + 注记"两层叠在一起才有字。只挂底图会得到一张没有地名的图。
- 凭证不能写死在页面里。写在前端等于公开,容易被别人拿去用、把配额耗光。稳妥做法是让服务器代为转发瓦片请求并在本地缓存,页面只请求本站地址;本项目以单一入口脚本统一处理请求,加一条转发规则即可,同时把图片白名单收紧到"只允许本站"。
同样思路也适用于以官方接口提供底图的其他商业服务(需申请各自的凭证,并按其要求展示署名;国产商业底图另有审图号要求)。
三、路线二:纯矢量底图零外部依赖,推荐作兜底
思路
干脆不下载任何瓦片图片,把海岸线、岛屿、经纬网用线"画"在地图上。观感接近报刊插图,谈不上精细,但作为台风在洋面上移动的背景完全够用。
数据从哪来(关键)
- 海岸线与岛屿:直接用本项目已有的本地地形/海深网格。这份数据源自公共领域的全球地形数据集,取它的"海平面"等值线就能得到海岸线和岛屿轮廓。好处是不引入任何外部边界数据,天然不碰"别人的边界怎么画"这个问题。
- 如果要画国界、省界,只能用自然资源部标准地图的版本,不能用境外来源的边界数据自己拼。
怎么落到页面上
- 把上面得到的线整理成矢量要素,交给地图组件直接绘制;经纬网每 5° 或 10° 画一条。
- 地图上不再有外部图片请求,图片白名单收紧为"只允许本站",离线也能正常显示。
代价:没有街道、地名和影像,信息量明显低于现在。适合"拿不到授权、又不想冒风险"时作为随时可切的兜底方案。
四、路线三:自建瓦片服务完全自主,工程量最大
三步走
- 准备数据。用自己绘制的图,或明确允许自由使用的公共领域数据(例如美国航天局的全球影像)。注意两点:"免费"不等于"公共领域"(很多是署名共享、禁止商用或限制流量);境外来源的边界数据不能直接用来画中国边界。
- 切成瓦片。栅格图用 GDAL 的切片工具,一条命令即可切出 0–6 级(本项目演示范围不需要高等级);矢量数据用 tippecanoe 一类工具转成矢量瓦片。
- 托管。切出来就是一堆按"层级/列/行"命名的图片文件,放进站点的静态目录、由入口脚本放行即可,不需要额外服务;前端底图地址改成本站相对路径。
命令示例
gdal2tiles.py -p mercator -z 0-6 --xyz 底图.tif tiles/ — 把一张栅格图切成 0–6 级瓦片目录
tippecanoe -o out.mbtiles -zg 数据.geojson — 把矢量数据打成瓦片包
注意:自建只解决"授权"问题,不自动解决"边界合规"。如果自制底图上要出现中国边界,仍须以标准地图为准并按规定标注,否则照样违规。
代价:需要一次性准备数据与切片环境,层级越高磁盘占用越大。适合有自有数据、希望长期完全自主的情况。
五、三条路线怎么选
| 路线一 官方底图 | 路线二 纯矢量 | 路线三 自建瓦片 | |
|---|---|---|---|
| 改动量 | 小 | 中 | 大 |
| 外部依赖 | 需申请凭证,有配额 | 无 | 无 |
| 边界合规 | 高(自带审图号) | 高(边界自控) | 取决于数据来源 |
| 观感 | 与现在接近,有街道/影像 | 简洁示意,无地名街道 | 完全自定 |
| 适合 | 希望保持现有观感时 | 拿不到授权时的兜底 | 有自有数据、要长期自主 |
建议顺序:先按路线一申请官方凭证;申请不到或不打算长期维护凭证,就切到路线二;等手上有自有数据、也愿意做一次切片,再考虑路线三。
六、落到本项目要改哪些地方
- 前端底图清单——把底图地址换成新来源(路线二则改为矢量图层)。
- 模拟器页的底图切换按钮——增删到与实际可用的底图一一对应,别留下点了没反应的选项。
- 引导页的底图与来源说明——底图种类、来源署名、署名位置跟着改。
- 服务器响应头里的图片来源白名单——换成新来源;走路线二或三时收紧为"只允许本站"。
- 页面引用的缓存版本号——只要动过前端脚本,就必须升这个号,否则访客浏览器仍在跑旧脚本,会以为"改了没生效"。
无论走哪条路,底图角落的署名都不能删。署名是使用他人底图的前提,也是《项目使用守则》里明确禁止篡改的内容。
七、结论
要么用有审图号、走官方接口的底图,要么干脆不依赖任何外部瓦片,把海岸线自己画出来。介于两者之间、既没有审图号、又是直连他人服务器的底图来源,短期省事,长期都是隐患。