唯杰地图 logo唯杰地图
VJMAP
EN

tianditu

vjmap/references/internet-map/tianditu.md 4.4 KB114 行
原文

本文回答:天地图矢量/影像/注记的瓦片地址与加载方式;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 统一代理。

六、常见坑

  1. vec_c(经纬直投)在 vjmap 里显示不对 → vjmap 需要 Web 墨卡托 vec_w。
  2. 单 token 大量请求 403 → 多 token 轮询;或升级商业版。
  3. 影像图层没有注记 → 需同时加 img_w + cia_w。
  4. 时区/版本问题:天地图有 _c/_w 两套,新旧版本可能字段略有差异;以官方为准。