@huaiyinhcy/trans-coord
Version:
支持墨卡托(Mercator)、WGS84、高德(GCJ02)、百度(BD09)之间的坐标转换,无需调用外部接口,可在本地直接执行。
68 lines (67 loc) • 2.4 kB
JavaScript
import { toMercator as g, toWgs84 as q, point as m } from "@turf/turf";
const r = Math.PI, d = 6378245, u = 0.006693421622965943, c = r * 3e3 / 180;
function W([t, o]) {
return t < 72.004 || t > 137.8347 ? !0 : o < 0.8293 || o > 55.8271;
}
function G([t, o]) {
let s = L(t - 105, o - 35), n = B(t - 105, o - 35);
const a = o / 180 * r;
let e = Math.sin(a);
e = 1 - u * e * e;
const i = Math.sqrt(e);
return s = s * 180 / (d * (1 - u) / (e * i) * r), n = n * 180 / (d / i * Math.cos(a) * r), [n, s];
}
function L(t, o) {
let s = -100 + 2 * t + 3 * o + 0.2 * o * o + 0.1 * t * o + 0.2 * Math.sqrt(Math.abs(t));
return s += (20 * Math.sin(6 * t * r) + 20 * Math.sin(2 * t * r)) * 2 / 3, s += (20 * Math.sin(o * r) + 40 * Math.sin(o / 3 * r)) * 2 / 3, s += (160 * Math.sin(o / 12 * r) + 320 * Math.sin(o * r / 30)) * 2 / 3, s;
}
function B(t, o) {
let s = 300 + t + 2 * o + 0.1 * t * t + 0.1 * t * o + 0.1 * Math.sqrt(Math.abs(t));
return s += (20 * Math.sin(6 * t * r) + 20 * Math.sin(2 * t * r)) * 2 / 3, s += (20 * Math.sin(t * r) + 40 * Math.sin(t / 3 * r)) * 2 / 3, s += (150 * Math.sin(t / 12 * r) + 300 * Math.sin(t / 30 * r)) * 2 / 3, s;
}
const f = {
toWgs84: (t) => {
const o = q(m(t)).geometry.coordinates;
return [o[0], o[1]];
},
toGcj02: (t) => M.toGcj02(f.toWgs84(t)),
toBd09: (t) => h.toBd09(f.toGcj02(t))
}, M = {
toMerc: (t) => g(m(t)).geometry.coordinates,
toGcj02: ([t, o]) => {
if (!W([t, o])) {
const [s, n] = G([t, o]);
t += s, o += n;
}
return [t, o];
},
toBd09: (t) => h.toBd09(M.toGcj02(t))
}, h = {
toWgs84: ([t, o]) => {
if (!W([t, o])) {
const [s, n] = G([t, o]);
t -= s, o -= n;
}
return [t, o];
},
toBd09: ([t, o]) => {
let s = t, n = o;
const a = Math.sqrt(s * s + n * n) + 2e-5 * Math.sin(n * c), e = Math.atan2(n, s) + 3e-6 * Math.cos(s * c);
return s = a * Math.cos(e) + 65e-4, n = a * Math.sin(e) + 6e-3, [s, n];
},
toMerc: (t) => M.toMerc(h.toWgs84(t))
}, j = {
toWgs84: (t) => h.toWgs84(j.toGcj02(t)),
toGcj02: ([t, o]) => {
let s = t - 65e-4, n = o - 6e-3;
const a = Math.sqrt(s * s + n * n) - 2e-5 * Math.sin(n * c), e = Math.atan2(n, s) - 3e-6 * Math.cos(s * c);
return s = a * Math.cos(e), n = a * Math.sin(e), [s, n];
},
toMerc: (t) => M.toMerc(j.toWgs84(t))
};
export {
j as bd09,
h as gcj02,
f as merc,
M as wgs84
};