cesium搭建离线地图服务——瓦片数据原理以及本地瓦片数据服务部署的思路

网友投稿 5070 2022-05-30

两个术语:

quadkey ——三维地图加载瓦片地图图片的键值,在请求url中可以看到;

TileXY——瓦片地图图片在整个地图中的坐标,也用作该瓦片图的存储目录;

一、地图分片原理

以Cesium默认加载的bing maps tile system为例。其地图以一种四叉树的方式进行存储和加载。每当放大地图时,会根据放大层级以及当前区域加载对应子层级的地图图片,在浏览器进行拼接展示。

为cesium搭建离线地图服务——瓦片数据原理以及本地瓦片数据服务部署的思路

官方给的示意图如下:

图中每个区域的红色的数字编码,可以记做TileXY。

二、瓦片地图图片的URL格式

Bing Maps的瓦片地图图片的URL的格式为:

http://ecn.t{0}.tiles.virtualearth.net/tiles/{1}{2}.png? g={4}

参数解释:

参数

解释

说明

{0}

代表Bing Maps的服务器,平衡负载

现在看来取值可以是0~7,也就是8台服务器

{1}

地图类型

卫星地图:a;普通地图:r;混合地图:h

{2}

瓦片地图图片键值(quadkey )

通过对应地图区域的位置、显示尺度等计算而来

{3}

地图图片类型

取值为png | jpeg | jpg

{4}

地图版本

其他url参数可以参考bing maps的官方文档。

其他地图供应商的url大同小异。

三、瓦片数据的存储

瓦片数据在文件系统中以下面这种路径形式(z/x/y.jpg,即TileXY方式)存储的:

上图中的图片路径是 2/2/1.jpg,即按照TileXY方式描述的 {地图放大层级}/{X坐标}/{Y坐标}.jpg。它对应的url是:

https://ecn.t3.tiles.virtualearth.net/tiles/a123.jpg?g=9675

也就是url中的图片名 a123.jpg(quadkey)和文件夹路径(TileXY)存在换算的映射。

四、quadkey和TileXY之间的映射

根据官方文档:在给定level下,把行号Y和列号X转换为2进制,然后行列交叉存储,再转换为4进制,即得到了相应的quadkey。譬如Level 3的第6行第4列的Tile计算:tileY = 5 = 101 ,tileX = 3 = 011;quadkey = 100111 = 213(4进制) = “213”。反过来计算就是quadkey到TileXY的转换。根据此方法,就很容易写quadkey到TileXY之间的转换代码。

五、本地搭建Maps服务方案

如果考虑网络不可用的场景,就需要构建本地Maps的服务。

比较可行的方案是根据url规则,将需要的地图瓦片数据批量下载到本地服务器,并根据quadkey和TileXY的映射关系配置路由,cesium的地图源的请求改成从本地服务器获取。

当前有对应脚本工具对瓦片数据进行批量下载,唯一问题是数据量有些大。中国范围内如果地图缩放支持到16级的卫星地图影像,中国的地图数据有图片约1.17亿张。放大到16级大概是下面效果,地面分辨率2.39m每像素。

所以如果使用此方案,需要:

1、根据我们实际需要下载对应区域、对应缩放层级的瓦片数据,如国外区域只下载部分层级,国内下载到16级,避免用到的数据占用太大;

2、有足够空间、有服务器存放瓦片数据,同时在此服务器上部署Maps服务,并配置好请求路由映射;

3、修改cesium对应的配置,改成三维地图图片加载走自己部署的Maps服务器,对应Viewer初始化时候配置imageryProvider参数。如:

// 卫星图设置为本地影像 imageryProvider : new Cesium.UrlTemplateImageryProvider({ url: "/resource/map-tile/bing/{z}/{x}/{y}.jpg", }),

六、如何下载地图数据

目前发现了一个名为MapTileDownloader的软件比较好用。感兴趣的可以找找试试。

web前端

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:XCMS | LC/MS and GC/MS Data Analysis
下一篇:体验官 | Redis读写分离实例体验及评测
相关文章