地球是一个椭球,Datum是一组用于描述这个椭球的数据集合。最经常使用的一个Datum是WGS84(World Geodetic System 1984),它的主要参数有:php
经过以上参数设定,咱们才能对地球上的任意一个位置用经度、纬度、高度三个变量进行描述。因此当咱们获取一组经纬度信息时,首先要弄明白这组信息对应的Datum。python
WGS84 Datum的信息能够用下图进行归纳:web
地图是显示在平面上的,所以须要将球面坐标转换为平面坐标,这个转换过程称为投影。最多见的投影是墨卡托(Mercator)投影,它具备等角性质,即球体上的两点之间的角度方位与平面上的两点之间的角度方位保持不变,所以特别适合用于导航。segmentfault
Web墨卡托投影(又称球体墨卡托投影)是墨卡托投影的变种,它接收的输入是Datum为WGS84的经纬度,但在投影时再也不把地球当作椭球而当作半径为6378137米的标准球体,以简化计算。其计算公式推导请参考下图:app
Web墨卡托投影有两个相关的投影标准,常常搞混:jsp
通过Web墨卡托投影后,地图就变为平面的一张地图。考虑到有时候咱们须要看宏观的地图信息(如世界地图里每一个国家的国界),有时候又要看很微观的地图信息(如导航时道路的路况信息)。为此,咱们对这张地图进行等级切分。在最高级(zoom=0),须要的信息最少,只需保留最重要的宏观信息,所以用一张256x256像素的图片表示便可;在下一级(zoom=1),信息量变多,用一张512x512像素的图片表示;以此类推,级别越低的像素越高,下一级的像素是当前级的4倍。这样从最高层级往下到最低层级就造成了一个金字塔坐标体系。ide
对每张图片,咱们将其切分为256x256的图片,称为瓦片(Tile)。这样,在最高级(zoom=0)时,只有一个瓦片;在下一级(zoom=1)时有4个瓦片;在下一级(zoom=2)时有16个瓦片,以此类推。ui
上述过程能够用下图进行总结:google
瓦片生成后,就是一堆图片。怎么对这堆图片进行编号,是目前主流互联网地图商分歧最大的地方。总结起来分为四个流派:编码
下图显示了前三个流派在zoom=1层级上的瓦片编号结果:
下表总结了中国主要地图商的瓦片编号流派,点击每一个连接就能够得到一个对应编号的瓦片地图:
地图商 | 瓦片编码 | 图层 | 连接 |
---|---|---|---|
高德地图 | 谷歌XYZ | 道路 | http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x=105&y=48&z=7 |
高德地图 | 谷歌XYZ | 卫星 | http://webst04.is.autonavi.com/appmaptile?style=6&x=843&y=388&z=10 |
谷歌地图 | 谷歌XYZ | 道路 | http://mt2.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&x=105&y=48&z=7 |
谷歌地图 | 谷歌XYZ | 卫星 | http://mt2.google.cn/vt/lyrs=s&hl=zh-CN&gl=cn&x=105&y=48&z=7 |
谷歌地图 | 谷歌XYZ | 地形 | http://mt0.google.cn/vt/lyrs=t&hl=zh-CN&gl=cn&x=420&y=193&z=9 |
OpenStreetMap | 谷歌XYZ | 道路 | http://a.tile.openstreetmap.org/7/105/48.png |
腾讯地图 | TMS | 道路 | http://rt1.map.gtimg.com/realtimerender?z=7&x=105&y=79&type=vector&style=0 |
Bing地图 | QuadTree | 道路 | http://r1.tiles.ditu.live.com/tiles/r1321001.png?g=100&mkt=zh-cn |
百度地图 | 百度XYZ | 道路 | http://online4.map.bdimg.com/tile/?qt=tile&x=98&y=36&z=9&;styles=pl&scaler=1&udt=20170406 |
百度地图 | 百度XYZ | 交通 | http://its.map.baidu.com:8002/traffic/TrafficTileService?level=19&x=99052&y=20189&time=1373790856265&label=web2D&;v=017 |
补充一个新的瓦片地图资源:http://map.geoq.cn/,里面有彩色、灰色、暖色和夜色版的中国地图,坐标为GCJ02。举例:http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetWarm/MapServer/tile/{z}/{y}/{x}
国内的经纬度有三套系统:
使用OpenStreetMap的坐标为WGS84;使用高德地图、腾讯地图的坐标为GCJ02;使用百度地图的坐标为BD09;谷歌地图和Bing地图的中国部分采用了高德地图的数据,因此坐标为GCJ02。
WGS84的坐标转化为GCJ02的坐标是单向的,即WGS84的坐标可以准确地变换为GCJ02坐标;但GCJ02坐标转换为WGS84时会存在精度损失。
GCJ02的坐标和BD09的坐标转换是双向的,转换规则能够参考下面的python代码:
import math x_pi = 3.14159265358979324 * 3000.0 / 180.0 def amapcoor2bmapcoor(amap_lon, amap_lat): x = amap_lon y = amap_lat 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) bmap_lon = z * math.cos(theta) + 0.0065 bmap_lat = z * math.sin(theta) + 0.006 return (bmap_lon, bmap_lat) def bmapcoor2amapcoor(bmap_lon, bmap_lat): x = bmap_lon - 0.0065 y = 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)
若是你能简单介绍出下面几个核心概念,恭喜你已经基本掌握了本文想要分享的知识点。
若是你对本文的知识点存在疑惑,能够查阅如下参考资料: