export default {
  x_pi: Math.PI * 3000.0 / 180.0,
  a: 6378245.0,
  ee: 0.00669342162296594323,
  /**
     * 百度坐标系(BD-09)与火星坐标系(GCJ-02)的转换
     * 即百度转谷歌,高德
     * @param bd_lon
     * @param bd_lat
     * @returns {*[]}
     */
  bd09togcj02 (bd_lon, bd_lat) {
    const x = bd_lon - 0.0065
    const y = bd_lat - 0.006
    const z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi)
    const theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi)
    const gg_lng = z * Math.cos(theta)
    const gg_lat = z * Math.sin(theta)
    return [gg_lng, gg_lat]
  },
  /**
     * 火星坐标系(GCJ-02)与百度坐标系(BD-09)的转换
     * 即谷歌,高德转百度
     * @param lng
     * @param lat
     * @returns {*[]}
     */
  gcj02tobd09 (lng, lat) {
    const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * this.x_pi)
    const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * this.x_pi)
    const bd_lng = z * Math.cos(theta) + 0.0065
    const bd_lat = z * Math.sin(theta) + 0.006
    return [bd_lng, bd_lat]
  },
  /**
     * WGS84转GCj02
     * @param lng
     * @param lat
     * @returns {*[]}
     */
  wgs84togcj02 (lng, lat) {
    if (this.out_of_china(lng, lat)) {
      return [lng, lat]
    } else {
      let dlat = this.transformlat(lng - 105.0, lat - 35.0)
      let dlng = this.transformlng(lng - 105.0, lat - 35.0)
      const radlat = lat / 180.0 * Math.PI
      let magic = Math.sin(radlat)
      magic = 1 - this.ee * magic * magic
      const sqrtmagic = Math.sqrt(magic)
      dlat = (dlat * 180.0) / ((this.a * (1 - this.ee)) / (magic * sqrtmagic) * Math.PI)
      dlng = (dlng * 180.0) / (this.a / sqrtmagic * Math.cos(radlat) * Math.PI)
      const mglat = lat + dlat
      const mglng = lng + dlng
      return [mglng, mglat]
    }
  },
  /**
     * GCJ02转换为WGS84
     * @param lng
     * @param lat
     * @returns {*[]}
     */
  gcj02towgs84 (lng, lat) {
    if (this.out_of_china(lng, lat)) {
      return [lng, lat]
    } else {
      let dlat = this.transformlat(lng - 105.0, lat - 35.0)
      let dlng = this.transformlng(lng - 105.0, lat - 35.0)
      const radlat = lat / 180.0 * Math.PI
      let magic = Math.sin(radlat)
      magic = 1 - this.ee * magic * magic
      const sqrtmagic = Math.sqrt(magic)
      dlat = (dlat * 180.0) / ((this.a * (1 - this.ee)) / (magic * sqrtmagic) * Math.PI)
      dlng = (dlng * 180.0) / (this.a / sqrtmagic * Math.cos(radlat) * Math.PI)
      const mglat = lat + dlat
      const mglng = lng + dlng
      return [lng * 2 - mglng, lat * 2 - mglat]
    }
  },
  /**
     * 百度坐标系转wgs84坐标系
     * @param {*} lng
     * @param {*} lat
     * @returns
     */
  bd09towgs84 (lng, lat) {
    // 百度坐标系先转为火星坐标系
    const gcj02 = this.bd09togcj02(lng, lat)
    // 火星坐标系转wgs84坐标系
    const result = this.gcj02towgs84(gcj02[0], gcj02[1])
    return result
  },
  /**
     * wgs84坐标系转百度坐标系
     * @param {*} lng
     * @param {*} lat
     * @returns
     */
  wgs84tobd09 (lng, lat) {
    // wgs84先转为火星坐标系
    const gcj02 = this.wgs84togcj02(lng, lat)
    // 火星坐标系转百度坐标系
    const result = this.gcj02tobd09(gcj02[0], gcj02[1])
    return result
  },
  transformlat (lng, lat) {
    let 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 * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0 / 3.0
    ret += (20.0 * Math.sin(lat * Math.PI) + 40.0 * Math.sin(lat / 3.0 * Math.PI)) * 2.0 / 3.0
    ret += (160.0 * Math.sin(lat / 12.0 * Math.PI) + 320 * Math.sin(lat * Math.PI / 30.0)) * 2.0 / 3.0
    return ret
  },
  transformlng (lng, lat) {
    let 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 * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0 / 3.0
    ret += (20.0 * Math.sin(lng * Math.PI) + 40.0 * Math.sin(lng / 3.0 * Math.PI)) * 2.0 / 3.0
    ret += (150.0 * Math.sin(lng / 12.0 * Math.PI) + 300.0 * Math.sin(lng / 30.0 * Math.PI)) * 2.0 / 3.0
    return ret
  },
  /**
     * 判断是否在国内,不在国内则不做偏移
     * @param lng
     * @param lat
     * @returns {boolean}
     */
  out_of_china (lng, lat) {
    return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false)
  },
  /**
     * 经纬度转墨卡托
     * @param poi 经纬度
     * @returns {{}}
     * @private
     */
  LngLatToMercator (lng, lat) {
    const mercator = {}
    const earthRad = 6378137.0
    mercator.x = lng * Math.PI / 180 * earthRad
    const a = lat * Math.PI / 180
    mercator.y = earthRad / 2 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)))

    return [mercator.x, mercator.y]
  },

  /**
     * 墨卡托转经纬度
     * @param poi 墨卡托
     * @returns {{}}
     * @private
     */
  MercatorToLngLat (x, y) {
    const lnglat = {}
    lnglat.lng = x / 20037508.34 * 180
    const mmy = y / 20037508.34 * 180
    lnglat.lat = 180 / Math.PI * (2 * Math.atan(Math.exp(mmy * Math.PI / 180)) - Math.PI / 2)
    // console.log(lnglat, '经纬度')
    return [lnglat.lng, lnglat.lat]
  }

}
