火星坐標系 (GCJ-02) 與百度坐標系 (BD-09) 的轉換算法

名詞解釋:
地球坐標 (WGS84)
國際標準票渠,GPS標準從 GPS 設備中取出的原始數據是就是這個
國際地圖提供商一般使用的也是這個

火星坐標 (GCJ-02)
中國標準护昧,行貨 GPS 設備取出的最終數據是這個
國家龜腚: 國內出版的各種地圖系統(tǒng)(包括電子形式),必須至少采用GCJ-02對地理位置進行首次加密。

百度坐標 (BD-09)
百度標準洲守,百度 SDK,地圖暗甥,Geocoding 用的都是這個。

獲取經緯度(GPS)
火星坐標 MKMapView
地球坐標 CLLocationManager

顯示經緯度(地圖)
火星坐標
iOS 地圖
Gogole地圖
搜搜捉捅、阿里云撤防、高德地圖
地球坐標
Google 衛(wèi)星地圖(國外地圖應該都是……)
百度坐標
百度地圖

推薦的解決方案:
既然是在國內,存儲一律用火星坐標棒口,這樣在使用國內地圖顯示時最方便(用百度地圖顯示時可以一次轉換取得)
CLLocationManager 拿到的 CLLocation 轉為火星坐標寄月,MKMapView 不用處理
使用地圖 API 進行 地址解析/逆地址解析(Geocoding) 時注意相應使用相應地圖商的坐標系
部分地圖商支持多個坐標系輸入,如高德支持地球无牵、火星坐標(這個一直有變動漾肮,具體只能參考廠商最新文檔了)

附上相應的轉換算法
iOS 平臺的轉換算法的已經封裝了一個 Category,在這里 CLLocation+Sino 茎毁。
地圖坐標 to 火星坐標
地球坐標系 (WGS-84) 到火星坐標系 (GCJ-02) 的轉換算法 (推薦!)
地圖 API: 百度的 高德的
<pre>using System;

namespace Navi
{
class EvilTransform
{
const double pi = 3.14159265358979324;

    //
    // Krasovsky 1940
    //
    // a = 6378245.0, 1/f = 298.3
    // b = a * (1 - f)
    // ee = (a^2 - b^2) / a^2;
    const double a = 6378245.0;
    const double ee = 0.00669342162296594323;

    //
    // World Geodetic System ==> Mars Geodetic System
    public static void transform(double wgLat, double wgLon, out double mgLat, out double mgLon)
    {
        if (outOfChina(wgLat, wgLon))
        {
            mgLat = wgLat;
            mgLon = wgLon;
            return;
        }
        double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
        double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
        double radLat = wgLat / 180.0 * pi;
        double magic = Math.Sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = Math.Sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
        mgLat = wgLat + dLat;
        mgLon = wgLon + dLon;
    }

    static bool outOfChina(double lat, double lon)
    {
        if (lon < 72.004 || lon > 137.8347)
            return true;
        if (lat < 0.8293 || lat > 55.8271)
            return true;
        return false;
    }

    static double transformLat(double x, double y)
    {
        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
        ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
        ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    static double transformLon(double x, double y)
    {
        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
        ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
        ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
        return ret;
    }
}

}
</pre>
火星坐標 to 地圖坐標
數據庫查表轉換 中國區(qū) GPS坐標 修正(適用于google地圖)
iOS 私有 API (已不可用)

火星坐標 vs 百度坐標
火星坐標系 (GCJ-02) 與百度坐標系 (BD-09) 的轉換算法

算法代碼如下克懊,其中 bd_encrypt 將 GCJ-02 坐標轉換成 BD-09 坐標, bd_decrypt 反之充岛。
<pre>#include <math.h>

const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

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);
} </pre>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末保檐,一起剝皮案震驚了整個濱河市耕蝉,隨后出現(xiàn)的幾起案子崔梗,更是在濱河造成了極大的恐慌,老刑警劉巖垒在,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒜魄,死亡現(xiàn)場離奇詭異扔亥,居然都是意外死亡,警方通過查閱死者的電腦和手機谈为,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門旅挤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伞鲫,你說我怎么就攤上這事粘茄。” “怎么了秕脓?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵柒瓣,是天一觀的道長。 經常有香客問我吠架,道長芙贫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任傍药,我火速辦了婚禮磺平,結果婚禮上,老公的妹妹穿的比我還像新娘拐辽。我一直安慰自己拣挪,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布薛训。 她就那樣靜靜地躺著媒吗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乙埃。 梳的紋絲不亂的頭發(fā)上闸英,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音介袜,去河邊找鬼甫何。 笑死,一個胖子當著我的面吹牛遇伞,可吹牛的內容都是我干的辙喂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼鸠珠,長吁一口氣:“原來是場噩夢啊……” “哼巍耗!你這毒婦竟也來了?” 一聲冷哼從身側響起渐排,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炬太,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驯耻,有當地人在樹林里發(fā)現(xiàn)了一具尸體亲族,經...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡炒考,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霎迫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斋枢。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖知给,靈堂內的尸體忽然破棺而出瓤帚,到底是詐尸還是另有隱情,我是刑警寧澤涩赢,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布缘滥,位于F島的核電站,受9級特大地震影響谒主,放射性物質發(fā)生泄漏朝扼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一霎肯、第九天 我趴在偏房一處隱蔽的房頂上張望擎颖。 院中可真熱鬧,春花似錦观游、人聲如沸搂捧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽允跑。三九已至,卻和暖如春搪柑,著一層夾襖步出監(jiān)牢的瞬間聋丝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工工碾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弱睦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓渊额,卻偏偏與公主長得像况木,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旬迹,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內容