小程序位置GCJ-02转换成WGS-84

首先介绍下这两个坐标系的概念:

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
  };
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值