將地圖座標轉換成GPS座標的簡單演算法

來源:互聯網
上載者:User

麗水市汽車運輸集團股份有限公司資訊中心
苟安廷

由於天朝上國的特色,我們接收到的GPS座標並不是真實的座標,而是GPS裝置按照國家密碼編譯演算法進行加偏以後的座標,這個演算法是一致的,和具體GPS裝置無關,收到GPS座標後,我們不能直接把這個座標顯示到電子地圖上,因為每種電子地圖會在此基礎上進行二次加偏,也就是說,我們必須把GPS座標轉換成地圖對應的地圖座標,才能正確顯示出來,這樣,我們將接觸到三個座標:真實座標、在真實座標基礎上加偏的GPS座標、在GPS加偏基礎上再加偏的地圖座標。GPS裝置收到真實座標後,會按統一演算法加偏,得到GPS座標,並傳給我們,這個過程是硬體完成的,我們將收到的GPS加偏座標,按每種地圖提供的糾偏介面,轉換成地圖座標,再顯示到地圖上。GPS本身的加偏演算法是一樣的,儘管我們並不知道具體怎麼算的,但不同地圖二次加偏的演算法不一樣,我們只有拿到該地圖對應的加偏演算法才能在該地圖上正確顯示位置資訊,這個過程我們通常稱之為糾偏,每種地圖都有自己的糾偏介面,也就是將GPS座標轉換成該地圖對應的地圖座標,關於百度地圖糾偏的方法,請參加我的另外一篇部落格:http://blog.csdn.net/gatr/article/details/9569189,但這些糾偏方法,都沒有提供逆向的,也就是說沒有將地圖座標轉換成GPS座標的直接方法,而這種需求往往又是必須的,比如,我們有一個百度地圖的座標,需要正確顯示到Google地圖上,顯然,無法直接將百度地圖座標轉換成Google地圖座標,最理想的方式,就是先把百度座標轉換成GPS座標,然後,再把GPS座標轉換成Google座標。

我們知道,地圖座標加偏是非線性,也就是說,不同地區,位移量不一樣,但同一個地區,位移量卻差不多,因此,我們只要找到該地區的位移量,就可以反算GPS座標了,那麼,如何找到位移量呢?一個簡單的辦法,就是把當前地圖座標當成GPS座標來使用,然後以此計算出對應地圖的地圖座標,最後,將原座標和新得到的座標相減,就得到了位移了,既然有了位移,將該位移和原座標疊加,就反算出了對應的GPS座標了。為了使用整數表示,我們參照GPS通用做法,將經緯度分別乘以一百萬,範例程式碼如下(不同地圖加偏方式不一樣,這裡,我們用一個方法類比):

       
/// <summary>

       
/// 類比地圖糾偏,每種地圖糾偏演算法參照對應的介面

      
 /// </summary>

       
/// <param name="p">GPS座標</param>

       
/// <returns>對應的地圖座標</returns>

       
private Point GpsToMap(Point p)

       
{

           
return new
Point(p.X - 1000, p.Y - 500);

       
}

 

      
/// <summary>

       
/// 將地圖座標轉還原為GPS座標

       
/// </summary>

       
/// <param name="p">當前地圖座標</param>

       
/// <returns>GPS座標</returns>

       
private Point MapToGps(Point p)

       
{

           
//將當前地圖座標,當成GPS座標使用,根據地圖轉換介面,得到地圖座標

           
Point temp = GpsToMap(p);

           
//用當前座標(類比的GPS座標)減去得到的地圖座標,得到位移

           
int offX = p.X - temp.X;

           
int offY = p.Y - temp.Y;

           
//根據地圖座標與位移的疊加,反算出GPS座標,並返回

           
return new
Point(p.X + offX, p.Y + offY);

       
}

       
//測試代碼

       
private void button1_Click(object sender,
EventArgs e)

       
{

           
/定義一個GPS座標

           
Point ptTest =
new Point(120123456, 28123456);

           
//類比糾偏得到地圖座標

           
Point pt1 = GpsToMap(ptTest);

           
//根據地圖座標,反算出GPS座標,我們可以看到,pt2和ptTest相同

           
Point pt2 = MapToGps(pt1);

       
}

上面的代碼實現了將地圖座標轉換成GPS座標的功能,需要注意的是,實際使用時,同樣的GPS座標,每次調用地圖糾偏介面時,得到的地圖座標都可能不一樣,都有一定的隨機誤差,因此,不要指望這種轉換是嚴格一對一的,實際只能是近似值而已。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.