index.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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 clean_coords_1 = __importDefault(require("@turf/clean-coords"));
  7. var line_segment_1 = __importDefault(require("@turf/line-segment"));
  8. var rhumb_bearing_1 = __importDefault(require("@turf/rhumb-bearing"));
  9. var helpers_1 = require("@turf/helpers");
  10. /**
  11. * Boolean-Parallel returns True if each segment of `line1` is parallel to the correspondent segment of `line2`
  12. *
  13. * @name booleanParallel
  14. * @param {Geometry|Feature<LineString>} line1 GeoJSON Feature or Geometry
  15. * @param {Geometry|Feature<LineString>} line2 GeoJSON Feature or Geometry
  16. * @returns {boolean} true/false if the lines are parallel
  17. * @example
  18. * var line1 = turf.lineString([[0, 0], [0, 1]]);
  19. * var line2 = turf.lineString([[1, 0], [1, 1]]);
  20. *
  21. * turf.booleanParallel(line1, line2);
  22. * //=true
  23. */
  24. function booleanParallel(line1, line2) {
  25. // validation
  26. if (!line1)
  27. throw new Error("line1 is required");
  28. if (!line2)
  29. throw new Error("line2 is required");
  30. var type1 = getType(line1, "line1");
  31. if (type1 !== "LineString")
  32. throw new Error("line1 must be a LineString");
  33. var type2 = getType(line2, "line2");
  34. if (type2 !== "LineString")
  35. throw new Error("line2 must be a LineString");
  36. var segments1 = line_segment_1.default(clean_coords_1.default(line1)).features;
  37. var segments2 = line_segment_1.default(clean_coords_1.default(line2)).features;
  38. for (var i = 0; i < segments1.length; i++) {
  39. var segment1 = segments1[i].geometry.coordinates;
  40. if (!segments2[i])
  41. break;
  42. var segment2 = segments2[i].geometry.coordinates;
  43. if (!isParallel(segment1, segment2))
  44. return false;
  45. }
  46. return true;
  47. }
  48. /**
  49. * Compares slopes and return result
  50. *
  51. * @private
  52. * @param {Geometry|Feature<LineString>} segment1 Geometry or Feature
  53. * @param {Geometry|Feature<LineString>} segment2 Geometry or Feature
  54. * @returns {boolean} if slopes are equal
  55. */
  56. function isParallel(segment1, segment2) {
  57. var slope1 = helpers_1.bearingToAzimuth(rhumb_bearing_1.default(segment1[0], segment1[1]));
  58. var slope2 = helpers_1.bearingToAzimuth(rhumb_bearing_1.default(segment2[0], segment2[1]));
  59. return slope1 === slope2;
  60. }
  61. /**
  62. * Returns Feature's type
  63. *
  64. * @private
  65. * @param {Geometry|Feature<any>} geojson Geometry or Feature
  66. * @param {string} name of the variable
  67. * @returns {string} Feature's type
  68. */
  69. function getType(geojson, name) {
  70. if (geojson.geometry && geojson.geometry.type)
  71. return geojson.geometry.type;
  72. if (geojson.type)
  73. return geojson.type; // if GeoJSON geometry
  74. throw new Error("Invalid GeoJSON object for " + name);
  75. }
  76. exports.default = booleanParallel;