"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
/**
 * Created by Wandergis on 2015/7/8.
 * 提供了百度坐标（BD-09）、国测局坐标（火星坐标，GCJ-02）、和 WGS-84 坐标系之间的转换
 */
// 定义一些常量
var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
var PI = 3.1415926535897932384626;
var a = 6378245.0;
var ee = 0.00669342162296594323;
/**
 * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02) 的转换
 * 即 百度 转 谷歌、高德
 * @param bd_lng_new
 * @param bd_lat_new
 * @returns {*[]}
 */
var bd09togcj02 = function bd09togcj02(bd_lng_new, bd_lat_new) {
  var bd_lng = +bd_lng_new;
  var bd_lat = +bd_lat_new;
  var x = bd_lng - 0.0065;
  var y = bd_lat - 0.006;
  var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);
  var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);
  var gg_lng = z * Math.cos(theta);
  var gg_lat = z * Math.sin(theta);
  return [gg_lng, gg_lat];
};

/**
 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
 * 即 谷歌、高德 转 百度
 * @param lng_new
 * @param lat_new
 * @returns {*[]}
 */
var gcj02tobd09 = function gcj02tobd09(lng_new, lat_new) {
  var lat = +lat_new;
  var lng = +lng_new;
  var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
  var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
  var bd_lng = z * Math.cos(theta) + 0.0065;
  var bd_lat = z * Math.sin(theta) + 0.006;
  return [bd_lng, bd_lat];
};

/**
 * WGS-84 转 GCJ-02
 * @param lng_wgs
 * @param lat_wgs
 * @returns {*[]}
 */
var wgs84togcj02 = function wgs84togcj02(lng_wgs, lat_wgs) {
  var lat = +lat_wgs;
  var lng = +lng_wgs;
  if (out_of_china(lng, lat)) {
    return [lng, lat];
  } else {
    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];
  }
};

/**
 * GCJ-02 转换为 WGS-84
 * @param lng_gcj
 * @param lat_gcj
 * @returns {*[]}
 */
var gcj02towgs84 = function gcj02towgs84(lng_gcj, lat_gcj) {
  var lat = +lat_gcj;
  var lng = +lng_gcj;
  if (out_of_china(lng, lat)) {
    return [lng, lat];
  } else {
    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 [lng * 2 - mglng, lat * 2 - mglat];
  }
};
var transformlat = function transformlat(lngTrans, latTrans) {
  var lat = +latTrans;
  var lng = +lngTrans;
  var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
  ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
  ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
  ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
  return ret;
};
var transformlng = function transformlng(lng_new, lat_new) {
  var lat = +lat_new;
  var lng = +lng_new;
  var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
  ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
  ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
  ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
  return ret;
};

/**
 * 判断是否在国内，不在国内则不做偏移
 * @param lng_out
 * @param lat_out
 * @returns {boolean}
 */
var out_of_china = function out_of_china(lng_out, lat_out) {
  var lat = +lat_out;
  var lng = +lng_out;
  // 纬度 3.86~53.55, 经度 73.66~135.05
  return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
};

/**
 * 根据坐标计算里程
 */

var getFlatternDistance = function getFlatternDistance(_ref) {
  var lon1 = _ref.lon1,
    lat1 = _ref.lat1,
    lon2 = _ref.lon2,
    lat2 = _ref.lat2;
  var DEF_PI = 3.14159265359; // PI
  var DEF_2PI = 6.28318530712; // 2*PI
  var DEF_PI180 = 0.01745329252; // PI/180.0
  var DEF_R = 6370693.5; // radius of earth
  var ew1, ns1, ew2, ns2;
  var dx, dy, dew;
  var distance; // 角度转换为弧度
  ew1 = lon1 * DEF_PI180;
  ns1 = lat1 * DEF_PI180;
  ew2 = lon2 * DEF_PI180;
  ns2 = lat2 * DEF_PI180;
  // 经度差
  dew = ew1 - ew2; // 若跨东经和西经180 度，进行调整
  if (dew > DEF_PI) dew = DEF_2PI - dew;else if (dew < -DEF_PI) dew = DEF_2PI + dew;
  dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)
  dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)
  // 勾股定理求斜边长
  distance = Math.sqrt(dx * dx + dy * dy).toFixed(0);
  return distance;
};

/**
 * 计算里程数
 * @param history  坐标集合
 */
var calculateMileage = function calculateMileage(history) {
  var mileage = 0;
  for (var i = 0; i < history.length - 1; i++) {
    mileage += parseInt(getFlatternDistance({
      lon1: history[i].longitude,
      lat1: history[i].latitude,
      lon2: history[i + 1].longitude,
      lat2: history[i + 1].latitude
    }));
  }
  return mileage == 0 ? '--:--' : "".concat((mileage / 1000).toFixed(2), "\u516C\u91CC");
};
var _default = exports["default"] = {
  bd09togcj02: bd09togcj02,
  gcj02tobd09: gcj02tobd09,
  wgs84togcj02: wgs84togcj02,
  gcj02towgs84: gcj02towgs84,
  calculateMileage: calculateMileage
};
//# sourceMappingURL=mapTool.js.map
