jr-util
Version:
这是MJR的JS工具库。定期更新
116 lines (115 loc) • 3.08 kB
JavaScript
const L = (a) => {
let n = a[0].lat, l = a[0].lat, i = a[0].lng, t = a[0].lng;
return a.forEach((r) => {
n = Math.min(n, r.lat), l = Math.max(l, r.lat), i = Math.min(i, r.lng), t = Math.max(t, r.lng);
}), { minLat: n, maxLat: l, minLng: i, maxLng: t };
}, h = (a, n) => {
const l = a.lat, i = a.lng;
let t = !1;
for (let r = 0, e = n.length - 1; r < n.length; e = r++) {
const m = n[r].lat, g = n[r].lng, c = n[e].lat, o = n[e].lng;
g > i != o > i && l < (c - m) * (i - g) / (o - g) + m && (t = !t);
}
return t;
}, P = (a, n) => {
let l;
do
l = {
lat: n.minLat + Math.random() * (n.maxLat - n.minLat),
lng: n.minLng + Math.random() * (n.maxLng - n.minLng)
};
while (!h(l, a));
return l;
}, F = (a, n) => {
const l = L(a.map((t) => ({ lat: t[1], lng: t[0] }))), i = L(n.map((t) => ({ lat: t[1], lng: t[0] })));
if (l.maxLng < i.minLng || l.minLng > i.maxLng || l.maxLat < i.minLat || l.minLat > i.maxLat)
return !1;
for (let t = 0; t < a.length; t++) {
const r = { lat: a[t][1], lng: a[t][0] };
if (h(
r,
n.map((e) => ({ lat: e[1], lng: e[0] }))
))
return !0;
}
for (let t = 0; t < n.length; t++) {
const r = { lat: n[t][1], lng: n[t][0] };
if (h(
r,
a.map((e) => ({ lat: e[1], lng: e[0] }))
))
return !0;
}
return !1;
}, j = (a, n, l = {}, i = 0.025) => {
const t = [], r = L(a);
for (let e = 0; e < n; e++) {
let m;
do {
const o = Math.floor(Math.random() * 4) + 4, s = [], x = P(a, r);
for (let u = 0; u < o; u++) {
const f = u * 2 * Math.PI / o, M = Math.random() * i + 1e-3, d = {
lat: x.lat + M * Math.sin(f),
lng: x.lng + M * Math.cos(f)
};
s.push([d.lng, d.lat]);
}
s.push(s[0]), m = s;
} while (t.some((o) => F(o.geometry.coordinates[0], m)));
const g = {
type: "Feature",
id: e + 1,
properties: {
_draw_type: "fill",
...l
},
geometry: {
type: "Polygon",
coordinates: [m]
}
}, c = m.reduce(
(o, s) => ({
minLng: Math.min(o.minLng, s[0]),
maxLng: Math.max(o.maxLng, s[0]),
minLat: Math.min(o.minLat, s[1]),
maxLat: Math.max(o.maxLat, s[1])
}),
{
minLng: m[0][0],
maxLng: m[0][0],
minLat: m[0][1],
maxLat: m[0][1]
}
);
g.bbox = [c.minLng, c.minLat, c.maxLng, c.maxLat], t.push(g);
}
return {
type: "FeatureCollection",
features: t
};
}, w = (a, n, l = {}) => {
const i = [], t = L(a);
for (let r = 0; r < n; r++) {
const e = P(a, t), m = {
type: "Feature",
id: r + 1,
properties: {
title: "\u6F14\u793A\u6570\u636E",
...l
},
geometry: {
type: "Point",
coordinates: [e.lng, e.lat]
}
};
m.bbox = [e.lng, e.lat, e.lng, e.lat], i.push(m);
}
return {
type: "FeatureCollection",
features: i
};
};
export {
j as generatePolygonGeoJSON,
w as generatePolygonPointGeoJSON
};