高德地图在Geoserver图层上定位出现偏移的解决办法

在worldwind球上添加Geoserver影像,然后使用高德定位SDK,获取的定位点的经纬度与实际的定位地点有偏差。通常误差范围在500米以内。但是这不符合精准定位的要求,如何解决这个问题以及如何导致定位偏差的原因是什么,就是这次着重研究的问题。

首先高德地图使用的坐标系是GCJ-02坐标系。GCJ-02是国家测绘局制定的地理信息系统的坐标系统。他是一种对经纬度数据的加密算法,即加入随机的偏差。而通过Geoserver发布的影响图层数据一般是WGS-84坐标。WGS-84是一种国际上采用的地心坐标系。这两种坐标系是不兼容的。因此,通过GCJ-02获取的数据显示在WGS-84上就会出现误差。

明白了定位出现误差的原因,定位偏移的问题也就好解决了。只需要通过公式将GCJ-02坐标数据转换成WGS-84坐标数据就可以了。
GCJ-02转换WGS-84的核心代码如下。

    //GCJ02=>WGS84   火星坐标系=>地球坐标系(精确)
    public static double[] gcj2WGSExactly(double gcjLat, double gcjLon) {
        double initDelta = 0.01;
        double threshold = 0.000000001;
        double dLat = initDelta, dLon = initDelta;
        double mLat = gcjLat - dLat, mLon = gcjLon - dLon;
        double pLat = gcjLat + dLat, pLon = gcjLon + dLon;
        double wgsLat, wgsLon, i = 0;
        while (true) {
            wgsLat = (mLat + pLat) / 2;
            wgsLon = (mLon + pLon) / 2;
            double[] tmp = wgs2GCJ(wgsLat, wgsLon);
            dLat = tmp[0] - gcjLat;
            dLon = tmp[1] - gcjLon;
            if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold))
                break;

            if (dLat > 0) pLat = wgsLat;
            else mLat = wgsLat;
            if (dLon > 0) pLon = wgsLon;
            else mLon = wgsLon;

            if (++i > 10000) break;
        }
        double[] latlon = new double[2];
        latlon[0] = wgsLat;
        latlon[1] = wgsLon;
        return latlon;
    }

在获取到经纬度后,只需要调用该方法就可以完美解决定位偏移问题。在此感谢CaiHB大牛。源码可以点击这里进行下载。

你可能感兴趣的:(学习教程)