UNPKG

jr-util

Version:

这是MJR的JS工具库。定期更新

116 lines (115 loc) 3.08 kB
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 };