一、谷歌地图切片投影方法及瓷砖索引机制1。地图投影Google地图采用Web Merkator投影(下图),使世界地图成为与赤道周长长度相同的正方形(赤道半径为6378137米),原点位于正方形中心(纬度和经度),以便于忽略极变形较大的地区。

Web墨卡托投影的X,Y坐标取值范围为:[-20037508.3427892,20037508.3427892],对应的经度取值范围为[-180,180],对应的纬度范围则为[-85.05112877980659,85.05112877980659]。具体投影解释请参考墨卡托投影:

2.瓦片索引机制

Google 地图的索引机制是 TMS(Tile Map Service) 规范的一个变种,其地图瓦片如下图进行索引:

Google 瓦片坐标系:把地球投影后形成的正方形划分为2 的 level(缩放级别) 次幂个地图瓦片,原点在左上角,类似于像素坐标系;详细解释参见Google Maps API 文档。

TMS瓦片坐标系:TMS与Google的地图瓦片切割方法相同,不同的是TMS的原点在左下角。

转换关系:TMS 与Google 坐标系的X 、Z是相等的,Y 的转换关系为:Y(TMS) + Y(Google) = Ma(2,zoom) – 1

注:关于投影和瓦片索引机制强烈推荐阅读:Tiles à la Google Maps: Coordinates, Tile Bounds and Projection,文中详细分析了地图瓦片涉及各类坐标的转换关系及具体算法,包括瓦片坐标(Google、TMS、Bing QuadTree)、像素坐标、WGS84 经纬度、Mercator 投影平面坐标等。

3.地图缩放级别的分辨率与地图比例尺的关系

地图缩放级别的分辨率(Resolution),是指某缩放级别每个像素代表的实际距离;

地图比例尺(Scale),是指某缩放级别图上一米代表的实际距离;

默认使用屏幕分辨率为96
算法:
dpi=96,即表示每英寸96像素,1英寸=2.54厘米。
比例尺与分辨率的关系:Scale=Resolution×每米的像素个数,
即有Scale = Resolution×(96*100
则Resolution = Scale*2.54/(96*100)

二、Google地图瓦片地址解析

1.使用Google Chrome 打开Google地图界面,按F12打开 开发人员工具,如下图:

由图片左侧的url地址可见,只要正确解析地址中的四个参数(x , y , z , s)就可以获取到地图瓦片了。

下面是本人的分析思路:

1.四个参数的含义(x、y、z、s):

x , y 是瓦片坐标系的坐标值,z代表缩放级别,s则共有八个字符:空字符和Galileo的七个字符。

x , y 的值在 z 增加时会按级数递增,而s 的值很可能是 x , y , z 三个参数组合后的从 0 到 7 的一个索引值。

x , y , z 组合后与 8 求余即可得到 s 的值。

2.四个参数的关系:

  • 当 x = 0 时,y 增 1 时,s会同时增 1,与 z 值无关。
  • 当 y = 0 时,x 增 1 时,s会同时增3 ,与 z 值无关。
  • 从上面两条可以得出,x , y 很可能以 3*x + y 的方式组合,然后与 8 求余即得 s。

推测公式为:( 3*x + y )%8 = s

3.验证

随即抽取几个地址,取其中的 x , y , s代入第二步中的推测公式验证,果然如此。之后怎么折腾这些瓦片地址就看你了。影像地图只是前缀不一样而已。看来以后不用再为找合适的 Google 地图下载器折腾了,你懂的!

4.其它几个参数的含义

1) Google 地图使用了四个服务地址,即 http://mt ( 0—3).google.cn/……,都是可以用滴。

地图:;hl=zh-CN&gl=cn&src=app&。。。

影像底图:;hl=zh-CN&gl=cn&src=app&。。。

影像的叠加层:;lyrs=h@177000000&hl=zh-CN&gl=cn&src=app&。。。

2) url地址中的 lyrs 表示的是图层类型,即瓦片类型,具体含义如下:

地图瓦片类型验证,直接修改lyrs参数的值即可:;hl=zh-CN&gl=CN&src=app&x=214130&y=114212&z=18&s=Ga

m:路线图
t:地形图
p:带标签的地形图
s:卫星图
y:带标签的卫星图
h:标签层(路名、地名等)

3) 暂时未发现 "&s=…" 的意义,url有无此后缀都不影响瓦片地址的访问。

以下是各地图的瓦片地图地址,可以在QGIS中加载,也可以在openlayer或leaflet前端页面中加载。
腾讯、百度、高德,加上谷歌和天地图应该足够用了。

腾讯、高德是GCJ02坐标系,百度是BD09坐标系,谷歌、必应是WGS84坐标系,天地图是CGCS2000坐标系,瓦片地图都是平面墨卡托投影。WGS84和CGCS2000坐标系,近似认为它们相等就可以了。

高德路网:
{x}&y={y}&z={z}&lang=zh_cn&size=1&scl=2&style=8<ype=11
高德影像:
;x={x}&y={y}&z={z}
高德矢量:
;size=1&style=7&x={x}&y={y}&z={z}
谷歌矢量:
;scale=2&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}
谷歌路网:
;x={x}&y={y}&z={z}
谷歌影像:
;gl=cn&x={x}&y={y}&z={z}
谷歌影像带注记:
;x={x}&y={y}&z={z}
谷歌地形:
;x={x}&y={y}&z={z}
谷歌地图矢量带地形渲染:
;x={x}&y={y}&z={z}
街景地图:
{z}/{x}/{y}.png
天地图影像:
;REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=e3b434f191257368fc43c5b011ab5911
天地图影像注记:
;REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=e3b434f191257368fc43c5b011ab5911
天地图矢量:
;REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=e3b434f191257368fc43c5b011ab5911

天地图矢量注记:
;REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=e3b434f191257368fc43c5b011ab5911

天地图地形:
;REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=e3b434f191257368fc43c5b011ab5911
天地图地形注记:
;REQUEST=GetTile&VERSION=1.0.0&LAYER=cta&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=e3b434f191257368fc43c5b011ab5911

腾讯地图矢量:
{z}&x={x}&y={-y}&type=vector&style=0

百度地图瓦片:
百度瓦片规格不符合WMS标准,需要重新计算,QGIS不支持重新计算瓦片,但openlayer和leaflet都支持。啥时候写前端加上。

必应地图矢量:
也需要重新计算瓦片,写前端的时候加上。

相关推荐