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