UNPKG

@sparta-utils/gps-transform-utils

Version:

一个支持三参数与七参数的 GPS 坐标转换工具,适用于 WGS84 转 CGCS2000、北京54 等坐标系的正向与反向平面投影计算。

62 lines (61 loc) 2.77 kB
import proj4 from 'proj4'; /** * 自动获取中央经线(三度带) */ function getDefaultCentralMeridian(lng, zoneWidth) { if (zoneWidth === void 0) { zoneWidth = 3; } var zone = Math.floor(lng / zoneWidth) + 1; return zone * zoneWidth; } /** * 构建 proj4 投影字符串 */ function buildProjString(coordSystem, centralMeridian, towgs84) { var parts = [ '+proj=tmerc', '+lat_0=0', "+lon_0=".concat(centralMeridian), '+k=1.0', '+x_0=500000', '+y_0=0', coordSystem === 'CGCS2000' ? '+ellps=GRS80' : '+a=6378245.0', coordSystem === '北京54' ? '+b=6356863.0188' : '', "+towgs84=".concat(towgs84), '+units=m', '+no_defs' ]; return parts.filter(Boolean).join(' '); } /** * GPS → 平面(3参数) */ export function gpsToPlaneBy3Params(coordSystem, params, gps, centralMeridian) { var cm = centralMeridian !== null && centralMeridian !== void 0 ? centralMeridian : getDefaultCentralMeridian(gps.lng); var towgs84 = "".concat(params.dx, ",").concat(params.dy, ",").concat(params.dz); var projDef = buildProjString(coordSystem, cm, towgs84); var _a = proj4('EPSG:4326', projDef, [gps.lng, gps.lat]), x = _a[0], y = _a[1]; return { x: parseFloat(x.toFixed(3)), y: parseFloat(y.toFixed(3)) }; } /** * GPS → 平面(7参数) */ export function gpsToPlaneBy7Params(coordSystem, params, gps, centralMeridian) { var cm = centralMeridian !== null && centralMeridian !== void 0 ? centralMeridian : getDefaultCentralMeridian(gps.lng); var dx = params.dx, dy = params.dy, dz = params.dz, rx = params.rx, ry = params.ry, rz = params.rz, scale = params.scale; var towgs84 = "".concat(dx, ",").concat(dy, ",").concat(dz, ",").concat(rx, ",").concat(ry, ",").concat(rz, ",").concat(scale); var projDef = buildProjString(coordSystem, cm, towgs84); var _a = proj4('EPSG:4326', projDef, [gps.lng, gps.lat]), x = _a[0], y = _a[1]; return { x: parseFloat(x.toFixed(3)), y: parseFloat(y.toFixed(3)) }; } /** * 平面 → GPS 坐标(反向投影) */ export function planeToGps(coordSystem, params, xy, centralMeridian, isSevenParam) { if (isSevenParam === void 0) { isSevenParam = false; } var towgs84 = isSevenParam ? "".concat(params.dx, ",").concat(params.dy, ",").concat(params.dz, ",").concat(params.rx, ",").concat(params.ry, ",").concat(params.rz, ",").concat(params.scale) : "".concat(params.dx, ",").concat(params.dy, ",").concat(params.dz); var projDef = buildProjString(coordSystem, centralMeridian, towgs84); var _a = proj4(projDef, 'EPSG:4326', [xy.x, xy.y]), lng = _a[0], lat = _a[1]; return { lng: parseFloat(lng.toFixed(8)), lat: parseFloat(lat.toFixed(8)) }; }