wechat-map-tools/miniprogram/utils/coord.js(103 行)+ geo.js(97 行)直接把 GPS 点画到微信地图上会整体偏移几百米。另外要算折线长度、多边形面积。
坐标系转换里的反向解最见功力(coord.js 第 48-65 行):
/**
* GCJ-02 -> WGS-84:反解没有闭式解,用不动点迭代。
* 偏移本身是米级小量且连续,迭代 3~5 次就收敛到厘米内。
*/
function gcj02ToWgs84(lng, lat) {
if (outOfChina(lat, lng)) return { longitude: lng, latitude: lat };
let wLng = lng, wLat = lat;
for (let i = 0; i < 8; i++) {
const g = wgs84ToGcj02(wLng, wLat); // 正向转一遍,看差多少
const dLng = g.longitude - lng;
const dLat = g.latitude - lat;
wLng -= dLng; // 反向修正
wLat -= dLat;
if (Math.abs(dLng) < 1e-10 && Math.abs(dLat) < 1e-10) break;
}
return { longitude: wLng, latitude: wLat };
}
球面距离与面积(geo.js):
function haversine(a, b) {
const lat1 = a.latitude * D2R, lat2 = b.latitude * D2R;
const dLat = lat2 - lat1, dLng = (b.longitude - a.longitude) * D2R;
const s = Math.sin(dLat/2)**2 + Math.cos(lat1)*Math.cos(lat2)*Math.sin(dLng/2)**2;
return 2 * EARTH_R * Math.asin(Math.min(1, Math.sqrt(s)));
}
面积用"以首点纬度做等距圆柱投影 + 平面鞋带公式"(geo.js 第 26-45 行)。
GCJ → WGS → GCJ 误差 < 1 厘米(有测试)toGcj02() / fromGcj02() 让调用方不用记六个函数名outOfChina() 快速判断,避免错误偏移module.exports),可整文件复制tests/test-core.js 8 + 8 项,用真实地标已知答案(天安门偏移 ≈555m、京沪 ≈1068km)geo-tools(npm):coord.js + geo.js + parse.js 一起.d.ts),前端用起来体验更好gcoord、coordtransform(npm)做同类事;你的实现胜在零依赖 + 完整测试 + 中文注释turf.js 里有更严格的球面算法(更准但更重)第 18 课(纯函数与脱离平台测试)