Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

切换底图,坐标偏差 #43

Open
park-zhang opened this issue Mar 6, 2021 · 1 comment
Open

切换底图,坐标偏差 #43

park-zhang opened this issue Mar 6, 2021 · 1 comment

Comments

@park-zhang
Copy link

使用了天地图和高德地图,切换后地图覆盖物位置有偏移,请问这个要怎么处理?

@ahu
Copy link

ahu commented Jan 9, 2025

天地图和高德使用的坐标系不一样,需要根据你定位设备的坐标系,转换一下坐标数据为天地图或高德的坐标。

假如你使用的是 chrome 浏览器获取坐标,它给出的数据通常是 WGS-84 坐标系。

天地图是这个坐标系:CGCS2000 坐标系,它与 WGS-84 坐标系差异很小。所以你对精度要求不高的情况下,可以直接用。也即你加载天地图底图时,坐标基本上是准的。

高德地图是 GCJ-02 坐标系,与 WGS-84 坐标系差异较大。所以使用时应该先将 chrome 给出的坐标转换一下。示例代码如下:

// WGS-84 转 GCJ-02
function wgs84ToGcj02(lng, lat) {
    var a = 6378245.0; // 地球半径
    var ee = 0.00669342162296594323; // 偏心率平方
    var pi = Math.PI;

    if (lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271) {
        return [lng, lat]; // 中国以外的坐标直接返回
    }

    var dLat = transformLat(lng - 105.0, lat - 35.0);
    var dLng = transformLng(lng - 105.0, lat - 35.0);
    var radLat = lat / 180.0 * pi;
    var magic = Math.sin(radLat);
    magic = 1 - ee * magic * magic;
    var sqrtMagic = Math.sqrt(magic);
    dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
    dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
    var mgLat = lat + dLat;
    var mgLng = lng + dLng;

    return [mgLng, mgLat];
}

function transformLat(x, y) {
    var pi = Math.PI;
    var 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;
}

function transformLng(x, y) {
    var pi = Math.PI;
    var 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;
}

// 示例:将 WGS-84 坐标转换为 GCJ-02
var wgsCoords = [116.404, 39.915]; // WGS-84 坐标
var gcjCoords = wgs84ToGcj02(wgsCoords[0], wgsCoords[1]);

console.log("GCJ-02 坐标:", gcjCoords);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants