百度坐標和火星坐標的轉換


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));
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM