@sparta-utils/gps-transform-utils
Version:
一个支持三参数与七参数的 GPS 坐标转换工具,适用于 WGS84 转 CGCS2000、北京54 等坐标系的正向与反向平面投影计算。
62 lines (61 loc) • 2.77 kB
JavaScript
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)) };
}