GPS坐標(biāo)與百度地圖坐標(biāo)轉(zhuǎn)換

空間坐標(biāo)公式:


image.png

上述四個方程式中待測點坐標(biāo)x、 y两曼、 z 和Vto為未知參數(shù)皂甘,其中di=c△ti (i=1、2悼凑、3偿枕、4)。

di (i=1佛析、2益老、3、4) 分別為衛(wèi)星1寸莫、衛(wèi)星2捺萌、衛(wèi)星3、衛(wèi)星4到接收機(jī)之間的距離膘茎。
△ti (i=1桃纯、2、3披坏、4) 分別為衛(wèi)星1态坦、衛(wèi)星2、衛(wèi)星3棒拂、衛(wèi)星4的信號到達(dá)接收機(jī)所經(jīng)歷的時間伞梯。
c為GPS信號的傳播速度(即光速)。

四個方程式中各個參數(shù)意義如下:

x帚屉、y谜诫、z 為待測點坐標(biāo)的空間直角坐標(biāo)。
xi 攻旦、yi 喻旷、zi (i=1、2牢屋、3且预、4) 分別為衛(wèi)星1槽袄、衛(wèi)星2、衛(wèi)星3锋谐、衛(wèi)星4在t時刻的空間直角坐標(biāo)遍尺,可由衛(wèi)星導(dǎo)航電文求得。

Vt i (i=1怀估、2狮鸭、3、4) 分別為衛(wèi)星1多搀、衛(wèi)星2歧蕉、衛(wèi)星3、衛(wèi)星4的衛(wèi)星鐘的鐘差康铭,由衛(wèi)星星歷提供惯退。
Vto為接收機(jī)的鐘差。

由以上四個方程即可解算出待測點的坐標(biāo)x从藤、y催跪、z 和接收機(jī)的鐘差Vto 。

GPS的基本定位原理是:衛(wèi)星不間斷地發(fā)送自身的星歷參數(shù)和時間信息夷野,用戶接收到這些信息后懊蒸,經(jīng)過計算求出接收機(jī)的三維位置,三維方向以及運動速度和時間信息悯搔。

引言

在將終端定位到的GPS點顯示到百度地圖上后骑丸,位置有很大偏差,故了解到百度對坐標(biāo)系做了加密
百度地圖api中采用兩種坐標(biāo)體系妒貌,經(jīng)緯度坐標(biāo)系和墨卡托投影坐標(biāo)系通危。前者單位是度,后者單位是米灌曙,具體定義可以參見百科詞條解釋: http://baike.baidu.com/view/61394.htmhttp://baike.baidu.com/view/301981.htm菊碟。

坐標(biāo)系轉(zhuǎn)化

查到兩種方式,一種使用百度提供的轉(zhuǎn)換接口在刺,另一種為本地轉(zhuǎn)換

使用百度地圖函數(shù)轉(zhuǎn)換

這里只列舉JS示例:
參考http://www.cnblogs.com/zhaohuionly/archive/2013/06/18/3142623.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;}
#l-map{height:100%;width:78%;float:left;border-right:2px solid #bcbcbc;}
#r-result{height:100%;width:20%;float:left;}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.5&ak=9fb983ecd9b505f8fedcc9ab07c65e3e"></script>
<script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
<title>GPS轉(zhuǎn)百度</title>
</head>
<body>
<div id="allmap"></div>
</body>
</html>
<script type="text/javascript">
//GPS坐標(biāo)
var xx = 117.126575995835;
var yy = 36.6702207308909;
var gpsPoint = new BMap.Point(xx,yy);

//地圖初始化
var bm = new BMap.Map("allmap");
bm.centerAndZoom(gpsPoint, 15);
bm.addControl(new BMap.NavigationControl());

//添加谷歌marker和label
var markergps = new BMap.Marker(gpsPoint);
bm.addOverlay(markergps); //添加GPS標(biāo)注
var labelgps = new BMap.Label("我是GPS標(biāo)注哦",{offset:new BMap.Size(20,-10)});
markergps.setLabel(labelgps); //添加GPS標(biāo)注

//坐標(biāo)轉(zhuǎn)換完之后的回調(diào)函數(shù)
translateCallback = function (point){
    var marker = new BMap.Marker(point);
    bm.addOverlay(marker);
    var label = new BMap.Label("我是百度標(biāo)注哦",{offset:new BMap.Size(20,-10)});
    marker.setLabel(label); //添加百度label
    bm.setCenter(point);
    alert("轉(zhuǎn)化為百度坐標(biāo)為:"+point.lng + "," + point.lat);
}

setTimeout(function(){
    BMap.Convertor.translate(gpsPoint,0,translateCallback);     //真實經(jīng)緯度轉(zhuǎn)成百度坐標(biāo)
}, 2000);
</script>

本地對坐標(biāo)轉(zhuǎn)換

還是使用JS演示逆害,包含html和js,顯示頁面baidu.html如下:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">

body, html,#allmap {width: 100%;height: 95%;overflow: hidden;margin:0;}

</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.5&ak=9fb983ecd9b505f8fedcc9ab07c65e3e"></script>
<script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
<script type="text/javascript" src="correction.js"></script>
<script type="text/javascript" src="points-test-data.js"></script>
    <script type="text/javascript" src="DistanceTool.js"></script>

<title>GPS坐標(biāo)轉(zhuǎn)百度</title>
</head>
<body>
<div id="allmap"></div>
<div id="control">
    <input type="button" value="開啟測距" align="right" onclick="myDis.open()" />
    <input type="button" value="關(guān)閉測距" align="right" onclick="myDis.close()" />
</div>

<script type="text/javascript">
//GPS坐標(biāo)
var xx = 117.126575995835;
var yy = 36.6702207308909;
var gpsPoint = new BMap.Point(xx,yy);

//地圖初始化
var bm = new BMap.Map("allmap");
bm.centerAndZoom(gpsPoint, 15);
bm.enableScrollWheelZoom();                    //開啟鼠標(biāo)滾輪控制縮放
bm.addControl(new BMap.NavigationControl());   //地圖平移縮放控件
bm.addControl(new BMap.ScaleControl());        //比例尺控件
bm.addControl(new BMap.OverviewMapControl());  //縮略地圖控件
bm.addControl(new BMap.MapTypeControl());      //地圖類型控件
var myDis = new BMapLib.DistanceTool(bm);

//添加谷歌marker和label
for (var i = 0; i < data.data.length; ) {
    _point = wgs2bd(data.data[i][1], data.data[i][0])

    point = new BMap.Point(_point[1], _point[0]);
    var marker = new BMap.Marker(point);
    bm.addOverlay(marker);
    //var label = new BMap.Label("B",{offset:new BMap.Size(20,-10)});
    //marker.setLabel(label); //添加百度label
    bm.setCenter(point);

    i+= 3;//隔3個點
}
</script>

</body>
</html>

加密函數(shù)使用的算法沒深研究,都是三角變換蚣驼,關(guān)鍵函數(shù)wgs2bd在correct.js中:

/*
 pi: 圓周率忍燥。
 a: 衛(wèi)星橢球坐標(biāo)投影到平面地圖坐標(biāo)系的投影因子。
 ee: 橢球的偏心率隙姿。
 x_pi: 圓周率轉(zhuǎn)換量。
 transformLat(lat, lon): 轉(zhuǎn)換方法厂捞,比較復(fù)雜输玷,不必深究了队丝。輸入:橫縱坐標(biāo),輸出:轉(zhuǎn)換后的橫坐標(biāo)欲鹏。
 transformLon(lat, lon): 轉(zhuǎn)換方法机久,同樣復(fù)雜,自行腦補(bǔ)吧赔嚎。輸入:橫縱坐標(biāo)膘盖,輸出:轉(zhuǎn)換后的縱坐標(biāo)。
 wgs2gcj(lat, lon): WGS坐標(biāo)轉(zhuǎn)換為GCJ坐標(biāo)尤误。
 gcj2bd(lat, lon): GCJ坐標(biāo)轉(zhuǎn)換為百度坐標(biāo)侠畔。
*/

var pi = 3.14159265358979324;
var a = 6378245.0;
var ee = 0.00669342162296594323;
var x_pi = 3.14159265358979324 * 3000.0 / 180.0;

function wgs2bd(lat, lon) {
       _wgs2gcj = wgs2gcj(lat, lon);
       _gcj2bd = gcj2bd(_wgs2gcj[0], _wgs2gcj[1]);
       return _gcj2bd;
}

function gcj2bd(lat, lon) {
       x = lon, y = 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);
       bd_lon = z * Math.cos(theta) + 0.0065;
       bd_lat = z * Math.sin(theta) + 0.006;
       return [ bd_lat, bd_lon ];
}

function bd2gcj(lat, lon) {
       x = lon - 0.0065, y = 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);
       gg_lon = z * Math.cos(theta);
       gg_lat = z * Math.sin(theta);
       return [ gg_lat, gg_lon ];
}

function wgs2gcj(lat, lon) {
       dLat = transformLat(lon - 105.0, lat - 35.0);
       dLon = transformLon(lon - 105.0, lat - 35.0);
       radLat = lat / 180.0 * pi;
       magic = Math.sin(radLat);
       magic = 1 - ee * magic * magic;
       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 = lat + dLat;
       mgLon = lon + dLon;
       return [ mgLat, mgLon ];
}

function transformLat(lat, lon) {
       ret = -100.0 + 2.0 * lat + 3.0 * lon + 0.2 * lon * lon + 0.1 * lat * lon + 0.2 * Math.sqrt(Math.abs(lat));
       ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0;
       ret += (20.0 * Math.sin(lon * pi) + 40.0 * Math.sin(lon / 3.0 * pi)) * 2.0 / 3.0;
       ret += (160.0 * Math.sin(lon / 12.0 * pi) + 320 * Math.sin(lon * pi  / 30.0)) * 2.0 / 3.0;
       return ret;
}

function transformLon(lat, lon) {
       ret = 300.0 + lat + 2.0 * lon + 0.1 * lat * lat + 0.1 * lat * lon + 0.1 * Math.sqrt(Math.abs(lat));
       ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0;
       ret += (20.0 * Math.sin(lat * pi) + 40.0 * Math.sin(lat / 3.0 * pi)) * 2.0 / 3.0;
       ret += (150.0 * Math.sin(lat / 12.0 * pi) + 300.0 * Math.sin(lat / 30.0 * pi)) * 2.0 / 3.0;
       return ret;
}

最終定位點顯示到地圖上基本正確,通過與百度地圖函數(shù)返回的精度對比损晤,本地轉(zhuǎn)換函數(shù)經(jīng)緯度誤差也在千分之一以下

定位效果截圖:

![Uploading image_743578.png . . .]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末软棺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尤勋,更是在濱河造成了極大的恐慌喘落,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件最冰,死亡現(xiàn)場離奇詭異瘦棋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)暖哨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門赌朋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹿蜀,你說我怎么就攤上這事箕慧。” “怎么了茴恰?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵颠焦,是天一觀的道長。 經(jīng)常有香客問我往枣,道長伐庭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任分冈,我火速辦了婚禮圾另,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雕沉。我一直安慰自己集乔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布坡椒。 她就那樣靜靜地躺著扰路,像睡著了一般尤溜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汗唱,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天宫莱,我揣著相機(jī)與錄音,去河邊找鬼哩罪。 笑死授霸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的际插。 我是一名探鬼主播碘耳,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腹鹉!你這毒婦竟也來了藏畅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤功咒,失蹤者是張志新(化名)和其女友劉穎愉阎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體力奋,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡榜旦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了景殷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溅呢。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖猿挚,靈堂內(nèi)的尸體忽然破棺而出咐旧,到底是詐尸還是另有隱情,我是刑警寧澤绩蜻,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布铣墨,位于F島的核電站,受9級特大地震影響办绝,放射性物質(zhì)發(fā)生泄漏伊约。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一孕蝉、第九天 我趴在偏房一處隱蔽的房頂上張望屡律。 院中可真熱鬧,春花似錦降淮、人聲如沸超埋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霍殴。三九已至窍蓝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間繁成,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工淑玫, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留巾腕,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓絮蒿,卻偏偏與公主長得像尊搬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子土涝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容