谷歌、高德、天地图、OSM、腾讯等的瓦片组织模式参见:https://blog.csdn.net/sinat_41310868/article/details/115561425
这篇文章单独说一下百度地图的瓦片组织规则。
相对于谷歌等地图的瓦片地图切片规则,百度的瓦片差异主要在如下两个方面:
1.瓦片坐标系原点由东经180°,南纬85.05°,变为了东经0°,北纬0°,既赤道与格林尼治经线的交点。
2.Y轴由向下,变为向上,既Y由南向北。
原点也变了,坐标轴也转向了,百度地图这个瓦片切片模式,的确是让人挺困惑的,就跟BD09坐标的存在一样,令人困惑double。
下图是在zoom level为3的时候,百度地图的瓦片分布,从瓦片坐标(0,0)开始,x和y都是正数的时候,是东北半球,西半球和南半球的瓦片x和y是负数。
百度地图zoom level最小值是3,最大值是21。
之前已经在坐标系与投影中介绍了百度地图的坐标系与投影,https://blog.csdn.net/sinat_41310868/article/details/115551276,基于百度地图与众不同的坐标系、投影、切片方式,经纬度坐标与瓦片坐标之间的转换,也要比正常的地图瓦片复杂一些。
首先,需要将经纬度坐标投影到平面坐标,根据平面坐标计算出瓦片坐标,在还原的时候,也需要根据平面坐标进行中转。
百度地图瓦片在zoom level为18的时候,其像素分辨率是1m/pixel,可推出像素分辨率的计算公式为:
resolution=2^( 18-z) m/pixel
其中z是zoom level。
百度地图瓦片的投影平面坐标起点为(0,0)。
当瓦片尺寸为256*256pixel的时候,瓦片坐标(tileX,tileY)的计算公式为:
tileX=int(x*2^(z-18)/256)
tileY=int(y*2^(z-18)/256)
其中,x和y是平面投影坐标,z是zoom level。
知道了在zoom level为18的时候,像素分辨率为1m/pixel,坐标原点为(0,0),一切就都豁然开朗了。
平面投影坐标(x,y)转瓦片像素坐标(pixelX,pixelY)的公式:
pixelX=x*2^(z-18)-int(x*2^(z-18)/256)*256
pixelY=y*2^(z-18)-int(y*2^(z-18)/256)*256
其中z是zoom level。
瓦片坐标(tileX,tileY)加上像素坐标(pixelX,pixelY),转平面投影坐标(x,y)的公式:
x=(tileX*256+pixelX)*2^(18-z)
y=(tileY*256+pixelY)*2^(18-z)
其中z是zoom level。
因为BD09坐标系是极坐标加常量二次加密GCJ02坐标系获得的,所以它的墨卡托投影需要分区间进行修正。它的参考椭球也是变形的,根据计算可知道,它的赤道半径是6378206米,扁率应该可以还用WGS84椭球的扁率1/298.257223565。
百度地图瓦片平面投影坐标x最大值为20037726m, y最大值为12474104m。
梳理完百度地图瓦片规则,真的还是很让人困惑,从BD09坐标系,到BD09MC投影,到独树一帜的瓦片规则,百度地图为什么要搞得这么绕来绕去呢?
这么复杂,一般人搞不出来,但为什么要搞这么复杂呢?理应是一个通用服务,为啥弄得这么遗世独立呢?
真的很困惑triple。
把坐标系转换、投影、瓦片坐标、像素坐标的计算方法写成了python代码,如下:
import math
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626 # π
a = 6378245.0 # 长半轴
ee = 0.00669342162296594323 # 扁率
# 百度墨卡托投影纠正矩阵
LLBAND = [75, 60, 45, 30, 15, 0]
LL2MC = [
[-0.0015702