瓦片地图及其计算
2024-09-15 10:10:03
GIS
XYZ
MDX

什么是瓦片地图

瓦片地图(Tiled web map1)一种通过分块技术将大范围地图按固定大小的图像或数据块(称为“瓦片”)分割,方便地图在网络或其他应用中快速加载和显示的技术。

标准的切片 Web 地图的属性主要包括:

  • 图块一般为 256x256 像素
  • 最小层级 0 情况下,可以在单个地图图块中渲染整个世界
  • 每个缩放级别在 XY 两个维度上都加倍,因此在放大时,单个图块将替换为 4 个图块
  • 使用 Web Mercator 投影(EPSG:3857),纬度限制约为85°

XYZ_Tile

图片来自: https://en.wikipedia.org/wiki/File:XYZ_Tiles.png

切片方法

1.Google Maps / OpenStreetMap

大多数平铺 Web 地图都遵循某些 Google 地图惯例,事实上的 OpenStreetMap 标准,称为 Slippy Map Tilenames 或 XYZ.

原点坐标在左上角

2.Tile Map Service(TMS)

OpenLayers 的早期标准,与XYZ的区别是 y 轴在 TMS 中向北为正, 即原点在左下角.

可通过以下公式计算得到 XYZ 的 Y 值

Y=2z1YtmsY = 2^z - 1 - Y_{tms}

js代码如下:

// 在编程语言中,左移运算较快
// y = Math.pow(2, z) - y - 1;
y = (1 << z) - y - 1;

参考阅读: The difference between XYZ and TMS tiles and how to convert between them (github.com)

3.QuadTrees

Bing Map 使用 Quadkeys 进行寻址2

缩放级别

缩放级别(zoom)一般为 0~18,zoom level 为 0 时,需要 1 张瓦片,zoom level 为 n 时,需要 22n2^2n 张瓦片

一般地图服务商提供地图的最大分辨率为亚米级,18 级时影像分辨率为 0.5972m,所以 zoom 一般为18.

Openlayer 提供了调试瓦片,可以显示每个瓦片的坐标3:

瓦片编号的计算

可根据以下公式计算4

x=lon+1803602zx=\left \lfloor \frac{lon+180}{360} \cdot 2^{z} \right \rfloor
y=(1ln(tan(latπ180)+1cos(latπ180))π)2z1y=\left \lfloor (1-\frac{ \ln (\tan (lat\cdot \frac{\pi }{180} )+\frac{1}{\cos(lat\cdot \frac{\pi}{180} )} )}{\pi}) \cdot 2^{z-1} \right \rfloor
lon=x2z360180lon=\frac{x}{2^z} \cdot 360-180
lat=arctan(sinh(πy2z))180πlat=\arctan (\sinh(\pi-\frac{y}{2^z} ))\cdot \frac{180}{\pi}

根据经纬度计算其所在瓦片编号

经度(Longitude):
纬度(Latitude):
缩放级别(Zoom):

x=211y=100

根据瓦片 XY 和 ZOOM 计算经纬度

X:
Y:
Z:

瓦片西北(左上)角的坐标(经度、纬度)为: 116.71875036.597889

相关参考资料

OpenLayers 3 Primer - 瓦片计算
flutter_map的 Demo: Tile Builder

参考

  1. Tiled web map - Wikipedia

  2. Bing Maps Tile System

  3. ol/source/TileDebug - OpenLayers API

  4. Slippy map tilenames