tianditu
本文回答:天地图矢量/影像/注记的瓦片地址与加载方式;CAD 叠加时为什么不用加偏。
一、瓦片地址
天地图使用 WGS84 原生坐标系,没有加偏问题。有两套投影:
| 投影 | URL 模板 T 字段 | 说明 |
|---|---|---|
| Web 墨卡托(推荐) | vec_w / img_w / cva_w |
与 vjmap 直接兼容 |
| 经纬度直投 | vec_c / img_c / cva_c |
vjmap 引擎只支持 Web 墨卡托瓦片网格,加载不了(_c 瓦片会整体错位) |
常用瓦片
矢量底图(日间): https://t{s}.tianditu.gov.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}&tk={t}
影像底图: https://t{s}.tianditu.gov.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}&tk={t}
矢量注记: https://t{s}.tianditu.gov.cn/DataServer?T=cva_w&X={x}&Y={y}&L={z}&tk={t}
影像注记: https://t{s}.tianditu.gov.cn/DataServer?T=cia_w&X={x}&Y={y}&L={z}&tk={t}
{s} 范围 07(或 16,看文档),{t} 是申请的 token。{s} / {t} 只有 svc.webMapUrl(tileShards / tileToken)会替换;直接作 raster source 的 tiles 时要写成具体子域和 tk。
二、作为底图
const svc = new vjmap.Service(URL, TOKEN);
const prj = new vjmap.LnglatProjection(); // 互联网底图用 LnglatProjection
const map = new vjmap.Map({
container: "map",
style: {
version: svc.styleVersion(),
sources: {
tdt1: {
type: "raster",
tileSize: 256, // 天地图是 256 瓦片;不写按默认 512 处理会发糊
tiles: ["https://t3.tianditu.gov.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}&tk=YOUR_TK"]
},
tdt2: {
type: "raster",
tileSize: 256,
tiles: ["https://t3.tianditu.gov.cn/DataServer?T=cva_w&X={x}&Y={y}&L={z}&tk=YOUR_TK"]
}
},
layers: [
{ id: "tdt1", type: "raster", source: "tdt1" },
{ id: "tdt2", type: "raster", source: "tdt2" }
]
},
center: prj.toLngLat([117.212429, 39.196783]),
zoom: 15,
renderWorldCopies: false
});
map.attach(svc, prj);
await map.onLoad();
三、叠加 CAD WMS
天地图是 WGS84,不需要 webMapType 参数(默认就是 WGS84)。
const cadMapId = "sys_cad2000";
const style = await svc.createStyle({ backcolor: 0xFFFFFF }, cadMapId);
const wmsurl = svc.wmsTileUrl({
mapid: cadMapId,
version: "v1",
layers: style.stylename,
srs: "EPSG:3857",
crs: "EPSG:4548" // CAD 图 EPSG(CGCS2000 117°E 三度带)
});
map.addSource("wms-cad", { type: "raster", tiles: [wmsurl], tileSize: 256 });
map.addLayer({ id: "wms-cad", type: "raster", source: "wms-cad", paint: { "raster-opacity": 1 } });
四、使用服务端代理(避免跨域 / 多 token 负载均衡)
const tileUrl = svc.webMapUrl({
tileCrs: "wgs84",
tileUrl: [
"https://t{s}.tianditu.gov.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}&tk={t}",
"https://t{s}.tianditu.gov.cn/DataServer?T=cva_w&X={x}&Y={y}&L={z}&tk={t}"
],
tileSize: 256,
tileMaxZoom: 18,
tileShards: "1,2,3,4,5,6",
tileToken: [
"6d53378dc5f7dbef8d84ffdd2b54139b",
"69eb2fa0de3b2a668f1ef603a3f8bc73" // 多 token 容灾
],
srs: "EPSG:4527", // 自己 CAD 图的 EPSG
mapbounds: res.bounds, // CAD 图坐标范围
fourParameterBefore: "39000000,0,1,0" // 若 CAD 只有 6 位坐标,补带系
});
map.addSource("web-tdt-source", { type: "raster", tiles: [tileUrl], tileSize: 256 });
map.addLayer({ id: "web-tdt-layer", type: "raster", source: "web-tdt-source" });
map.moveLayer("web-tdt-layer", map.getStyle().layers[0].id); // 放到最底
五、Token 管理
- 开发阶段:官方申请个人 key。
- 生产环境:后端保管 key,前端用
svc.webMapUrl让后端拼接;不要把 key 直接写在前端tiles。 - 企业版:私有化部署 vjmap 时,可把天地图瓦片缓存到本机,自带 token 统一代理。
六、常见坑
vec_c(经纬直投)在 vjmap 里显示不对 → vjmap 需要 Web 墨卡托vec_w。- 单 token 大量请求 403 → 多 token 轮询;或升级商业版。
- 影像图层没有注记 → 需同时加
img_w+cia_w。 - 时区/版本问题:天地图有
_c/_w两套,新旧版本可能字段略有差异;以官方为准。