摘要:高德和在國(guó)內(nèi)都是使用坐標(biāo)系或在此基礎(chǔ)上面加密為直接的坐標(biāo)系,可以說(shuō),是國(guó)內(nèi)最廣泛使用的坐標(biāo)系百度坐標(biāo)系,百度坐標(biāo)系是在坐標(biāo)系的基礎(chǔ)上再次加密偏移后形成的坐標(biāo)系,只適用于百度地圖。
概述
一:在進(jìn)行地圖開發(fā)過程中,我們一般能接觸到以下三種類型的地圖坐標(biāo)系:
1.WGS-84原始坐標(biāo)系,一般用國(guó)際GPS紀(jì)錄儀記錄下來(lái)的經(jīng)緯度,通過GPS定位拿到的原始經(jīng)緯度,Google和高德地圖定位的的經(jīng)緯度(國(guó)外)都是基于WGS-84坐標(biāo)系的;但是在國(guó)內(nèi)是不允許直接用WGS84坐標(biāo)系標(biāo)注的,必須經(jīng)過加密后才能使用;
2.GCJ-02坐標(biāo)系,又名“火星坐標(biāo)系”,是我國(guó)國(guó)測(cè)局獨(dú)創(chuàng)的坐標(biāo)體系,由WGS-84加密而成,在國(guó)內(nèi),必須至少使用GCJ-02坐標(biāo)系,或者使用在GCJ-02加密后再進(jìn)行加密的坐標(biāo)系,如百度坐標(biāo)系。高德和Google在國(guó)內(nèi)都是使用GCJ-02坐標(biāo)系或在此基礎(chǔ)上面加密為直接的坐標(biāo)系,可以說(shuō),GCJ-02是國(guó)內(nèi)最廣泛使用的坐標(biāo)系;
3.百度坐標(biāo)系:bd-09,百度坐標(biāo)系是在GCJ-02坐標(biāo)系的基礎(chǔ)上再次加密偏移后形成的坐標(biāo)系,只適用于百度地圖。(目前百度API提供了從其它坐標(biāo)系轉(zhuǎn)換為百度坐標(biāo)系的API,但卻沒有從百度坐標(biāo)系轉(zhuǎn)為其他坐標(biāo)系的API)
二:為什么會(huì)發(fā)生偏移?
1.由于坐標(biāo)系之間不兼容,如在百度地圖上定位的經(jīng)緯度拿到高德地圖上直接描點(diǎn)就肯定會(huì)發(fā)生偏移;只考慮國(guó)內(nèi)的情況,高德地圖和Google地圖是可以不經(jīng)過轉(zhuǎn)換也能夠準(zhǔn)確顯示的(在國(guó)內(nèi)用的都是GCJ-02坐標(biāo)系);下面是收錄了網(wǎng)上的WGS-84,GCJ-02,百度坐標(biāo)系(bd-09)之間的相互轉(zhuǎn)換的方法,經(jīng)測(cè)試,是轉(zhuǎn)換后相對(duì)準(zhǔn)確可用的:
測(cè)試工具類:
package com.topinfo.gps; /** * 火星坐標(biāo)系 (GCJ-02) 與百度坐標(biāo)系 (BD-09) 的互轉(zhuǎn) * */ public class GPSUtil { public static double pi = 3.1415926535897932384626; public static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; public static double a = 6378245.0; public static double ee = 0.00669342162296594323; public 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; } public 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; } public static double[] transform(double lat,double lon){ if (outOfChina (lat, lon)) { return new double[] { lat, lon }; } double dLat = transformLat (lon - 105.0, lat - 35.0); double dLon = transformLon (lon - 105.0, lat - 35.0); double radLat = lat / 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); double mgLat = lat + dLat; double mgLon = lon + dLon; return new double[] { mgLat, mgLon }; } public static boolean 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; } /** * 84 to 火星坐標(biāo)系 (GCJ-02) World Geodetic System ==> Mars Geodetic System * * @param lat * @param lon * @return */ public static double[] gps84_To_Gcj02(double lat,double lon){ if (outOfChina (lat, lon)) { return new double[] { lat, lon }; } double dLat = transformLat (lon - 105.0, lat - 35.0); double dLon = transformLon (lon - 105.0, lat - 35.0); double radLat = lat / 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); double mgLat = lat + dLat; double mgLon = lon + dLon; return new double[] { mgLat, mgLon }; } /** * * 火星坐標(biāo)系 (GCJ-02) to 84 * * @param lon * @param lat * @return * */ public static double[] gcj02_To_Gps84(double lat,double lon){ double[] gps = transform (lat, lon); double lontitude = lon * 2 - gps[1]; double latitude = lat * 2 - gps[0]; return new double[] { latitude, lontitude }; } /** * 火星坐標(biāo)系 (GCJ-02) 與百度坐標(biāo)系 (BD-09) 的轉(zhuǎn)換算法 將 GCJ-02 坐標(biāo)轉(zhuǎn)換成 BD-09 坐標(biāo) * * @param lat * @param lon */ public static double[] gcj02_To_Bd09(double lat,double lon){ double x = lon, y = lat; double z = Math.sqrt (x * x + y * y) + 0.00002 * Math.sin (y * x_pi); double theta = Math.atan2 (y, x) + 0.000003 * Math.cos (x * x_pi); double tempLon = z * Math.cos (theta) + 0.0065; double tempLat = z * Math.sin (theta) + 0.006; double[] gps = { tempLat, tempLon }; return gps; } /** * * 火星坐標(biāo)系 (GCJ-02) 與百度坐標(biāo)系 (BD-09) 的轉(zhuǎn)換算法 * * 將 BD-09 坐標(biāo)轉(zhuǎn)換成GCJ-02 坐標(biāo) * * @param * bd_lat * @param bd_lon * @return */ public static double[] bd09_To_Gcj02(double lat,double lon){ double x = lon - 0.0065, y = lat - 0.006; double z = Math.sqrt (x * x + y * y) - 0.00002 * Math.sin (y * x_pi); double theta = Math.atan2 (y, x) - 0.000003 * Math.cos (x * x_pi); double tempLon = z * Math.cos (theta); double tempLat = z * Math.sin (theta); double[] gps = { tempLat, tempLon }; return gps; } /**將gps84轉(zhuǎn)為bd09 * @param lat * @param lon * @return */ public static double[] gps84_To_bd09(double lat,double lon){ double[] gcj02 = gps84_To_Gcj02 (lat, lon); double[] bd09 = gcj02_To_Bd09 (gcj02[0], gcj02[1]); return bd09; } public static double[] bd09_To_gps84(double lat,double lon){ double[] gcj02 = bd09_To_Gcj02 (lat, lon); double[] gps84 = gcj02_To_Gps84 (gcj02[0], gcj02[1]); // 保留小數(shù)點(diǎn)后六位 gps84[0] = retain6 (gps84[0]); gps84[1] = retain6 (gps84[1]); return gps84; } /**保留小數(shù)點(diǎn)后六位 * @param num * @return */ private static double retain6(double num){ String result = String.format ("%.6f", num); return Double.valueOf (result); } }
測(cè)試類:
package com.topinfo.gps; public class Test2 { /** //GPS坐標(biāo) 116.32715863448607 39.990912172420714 //百度 116.33993794567915 39.99790821949972 */ public static void main(String[] args){ double[] gps = GPSUtil.gps84_To_bd09 (39.990912172420714, 116.32715863448607); System.out.println (gps[0]); System.out.println (gps[1]); } }
輸出:
39.997903976430734
116.33993249456921
經(jīng)過比對(duì):
39.997903976430734
39.99790821949972
116.33993249456921
116.33993794567915
然后在百度官網(wǎng)API測(cè)試;也幾乎是重疊的,如果:
工具類我是在 https://blog.csdn.net/a135703... 找到的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/74369.html
摘要:實(shí)際中我們可能會(huì)用到不同的地圖,那么就對(duì)應(yīng)到不同坐標(biāo)系的轉(zhuǎn)換,比如說(shuō),你有一份的數(shù)據(jù)服務(wù),你要展現(xiàn)在百度或者高德地圖上,這時(shí)候你就需要轉(zhuǎn)換了。 地圖坐標(biāo)轉(zhuǎn)換 LBS,基于位置的服務(wù)(Location Based Service),近年來(lái)已經(jīng)無(wú)處不在,尤其是我們前端,相信或多或少都有接觸一些地圖API服務(wù),比如高德、百度啊、谷歌啊~但是用的時(shí)候可能看到下面這些字眼:比如BD09、火星坐標(biāo)...
摘要:做過地圖相關(guān)開發(fā)的同學(xué)肯定會(huì)遇到這樣一個(gè)問題同樣的經(jīng)緯度坐標(biāo),在百度地圖和高德地圖上位置不一樣。解決方案百度地圖以及高德地圖都提供了一些方法來(lái)轉(zhuǎn)換不同坐標(biāo)系下的坐標(biāo),但是它們都需要進(jìn)行網(wǎng)絡(luò)請(qǐng)求,性能很差。 做過地圖相關(guān)開發(fā)的同學(xué)肯定會(huì)遇到這樣一個(gè)問題:同樣的經(jīng)緯度坐標(biāo),在百度地圖和高德地圖上位置不一樣。showImg(https://segmentfault.com/img/remot...
眾所周知,Python的一個(gè)使用場(chǎng)景還是比較多的,在工作當(dāng)中,也會(huì)涉及到多方面的一些事情。那么,今天小編寫這篇文章的一個(gè)主要目的,給大家來(lái)介紹關(guān)于如何用Python完成百度與搞得地圖轉(zhuǎn)換,下面就給大家詳細(xì)介紹下。 一、地理編碼與逆編碼 地理編碼與逆編碼表示的是地名地址與地理坐標(biāo)(經(jīng)緯度)互相轉(zhuǎn)換的過程。其中,將地址信息映射為地理坐標(biāo)的過程稱之為地理編碼;將地理坐標(biāo)轉(zhuǎn)換為地址信息的過程稱之為...
摘要:轉(zhuǎn)換的結(jié)果和百度提供的接口精確到小數(shù)點(diǎn)后位請(qǐng)放心使用衛(wèi)星橢球坐標(biāo)投影到平面地圖坐標(biāo)系的投影因子。 WGS-84:是國(guó)際標(biāo)準(zhǔn),GPS坐標(biāo)(Google Earth使用、或者GPS模塊) GCJ-02:中國(guó)坐標(biāo)偏移標(biāo)準(zhǔn),Google Map、高德、騰訊使用 BD-09:百度坐標(biāo)偏移標(biāo)準(zhǔn),Baidu Map使用 WGS-84 to GCJ-02 GPS.gcj_encrypt(); GC...
摘要:轉(zhuǎn)換的結(jié)果和百度提供的接口精確到小數(shù)點(diǎn)后位請(qǐng)放心使用衛(wèi)星橢球坐標(biāo)投影到平面地圖坐標(biāo)系的投影因子。 WGS-84:是國(guó)際標(biāo)準(zhǔn),GPS坐標(biāo)(Google Earth使用、或者GPS模塊) GCJ-02:中國(guó)坐標(biāo)偏移標(biāo)準(zhǔn),Google Map、高德、騰訊使用 BD-09:百度坐標(biāo)偏移標(biāo)準(zhǔn),Baidu Map使用 WGS-84 to GCJ-02 GPS.gcj_encrypt(); GC...
閱讀 3969·2021-11-23 10:09
閱讀 1338·2021-11-23 09:51
閱讀 2939·2021-11-23 09:51
閱讀 1585·2021-09-07 09:59
閱讀 2354·2019-08-30 15:55
閱讀 2292·2019-08-30 15:55
閱讀 2949·2019-08-30 15:52
閱讀 2560·2019-08-26 17:04