首先介绍下这两个坐标系的概念:
WGS-84:是国际上通用的坐标体系,目前是全球范围内定位和测量的统一基准。
GCJ-02:是由中国国家测绘局(现为中国国家测绘地理信息局)制定的地理信息系统的坐标系统。
综上可知,GCJ-02坐标系是在WGS-84坐标系的基础上,通过加密算法对经纬度数据进行加密处理得到的。这种加密算法会加入随机的偏差,使得公开的坐标数据与真实的坐标数据之间存在一定的偏移。
我们在地图上展示物体的地点需要使用GCJ-02坐标系,但向后端传送坐标数据时,往往会要求使用WGS-84坐标系,所以我们就需要稍稍转化下,下面是两个坐标系之间相互转化的代码:
1.GCJ-02转换成WGS-84
function transformFromGCJToWGS(latitude, longitude) {
if (isLocationOutOfChina(latitude, longitude)) {
return {
latitude:latitude,
longitude: longitude
}
}
var threshold = 0.00001;
// The boundary
var minLat = latitude - 0.5;
var maxLat = latitude + 0.5;
var minLng = longitude - 0.5;
var maxLng = longitude + 0.5;
var delta = 1;
var maxIteration = 30;
while (true) {
var leftBottom = transformFromWGSToGCJ(minLat, minLng);
var rightBottom = transformFromWGSToGCJ(minLat, maxLng);
var leftUp = transformFromWGSToGCJ(maxLat, minLng);
var midPoint = transformFromWGSToGCJ((minLat + maxLat) / 2, (minLng + maxLng) / 2);
delta = Math.abs(midPoint.latitude - latitude) + Math.abs(midPoint.longitude - longitude);
if (maxIteration-- <= 0 || delta <= threshold) {
return {
latitude: (minLat + maxLat) / 2,
longitude: (minLng + maxLng) / 2
};
}
if (isContains({
latitude: latitude,
longitude: longitude
}, leftBottom, midPoint)) {
maxLat = (minLat + maxLat) / 2;
maxLng = (minLng + maxLng) / 2;
} else if (isContains({
latitude: latitude,
longitude: longitude
}, rightBottom, midPoint)) {
maxLat = (minLat + maxLat) / 2;
minLng = (minLng + maxLng) / 2;
} else if (isContains({
latitude: latitude,
longitude: longitude
}, leftUp, midPoint)) {
minLat = (minLat + maxLat) / 2;
maxLng = (minLng + maxLng) / 2;
} else {
minLat = (minLat + maxLat) / 2;
minLng = (minLng + maxLng) / 2;
}
}
}
2.WGS-84转换成GCJ-02
function transformFromWGSToGCJ(latitude, longitude) {
var lat = "";
var lon = "";
var ee = 0.00669342162296594323;//扁率
var a = 6378245.0;//长半轴
var pi = 3.14159265358979324;//Π
if (isLocationOutOfChina(latitude, longitude)) {
lat = latitude;
lon = longitude;
} else {
var adjustLat = transformLatWithXY(longitude - 105.0, latitude - 35.0);
var adjustLon = transformLonWithXY(longitude - 105.0, latitude - 35.0);
var radLat = latitude / 180.0 * pi;
var magic = Math.sin(radLat);
magic = 1 - ee * magic * magic;
var sqrtMagic = Math.sqrt(magic);
adjustLat = (adjustLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
adjustLon = (adjustLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
latitude = latitude + adjustLat;
longitude = longitude + adjustLon;
}
return {
latitude: latitude,
longitude: longitude
};
}