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

两个术语:

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

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

 

一、地图分片原理

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

官方给的示意图如下:


图中每个区域的红色的数字编码,可以记做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.jpgquadkey)和文件夹路径(TileXY)存在换算的映射。

 

四、quadkey和TileXY之间的映射

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

五、本地搭建Maps服务方案

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

比较可行的方案是根据url规则,将需要的地图瓦片数据批量下载到本地服务器,并根据quadkeyTileXY的映射关系配置路由,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的软件比较好用。感兴趣的可以找找试试。

合智互联客户成功服务热线:400-1565-661

admin
admin管理员

上一篇:【上电即上华为云】华为云openCPU智联模组_wifi_HF-LPX70_RISC-V_LwM2M
下一篇:从自然语言处理到时序预测(附赠AAAI21最佳论文INFORMER的详细解析)

留言评论

暂无留言
取消
扫码支持