index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // index.ts
  2. import { getGeom } from "@turf/invariant";
  3. import { polygon, lineString } from "@turf/helpers";
  4. import { booleanDisjoint } from "@turf/boolean-disjoint";
  5. import { booleanCrosses } from "@turf/boolean-crosses";
  6. import { lineIntersect } from "@turf/line-intersect";
  7. import { booleanPointOnLine as isPointOnLine } from "@turf/boolean-point-on-line";
  8. function booleanValid(feature) {
  9. if (!feature.type) return false;
  10. const geom = getGeom(feature);
  11. const type = geom.type;
  12. const coords = geom.coordinates;
  13. switch (type) {
  14. case "Point":
  15. return coords.length > 1;
  16. case "MultiPoint":
  17. for (var i = 0; i < coords.length; i++) {
  18. if (coords[i].length < 2) return false;
  19. }
  20. return true;
  21. case "LineString":
  22. if (coords.length < 2) return false;
  23. for (var i = 0; i < coords.length; i++) {
  24. if (coords[i].length < 2) return false;
  25. }
  26. return true;
  27. case "MultiLineString":
  28. if (coords.length < 2) return false;
  29. for (var i = 0; i < coords.length; i++) {
  30. if (coords[i].length < 2) return false;
  31. }
  32. return true;
  33. case "Polygon":
  34. for (var i = 0; i < geom.coordinates.length; i++) {
  35. if (coords[i].length < 4) return false;
  36. if (!checkRingsClose(coords[i])) return false;
  37. if (checkRingsForSpikesPunctures(coords[i])) return false;
  38. if (i > 0) {
  39. if (lineIntersect(polygon([coords[0]]), polygon([coords[i]])).features.length > 1)
  40. return false;
  41. }
  42. }
  43. return true;
  44. case "MultiPolygon":
  45. for (var i = 0; i < geom.coordinates.length; i++) {
  46. var poly = geom.coordinates[i];
  47. for (var ii = 0; ii < poly.length; ii++) {
  48. if (poly[ii].length < 4) return false;
  49. if (!checkRingsClose(poly[ii])) return false;
  50. if (checkRingsForSpikesPunctures(poly[ii])) return false;
  51. if (ii === 0) {
  52. if (!checkPolygonAgainstOthers(poly, geom.coordinates, i))
  53. return false;
  54. }
  55. if (ii > 0) {
  56. if (lineIntersect(polygon([poly[0]]), polygon([poly[ii]])).features.length > 1)
  57. return false;
  58. }
  59. }
  60. }
  61. return true;
  62. default:
  63. return false;
  64. }
  65. }
  66. function checkRingsClose(geom) {
  67. return geom[0][0] === geom[geom.length - 1][0] && geom[0][1] === geom[geom.length - 1][1];
  68. }
  69. function checkRingsForSpikesPunctures(geom) {
  70. for (var i = 0; i < geom.length - 1; i++) {
  71. var point = geom[i];
  72. for (var ii = i + 1; ii < geom.length - 2; ii++) {
  73. var seg = [geom[ii], geom[ii + 1]];
  74. if (isPointOnLine(point, lineString(seg))) return true;
  75. }
  76. }
  77. return false;
  78. }
  79. function checkPolygonAgainstOthers(poly, geom, index) {
  80. var polyToCheck = polygon(poly);
  81. for (var i = index + 1; i < geom.length; i++) {
  82. if (!booleanDisjoint(polyToCheck, polygon(geom[i]))) {
  83. if (booleanCrosses(polyToCheck, lineString(geom[i][0]))) return false;
  84. }
  85. }
  86. return true;
  87. }
  88. var turf_boolean_valid_default = booleanValid;
  89. export {
  90. booleanValid,
  91. turf_boolean_valid_default as default
  92. };
  93. //# sourceMappingURL=index.js.map