为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.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的软件比较好用。感兴趣的可以找找试试。
- 点赞
- 收藏
- 关注作者
评论(0)