index.js 2.5 KB

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