记一次 CesiumJS 中非 4326/3857 WMTS 数据的加载

CesiumJS 能用的 WMTS 目前只支持两种切片方案(TilingScheme):

  • 0 级瓦片有 2 个的 GeographicTilingScheme
  • 0 级瓦片只有 1 个的 WebMercatorTilingScheme

光说很抽象,上图:

记一次 CesiumJS 中非 4326/3857 WMTS 数据的加载 2

记一次 CesiumJS 中非 4326/3857 WMTS 数据的加载 4

0 级瓦片有 2 个的投影,是直接以经纬度数值展平成平面,众所周知:

纬度跨度:经度跨度=180:360=1:2纬度跨度:经度跨度 = 180:360 = 1:2

所以 GeographicTilingScheme 的样子就是一个一比二的 矩形,刚好就在 0 级瓦片时有两个,后续就按常规的四叉树切分即可。而 WebMercator 投影后的坐标系 xy 值域是 [−20037508.34,20037508.34]2[-20037508.34,20037508.34]^2,是一个 正方形,所以可以按单个 0 级瓦片进行四叉树切分。

以上,是技术前提,CesiumJS 只能支持这两种切分方案,也就是说,我国常用的其他投影方法,例如高斯投影、兰伯特投影等是不支持的,主要是形状不太满足构造四叉树瓦片。

既有 WMTS 的现状

需求是这样的,这一份 WMTS 的起切等级并不是 0 级,通过观察能力文档,我可以得出如下几个结论:

  • 它是自定义切片方案,但满足 GeographicTilingScheme 方案的形状,是 1:2 的矩形
  • 它的 0 级瓦片与 EPSG:4326 的 0 级瓦片不同
  • 它的 0 级瓦片分辨率与 EPSG:4326 的 9 级瓦片相同
  • 它的 0 级瓦片共有 1024 列 × 512 行,而 EPSG:4326 是 2 列 × 1 行,是 4326 的 5122512^2

如果读者足够敏锐,可以得知这个 WMTS 的起切瓦片实际上几乎就是 4326 的第 9 级瓦片:

<TileMatrixLimits>
    <TileMatrix>EPSG:4490:0</TileMatrix>
    <MinTileRow>190</MinTileRow>
    <MaxTileRow>192</MaxTileRow>
    <MinTileCol>835</MinTileCol>
    <MaxTileCol>838</MaxTileCol>
</TileMatrixLimits>eMatrix>
复制代码

比对广东省省界数据的 4326 坐标系第 9 级瓦片阵(TileMatrix)定义:

<TileMatrixLimits>
    <TileMatrix>EPSG:4326:9</TileMatrix>
    <MinTileRow>183</MinTileRow>
    <MaxTileRow>198</MaxTileRow>
    <MinTileCol>823</MinTileCol>
    <MaxTileCol>845</MaxTileCol>
</TileMatrixLimits>
复制代码

最大最小行列号略有差别,是因为数据所跨的范围略有不同,前者范围较后者(广东省省界)小。

我只能说比较庆幸,这样的 WMTS 基本还是可以满足加载要求的,现有 API 可以满足加载调整。

兵来将挡水来土掩 – 问题解决

先给代码,然后解释:

const provider = new WebMapTileServiceImageryProvider({
  url: new Resource({
    url: 'http://127.0.0.1/server/wmts', // 简写 url,会意即可
    headers: {
      'tk': 'aaaaaaaaa', // 数据保密,需要传递 token
    }
  }),
  tileMatrixSetID: 'EPSG:4490',
  format: 'image/png',
  tileMatrixLabels: Object.keys(new Array(11).fill(0)).map(v => `EPSG:4490:${v}`),
  layer: 'demo',
  rectangle: Rectangle.fromDegrees(113.75549, 22.383494, 114.662777, 22.888641),
  style: "",
  tilingScheme: new GeographicTilingScheme({
    numberOfLevelZeroTilesX: 1024,
    numberOfLevelZeroTilesY: 512,
  })
})
viewer.imageryLayers.addImageryProvider(provider)
复制代码

url 参数

WebMapTileServiceImageryProviderurl 可以是两种类型的值:stringResource,这个 WMTS 数据需要在所有请求头中加上访问令牌(token),所以我选择创建一个 Resource 对象来传递 token。

tileMatrixSetID 和 layer 参数

这里设为 EPSG:4490,指的是能力文档中该图层(layer: 'demo')下的 <TileMatrixSetLink></TileMatrixSetLink> 的瓦片阵集ID(TileMatrixSetID):

<TileMatrixSetLink>
    <TileMatrixSet>EPSG:4490</TileMatrixSet>
    <TileMatrixSetLimits><!-- ... --></TileMatrixSetLimits>
</TileMatrixSetLink>
复制代码

tileMatrixLabels 参数

这个没什么好说的,就是每一层瓦片阵的访问标签,我这里使用 JavaScript 的数组语法糖快速生成了 11 级(0到10,共11层)瓦片阵的 ID,即:

Object.keys(new Array(11).fill(0)).map(v => `EPSG:4490:${v}`)

// ["EPSG:4490:0", "EPSG:4490:1", ..., "EPSG:4490:10"]
复制代码

这样,网络请求瓦片的链接:

http://127.0.0.1/server/wmts?tilematrix=EPSG%3A4490%3A1&layer=ZT%3ATDYT&style=&tilerow=382&tilecol=1671&tilematrixset=EPSG%3A4490&format=image%2Fpng&service=WMTS&version=1.0.0&request=GetTile
复制代码

中的 tilematrix 参数的值:EPSG:4490:1 就是正确的了。tileMatrixLabels 数组默认是数字 0 ~ 最大等级,如果图层在能力文档中定义的 tilematrix 的 ID 不是 0 ~ 最大等级的数字的话,就需要这样构造一个数组来告诉 CesiumJS,要以什么样的 tilematrix 发出请求。

rectangle 参数

加上这个参数,就可以最大优化 WMTS 的请求性能,如果不加这个参数限制请求范围,就会取相机视角下的所有筛选到的瓦片,这对这个例子十分有效,主要还是要加上最后一个参数:

tilingScheme 参数

上文已经提及,这个 WMTS 的切片方案与 4326 的是几乎一致的,只不过其 0 级相当于 4326 的 9 级。

那么,当 CesiumJS 发出第 0 级瓦片请求时,默认的 TilingScheme 是只有 1 行 2 列的瓦片的,但是在能力文档中,我注意到了一个定义:

<Contents>
    <TileMatrixSet>
        <ows:Identifier>EPSG:4490</ows:Identifier>
        <ows:SupportedCRS>urn:ogc:def:crs:EPSG::4490</ows:SupportedCRS>
        <TileMatrix>
            <ows:Identifier>EPSG:4490:0</ows:Identifier>
            <ScaleDenominator>545978.7734655447</ScaleDenominator>
            <TopLeftCorner>90.0 -180.0</TopLeftCorner>
            <TileWidth>256</TileWidth>
            <TileHeight>256</TileHeight>
            <MatrixWidth>1024</MatrixWidth>
            <MatrixHeight>512</MatrixHeight>
        </TileMatrix>
        <!-- ... -->
    <TileMatrixSet>
</Contents>
复制代码

这是这个 WMTS 服务下的 EPSG:4490 的瓦片阵集(TileMatrixSet)的第 0 个瓦片阵(TileMatrix)的定义,这里定义了几个比较重要的参数:

  • Identifier:瓦片阵的 ID
  • ScaleDenominator:比例(分母)
  • TileWidth / TileHeight:该瓦片阵的瓦片的像素宽高
  • MatrixWidth / MatrixHeight:该瓦片阵的瓦片行列数

要用于前端的就是最后一个,行列数:

new GeographicTilingScheme({
  numberOfLevelZeroTilesX: 1024,
  numberOfLevelZeroTilesY: 512,
})
复制代码

这样就能在 CesiumJS 发出第 0 级瓦片请求时,行列号能与 WMTS 的瓦片行列号对应上了,TilingScheme API 的这两个参数就是这么个用法,前提是切片的形状满足 CesiumJS 支持的这两个:GeographicTilingSchemeWebMercatorTilingScheme

小结

通过这次实践,我又进一步学习了老旧但是又不得不用的 WMTS 规范,以及这种非标准 4326、3857 切片数据的加载细节,那就是精确地根据能力文档中各项参数(瓦片阵集的选择、瓦片阵的范围等),配合 JsAPI 控制发出准确的请求。

如果真遇上那种不满足 CesiumJS 这俩切片方案的,估计就难搞了,水平有限。

作者:岭南灯火
链接:https://juejin.cn/post/7205208559264170040
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。商机网仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 tenspace2022@163.com 举报,一经查实,本站将立刻删除。 本文链接:https://www.315965.com/n/53990.html 聚才发 母婴好物

(0)
上一篇 2023年4月9日 下午1:08
下一篇 2023年4月9日 下午1:10

相关推荐

  • cad2014安装教程图解及激活方法(cad2014安装教程详细图解和激活教程)

    在电脑上安装cad2014这一款软件的时候,一些网友会遇到:cad2014安装失败的问题,系统提示:安装完成,某些产品无法安装。反复安装了好几次都是这个提示,那么,cad2014一直安装失败怎么办?cad2014安装失败解决方法。 cad2014安装失败解决方法: 控制面板——程序——打开或关闭windows功能,把.NET Framework 3.5 和4…

    2023年4月9日 下午1:09
    21
  • 取代C++!微软改用Rust语言重写Win11内核:简洁安全、性能更佳

    快科技4月29日讯,随着微软确定结束对Win10的功能更新,其更多精力将转移到Win11以及“Win12”上。 在日前举办的BlueHat IL 2023 大会上,微软企业和操作系统安全副总裁David Weston介绍了他们正对Win11进行的内核级改造。 简单来说,微软正用Rust取代C++改写内核,目前已经添加了36000行代码。 Weston指出,R…

    2023年4月9日 下午1:09
    21
  • Nodejs读书笔记

    今天终于把朴灵老师写的《深入浅出Node.js》给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架、库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构。建议有一定Node基础或者做过Node方面的小项目的同学阅读,看完以后你的思维会有很奇特的碰撞,我看的时候就常常会有这样的想法:“哦,原来这个功能是这样实现的…

    2023年4月9日 下午1:09
    21
  • 电脑组装教程图解插头(电脑主机插线安装步骤图)

    对于没有任何硬件安装基础的小伙伴来说,如果想要自己组装一台电脑主机,是一件相对比较困难的事情,毕竟隔行如隔山,但是就是有一些动手能力强的人群,通过一篇详细的DIY电脑组装教程就可以将自己选择的硬件组装出一台完整的电脑。装机之家晓龙为广大粉丝编写过几篇十分详细的电脑装机教程,基本都是图文版的,全网至少达到了上千万浏览量,受到了广大网友的一致好评。不过也有网友表…

    2023年4月9日 下午1:09
    21
  • 儿童编发教程简单好看(儿童编发教程简单好看公主)

    三到六岁的小女孩,正是一个上幼儿园的年纪,自己的动手能力还没有那么强,所以一些事情还需要爸爸妈妈的协助。比如说小女孩扎头发的时候,就需要有一个“心灵手巧”的妈妈,好看的发型不仅可以满足小女孩爱美的心,也可以呈现出更加甜美俏皮的风格。 小女孩发型的绑扎方法是怎样的呢?有没有什么简单又好看的扎发方法呢?01、可以用橡皮筋来打造出俏皮的麻花辫,尤其是亮色系的橡皮筋…

    2023年4月9日 下午1:09
    21
  • 二阶魔方教程新手公式(二阶魔方教程新手公式图解)

    面先法分为三步。首先拼好一面(任意颜色,本文以白色为例。)再拼好已拼好面的对面(如:绿对蓝 红对橙 白对黄)。当然在学习前要知道各个字母公式的含义。 R=Right (右面顺时针旋转90度) R 的含义 与R相对的是L L=Left(左面顺时针旋转90度) L 的含义 还有F,Front(前面顺时针旋转90度) F 的含义 与F相对的是B B=Back(后面…

    2023年4月9日 下午1:09
    21
  • oracle11g安装教程完整版(oracle11g客户端安装与配置)

    在本教程中,我们将逐步介绍如何下载Oracle 11g数据库并演示如何安装在Windows 10 64位机器上,以便在系统中学习和实践PL/SQL编程。 下载并安装Oracle数据库 首先,需要到Oracle官方网站下载Oracle数据库,在这里我们将下载Oracle 11g第2版的Microsoft Windows(x64)版本。由于安装文件过大,可以分两…

    2023年4月9日 下午1:09
    21
  • matlab安装教程2016a(matlab2016下载安装教程)

    大家好,我是本文的小编 ‘软妹’,前几篇为大家分享了Proe、Creo系列软件的安装步骤,在商业数据领域MATLAB用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,其统一了用于一维、二维与三维数值积分的函数并提升了基本数学和内插函数的性能!。今天为大家分享Matlab 2016a版本纯净安装的步骤,希望能…

    2023年4月9日 下午1:09
    21
  • 订单30分钟未支付自动取消怎么实现?

    方案 1:数据库轮询 思路 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行 update 或 delete 等操作 实现 可以用 quartz 来实现的,简单介绍一下 maven 项目引入一个依赖如下所示 <dependency>   <groupId>org.quartz…

    2023年4月9日 下午1:09
    21
  •  ChatGPT 或 Google:哪个给出了最佳答案

    ChatGPT 因其先进的对话和技术功能而越来越受欢迎。 你可以问聊天机器人任何你想问的问题,它会在几秒钟内输出答案。 Google 搜索还可以帮助您找到问题的答案。 虽然它不是搜索引擎,但您是否应该使用 ChatGPT 而不是 Google 作为信息的首选来源? 另外:ChatGPT 不能做的 6 件事(以及它拒绝做的另外 20 件事) Preply 是一…

    2023年4月9日 下午1:09
    21