如果你要開發一個基於 GPS 甚至 IP 地址進行地址定位的功能時,你需要了解一下這些基本知識點,本人對真正的測繪專業不在行,如有疏漏歡迎指正。
GPS 常用坐標系#1 WGS-84 國際標準: Google Earth、或者GPS模塊使用該標準目前 GPS 的國際標準坐標系統, GPS 所發布的星曆參數就是基於此坐標系統的。WGS-84 坐標系統的全稱是World Geodical System-84(世界大地坐標系-84),它是一個地心地固坐標系統。WGS-84 坐標系統由美國國防部製圖局建立,於1987 年取代了當時GPS所採用的坐標系統―WGS-72坐標系統而成為GPS 的所使用的坐標系統。WGS-84 坐標系的坐標原點位於地球的質心,Z 軸指向BIH1984.0 定義的協議地球極方向,X 軸指向BIH1984.0 的啟始子午面和赤道的交點,Y 軸與X 軸和Z 軸構成右手系。
Google Earth屬於衛星照片,它不是地圖,所以不受天朝測繪法的約束,因此Google Earth的坐標是真實坐標。
#2 GCJ-02 中國坐標偏移標準: Google Map、高德、騰訊使用國測局02年發布的坐標體系。又稱 「火星坐標」。在中國,必須至少採用GCJ-02對地理位置進行 首次 加密。比如谷歌,騰訊,高德都在用這個坐標體系。GCJ-02是國內最廣泛使用的坐標體系,也是在正常坐標系下經過加入隨機誤差進行脫密處理後的坐標系。
偏移的起因:
天朝測繪局以國家安全為理由,用法律的形式對所有在天朝發行的地圖類產品加了強制性規範,要求所有地圖類產品都必須使用國家測繪局的一種加偏移的算法,對地圖的真實坐標進行加偏移處理,之後才可能通過審批准許上市。因此,天朝的所有官方及商用地圖的坐標都是偏移的,這種偏移屬於非線性的,偏移量在300至500米不等,偏移方向也不定。這種加過偏移的地圖坐標就是所謂「火星坐標」。
但是實際上,這種偏移的算法已經被破解了,隨便可以搜索得到,那為什麼還要這個偏移,豈不是掩耳盜鈴?
知乎上一位同學說的在理:
「因為這是原則問題,就比如說,有人開發了軟體,別人破解了,然後你問了,既然有破解的為什麼大家還要買收費的,一個道理。你破解是你的事情,這件事情犯法了,不要把犯法的事情當作理所應當。」
#3 BD-09 百度坐標偏移標準: Baidu Map / Baidu SDK 使用百度自己定義的坐標體系,其實就是在火星坐標上來個二次加密而已。
如果使用的是百度sdk那麼可以獲得百度坐標(BD-09)或者火星坐標(GCJ-02), 默認是BD-09
如果使用的是ios的原生定位庫,那麼獲得的坐標是WGS-84
如果使用的是高德sdk,那麼獲取的坐標是GC-J02
註:搜狗、圖吧等也是自己的坐標體系標準,和百度類似。
上面三種坐標體系是按照偏移加密來分別的,開發需要特別關心互相之間的轉換,如果有多重數據來源的話。
接下來的分類是球面和平面坐標:
球面坐標,對於北京來說,就是(116.38817139.935961)這樣的坐標。比如騰訊、高德、百度都是這樣的經緯度坐標。谷歌是經緯度順序寫反的經緯度坐標。
如果是度分秒坐標,需要進行轉換,才能得到上方的經緯度坐標。
這裡可以看到經緯度http://api.map.baidu.com/lbsapi/getpoint/index.html
平面坐標,相當於是直線距離,數字一般都比較大,像這樣的。(215362.00021333335 99526.00034912192)
墨卡託坐標,主要用於程序的後臺計算。直線距離嘛,加加減減幾乎計算方便。
搜狗地圖API就是直接使用的墨卡託坐標。
什麼是墨卡託投影?
墨卡託(Mercator)投影,又名「等角正軸圓柱投影」,荷蘭地圖學家墨卡託(Mercator)在1569年擬定,假設地球被圍在一個中空的圓柱裡,其赤道與圓柱相接觸,然後再假想地球中心有一盞燈,把球面上的圖形投影到圓柱體上,再把圓柱體展開,這就是一幅標準緯線為零度(即赤道)的「墨卡託投影」繪製出的世界地圖。從球到平面,有個轉換公式,這裡就不再羅列。
做個小實驗,以東方明珠為參照物,對比下百度地圖,騰訊地圖,Google Map和Google Earth的經緯度偏差:
百度拾取坐標系統直接搜索東方明珠,顯示的經緯度值在右上角:
121.506271,31.245414
選擇上海,搜索東方明珠,顯示的經緯度為:
31.239780,121.499680
搜索東方明珠,在地圖上右鍵,選擇「這裡有什麼?」,會顯示經緯度值為(谷歌的經緯度是顛倒的):
31.239900,121.499723
搜索到東方明珠,在下方顯示的經緯度是以度分秒顯示的,31° 14′ 30.63″ 121° 29′ 42.61 ″ 找個轉換工具變為如下的經緯度數:
31.241841666666666,121.49516944444444
將經緯度分別放到對方的系統裡搜索,可以發現是有偏移的
Google經緯度 In Baidu.PNG
Baidu經緯度 In Google.PNG
Google Earth in Google Map.PNG
結論:百度地圖自己的偏移加密方式, 谷歌地圖和騰訊地圖都是GCJ-02標準,谷歌Earth是國標的原始GPS經緯度。
IP 地址定位技術簡而言之就是通過IP位址來確定地理位置,它的基本原理是,利用IP設備的名字、註冊信息或時延信息等來估計其地理位置。
定位算法設計的基本原則是:在保證定位精度的前提下,儘量減少測量開銷,同時兼具良好的擴展性,並能保護用戶隱私。
最初的定位算法通過向DNS伺服器查詢或者挖掘隱含在主機名中的信息來推測IP設備的地理位置之後,一些定位算法根據時延與地理距離之間的線性關係來估測主機位置,並通過拓撲信息來減小定位誤差。近年來,基於概率的定位算法重新成為一個研究熱點,通過尋找時延與地理距離的分布規律來進行定位。雖經不斷改進,但這兩類算法都不能精確地定位,因此,一些綜合的定位算法使用了上述兩類方法來進行交叉驗證以提高精度.
通常來說,IP定位最早是通過運營商實現,每個運營商申請到的IP段,在某個範圍內使用。因此早期只能是國家為單位的基礎數據。
對於比較大的國家,就進一步劃分,比如,中國電信固定將某些IP分配某些機房使用,而這些機房則具備地域屬性,因此就可以知道某些IP的位置是哪個省市區。再進一步,網上有種測算路由的方式進行定位,就是由大範圍逐個跳轉,跟蹤路由。從而對比找出IP所在的小範圍。
隨著大數據發展,像百度收集了大量數據,數據實時分析。因此可以將手機收集到的精準GPS數據和當前所用IP數據成對上報給後端伺服器,運算過之後,就可以得出某個IP的分布範圍數據。
如今,網絡鋪設已經有個相當多的特性,比如:
直接給用戶分配公網IP;
為了緩解IP資源不足問題,給到用戶的是私網IP,用戶最終用代理的IP池的IP訪問公網;
IP資源利用率過低,幾乎是一個省份用一個IP池進行代理給用戶的手機網絡上網;
因此定位的誤差從幾十米到整個省份不等,但就目前類似百度的實力來說,定位到行政市一級理論上是完全沒有問題的,甚至很多情況已經可以精準到幾十米的程度了。
# IP定位的API類似的免費IP定位服務有很多成熟API,比如 阿里雲市場,淘寶IP庫,百度開發者平臺/百度API Store,純真IP庫等等,若希望穩定服務,也有對應的收費企業版,可選範圍很多,精度都是到行政市一級的。
目前個人傾向於阿里雲市場的免費IP庫 + 百度開發者平臺雙渠道接入,隨時可以切換。
下方的一個在線系統就調用了百度開發平臺的IP精準定位服務,在PC端打開瀏覽器就可以定位到你的具體位置,偏差很小。
https://www.opengps.cn/Data/IP/IPHighAccuracy.aspx
可惜的是,目前該服務已關閉(http://lbsyun.baidu.com/index.php?title=webapi/ip-api)。
參考文獻:
[IP定位技術的研究]:
http://www.jos.org.cn/html/2014/7/4621.htm
[openGPS.cn - 高精度IP定位原理,定位誤差說明]:
http://blog.csdn.net/cuitang1031/article/details/52787772
如果覺得有用,歡迎打賞