diff --git a/package-lock.json b/package-lock.json
index 3deacc196e..4eefcc3545 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7584,6 +7584,40 @@
"url": "https://opencollective.com/turf"
}
},
+ "node_modules/@turf/boolean-disjoint": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-7.2.0.tgz",
+ "integrity": "sha512-xdz+pYKkLMuqkNeJ6EF/3OdAiJdiHhcHCV0ykX33NIuALKIEpKik0+NdxxNsZsivOW6keKwr61SI+gcVtHYcnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-point-in-polygon": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/line-intersect": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@turf/polygon-to-line": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/boolean-intersects": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-7.2.0.tgz",
+ "integrity": "sha512-GLRyLQgK3F14drkK5Qi9Mv7Z9VT1bgQUd9a3DB3DACTZWDSwfh8YZUFn/HBwRkK8dDdgNEXaavggQHcPi1k9ow==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/boolean-disjoint": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
"node_modules/@turf/boolean-point-in-polygon": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.2.0.tgz",
@@ -7600,6 +7634,25 @@
"url": "https://opencollective.com/turf"
}
},
+ "node_modules/@turf/buffer": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-7.2.0.tgz",
+ "integrity": "sha512-QH1FTr5Mk4z1kpQNztMD8XBOZfpOXPOtlsxaSAj2kDIf5+LquA6HtJjZrjUngnGtzG5+XwcfyRL4ImvLnFjm5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/bbox": "^7.2.0",
+ "@turf/center": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/jsts": "^2.7.1",
+ "@turf/meta": "^7.2.0",
+ "@turf/projection": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "d3-geo": "1.7.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
"node_modules/@turf/center": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/@turf/center/-/center-7.2.0.tgz",
@@ -7672,6 +7725,22 @@
"url": "https://opencollective.com/turf"
}
},
+ "node_modules/@turf/intersect": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-7.2.0.tgz",
+ "integrity": "sha512-81GMzKS9pKqLPa61qSlFxLFeAC8XbwyCQ9Qv4z6o5skWk1qmMUbEHeMqaGUTEzk+q2XyhZ0sju1FV4iLevQ/aw==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "polyclip-ts": "^0.16.8",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
"node_modules/@turf/invariant": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.2.0.tgz",
@@ -7686,6 +7755,15 @@
"url": "https://opencollective.com/turf"
}
},
+ "node_modules/@turf/jsts": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/@turf/jsts/-/jsts-2.7.2.tgz",
+ "integrity": "sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg==",
+ "license": "(EDL-1.0 OR EPL-1.0)",
+ "dependencies": {
+ "jsts": "2.7.1"
+ }
+ },
"node_modules/@turf/line-intersect": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-7.2.0.tgz",
@@ -7749,6 +7827,37 @@
"url": "https://opencollective.com/turf"
}
},
+ "node_modules/@turf/polygon-to-line": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-7.2.0.tgz",
+ "integrity": "sha512-9jeTN3LiJ933I5sd4K0kwkcivOYXXm1emk0dHorwXeSFSHF+nlYesEW3Hd889wb9lZd7/SVLMUeX/h39mX+vCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/helpers": "^7.2.0",
+ "@turf/invariant": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
+ "node_modules/@turf/projection": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-7.2.0.tgz",
+ "integrity": "sha512-/qke5vJScv8Mu7a+fU3RSChBRijE6EVuFHU3RYihMuYm04Vw8dBMIs0enEpoq0ke/IjSbleIrGQNZIMRX9EwZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@turf/clone": "^7.2.0",
+ "@turf/helpers": "^7.2.0",
+ "@turf/meta": "^7.2.0",
+ "@types/geojson": "^7946.0.10",
+ "tslib": "^2.8.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/turf"
+ }
+ },
"node_modules/@types/body-parser": {
"version": "1.19.5",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
@@ -9539,6 +9648,15 @@
"node": "*"
}
},
+ "node_modules/bignumber.js": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.2.1.tgz",
+ "integrity": "sha512-+NzaKgOUvInq9TIUZ1+DRspzf/HApkCwD4btfuasFTdrfnOxqx853TgDpMolp+uv4RpRp7bPcEU2zKr9+fRmyw==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -11872,6 +11990,21 @@
"node": ">=6"
}
},
+ "node_modules/d3-array": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
+ "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/d3-geo": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz",
+ "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "d3-array": "1"
+ }
+ },
"node_modules/dargs": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
@@ -16725,6 +16858,15 @@
"verror": "1.10.0"
}
},
+ "node_modules/jsts": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/jsts/-/jsts-2.7.1.tgz",
+ "integrity": "sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==",
+ "license": "(EDL-1.0 OR EPL-1.0)",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/jszip": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
@@ -23272,6 +23414,16 @@
"robust-predicates": "^3.0.2"
}
},
+ "node_modules/polyclip-ts": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/polyclip-ts/-/polyclip-ts-0.16.8.tgz",
+ "integrity": "sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bignumber.js": "^9.1.0",
+ "splaytree-ts": "^1.0.2"
+ }
+ },
"node_modules/postcss": {
"version": "8.5.2",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
@@ -25834,6 +25986,12 @@
"wbuf": "^1.7.3"
}
},
+ "node_modules/splaytree-ts": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/splaytree-ts/-/splaytree-ts-1.0.2.tgz",
+ "integrity": "sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==",
+ "license": "BDS-3-Clause"
+ },
"node_modules/split": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
@@ -28583,7 +28741,10 @@
"license": "MIT",
"dependencies": {
"@mat-datetimepicker/core": "^15.0.1",
+ "@turf/boolean-intersects": "^7.2.0",
+ "@turf/buffer": "^7.2.0",
"@turf/helpers": "^7.2.0",
+ "@turf/intersect": "^7.2.0",
"@turf/line-intersect": "^7.2.0",
"@turf/point-on-feature": "^7.2.0",
"file-saver": "^2.0.2",
diff --git a/packages/geo/ng-package.json b/packages/geo/ng-package.json
index 2add21d3a7..cfd7317453 100644
--- a/packages/geo/ng-package.json
+++ b/packages/geo/ng-package.json
@@ -18,7 +18,13 @@
"nosleep.js",
"striptags",
"ts-cacheable",
- "ts-md5"
+ "ts-md5",
+ "@turf/helpers",
+ "@turf/boolean-intersects",
+ "@turf/buffer",
+ "@turf/intersect",
+ "@turf/line-intersect",
+ "@turf/point-on-feature"
],
"assets": [
{ "input": "", "glob": "**/*.them*.scss", "output": "" },
diff --git a/packages/geo/package.json b/packages/geo/package.json
index f0c8a28ae9..2de717daec 100644
--- a/packages/geo/package.json
+++ b/packages/geo/package.json
@@ -39,6 +39,9 @@
},
"dependencies": {
"@mat-datetimepicker/core": "^15.0.1",
+ "@turf/boolean-intersects": "^7.2.0",
+ "@turf/buffer": "^7.2.0",
+ "@turf/intersect": "^7.2.0",
"@turf/helpers": "^7.2.0",
"@turf/line-intersect": "^7.2.0",
"@turf/point-on-feature": "^7.2.0",
diff --git a/packages/geo/src/lib/geometry/shared/geometry.utils.ts b/packages/geo/src/lib/geometry/shared/geometry.utils.ts
index d5747576a1..1469aaecc0 100644
--- a/packages/geo/src/lib/geometry/shared/geometry.utils.ts
+++ b/packages/geo/src/lib/geometry/shared/geometry.utils.ts
@@ -8,9 +8,13 @@ import OlPoint from 'ol/geom/Point';
import OlPolygon from 'ol/geom/Polygon';
import * as olstyle from 'ol/style';
-import { lineString } from '@turf/helpers';
+import booleanIntersects from '@turf/boolean-intersects';
+import buffer from '@turf/buffer';
+import { Units, lineString } from '@turf/helpers';
+import { feature as turfFeature } from '@turf/helpers';
import lineIntersect from '@turf/line-intersect';
+import { FeatureGeometry } from '../../feature';
import {
GeometrySliceLineStringError,
GeometrySliceMultiPolygonError,
@@ -145,3 +149,27 @@ export function getMousePositionFromOlGeometryEvent(olEvent: BasicEvent) {
const olGeometryCast = olGeometry as OlPoint | OlLineString | OlCircle;
return olGeometryCast.getFlatCoordinates().slice(-2) as [number, number];
}
+
+export function doesOlGeometryIntersects(
+ olGeometry1: OlGeometry,
+ olGeometry2: OlGeometry
+): boolean {
+ const olGeoJSON = new OlGeoJSON();
+ const firstGeom = olGeoJSON.writeGeometryObject(olGeometry1);
+ const secondGeom = olGeoJSON.writeGeometryObject(olGeometry2);
+ return booleanIntersects(
+ firstGeom as FeatureGeometry,
+ secondGeom as FeatureGeometry
+ );
+}
+
+export function bufferOlGeometry(
+ olGeometry: OlGeometry,
+ dist: number,
+ units: Units = 'meters'
+): FeatureGeometry {
+ const olGeoJSON = new OlGeoJSON();
+ const bufferedGeom = olGeoJSON.writeGeometryObject(olGeometry);
+ const buffered = buffer(turfFeature(bufferedGeom), dist, { units });
+ return buffered.geometry;
+}
diff --git a/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.html b/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.html
new file mode 100644
index 0000000000..5b974815fa
--- /dev/null
+++ b/packages/geo/src/lib/workspace/widgets/interactive-selection/interactive-selection.component.html
@@ -0,0 +1,29 @@
+