首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

百度地圖座標轉換:墨卡托座標與火星座標 (GCJ-02) 互轉 Java 實作

     編輯:Java 相關知識

前言

百度地圖使用 BD-09 座標體系(在 GCJ-02 基礎上再加密)。本文提供百度墨卡托座標 (BD-09) 與火星座標 (GCJ-02) 互轉的 Java 實作,核心為非線性偏移演算法。

轉換類別


public class BaiduCoordConverter {
    private static final double X_PI = 3.14159265358979324 * 3000.0 / 180.0;

    /**
     * BD-09 -> GCJ-02 (解密)
     */
    public static double[] bd09ToGcj02(double bdLat, double bdLon) {
        double x = bdLon - 0.0065;
        double y = bdLat - 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 gcjLon = z * Math.cos(theta);
        double gcjLat = z * Math.sin(theta);
        return new double[]{gcjLat, gcjLon};
    }

    /**
     * GCJ-02 -> BD-09 (加密)
     */
    public static double[] gcj02ToBd09(double gcjLat, double gcjLon) {
        double x = gcjLon, y = gcjLat;
        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 bdLon = z * Math.cos(theta) + 0.0065;
        double bdLat = z * Math.sin(theta) + 0.006;
        return new double[]{bdLat, bdLon};
    }

    public static void main(String[] args) {
        double bdLat = 31.22997, bdLon = 121.640756;
        double[] gcj = bd09ToGcj02(bdLat, bdLon);
        System.out.printf("BD-09: %.6f, %.6f%n", bdLat, bdLon);
        System.out.printf("GCJ-02: %.6f, %.6f%n", gcj[0], gcj[1]);

        double[] bd = gcj02ToBd09(gcj[0], gcj[1]);
        System.out.printf("回轉 BD-09: %.6f, %.6f%n", bd[0], bd[1]);
    }
}

座標體系說明

  • WGS-84:GPS 原始座標(國際標準)。
  • GCJ-02 (火星座標):中國國家測繪局制定加密標準,高德、騰訊地圖使用。
  • BD-09 (百度座標):百度在 GCJ-02 基礎上再次加密。

應用場景

  • 整合多家地圖服務時需統一座標體系。
  • GPS 定位資料上傳百度地圖顯示前需 WGS-84 → GCJ-02 → BD-09 雙重轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved