@sparta-utils/gps-transform-utils
Version:
一个支持三参数与七参数的 GPS 坐标转换工具,适用于 WGS84 转 CGCS2000、北京54 等坐标系的正向与反向平面投影计算。
110 lines (100 loc) • 2.96 kB
text/typescript
import proj4 from 'proj4'
export interface GPS {
lng: number
lat: number
}
export interface PlaneXY {
x: number
y: number
}
export interface ThreeParams {
dx: number
dy: number
dz: number
}
export interface SevenParams extends ThreeParams {
rx: number // 秒
ry: number
rz: number
scale: number // ppm
}
/**
* 自动获取中央经线(三度带)
*/
function getDefaultCentralMeridian(lng: number, zoneWidth = 3): number {
const zone = Math.floor(lng / zoneWidth) + 1
return zone * zoneWidth
}
/**
* 构建 proj4 投影字符串
*/
function buildProjString(
coordSystem: 'CGCS2000' | '北京54',
centralMeridian: number,
towgs84: string
): string {
const parts = [
'+proj=tmerc',
'+lat_0=0',
`+lon_0=${centralMeridian}`,
'+k=1.0',
'+x_0=500000',
'+y_0=0',
coordSystem === 'CGCS2000' ? '+ellps=GRS80' : '+a=6378245.0',
coordSystem === '北京54' ? '+b=6356863.0188' : '',
`+towgs84=${towgs84}`,
'+units=m',
'+no_defs'
]
return parts.filter(Boolean).join(' ')
}
/**
* GPS → 平面(3参数)
*/
export function gpsToPlaneBy3Params(
coordSystem: 'CGCS2000' | '北京54',
params: ThreeParams,
gps: GPS,
centralMeridian?: number
): PlaneXY {
const cm = centralMeridian ?? getDefaultCentralMeridian(gps.lng)
const towgs84 = `${params.dx},${params.dy},${params.dz}`
const projDef = buildProjString(coordSystem, cm, towgs84)
const [x, y] = proj4('EPSG:4326', projDef, [gps.lng, gps.lat])
return { x: parseFloat(x.toFixed(3)), y: parseFloat(y.toFixed(3)) }
}
/**
* GPS → 平面(7参数)
*/
export function gpsToPlaneBy7Params(
coordSystem: 'CGCS2000' | '北京54',
params: SevenParams,
gps: GPS,
centralMeridian?: number
): PlaneXY {
const cm = centralMeridian ?? getDefaultCentralMeridian(gps.lng)
const { dx, dy, dz, rx, ry, rz, scale } = params
const towgs84 = `${dx},${dy},${dz},${rx},${ry},${rz},${scale}`
const projDef = buildProjString(coordSystem, cm, towgs84)
const [x, y] = proj4('EPSG:4326', projDef, [gps.lng, gps.lat])
return { x: parseFloat(x.toFixed(3)), y: parseFloat(y.toFixed(3)) }
}
/**
* 平面 → GPS 坐标(反向投影)
*/
export function planeToGps(
coordSystem: 'CGCS2000' | '北京54',
params: ThreeParams | SevenParams,
xy: PlaneXY,
centralMeridian: number,
isSevenParam = false
): GPS {
const towgs84 = isSevenParam
? `${params.dx},${params.dy},${params.dz},${(params as SevenParams).rx},${
(params as SevenParams).ry
},${(params as SevenParams).rz},${(params as SevenParams).scale}`
: `${params.dx},${params.dy},${params.dz}`
const projDef = buildProjString(coordSystem, centralMeridian, towgs84)
const [lng, lat] = proj4(projDef, 'EPSG:4326', [xy.x, xy.y])
return { lng: parseFloat(lng.toFixed(8)), lat: parseFloat(lat.toFixed(8)) }
}