Browse Source

添加国内坐标转换功能

tags/1.14.3
Caven Chen 4 years ago
parent
commit
f474a3d55c
3 changed files with 185 additions and 1 deletions
  1. 2
    1
      src/core/Loader.Base.js
  2. 176
    0
      src/core/transform/CoordTransform.js
  3. 7
    0
      src/core/transform/index.js

+ 2
- 1
src/core/Loader.Base.js View File

@@ -21,7 +21,7 @@ import WidgetType from './widget/WidgetType'
import MouseMode from './option/MouseMode'
import State from './state/State'
import Position from './position/Position'
import Transform from './transform/Transform'
import { Transform, CoordTransform } from './transform'
import Parse from './parse/Parse'

const base = {
@@ -45,6 +45,7 @@ const base = {
Position,
Transform,
T: Transform,
CoordTransform,
Parse,
P: Parse
}

+ 176
- 0
src/core/transform/CoordTransform.js View File

@@ -0,0 +1,176 @@
/**
* @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) 与 火星坐标系 (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) 与百度坐标系 (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 转 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 转换为 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 d = this.delta(lng, lat)
let mgLng = lng + d[0]
let mgLat = lat + d[1]
return [lng * 2 - mgLng, lat * 2 - mgLat]
}
}

/**
*
* @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

+ 7
- 0
src/core/transform/index.js View File

@@ -0,0 +1,7 @@
/**
* @Author: Caven
* @Date: 2021-01-31 21:38:15
*/

export { default as Transform } from './Transform'
export { default as CoordTransform } from './CoordTransform'

Loading…
Cancel
Save