utils_polygonIntersectFeatures.mjs
/**
## mapp.utils.polygonIntersectFeatures()
@module /utils/polygonIntersectFeatures
*/
/**
* Checks if features intersect with a drawn polygon on a map view.
* @function polygonIntersectFeatures
* @param {Object} params - The parameters for the function.
* @param {Object} params.mapview - The map view instance.
* @param {Function} [params.drawendCallback] - Callback function to be called with intersecting features.
* @param {Object} [params.interaction] - Additional interaction options to be merged with the default config.
*/
export function polygonIntersectFeatures(params) {
if (!params.mapview) return;
function getArrayDepth(arr) {
return Array.isArray(arr) ?
1 + Math.max(0, ...arr.map(getArrayDepth)) :
0;
}
// Config for mapview draw interaction.
const interaction = {
// Draw polygon.
type: 'Polygon',
drawend: e => {
const poly = e.feature
const polyGeom = poly.getGeometry()
let features = params.mapview.interaction.snap.source.getFeatures()
features = features
.filter(feature => {
let coordinates = feature.getGeometry().getCoordinates()//.flat(2)
coordinates = coordinates.flat(getArrayDepth(coordinates) - 2)
return coordinates.some(coord => polyGeom.intersectsCoordinate(coord))
})
if (params.drawendCallback) {
params.drawendCallback(features)
}
},
...params
}
// Initiate drawing on mapview with config as interaction argument.
params.mapview.interactions.draw(interaction)
}