| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // index.ts
- import { getGeom } from "@turf/invariant";
- import { polygon, lineString } from "@turf/helpers";
- import { booleanDisjoint } from "@turf/boolean-disjoint";
- import { booleanCrosses } from "@turf/boolean-crosses";
- import { lineIntersect } from "@turf/line-intersect";
- import { booleanPointOnLine as isPointOnLine } from "@turf/boolean-point-on-line";
- function booleanValid(feature) {
- if (!feature.type) return false;
- const geom = getGeom(feature);
- const type = geom.type;
- const coords = geom.coordinates;
- switch (type) {
- case "Point":
- return coords.length > 1;
- case "MultiPoint":
- for (var i = 0; i < coords.length; i++) {
- if (coords[i].length < 2) return false;
- }
- return true;
- case "LineString":
- if (coords.length < 2) return false;
- for (var i = 0; i < coords.length; i++) {
- if (coords[i].length < 2) return false;
- }
- return true;
- case "MultiLineString":
- if (coords.length < 2) return false;
- for (var i = 0; i < coords.length; i++) {
- if (coords[i].length < 2) return false;
- }
- return true;
- case "Polygon":
- for (var i = 0; i < geom.coordinates.length; i++) {
- if (coords[i].length < 4) return false;
- if (!checkRingsClose(coords[i])) return false;
- if (checkRingsForSpikesPunctures(coords[i])) return false;
- if (i > 0) {
- if (lineIntersect(polygon([coords[0]]), polygon([coords[i]])).features.length > 1)
- return false;
- }
- }
- return true;
- case "MultiPolygon":
- for (var i = 0; i < geom.coordinates.length; i++) {
- var poly = geom.coordinates[i];
- for (var ii = 0; ii < poly.length; ii++) {
- if (poly[ii].length < 4) return false;
- if (!checkRingsClose(poly[ii])) return false;
- if (checkRingsForSpikesPunctures(poly[ii])) return false;
- if (ii === 0) {
- if (!checkPolygonAgainstOthers(poly, geom.coordinates, i))
- return false;
- }
- if (ii > 0) {
- if (lineIntersect(polygon([poly[0]]), polygon([poly[ii]])).features.length > 1)
- return false;
- }
- }
- }
- return true;
- default:
- return false;
- }
- }
- function checkRingsClose(geom) {
- return geom[0][0] === geom[geom.length - 1][0] && geom[0][1] === geom[geom.length - 1][1];
- }
- function checkRingsForSpikesPunctures(geom) {
- for (var i = 0; i < geom.length - 1; i++) {
- var point = geom[i];
- for (var ii = i + 1; ii < geom.length - 2; ii++) {
- var seg = [geom[ii], geom[ii + 1]];
- if (isPointOnLine(point, lineString(seg))) return true;
- }
- }
- return false;
- }
- function checkPolygonAgainstOthers(poly, geom, index) {
- var polyToCheck = polygon(poly);
- for (var i = index + 1; i < geom.length; i++) {
- if (!booleanDisjoint(polyToCheck, polygon(geom[i]))) {
- if (booleanCrosses(polyToCheck, lineString(geom[i][0]))) return false;
- }
- }
- return true;
- }
- var turf_boolean_valid_default = booleanValid;
- export {
- booleanValid,
- turf_boolean_valid_default as default
- };
- //# sourceMappingURL=index.js.map
|