在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大牛。源码可以点击这里进行下载。