Tengo una aplicación donde el usuario dibuja una ruta (una serie de líneas rectas conectadas) y esta ruta no puede intersecar ninguna característica en una capa GeoJSON en particular.
Necesito verificar que ningún punto a lo largo de estas líneas se cruza con la capa GeoJSON, no solo los puntos finales.
¿Cómo puedo realizar esta verificación?
Respuestas:
Puede probar la biblioteca Turf y un método como intersect: http://turfjs.org/docs/#intersect
Aquí está el ejemplo de código de esa biblioteca:
fuente
EDITAR: Vea el violín de ghybs del comentario anterior para obtener una solución más simple y mejor usando turf.js. La respuesta original sigue:
Aquí hay una versión modificada de la rutina de intersección de la biblioteca geojson-js-utils que toma las cadenas de líneas GeoJSON como entrada y produce puntos GeoJSON de su intersección como salida:
Las modificaciones fueron necesarias porque la función original era calcular las intersecciones solo de latitud y longitud, como si fueran solo coordenadas en un plano, produciendo resultados inexactos (especialmente en latitudes altas o largas distancias). El uso
L.Projection
de convertir a un sistema de coordenadas proyectadas conforme (o, en este caso, casi conforme ) durante el cálculo corrige esto.Se podría modificar aún más para aceptar objetos de geometría de folleto en lugar de solo LineStrings, pero en su lugar utilicé esta función bastante difícil de manejar para crear LineStrings para pasar a la función de intersección:
y esta función para tomar objetos Leaflet, convertirlos en LineStrings y verificar intersecciones:
Aquí hay un ejemplo de violín que usa esto con Leaflet.draw:
http://fiddle.jshell.net/nathansnider/egzxw86h/
Cuando termine de dibujar un objeto, colocará marcadores en el mapa en los puntos donde el objeto dibujado se cruza con la geometría base. No puede verificar las intersecciones mientras todavía se está dibujando un camino, porque Leaflet.draw no nos da ningún controlador de eventos para usar mientras el dibujo aún está en progreso. Sin embargo, se comprobará tan pronto como se complete un evento de sorteo.
También tenga en cuenta que esto no detectará las intersecciones para las rutas que se encuentran completamente dentro de los polígonos con los que se están comprobando. Podrías hacer esas comprobaciones usando turf.js (probablemente combinando turf.explode con turf.within ).
fuente