1. 程式人生 > >地球座標-火星座標-百度座標及之間的轉換演算法 C#

地球座標-火星座標-百度座標及之間的轉換演算法 C#

WGS84 :

World Geodetic System 1984,是為GPS 全球定位系統 使用而建立的座標系統。通過遍佈世界的 衛星觀測站 觀測到的座標建立,其初次WGS84的精度為1-2m,在1994年1月2日,通過10個觀測站在GPS測量方法上改正,得到了WGS84(G730),G表示由GPS測量得到,730表示為GPS時間第730個周。

1996年,National Imagery and Mapping Agency (NIMA) 為 美國國防部(U.S.Department of Defense, DoD)做了一個新的座標系統。這樣實現了新的WGS版本:WGS(G873)。其因為加入了 美國海軍天文臺

 和北京站的改正,其東部方向加入了31-39cm 的改正。所有的其他座標都有在1分米之內的修正。

火星座標:

星座標系統,這是我們的國家又一個偉大的發明,讓國外的政府和企業等,都看不懂我們的座標系統。國家是出於國家安全考慮,將我們看到的真實的座標變成假的虛擬的座標,這樣,我們的國家就安全了,不會被恐怖分子破壞了。

國家保密外掛,也叫做加密外掛或者加偏或者SM模組,其實就是對真實座標系統進行人為的加偏處理,按照幾行程式碼的演算法,將真實的座標加密成虛假的座標,而這個加偏並不是線性的加偏,所以各地的偏移情況都會有所不同(GCJ-02)。而加密後的座標也常被人稱為 火星座標系統 。

百毒等線上地圖為了配合政府,以及保護自己的商業利益,在GCJ-02的基礎上都使用了進一步的其它座標加密演算法形成了如百度座標、圖吧座標的座標系統。這樣的做法讓他們既符合了國家要求,又進一步防止使用者遷移。

國內地圖座標系統計:

image

名詞總結: 
地球座標:指WGS84座標系統 
火星座標:指使用國家保密外掛人為偏移後的座標 
地球地圖:指與地球座標對應的客觀真實的地圖 
火星地圖:指經過加密偏移後的,與火星座標對應的地圖

問題:

首先,我們手上所有的GPS裝置,根據渠道和介面軟體的不同,分為火星座標裝置與WGS84座標裝置兩種,另外所有GPS裝置中的地圖以及網上的地圖,分為火星地圖(即人為偏移)和真實地圖兩種。 
比如國內“正規渠道的車載GPS”,採用的是火星座標配火星地圖,完美結合,能夠準確的在地球上使用,缺點就是記錄的點和軌跡都是火星的,與其他地球人無法交流分享。 
多數水貨GPS裝置,使用的都是地球座標配火星地圖,這樣軌跡和航點都是真實座標的,只不過在火星地圖上偏移了 
有些玩家,會將火星地圖加入偏移演算法(無論準確或不準確),人為糾偏,形成地球座標配糾偏地圖(自制地圖),不考慮誤差可以正常使用 
而目前,所有正式釋出的大陸境內電子地圖,都是火星地圖,所以只有大陸之外地區,才能夠用到地球座標與官方地球地圖完美結合的解決方案。 

傳說中的轉換:

WGS-84 到 GCJ-02 的轉換(即 GPS 加偏)演算法是一個普通青年輕易無法接觸到的“公開”的 祕密 。這個演算法的程式碼在網際網路上是公開的,詳情請使用 Google 搜尋"wgtochina_lb" 。整理後的演算法程式碼請參考https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936 。知道了這個演算法之後,就可以離線進行 Google 地圖偏移校正,不必像 之前 那麼麻煩。至於 GCJ-02 到 WGS-84 的轉換(即 GPS 糾偏),可以使用二分法。//// Copyright (C) 1000 - 9999 Somebody Anonymous// NO WARRANTY OR GUARANTEE//using System; namespace Navi { class EvilTransform { constdouble pi = 3.14159265358979324; //// Krasovsky 1940//// a = 6378245.0, 1/f = 298.3// b = a * (1 - f)// ee = (a^2 - b^2) / a^2;constdouble a = 6378245.0; constdouble ee = 0.00669342162296594323; //// World Geodetic System ==> Mars Geodetic Systempublicstaticvoid transform(double wgLat, double wgLon, outdouble mgLat, outdouble 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; } staticbool outOfChina(double lat, double lon) { if (lon < 72.004 || lon > 137.8347) returntrue; if (lat < 0.8293 || lat > 55.8271) returntrue; returnfalse; } staticdouble 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; } staticdouble 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; } } }

相關推薦

火星座標(gcj02)、國測局座標(GPS)和座標(bd0911)互轉

火星座標轉百度座標 /** * 火星轉百度 * * @param bd_lat 百度座標緯度 * @param bd_lon 百度座標經度 */ public void bd_encrypt(double gg_lat, double gg_lon) { double x =

地球座標-火星座標-座標之間轉換演算法 C#

WGS84 :World Geodetic System 1984,是為GPS 全球定位系統 使用而建立的座標系統。通過遍佈世界的 衛星觀測站 觀測到的座標建立,其初次WGS84的精度為1-2m,在1994年1月2日,通過10個觀測站在GPS測量方法上改正,得到了WGS84(G730),G表示由GPS測量得到

java版座標系轉換(火星座標、GPS座標座標)

public class Gps {public double wgLat;public double wgLon;public Gps(double wgLat, double wgLon) {setWgLat(wgLat);setWgLon(wgLon);}public double getWg

QT:座標(BD09)、國測局座標火星座標,GCJ02)、和WGS84座標系之間轉換(JS版程式碼)

/** * Created by Wandergis on 2015/7/8. * 提供了百度座標(BD09)、國測局座標(火星座標,GCJ02)、和WGS84座標系之間的轉換 */ //定義一些常量 var x_PI = 3.14159265358979324 * 3000.0 / 18

GCJ-02(火星,高德) 和BD-09() 座標轉換(PHP)

<?php //GCJ-02(火星,高德) 座標轉換成 BD-09(百度) 座標//@param gg_lon 火星經度//@param gg_lat 火星緯度 functionbd_encrypt($gg_lon,$gg_lat) { $

基於python的WGS84轉座標

from urllib.request import urlopen, quote import json def wgs84tobaidu(x,y): data=str(x)+','+str(y); output = 'json' url='http://api.map.bai

ionic2 geolocation定位,將geolocation座標轉換座標,高德地圖座標

安裝 geolocation 外掛 執行以下命令 npm install --save @ionic-native/geolocation 將geolocation外掛在app.module.ts內宣告 import { Geolocation } from '@ionic-nativ

高德座標座標的相互轉換

//百度座標轉高德(傳入經度、緯度) function bd_decrypt(bd_lng, bd_lat) {     var X_PI = Math.PI * 3000.0 / 180.0;     var x = bd_lng - 0.0065;     var y =

GPS轉座標,離線 java

首先是找到一個可以線上傳引數的api public class GpsToBaidu { public static JSONObject GpsToBaiDu(String latitude, String longitude) { //URL

座標轉84座標

function getLocation(){              x_PI = 3.14159265358979324 * 3000.0 / 180.0;              PI = 3.1415926535897932384626;             

OpenLayer載入座標偏移問題解決(方案二)

前言:上一篇文章介紹了百度座標載入在,天地圖,OSM像這類的非百度地圖的第三方地圖,本文主要講述的用載入百度地圖作為底圖這樣我們不再需要座標轉你,但是在使用WGS-84座標的時候,我們需要把他們轉到BD-9座標系上才能載入到地圖上的正確位置。上一篇文章中,我們只需要轉換百度座

座標轉WGS84(即GPS)座標

        此座標轉換用的是GPSspg的API,如果您需要轉幾個的話還是線上轉效率比較高;如果量比較大的話,轉換不超過2000次/天,可以用此方法(免費);如果量很大的話,推薦訂閱較高階的套餐。單個線上轉換:地址:http://www.gpsspg.com/maps.h

兩點座標間距離(地圖JavaScript API和web服務API)

一、介紹 本文介紹了百度API計算2點間距離及程式碼例項 百度地圖JavaScript API 百度web服務API 二、使用百度地圖JavaScript API 百度API官網地址:http://lbsyun.baidu.com/index.php?title=

微信座標轉換座標(地圖JavaScript API和web服務API)

一、介紹 本文介紹了微信座標轉換成百度座標的2種方式及程式碼例項 百度地圖JavaScript API 百度web服務API 二、注意 百度地圖JavaScript API:只可以轉換成百度座標。百度座標轉換中文地址  百度web服務API:轉換成百

座標轉換中文地址(地圖JavaScript API逆地址解析 )

使用“百度地圖JavaScript API”把微信座標轉成中文地址 百度API官網地址:http://lbsyun.baidu.com/index.php?title=jspopular 步驟1:頁面引用js <script type="text/javascript" src

PHP+地圖API+JAVASCRIPT實現GPS座標座標轉換的例項

<!--小幅的座標轉換點位程式--> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=U

根據原始座標得到座標再進行逆地址解析

let data = { lng: 113.531321, lat: 22.456451 } let pointArr = [] pointArr.push(new BMap.Point

地圖滑動後獲取螢幕的中心點座標

//地圖狀態改變相關介面 mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() { @Override

OpenLayer載入座標偏移問題解決(方案一)

思路:方案一的問題就是解決百度座標載入OSM地圖或者天地圖偏移的問題,我們通過百度api獲取的座標,用OL去載入的時候有座標偏移的問題,百度座標獲取的是BD-9經過二次加密的座標系,而OL是WGS-84要想不偏移我們應該將BD-9轉到WGS-84,在這裡我們用到了一個大牛編寫

openlayers3應用(三):座標“糾偏”

前兩篇文章介紹了openlayers3載入百度線上和離線瓦片地圖,頁面上能夠正常顯示。地圖載入後在地圖上顯示一條GPS軌跡,發現離實際位置相差太遠,如下圖所示: 軌跡形狀和實際形狀相同,但是位移太遠