火星坐标和WGS84坐标转换
class GCJ02_WGS84 {
static x_pi = 3.14159265358979324 * 3000.0 / 180.0
static pi = 3.1415926535897932384626 //π
static a = 6378245.0 // 长半轴
static ee = 0.00669342162296594323 // 扁率
static wgs84togcj02(lng: number, lat: number) {
let dlat = this.transformlat(lng - 105.0, lat - 35.0)
let dlng = this.transformlng(lng - 105.0, lat - 35.0)
let radlat = lat / 180.0 * this.pi
let magic = Math.sin(radlat)
magic = 1 - this.ee * magic * magic
let sqrtmagic = Math.sqrt(magic)
dlat = (dlat * 180.0) / ((this.a * (1 - this.ee)) / (magic * sqrtmagic) * this.pi)
dlng = (dlng * 180.0) / (this.a / sqrtmagic * Math.cos(radlat) * this.pi)
let mglat = lat + dlat
let mglng = lng + dlng
return [mglng, mglat]
}
static gcj02towgs84(lng: number, lat: number) {
// GCJ02(火星坐标系) 转GPS84: param lng: 火星坐标系的经度: param lat: 火星坐标系纬度: return :
let dlat = this.transformlat(lng - 105.0, lat - 35.0)
let dlng = this.transformlng(lng - 105.0, lat - 35.0)
let radlat = lat / 180.0 * this.pi
let magic = Math.sin(radlat)
magic = 1 - this.ee * magic * magic
let sqrtmagic = Math.sqrt(magic)
dlat = (dlat * 180.0) / ((this.a * (1 - this.ee)) / (magic * sqrtmagic) * this.pi)
dlng = (dlng * 180.0) / (this.a / sqrtmagic * Math.cos(radlat) * this.pi)
let mglat = lat + dlat
let mglng = lng + dlng
return [lng * 2 - mglng, lat * 2 - mglat]
}
static transformlat(lng: number, lat: number) {
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 * this.pi) + 20.0 * Math.sin(2.0 * lng * this.pi)) * 2.0 / 3.0
ret += (20.0 * Math.sin(lat * this.pi) + 40.0 * Math.sin(lat / 3.0 * this.pi)) * 2.0 / 3.0
ret += (160.0 * Math.sin(lat / 12.0 * this.pi) + 320 * Math.sin(lat * this.pi / 30.0)) * 2.0 / 3.0
return ret
}
static transformlng(lng: number, lat: number) {
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 * this.pi) + 20.0 *
Math.sin(2.0 * lng * this.pi)) * 2.0 / 3.0
ret += (20.0 * Math.sin(lng * this.pi) + 40.0 *
Math.sin(lng / 3.0 * this.pi)) * 2.0 / 3.0
ret += (150.0 * Math.sin(lng / 12.0 * this.pi) + 300.0 *
Math.sin(lng / 30.0 * this.pi)) * 2.0 / 3.0
return ret
}
}
export default GCJ02_WGS84
地理坐标系和投影坐标系转换
import proj4 from 'proj4'
type EPSG = 4527 | 4490
const defs = new Map()
defs.set(4490, "+proj=longlat +ellps=GRS80 +no_defs")
defs.set(4527, "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=GRS80 +units=m +no_defs")
/**
* 坐标转换
* @param longitudeOrX 经度或x
* @param latitudeOrY 纬度或y
* @param soureEPSG 原坐标系
* @param destnEPSG 目标坐标系
* @returns 转换后的坐标数值
*/
export const coordinateTransformation = (longitudeOrX: number, latitudeOrY: number, soureEPSG: EPSG, destnEPSG: EPSG): { x: number, y: number } => {
proj4.defs(`EPSG:${soureEPSG}`, `${defs.get(soureEPSG)}`)
proj4.defs(`EPSG:${destnEPSG}`, `${defs.get(destnEPSG)}`)
return proj4.transform(proj4.Proj(`EPSG:${soureEPSG}`), proj4.Proj(`EPSG:${destnEPSG}`), [longitudeOrX, latitudeOrY])
}
实现地理坐标系间相互转换,地理坐标系和投影坐标系相互转换,投影坐标系间相互转换(此示例只有4490和4527的定义信息)