J'ai une application où l'utilisateur dessine un chemin (une série de lignes droites connectées) et ce chemin ne peut croiser aucune entité dans une couche GeoJSON particulière.
Je dois vérifier qu'aucun point le long de ces lignes ne coupe la couche GeoJSON, pas seulement les extrémités.
Comment puis-je effectuer cette vérification?
Réponses:
Vous pouvez essayer la bibliothèque Turf et une méthode comme intersect: http://turfjs.org/docs/#intersect
Voici l'exemple de code de cette bibliothèque:
la source
EDIT: Voir le violon de ghybs dans le commentaire ci-dessus pour une solution plus simple et meilleure en utilisant turf.js. La réponse originale suit:
Voici une version modifiée de la routine d'intersection de la bibliothèque geojson-js-utils qui prend les lignes de ligne GeoJSON en entrée et produit les points GeoJSON de leur intersection en sortie:
Les modifications étaient nécessaires parce que la fonction d'origine calculait les intersections à partir de la latitude et de la longitude seules, comme si elles n'étaient que des coordonnées sur un plan, produisant des résultats inexacts (en particulier à des latitudes élevées ou sur de longues distances). L'utilisation
L.Projection
de la conversion en système de coordonnées projeté conforme (ou, dans ce cas, presque conforme ) pendant le calcul corrige ce problème.On pourrait le modifier davantage pour accepter les objets de géométrie Leaflet au lieu de simplement LineStrings, mais à la place, j'ai utilisé cette fonction plutôt lourde pour créer des LineStrings à passer à la fonction d'intersection:
et cette fonction pour prendre des objets Leaflet, les convertir en LineStrings et vérifier les intersections:
Voici un exemple de violon utilisant ceci avec Leaflet.draw:
http://fiddle.jshell.net/nathansnider/egzxw86h/
Lorsque vous avez terminé de dessiner un objet, il place des marqueurs sur la carte aux points où l'objet dessiné croise la géométrie de base. Il ne peut pas vérifier les intersections alors qu'un chemin est toujours en cours de dessin, car Leaflet.draw ne nous donne aucun gestionnaire d'événements à utiliser pendant que le dessin est en cours. Il sera vérifié dès qu'un tirage au sort sera terminé.
Notez également que cela ne détectera pas les intersections pour les chemins qui se trouvent entièrement dans les polygones par rapport auxquels ils sont vérifiés. Vous pouvez faire ces vérifications en utilisant turf.js (en combinant probablement turf.explode avec turf.within ).
la source