【Cesium杂谈】Cesium的tilingScheme和天地图服务

Cesium的tilingScheme

Cesium的tilingSchme决定了瓦片的组织方式。内部实现了两种tilingScheme方式:GeographicTilingScheme和WebMercatorTilingScheme。

tilingScheme类有以下一些成员变量

  • ellipsoid:椭球体,这个都是WGS84
  • projection:使用的投影方式,GeographicTilingScheme对应的是GeographicProjection,WebMercatorTilingScheme对应的是WebMercatorProjection
  • numberOfLevelZeroTileX/numberOfLevelZeroTileY:在0级时瓦片的个数,后续的层级的瓦片个数都是依据0级瓦片的个数来决定的。其中,GeographicTilingScheme的值为2/1,即,在0级,X方向有2张瓦片,Y方向有1张瓦片,整个0级有2*1 = 2张瓦片。而WebMercatorTilingScheme都是1,即在0级只有一张瓦片。

天地图的瓦片组织方式

天地图的矢量地图和影像地图都提供了经纬度格式和墨卡托投影的服务。可以通过https://t0.tianditu.gov.cn/img_c/wmts?request=GetCapabilities&service=wmts和https://t0.tianditu.gov.cn/img_w/wmts?request=GetCapabilities&service=wmts获取服务的元数据。

墨卡托投影影像服务

从元数据中可以看到,墨卡托服务可以提供的影像的范围为(-20037508.3427892 -20037508.3427892)到(20037508.3427892 20037508.3427892),即全球范围,其单位为米。

从tileMatrixSet中可以看到,提供的服务的第1级影像的瓦片个数为2×2=4张,影像的宽高为256×256。一共可以提供1-18级的影像,第18级影像一共为262144×262144张。
天地图墨卡托格式的地图影像第1级瓦片数量为4,这个和GeographicTilingScheme是一致的,因此不需要额外处理。

经纬度影像服务

经纬度服务提供的影像的范围以经纬度来表示,范围同样是全球范围

在tileMatrixSet中,可以看到一共可以提供1-18级影像,第1级影像X方向有两张,Y方向有1张,即一共是两张影像。
经纬度格式的影像第1级有2张,而WebMercatorTilingScheme的第1级有8张,第0级才是2张,数量不匹配,因此,要使用tileMatrixLabels来指定对应关系,其值可设置为[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],即,当我们请求第0级的瓦片(2个)对应的影像时,我们应该请求的对应的天地图影像服务的层级为1(也是2张),这样才能做到瓦片和影像的正确对应。

瓦片影像调度规则

cesium中一个瓦片中有影像数据和地形数据,地形数据用于决定瓦片的顶点信息,影像数据决定瓦片的贴图。在创建地球时,使用地形的tilingScheme规则来创建瓦片,cesium的.terrain格式的地形数据,默认是经纬度形式的,因此,瓦片的顶点数据都是以GeographicTilingScheme规则来创建的,即第0级有2个瓦片,分别是东半球和西半球。cesium中还提供了椭球地形,可以指定其tilingScheme,默认为经纬度。
而影像数据由第三方服务提供或者用户自行切片提供,如天地图影像服务,包含两种格式的影像服务。即第一级有四张影像的墨卡托形式的影像服务,和第一级有2张影像的经纬度形式的影像服务。
地形的瓦片规则和影像的瓦片规则可能是不一致的。例如,地形采用的cesium地形,为经纬度瓦片切分规则,第0级有2张瓦片,但是影像使用的是墨卡托瓦片切分规则,第一级有4张影像。那么,在渲染的时候,一个瓦片需要两张影像图才能全部覆盖这个瓦片,因此,需要计算出对应的两张瓦片的行列号,然后去服务请求。

其他地图服务的瓦片规则

百度地图:百度地图使用BD09坐标,是在火星坐标系GCJ-02的基础上二次加密后的坐标,火星坐标系是基于WGS84加密后得到的坐标。百度地图的tilingScheme是基于墨卡托的,其投影方式需要自定义。
高德地图:高德地图只支持墨卡托格式的WMTS图层。tilingScheme基于墨卡托,投影方式是火星坐标。
星图地球:支持经纬度和墨卡托。从0级开始,经纬度0级1张图,墨卡托0级2张图
腾讯地图:只支持墨卡托,GCJ-02火星坐标系

一个开源库https://github.com/dvgis/cesium-map/tree/master提供了cesium实现的不同地图服务的加载功能,可供参考。

Cesium加载天地图示例

墨卡托投影影像

前面已经说过,墨卡托投影的服务每个层级的影像数量是对应的,因此,不需要额外处理,不需要设置tileMatrixLabels,只需要指定一下tilingScheme(也可以不指定,因为默认就是墨卡托的tilingScheme)

const viewer = new Cesium.Viewer("cesiumContainer", {
   imageryProvider:new Cesium.WebMapTileServiceImageryProvider({
    url: "https://{s}.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}&tk=你的tk",
    layer: "img_w",
    style: "default",
    format: "tiles",
    tileMatrixSetID: "w",
    subdomains:["t0","t1","t2","t3","t4","t5","t6","t7"],
    tilingScheme: new Cesium.WebMercatorTilingScheme(),
  })
})

经纬度影像

经纬度影像需要指定tileMatrixLabels

const viewer = new Cesium.Viewer("cesiumContainer", {
  imageryProvider:new Cesium.WebMapTileServiceImageryProvider({
    url: "https://{s}.tianditu.gov.cn/img_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}&tk=你的tk",
    layer: "img_c",
    style: "default",
    format: "tiles",
    tileMatrixSetID: "c",
    subdomains:["t0","t1","t2","t3","t4","t5","t6","t7"],
    tilingScheme: new Cesium.GeographicTilingScheme(),
    tileMatrixLabels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"],
  })
})

两种影像的结果是一样的

posted @ 2024-02-29 16:03  李煎饼_GISer  阅读(427)  评论(0编辑  收藏  举报