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)
}