地球是一個橢球,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)
若是你能簡單介紹出下面幾個核心概念,恭喜你已經基本掌握了本文想要分享的知識點。
若是你對本文的知識點存在疑惑,能夠查閱如下參考資料: