如题 请教大神 如何将百度地图的经纬度转成真实经纬度。百度API只提供其他经纬度转换成百度经纬度。
欢迎选择我的课程,让我们一起见证您的进步~~
我之前在Android上用的java版的,給你轉成swift了,跑了一下應該沒啥問題。 先用第一個函數,將百度座標轉成火星座標,再用第二個,將火星座標轉成WGS84座標,也就是真實座標了。
let PI = 3.1415926535897932384626; let A = 6378245.0; let EE = 0.00669342162296594323; //: Change BD-09 to Gcj-02 func bd09_to_gcj02(latitude lat:Double, longitude lon:Double) -> (lat:Double, lon:Double) { let x: Double = lon - 0.0065; let y: Double = lat - 0.006; let z: Double = sqrt(x * x + y * y) - 0.00002 * sin(y * PI); let theta: Double = atan2(y, x) - 0.000003 * cos(x * PI); return (z * sin(theta), z * cos(theta)); } //: Change Gcj-02 to WGS-84 func gcj02_to_wgs84(latitude lat:Double, longitude lon:Double) -> (lat:Double, lon:Double) { let wgs84_pos: (lat: Double, lon: Double) = tran(latitude: lat, longitude: lon); let gcj02_lon: Double = lon * 2 - wgs84_pos.lon; let gcj02_lat: Double = lat * 2 - wgs84_pos.lat; return (gcj02_lat, gcj02_lon); } //: Private func private func tran(latitude lat:Double, longitude lon:Double) -> (lat:Double, lon:Double) { var dLat: Double = transformLat(lon - 105.0, y: lat - 35.0); var dLon: Double = transformLon(lon - 105.0, y: lat - 35.0); let radLat: Double = lat / 180.0 * PI; var magic: Double = sin(radLat); magic = 1 - EE * magic * magic; let sqrtMagic: Double = sqrt(magic); dLat = (dLat * 180.0) / ((A * (1 - EE)) / (magic * sqrtMagic) * PI); dLon = (dLon * 180.0) / (A / sqrtMagic * cos(radLat) * PI); let mgLat: Double = lat + dLat; let mgLon: Double = lon + dLon; return (mgLat, mgLon); } private func transformLat(x: Double, y: Double) -> Double { var ret: Double = -100.0 + 2.0 * x + 3.0 * y; ret += 0.2 * y * y + 0.1 * x * y; ret += 0.2 * sqrt(abs(x)); ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0; ret += (20.0 * sin(y * PI) + 40.0 * sin(y / 3.0 * PI)) * 2.0 / 3.0; ret += (160.0 * sin(y / 12.0 * PI) + 320 * sin(y * PI / 30.0)) * 2.0 / 3.0; return ret; } private func transformLon(x: Double, y: Double) -> Double { var ret: Double = 300.0 + x + 2.0 * y; ret += 0.1 * x * x + 0.1 * x * y; ret += 0.1 * sqrt(abs(x)); ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0; ret += (20.0 * sin(x * PI) + 40.0 * sin(x / 3.0 * PI)) * 2.0 / 3.0; ret += (150.0 * sin(x / 12.0 * PI) + 300.0 * sin(x / 30.0 * PI)) * 2.0 / 3.0; return ret; }
前端時間寫了一個js版本的常用互聯網坐標轉換,正好對應你的這個問題,另外GPS坐標是WGS84坐標,http://wandergis.github.io/coordtransform/ github今天挂了,只能给你这个了,你可以使用npm下载使用,还提供了一个python版本的你可以去看看,剛剛發現你是在ios下提問的,原始碼是開源的你可以參考修改成objectivec的程式碼或swift的
github
python
百度座標似乎是火星座標再修正了一次,有百度座標轉火星座標的,也有火星座標轉地球座標的,這類你可以去github上 或百度下就有的。 話說 你都用了百度地圖了,為啥還要知道真正的地球座標。
百度地圖有介面可以轉換的,可以查一下百度地圖的API
我之前在Android上用的java版的,給你轉成swift了,跑了一下應該沒啥問題。
先用第一個函數,將百度座標轉成火星座標,再用第二個,將火星座標轉成WGS84座標,也就是真實座標了。
前端時間寫了一個js版本的常用互聯網坐標轉換,正好對應你的這個問題,另外GPS坐標是WGS84坐標,http://wandergis.github.io/coordtransform/
github
今天挂了,只能给你这个了,你可以使用npm下载使用,还提供了一个python
版本的你可以去看看,剛剛發現你是在ios下提問的,原始碼是開源的你可以參考修改成objectivec的程式碼或swift的百度座標似乎是火星座標再修正了一次,有百度座標轉火星座標的,也有火星座標轉地球座標的,這類你可以去github上 或百度下就有的。
話說 你都用了百度地圖了,為啥還要知道真正的地球座標。
百度地圖有介面可以轉換的,可以查一下百度地圖的API