diff --git a/packages/turf-line-intersect/README.md b/packages/turf-line-intersect/README.md index 2c9881046f..894e512b90 100644 --- a/packages/turf-line-intersect/README.md +++ b/packages/turf-line-intersect/README.md @@ -12,8 +12,8 @@ Takes any LineString or Polygon GeoJSON and returns the intersecting point(s). * `line2` **[GeoJSON][1]** any LineString or Polygon * `options` **[Object][2]** Optional parameters (optional, default `{}`) - * `options.removeDuplicates` **[boolean][3]** remove duplicate intersections (optional, default `true`) - * `options.ignoreSelfIntersections` **[boolean][3]** ignores self-intersections on input features (optional, default `false`) + * `options.removeDuplicates` **[boolean][3]** remove duplicate intersections (default `true`) (optional, default `true`) + * `options.ignoreSelfIntersections` **[boolean][3]** ignores self-intersections on input features (default `true`) (optional, default `true`) ### Examples @@ -21,9 +21,6 @@ Takes any LineString or Polygon GeoJSON and returns the intersecting point(s). var line1 = turf.lineString([[126, -11], [129, -21]]); var line2 = turf.lineString([[123, -18], [131, -14]]); var intersects = turf.lineIntersect(line1, line2); - -//addToMap -var addToMap = [line1, line2, intersects] ``` Returns **[FeatureCollection][4]<[Point][5]>** point(s) that intersect both diff --git a/packages/turf-line-intersect/index.ts b/packages/turf-line-intersect/index.ts index 3723bdba2f..add1700f98 100644 --- a/packages/turf-line-intersect/index.ts +++ b/packages/turf-line-intersect/index.ts @@ -18,16 +18,13 @@ import { sweeplineIntersections as findIntersections } from "./lib/sweepline-int * @param {GeoJSON} line1 any LineString or Polygon * @param {GeoJSON} line2 any LineString or Polygon * @param {Object} [options={}] Optional parameters - * @param {boolean} [options.removeDuplicates=true] remove duplicate intersections - * @param {boolean} [options.ignoreSelfIntersections=false] ignores self-intersections on input features + * @param {boolean} [options.removeDuplicates=true] remove duplicate intersections (default `true`) + * @param {boolean} [options.ignoreSelfIntersections=true] ignores self-intersections on input features (default `true`) * @returns {FeatureCollection} point(s) that intersect both * @example * var line1 = turf.lineString([[126, -11], [129, -21]]); * var line2 = turf.lineString([[123, -18], [131, -14]]); * var intersects = turf.lineIntersect(line1, line2); - * - * //addToMap - * var addToMap = [line1, line2, intersects] */ function lineIntersect< G1 extends LineString | MultiLineString | Polygon | MultiPolygon, @@ -40,7 +37,7 @@ function lineIntersect< ignoreSelfIntersections?: boolean; } = {} ): FeatureCollection { - const { removeDuplicates = true, ignoreSelfIntersections = false } = options; + const { removeDuplicates = true, ignoreSelfIntersections = true } = options; let features: Feature[] = []; if (line1.type === "FeatureCollection") features = features.concat(line1.features); diff --git a/packages/turf-line-intersect/test.ts b/packages/turf-line-intersect/test.ts index 40d45e91db..3f17e827b9 100644 --- a/packages/turf-line-intersect/test.ts +++ b/packages/turf-line-intersect/test.ts @@ -4,13 +4,9 @@ import path from "path"; import { loadJsonFileSync } from "load-json-file"; import { writeJsonFileSync } from "write-json-file"; import { truncate } from "@turf/truncate"; -import { - featureCollection, - // geometryCollection, - lineString, - polygon, -} from "@turf/helpers"; +import { featureCollection, lineString, polygon } from "@turf/helpers"; import { lineIntersect } from "./index.js"; +import { Feature, LineString, Point } from "geojson"; const directories = { in: path.join("test", "in") + path.sep, @@ -21,14 +17,18 @@ const fixtures = fs.readdirSync(directories.in).map((filename) => { return { filename, name: path.parse(filename).name, - geojson: loadJsonFileSync(directories.in + filename), + geojson: loadJsonFileSync( + directories.in + filename + ) as GeoJSON.FeatureCollection, }; }); test("turf-line-intersect", (t) => { for (const { filename, name, geojson } of fixtures) { const [line1, line2] = geojson.features; - const results = truncate(lineIntersect(line1, line2)); + const results: GeoJSON.FeatureCollection = truncate( + lineIntersect(line1, line2) + ); results.features.push(line1); results.features.push(line2); @@ -132,3 +132,48 @@ test("turf-line-intersect - polygon support #586", (t) => { t.equal(results.features.length, 1, "should return single point"); t.end(); }); + +test("turf-line-intersect - self intersection behavior", (t) => { + const line1: Feature = { + type: "Feature", + properties: {}, + geometry: { + type: "LineString", + coordinates: [ + [0, 0], + [0, 2], + [2, 1], + [-1, 1], + ], + }, + }; + const line2: Feature = { + type: "Feature", + properties: {}, + geometry: { + type: "LineString", + coordinates: [ + [3, 3], + [4, 4], + [5, 5], + ], + }, + }; + + const ignored = lineIntersect(line1, line2); + t.equal( + ignored.features.length, + 0, + "self intersections should be ignored by default" + ); + + const included = lineIntersect(line1, line2, { + ignoreSelfIntersections: false, + }); + t.equal( + included.features.length, + 1, + "self intersections should be included when ignoreSelfIntersections set to false" + ); + t.end(); +}); diff --git a/packages/turf-line-intersect/test/in/self-intersection-only.geojson b/packages/turf-line-intersect/test/in/self-intersection-only.geojson new file mode 100644 index 0000000000..ec5b6ebf7c --- /dev/null +++ b/packages/turf-line-intersect/test/in/self-intersection-only.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [0, 2], + [2, 1], + [-1, 1] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [3, 3], + [4, 4], + [5, 5] + ] + } + } + ] +} diff --git a/packages/turf-line-intersect/test/out/self-intersection-only.geojson b/packages/turf-line-intersect/test/out/self-intersection-only.geojson new file mode 100644 index 0000000000..ec5b6ebf7c --- /dev/null +++ b/packages/turf-line-intersect/test/out/self-intersection-only.geojson @@ -0,0 +1,30 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [0, 0], + [0, 2], + [2, 1], + [-1, 1] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "geometry": { + "type": "LineString", + "coordinates": [ + [3, 3], + [4, 4], + [5, 5] + ] + } + } + ] +}