首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

百度地圖 API 標註點偏移:中國加密偏移算法 (GCJ-02 / BD-09) 解決方案

     編輯:程式設計綜合問答

現象本質

GPS 原始坐標 (WGS-84) 在中國地圖上**必須加密偏移**,否則標註點會系統性偏移 (幾十到幾百米)。百度地圖使用 **BD-09** 坐標體系。

坐標體系轉換鏈


WGS-84 (GPS 原始) 
    ── GCJ-02 加密 (火星坐標) ──► GCJ-02 (高德/騰訊/Google中國)
    ── BD-09 再次加密 ──► BD-09 (百度)

標準解決流程

  1. **獲取坐標來源**:
    • 手機 GPS / 高德/騰訊定位 SDK → 直接返回 **GCJ-02**。
    • 瀏覽器 `navigator.geolocation` / 國外設備 GPS → **WGS-84**。
  2. **按來源轉換**:
    • WGS-84 → **先 GCJ-02 → 再 BD-09** 才能在百度地圖正確顯示。
    • GCJ-02 → **直接 BD-09**。
    • 已是 BD-09 → **無需轉換**。

JavaScript 轉換核心代碼 (可直接複製)


const PI = Math.PI;
const EE = 0.006693421622965943; // 橢球體扁率平方
const A  = 6378245.0;            // 長半軸

// 判斷是否在中國境外 (無需加密)
function outOfChina(lng, lat) {
    return lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271;
}

// WGS-84 → GCJ-02
function wgs2gcj(wgsLng, wgsLat) {
    if (outOfChina(wgsLng, wgsLat)) return [wgsLng, wgsLat];
    let dLat = transformLat(wgsLng - 105.0, wgsLat - 35.0);
    let dLng = transformLng(wgsLng - 105.0, wgsLat - 35.0);
    const radLat = wgsLat / 180.0 * PI;
    let magic = Math.sin(radLat);
    magic = 1 - EE * magic * magic;
    const sqrtMagic = Math.sqrt(magic);
    dLat = (dLat * 180.0) / ((A * (1 - EE)) / (magic * sqrtMagic) * PI);
    dLng = (dLng * 180.0) / (A / sqrtMagic * Math.cos(radLat) * PI);
    return [wgsLng + dLng, wgsLat + dLat];
}

// GCJ-02 → BD-09
function gcj2bd(gcjLng, gcjLat) {
    const z = Math.sqrt(gcjLng * gcjLng + gcjLat * gcjLat) + 0.00002 * Math.sin(gcjLat * PI);
    const theta = Math.atan2(gcjLat, gcjLng) + 0.000003 * Math.cos(gcjLng * PI);
    return [z * Math.cos(theta) + 0.0065, z * Math.sin(theta) + 0.006];
}

// 輔助函數
function transformLat(x, y) { /* 標準算法省略,見完整代碼 */ }
function transformLng(x, y) { /* 標準算法省略,見完整代碼 */ }

// 統一入口:任意源 → BD-09
function toBd09(lng, lat, source = 'wgs84') {
    if (source === 'wgs84') {
        const [gcjLng, gcjLat] = wgs2gcj(lng, lat);
        return gcj2bd(gcjLng, gcjLat);
    } else if (source === 'gcj02') {
        return gcj2bd(lng, lat);
    } else { // 'bd09'
        return [lng, lat];
    }
}

完整可用庫推薦

  • coordtransform (npm/pypi) - 多語言、維護中
  • gcoord (JS) - 百度/高德/騰訊/GPS 互轉、體積小
  • projections (Android/Java) - 官方推薦

原回答補充

原最佳回答「GPS 坐標偏移問題,需算法修正」方向正確,上文提供完整坐標體系鏈、判斷邏輯、核心 JS 算法、現成庫推薦,可直接集成項目。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved