UNPKG

maplair

Version:

JavaScript library for mobile-friendly interactive maps

89 lines (88 loc) • 2.86 kB
import { __exportAll } from "../_virtual/_rolldown/runtime.js"; import { Point } from "./Point.js"; import { LatLngBounds } from "../geo/LatLngBounds.js"; import { LatLng } from "../geo/LatLng.js"; import { _getBitCode, _getEdgeIntersection, isFlat } from "./LineUtil.js"; //#region src/geometry/PolyUtil.js var PolyUtil_exports = /* @__PURE__ */ __exportAll({ centroid: () => centroid, clipPolygon: () => clipPolygon, polygonCenter: () => polygonCenter }); function clipPolygon(points, bounds, round) { let clippedPoints, i, j, k, a, b, len, edge, p; const edges = [ 1, 4, 2, 8 ]; for (i = 0, len = points.length; i < len; i++) points[i]._code = _getBitCode(points[i], bounds); for (k = 0; k < 4; k++) { edge = edges[k]; clippedPoints = []; for (i = 0, len = points.length, j = len - 1; i < len; j = i++) { a = points[i]; b = points[j]; if (!(a._code & edge)) { if (b._code & edge) { p = _getEdgeIntersection(b, a, edge, bounds, round); p._code = _getBitCode(p, bounds); clippedPoints.push(p); } clippedPoints.push(a); } else if (!(b._code & edge)) { p = _getEdgeIntersection(b, a, edge, bounds, round); p._code = _getBitCode(p, bounds); clippedPoints.push(p); } } points = clippedPoints; } return points; } function polygonCenter(latlngs, crs) { let i, j, p1, p2, f, area, x, y, center; if (!latlngs || latlngs.length === 0) throw new Error("latlngs not passed"); if (!isFlat(latlngs)) { console.warn("latlngs are not flat! Only the first ring will be used"); latlngs = latlngs[0]; } let centroidLatLng = new LatLng([0, 0]); const bounds = new LatLngBounds(latlngs); if (bounds.getNorthWest().distanceTo(bounds.getSouthWest()) * bounds.getNorthEast().distanceTo(bounds.getNorthWest()) < 1700) centroidLatLng = centroid(latlngs); const len = latlngs.length; const points = []; for (i = 0; i < len; i++) { const latlng = new LatLng(latlngs[i]); points.push(crs.project(new LatLng([latlng.lat - centroidLatLng.lat, latlng.lng - centroidLatLng.lng]))); } area = x = y = 0; for (i = 0, j = len - 1; i < len; j = i++) { p1 = points[i]; p2 = points[j]; f = p1.y * p2.x - p2.y * p1.x; x += (p1.x + p2.x) * f; y += (p1.y + p2.y) * f; area += f * 3; } if (area === 0) center = points[0]; else center = [x / area, y / area]; const latlngCenter = crs.unproject(new Point(center)); return new LatLng([latlngCenter.lat + centroidLatLng.lat, latlngCenter.lng + centroidLatLng.lng]); } function centroid(coords) { let latSum = 0; let lngSum = 0; let len = 0; for (const coord of coords) { const latlng = new LatLng(coord); latSum += latlng.lat; lngSum += latlng.lng; len++; } return new LatLng([latSum / len, lngSum / len]); } //#endregion export { PolyUtil_exports, centroid, clipPolygon, polygonCenter }; //# sourceMappingURL=PolyUtil.js.map