| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 | 
							- /**
 -  * @Author: Caven
 -  * @Date: 2021-01-31 20:40:25
 -  */
 - 
 - const BD_FACTOR = (3.14159265358979324 * 3000.0) / 180.0
 - const PI = 3.1415926535897932384626
 - const RADIUS = 6378245.0
 - const EE = 0.00669342162296594323
 - 
 - class CoordTransform {
 -   /**
 -    * BD-09 To GCJ-02
 -    * @param lng
 -    * @param lat
 -    * @returns {number[]}
 -    */
 -   static BD09ToGCJ02(lng, lat) {
 -     let x = +lng - 0.0065
 -     let y = +lat - 0.006
 -     let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * BD_FACTOR)
 -     let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * BD_FACTOR)
 -     let gg_lng = z * Math.cos(theta)
 -     let gg_lat = z * Math.sin(theta)
 -     return [gg_lng, gg_lat]
 -   }
 - 
 -   /**
 -    * GCJ-02 To BD-09
 -    * @param lng
 -    * @param lat
 -    * @returns {number[]}
 -    * @constructor
 -    */
 -   static GCJ02ToBD09(lng, lat) {
 -     lat = +lat
 -     lng = +lng
 -     let z =
 -       Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * BD_FACTOR)
 -     let theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * BD_FACTOR)
 -     let bd_lng = z * Math.cos(theta) + 0.0065
 -     let bd_lat = z * Math.sin(theta) + 0.006
 -     return [bd_lng, bd_lat]
 -   }
 - 
 -   /**
 -    * WGS-84 To GCJ-02
 -    * @param lng
 -    * @param lat
 -    * @returns {number[]}
 -    */
 -   static WGS84ToGCJ02(lng, lat) {
 -     lat = +lat
 -     lng = +lng
 -     if (this.out_of_china(lng, lat)) {
 -       return [lng, lat]
 -     } else {
 -       let d = this.delta(lng, lat)
 -       return [lng + d[0], lat + d[1]]
 -     }
 -   }
 - 
 -   /**
 -    * GCJ-02 To WGS-84
 -    * @param lng
 -    * @param lat
 -    * @returns {number[]}
 -    * @constructor
 -    */
 -   static GCJ02ToWGS84(lng, lat) {
 -     lat = +lat
 -     lng = +lng
 -     if (this.out_of_china(lng, lat)) {
 -       return [lng, lat]
 -     } else {
 -       let out = [lng, lat]
 - 
 -       let gcj02_point = this.WGS84ToGCJ02(lng, lat)
 -       let dlng = gcj02_point[0] - lng
 -       let dlat = gcj02_point[1] - lat
 -       do {
 -         gcj02_point = this.WGS84ToGCJ02((out[0] -= dlng), (out[1] -= dlat))
 -         dlng = gcj02_point[0] - lng
 -         dlat = gcj02_point[1] - lat
 -       } while (Math.abs(dlng) > 1e-7 || Math.abs(dlat) > 1e-7)
 - 
 -       return out
 -     }
 -   }
 - 
 -   /**
 -    *
 -    * @param lng
 -    * @param lat
 -    * @returns {number[]}
 -    */
 -   static delta(lng, lat) {
 -     let dLng = this.transformLng(lng - 105, lat - 35)
 -     let dLat = this.transformLat(lng - 105, lat - 35)
 -     const radLat = (lat / 180) * PI
 -     let magic = Math.sin(radLat)
 -     magic = 1 - EE * magic * magic
 -     const sqrtMagic = Math.sqrt(magic)
 -     dLng = (dLng * 180) / ((RADIUS / sqrtMagic) * Math.cos(radLat) * PI)
 -     dLat = (dLat * 180) / (((RADIUS * (1 - EE)) / (magic * sqrtMagic)) * PI)
 -     return [dLng, dLat]
 -   }
 - 
 -   /**
 -    *
 -    * @param lng
 -    * @param lat
 -    * @returns {number}
 -    */
 -   static transformLng(lng, lat) {
 -     lat = +lat
 -     lng = +lng
 -     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 * 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
 -    * @param lat
 -    * @returns {number}
 -    */
 -   static transformLat(lng, lat) {
 -     lat = +lat
 -     lng = +lng
 -     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 * 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
 -   }
 - 
 -   /**
 -    *
 -    * @param lng
 -    * @param lat
 -    * @returns {boolean}
 -    */
 -   static out_of_china(lng, lat) {
 -     lat = +lat
 -     lng = +lng
 -     return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55)
 -   }
 - }
 - 
 - export default CoordTransform
 
 
  |