地图坐标转换-火星坐标
在開始這個題目之前,先給大家再次掃掃盲,掃的不是坐標系統的盲,而是我們國家所使用的坐標系統。大家都知道,美國GPS使用的是WGS84的坐標系統,以經緯度的形式來表示地球平面上的某一個位置,這應該是國際共識。但在我國,出于國家安全考慮,國內所有導航電子地圖必須使用國家測繪局制定的加密坐標系統,即將一個真實的經緯度坐標加密成一個不正確的經緯度坐標,我們在業內將前者稱之為地球坐標,后者稱之為火星坐標,具體的說明可以參看百度百科中關于火星坐標系統的解釋。
1.國內各地圖API坐標系統比較
參考 http://rovertang.com/labs/map-compare/
結論是:
| 百度地圖API | 百度坐標 |
| 騰訊搜搜地圖API | 火星坐標 |
| 搜狐搜狗地圖API | 搜狗坐標* |
| 阿里云地圖API | 火星坐標 |
| 圖吧MapBar地圖API | 圖吧坐標 |
| 高德MapABC地圖API | 火星坐標 |
| 靈圖51ditu地圖API | 火星坐標 |
2.下面是百度官方對百度坐標為何有偏移的解釋
國際經緯度坐標標準為WGS-84,國內必須至少使用國測局制定的GCJ-02,對地理位置進行首次加密。百度坐標在此基礎上,進行了BD-09二次加密措施,更加保護了個人隱私。百度對外接口的坐標系并不是GPS采集的真實經緯度,需要通過坐標轉換接口進行轉換。
3.火星坐標系 (GCJ-02) 與百度坐標系 (BD-09) 的轉換算法
GCJ-02(火星坐標) 和 BD-09 (百度坐標)
算法代碼如下,其中 bd_encrypt 將 GCJ-02 坐標轉換成 BD-09 坐標, bd_decrypt 反之。
void bd_encrypt(double gg_lat, double gg_lon, double &bd_lat, double &bd_lon)
{
double x = gg_lon, y = gg_lat;
double z = sqrt(x x + y y) + 0.00002 sin(y x_pi);
double theta = atan2(y, x) + 0.000003 cos(x x_pi);
bd_lon = z cos(theta) + 0.0065;
bd_lat = z sin(theta) + 0.006;
}
void bd_decrypt(double bd_lat, double bd_lon, double &gg_lat, double &gg_lon)
{
double x = bd_lon - 0.0065, y = bd_lat - 0.006;
double z = sqrt(x x + y y) - 0.00002 sin(y x_pi);
double theta = atan2(y, x) - 0.000003 cos(x x_pi);
gg_lon = z cos(theta);
gg_lat = z sin(theta);
}
4.地球坐標系 (WGS-84) 到火星坐標系 (GCJ-02) 的轉換算法
WGS-84 到 GCJ-02 的轉換(即 GPS 加偏)算法是一個普通青年輕易無法接觸到的“公開”的秘密。這個算法的代碼在互聯網上是公開的,詳情請使用 Google 搜索 “wgtochina_lb” 。
整理后的算法代碼請參考 https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936 。知道了這個算法之后,就可以離線進行 Google 地圖偏移校正,不必像之前那么麻煩。
至于 GCJ-02 到 WGS-84 的轉換(即 GPS 糾偏),可以使用二分法。
總結
以上是生活随笔為你收集整理的地图坐标转换-火星坐标的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CHD-5.3.6集群上sqoop安装
- 下一篇: 气象数据库分析