Ich habe eine Anwendung, in der der Benutzer einen Pfad (eine Reihe verbundener gerader Linien) zeichnet und dieser Pfad möglicherweise kein Merkmal in einer bestimmten GeoJSON-Ebene schneidet.
Ich muss überprüfen, ob kein Punkt entlang dieser Linien die GeoJSON-Ebene schneidet, nicht nur die Endpunkte.
Wie kann ich diese Prüfung durchführen?
Antworten:
Sie können die Turf-Bibliothek und eine Methode wie intersect ausprobieren: http://turfjs.org/docs/#intersect
Hier ist das Codebeispiel aus dieser Bibliothek:
quelle
BEARBEITEN : Eine einfachere und bessere Lösung mit turf.js finden Sie in Ghybs 'Geige aus dem obigen Kommentar. Die ursprüngliche Antwort folgt:
Hier ist eine modifizierte Version der Schnittroutine aus der Bibliothek geojson-js-utils , die GeoJSON-Linestrings als Eingabe verwendet und GeoJSON-Punkte ihrer Schnittmenge als Ausgabe erzeugt:
Die Änderungen waren notwendig, da die ursprüngliche Funktion darin bestand, Schnittpunkte nur aus Breiten- und Längengraden zu berechnen, als wären sie nur Koordinaten in einer Ebene, was zu ungenauen Ergebnissen führte (insbesondere bei hohen Breiten oder über große Entfernungen). Die
L.Projection
Konvertierung in ein konformes (oder in diesem Fall nahezu konformes ) projiziertes Koordinatensystem während der Berechnung behebt dies.Man könnte es weiter modifizieren, um Leaflet-Geometrieobjekte anstelle von nur LineStrings zu akzeptieren, aber stattdessen habe ich diese ziemlich unhandliche Funktion verwendet, um LineStrings zu erstellen, die an die Schnittpunktfunktion übergeben werden sollen:
und diese Funktion, um Leaflet-Objekte zu nehmen, sie in LineStrings zu konvertieren und nach Schnittpunkten zu suchen:
Hier ist ein Beispiel für eine Geige, die dies mit Leaflet.draw verwendet:
http://fiddle.jshell.net/nathansnider/egzxw86h/
Wenn Sie mit dem Zeichnen eines Objekts fertig sind, werden Markierungen auf der Karte an den Punkten platziert, an denen sich das gezeichnete Objekt mit der Basisgeometrie schneidet. Es kann nicht nach Schnittpunkten suchen, während ein Pfad noch gezeichnet wird, da Leaflet.draw uns keine Ereignishandler zur Verfügung stellt, die verwendet werden können, während die Zeichnung noch ausgeführt wird. Es wird überprüft, sobald ein Ziehungsereignis abgeschlossen ist.
Beachten Sie auch, dass dadurch keine Schnittpunkte für Pfade erkannt werden, die vollständig innerhalb der Polygone liegen, gegen die sie geprüft werden. Sie können diese Überprüfungen mit turf.js durchführen (wahrscheinlich kombinieren Sie turf.explode mit turf.within ).
quelle