1 百度官方對百度坐標為何有偏移的解釋
國際經緯度坐標標准為WGS-84,國內必須至少使用國測局制定的GCJ-02,對地理位置進行首次加密。百度坐標在此基礎上,進行了BD-09二次加密措施,更加保護了個人隱私。百度對外接口的坐標系並不是GPS采集的真實經緯度,需要通過坐標轉換接口進行轉換。
2 火星坐標系 (GCJ-02) 與百度坐標系 (BD-09) 的轉換算法
GCJ-02(火星坐標) 和 BD-09 (百度坐標)
算法代碼如下,其中 bd_encrypt 將 GCJ-02 坐標轉換成 BD-09 坐標, bd_decrypt 反之。
3.備注:
參考如下,但是博主的代碼有些許地方不規范,有點點小問題。附上改正后的代碼
參考:https://blog.csdn.net/w605283073/article/details/64906518
/** * <p> * 百度地圖坐標和火星坐標轉換 * 高德坐標系統:https://lbs.amap.com/console/show/picker; * 百度坐標系統:http://api.map.baidu.com/lbsapi/getpoint/index.html * </p> * * @author luohq * @date 2018/11/27 */ public class CoodinateCovertor { private static double xPi = 3.14159265358979324 * 3000.0 / 180.0; private CoodinateCovertor() { } /** * 將火星坐標轉變成百度坐標 * * @param marsCoordinate 火星坐標(高德、騰訊地圖坐標等) * @return 百度坐標 */ public static Coordinate marsToBaidu(Coordinate marsCoordinate) { double x = marsCoordinate.getLongitude(); double y = marsCoordinate.getLatitude(); double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * xPi); double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * xPi); return new Coordinate(dataDigit(6, z * Math.cos(theta) + 0.0065), dataDigit(6, z * Math.sin(theta) + 0.006)); } /** * 將百度坐標轉變成火星坐標 * * @param baiduCoordinate 百度坐標(百度地圖坐標) * @return 火星坐標(高德、騰訊地圖等) */ public static Coordinate baiduToMars(Coordinate baiduCoordinate) { double x = baiduCoordinate.getLongitude() - 0.0065; double y = baiduCoordinate.getLatitude() - 0.006; double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * xPi); double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * xPi); return new Coordinate(dataDigit(6, z * Math.cos(theta)), dataDigit(6, z * Math.sin(theta))); } /** * 對double類型數據保留小數點后多少位 * * @param digit 位數 * @param input 輸入 * @return 保留小數位后的數 */ public static double dataDigit(int digit, double input) { return BigDecimal.valueOf(input).setScale(digit, BigDecimal.ROUND_HALF_UP).doubleValue(); } ------------------------- @Data @NoArgsConstructor @AllArgsConstructor public class Coordinate { /** * 經度 */ private double longitude; /** * 緯度 */ private double latitude; } ------------------------- public class CoodinateCovertorTest {
@Test
public void marsToBaidu() {
// eg:高德地圖的"黃渠公園"ip(116.56846,39.927558)
Coordinate lngLat_bd = new Coordinate(116.56846, 39.927558);
System.out.println("火星坐標轉百度坐標:" + CoodinateCovertor.marsToBaidu(lngLat_bd));
}
}