先了解几个概念:
一、经纬度
地球是个椭球,Datum是一组描述这个椭球的数据集合。最常用的一个Datum是WGS84(World Geodetic System 1984)。主要的参数有:长短轴,质心,子午线,扁平比例
- 坐标系的原点地球质心
- 子午线,即零度经线
- 椭球截面长轴a
- 椭球截面短轴b,可选参数
- 扁平比例f=(a−b)/a=1/298.257223563;
- geoid,海平面,用于定义高度,本文从略。
WGS84 Datum的信息可以用下图进行概括:
二、投影
投影就是把球面坐标转为平面坐标。常见投影是墨卡托投影,因为他具有等角性质,即球体两点之间的角度方位和平面上的两点之前的角度方位保持不变。适用于导航。
Web墨卡托投影(球体墨卡托投影)是墨卡托投影的变种,接受的是WGS84的经纬度,投影式不再把地球当作椭球而是当作半径为6378137米的标准球体。
计算公式推导如下(反正我也看不明白,笔记就做上吧=学会了):
Web墨卡托投影有两个相关的投影标准(EPSG4326,EPSG3857):
- EPSG4326:Web墨卡托投影后的平面地图,但仍然使用WGS84的经度、纬度表示坐标;
- EPSG3857:Web墨卡托投影后的平面地图,坐标单位为米。
三、瓦片
Web墨卡托投影以后,地球变为一张图。zoom(缩放级别)级别高的时候要看宏观的地图信息,zoom级别小的时候需要看围观的地图信息。比如瓦片就是zoom=1的时候,可能只有一张图,在下一级别4个瓦片,再下一级别是16个瓦片。这样就形成了一个金字塔坐标系。
四、瓦片编号
瓦片生成后,对一堆图片如何进行编号。有四个流派。
- 谷歌XYZ:Z表示缩放层级,Z=zoom;XY的原点在左上角,X从左向右,Y从上向下。
- TMS:开源产品的标准,Z的定义与谷歌相同;XY的原点在左下角,X从左向右,Y从下向上。
- QuadTree:微软Bing地图使用的编码规范,Z的定义与谷歌相同,同一层级的瓦片不用XY两个维度表示,而只用一个整数表示,该整数服从四叉树编码规则
- 百度XYZ:Z从1开始,在最高级就把地图分为四块瓦片;XY的原点在经度为0纬度位0的位置,X从左向右,Y从下向上。
下图显示了前三个流派在zoom=1层级上的瓦片编号结果:
五、中国的经纬度
国内的经纬度有三套系统:
- WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系
GCJ02:又称火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。
使用OpenStreetMap的坐标为WGS84;使用高德地图、腾讯地图的坐标为GCJ02;使用百度地图的坐标为BD09;谷歌地图和Bing地图的中国部分采用了高德地图的数据,所以坐标为GCJ02。
WGS84的坐标转化为GCJ02的坐标是单向的,即WGS84的坐标能够准确地变换为GCJ02坐标;但GCJ02坐标转换为WGS84时会存在精度损失。
GCJ02的坐标和BD09的坐标转换是双向的,转换规则可以参考下面的python代码:
import mathx_pi = 3.14159265358979324 * 3000.0 / 180.0def amapcoor2bmapcoor(amap_lon, amap_lat):x = amap_lony = amap_latz = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * x_pi)theta = math.atan2(y, x) + 0.000003 * math.cos(x * x_pi)bmap_lon = z * math.cos(theta) + 0.0065bmap_lat = z * math.sin(theta) + 0.006return (bmap_lon, bmap_lat)def bmapcoor2amapcoor(bmap_lon, bmap_lat):x = bmap_lon - 0.0065y = bmap_lat - 0.006;z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi);theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi);amap_lon = z * math.cos(theta);amap_lat = z * math.sin(theta);return (amap_lon, amap_lat)
五、小结
个人总结:
- 经纬度和瓦片的概念
- 墨卡托投影与Web墨卡托投影(Web墨卡托投影是摩卡投影的变种)
- EPSG4326、EPSG3857(Web墨卡托的标准,EPSG4326是WGS84表示坐标,EPSG3857坐标单位是米)
- WGS84、GCJ02、BD09(WGS84大家广泛GPS用的,GCJ02是国家加密的,BD09是百度在国家加密的基础上再加密的)
根据以下作者做的笔记,他的比较完整。
参考地址:https://segmentfault.com/a/1190000011276788
【瓦片编号】https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection/#3/15.00/50.00
【墨卡托投影】
【百度XYZ】https://lbsyun.baidu.com/index.php?title=jspopular/guide/maplayer
【微软QuadTree】https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system?redirectedfrom=MSDN