index.js 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. var meta_1 = require("@turf/meta");
  7. var invariant_1 = require("@turf/invariant");
  8. var line_overlap_1 = __importDefault(require("@turf/line-overlap"));
  9. var line_intersect_1 = __importDefault(require("@turf/line-intersect"));
  10. var geojson_equality_1 = __importDefault(require("geojson-equality"));
  11. /**
  12. * Compares two geometries of the same dimension and returns true if their intersection set results in a geometry
  13. * different from both but of the same dimension. It applies to Polygon/Polygon, LineString/LineString,
  14. * Multipoint/Multipoint, MultiLineString/MultiLineString and MultiPolygon/MultiPolygon.
  15. *
  16. * In other words, it returns true if the two geometries overlap, provided that neither completely contains the other.
  17. *
  18. * @name booleanOverlap
  19. * @param {Geometry|Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature1 input
  20. * @param {Geometry|Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature2 input
  21. * @returns {boolean} true/false
  22. * @example
  23. * var poly1 = turf.polygon([[[0,0],[0,5],[5,5],[5,0],[0,0]]]);
  24. * var poly2 = turf.polygon([[[1,1],[1,6],[6,6],[6,1],[1,1]]]);
  25. * var poly3 = turf.polygon([[[10,10],[10,15],[15,15],[15,10],[10,10]]]);
  26. *
  27. * turf.booleanOverlap(poly1, poly2)
  28. * //=true
  29. * turf.booleanOverlap(poly2, poly3)
  30. * //=false
  31. */
  32. function booleanOverlap(feature1, feature2) {
  33. var geom1 = invariant_1.getGeom(feature1);
  34. var geom2 = invariant_1.getGeom(feature2);
  35. var type1 = geom1.type;
  36. var type2 = geom2.type;
  37. if ((type1 === "MultiPoint" && type2 !== "MultiPoint") ||
  38. ((type1 === "LineString" || type1 === "MultiLineString") &&
  39. type2 !== "LineString" &&
  40. type2 !== "MultiLineString") ||
  41. ((type1 === "Polygon" || type1 === "MultiPolygon") &&
  42. type2 !== "Polygon" &&
  43. type2 !== "MultiPolygon")) {
  44. throw new Error("features must be of the same type");
  45. }
  46. if (type1 === "Point")
  47. throw new Error("Point geometry not supported");
  48. // features must be not equal
  49. var equality = new geojson_equality_1.default({ precision: 6 });
  50. if (equality.compare(feature1, feature2))
  51. return false;
  52. var overlap = 0;
  53. switch (type1) {
  54. case "MultiPoint":
  55. for (var i = 0; i < geom1.coordinates.length; i++) {
  56. for (var j = 0; j < geom2.coordinates.length; j++) {
  57. var coord1 = geom1.coordinates[i];
  58. var coord2 = geom2.coordinates[j];
  59. if (coord1[0] === coord2[0] && coord1[1] === coord2[1]) {
  60. return true;
  61. }
  62. }
  63. }
  64. return false;
  65. case "LineString":
  66. case "MultiLineString":
  67. meta_1.segmentEach(feature1, function (segment1) {
  68. meta_1.segmentEach(feature2, function (segment2) {
  69. if (line_overlap_1.default(segment1, segment2).features.length)
  70. overlap++;
  71. });
  72. });
  73. break;
  74. case "Polygon":
  75. case "MultiPolygon":
  76. meta_1.segmentEach(feature1, function (segment1) {
  77. meta_1.segmentEach(feature2, function (segment2) {
  78. if (line_intersect_1.default(segment1, segment2).features.length)
  79. overlap++;
  80. });
  81. });
  82. break;
  83. }
  84. return overlap > 0;
  85. }
  86. exports.default = booleanOverlap;