[PYTHON] Ziel GIS Master # 2 Durchsuchen Sie nahe gelegene Straßen mit hoher Geschwindigkeit mit R-Tree

Im vorherigen Beitrag habe ich die Straße NW aus OSM extrahiert

Letztes Mal habe ich versucht, die Straße NW aus OSM zu extrahieren. Ziel ist es, GIS Master # 1 Road NW aus OpenStreetMap zu extrahieren

Wenn Sie genauer hinschauen, können POI-ähnliche Elemente wie Ampeln, Postämter und Cafés enthalten sein. Sie können das Polygon auch auf der Website verwenden. Ja, na klar. → Allerdings nicht alle. Es gibt verschiedene Möglichkeiten, das Gelände zu gestalten, von denen einige nur Gebäude haben und einige Parkplätze umfassen. Möglicherweise erstellen Sie auch Polygon. Nein, es ist immer noch diese Qualität, also respektiere ich die Mapper wirklich. Ich kann nicht Ich bin immer dankbar für Ihre Hilfe.

Sie können verschiedene Dinge bekommen. Aber ich werde diese Geschichte zum dritten Mal speichern.

Dieses Mal möchte ich schreiben, wie man die extrahierte Straße NW benutzt.

Ich möchte eine Straße in der Nähe meines aktuellen Standorts finden

Was ich tun möchte, ist, welche Straße diesem Ort am nächsten ist Es ist von der extrahierten Straße NW zu zeichnen.

(Wenn der GPS-Fehler nicht so groß ist) Da davon ausgegangen wird, dass die Straße den vom GPS-Logger erhaltenen Standortinformationen am nächsten kam, Alles was Sie tun müssen, ist die nächste Straße zu zeichnen. Es ist ein sehr einfacher Kartenabgleich.

Wie machst du das? (Problem)

Als Voraussetzung Es gibt häufig mehrere Mittelpunkte (Knoten) auf der Straße, die aus dem OSM herausgezogen werden. Es kann zum Zeitpunkt einer Kurve als Knoten oder als Kreuzung mit einer anderen Straße eingegeben werden. → Letzteres ist auch interessant. Lass es.

In diesem Fall lassen wir den GPS-Fehler vorerst. Messen Sie die Entfernung zwischen Ihrem aktuellen Standort und allen Knoten. Die Straße mit dem kürzesten Knoten ist diejenige Es kann gesagt werden, dass es eine Straße ist, die angepasst werden sollte.

Berechnen wir nun die Entfernung zwischen dem aktuellen Standort und allen Knoten! Nur für den Fall, ich möchte ungefähr 3 Kandidaten herausbringen, also ordnen wir sie in aufsteigender Reihenfolge der Entfernung an und holen die 3 Straßen-IDs von oben! Ist es besser, alle Knoten in die Datenbank aufzunehmen und nach SQL zu suchen? In absteigender Reihenfolge der euklidischen Entfernung anordnen! !!

order by SQRT(POW((lon-Zielposition lon),2) + POW((lat-Zielposition lat),2)) desc

↑ Ich habe es nicht ausprobiert, aber ich weiß nicht, wann es enden wird. Es mag überraschend schnell sein, aber Ich kann nur die späte Zukunft sehen. Es wird abgelehnt.

Wie geht's (Lösung)

Es ist eine Lösung "Lösung", indem man w wegläuft Ich denke, es gibt viele Möglichkeiten, aber für mich war es relativ einfach und schnell.

R-tree Aus R-Baum Wikipedia

Dies. Der Punkt ist, die Positionsdaten zu indizieren. Einfach mit Python zu verwenden. → Es scheint sich um eine Python-Wrapper-Version von libspatialindex zu handeln. Sie müssen zuerst libspatialindex installieren. Ich erinnere mich, dass ich ein wenig süchtig nach der Installation war, aber ... Wenn ich nach der Installation versuchte, mit Python zu importieren, wie unten gezeigt, wurde manchmal die Fehlermeldung "libspatialindex ~ kann nicht gelesen werden" angezeigt. from rtree import index

Es hätte funktionieren sollen, wenn ich den Pfad mit der so-Datei von libspatialindex in LD_LIBRARY_PATH in die Umgebungsvariable eingefügt hätte. Das ist alles für mich.

Wenn Sie bereit sind, fügen Sie die OSM-Straßeninformationen in den R-Baum ein und erstellen Sie einen Index. Da die Straße NW im vorherigen Beitrag genommen wurde, werden alle Zwischenpunkte (Positionsreihen, die LINE STRING sind (Position 1, Position 2, ...)) von dort entfernt. → Da der Abstand zwischen diesen Positionen variiert, halte ich es für in Ordnung, eine lineare Interpolation durchzuführen.

Ich werde es einfügen.

#Anwendungsbeispiel mit Bezug auf das Tutorial

#Baumeigenschaften
p = rtree.index.Property()
p.dat_extension = 'data'
p.idx_extension = 'index'
file_idx = index.Index('rtree', properties = p)

#Ab hier unten sind alle Punkte. Loop oder irgendetwas ist in Ordnung

#Nach der Suche ist es praktisch, wenn Sie ein Objekt erstellen und Informationen eingeben
hogehogeho = {}
hogehogeho["name"]="test" #Osm hier_Gibst du einen Ausweis oder so

#Wenn Sie es in ein Rechteck setzen, lon1,lat1,lon2,Obwohl es lat2 ist, werde ich einen Punkt setzen, also werde ich vorerst weiterhin den gleichen Wert setzen
file_idx.insert(id=id, bounds=(lon1, lat1, lon1, lat1), obj=hogehogeho)

Ich habe file_idx.insert (~) an allen Punkten ausgeführt, um einen Index zu erstellen. Ich denke, allein in Japan werden es einige zehn GB sein. Seien Sie vorsichtig mit der Kapazität der Festplatte.

Sobald Sie hier angekommen sind, suchen Sie einfach.

#Sie können so suchen
# - target_lon,target_lat ist die Standortinformation, nach der Sie suchen möchten
# -3 ist die Anzahl der Suchvorgänge
# -Grundsätzlich können Sie sie in der Reihenfolge ihrer Nähe nehmen(Bestätigung erforderlich)
#→ Bei der Berechnung der Entfernung unter Berücksichtigung der Erde habe ich das Gefühl, dass einige Dinge leicht außer Betrieb waren.
#Aber ich denke nicht, dass es sich um 1 m verschieben wird, also möchte ich denken, dass es in Ordnung ist!
for pdat in file_idx.nearest((target_lon,target_lat), 3, objects=True):
    print(pdat.object['name'])
    #Der Trefferindex ist pdat.Da es mit bbox genommen werden kann, Ziel_lon,target_lat und pdat.Wenn Sie die Entfernung von bbox berechnen, wird die tatsächliche Entfernung ermittelt.

Betriebsüberprüfung App

Also habe ich versucht, den Betrieb zu überprüfen. Ich habe ein Prototyp-Tool erstellt, das die Straße in der Nähe zeichnet, wenn Sie auf die Karte klicken. Sie können sehen, dass die Straße in der Nähe an der Stelle gezeichnet wird, an der auf die rote Diamantmarkierung geklickt wird. Die Farben sind Rot-> Orange-> Grün-> Hellblau-> Blau-> Schwarz, und die Straßen in der Nähe der angeklickten Position werden angezeigt. Die Kronen werden in der Reihenfolge 1 bis 5 angezeigt. Nun, ich glaube nicht, dass es eine 2 gibt, aber ich denke, es ist unter der 3.

akihabara_rtree.png

Die Suchgeschwindigkeit ist übrigens fast unbemerkt. Ich denke, es ist keine Übertreibung zu sagen, dass es ein Moment ist. Dies sollte nicht der Fall sein, wenn Sie die Entfernung mit allen Punkten berechnet haben.

Jetzt bist du bereit für den Kampf

Es ist jetzt möglich, mit hoher Geschwindigkeit nach Straßen in der Nähe dieses Punktes zu suchen. Danach ist es notwendig, den erfassten Straßenwinkel gemäß den Daten abzugleichen. → Hey, das ist das Ärgerlichste ... Wenn die GPS-Genauigkeit gut ist, sollte die nächste Straße mit Stimmenmehrheit festgelegt werden. .. .. Das ist schwierig. Ja. Ich kämpfe auch.

Aber wir sind bereit für den Kampf! Ich würde gerne sagen, dass.

Später reden?

OSM-Straßen sind ziemlich eigenartig, und selbst nach dem Durchqueren einer Kreuzung bleibt die ID unverändert und wird häufig L-förmig. Für meinen Gebrauch möchte ich es durch eine Kreuzung in eine Straße teilen, also Ich habe einen Vorprozess durchgeführt, um die Originaldaten zu teilen. Ich habe auch den oben hergestellten R-Baum dafür verwendet. → Wie sehr magst du ... Durchsuchen Sie alle Knoten in der Reihenfolge nach Baum und extrahieren Sie Knoten mit einem Abstand von 0. Eine Straße mit einem Knoten mit einem Abstand von 0 kann als Kreuzung bezeichnet werden, wenn es sich um einen Punkt handelt, an dem sich mehrere eindeutige osm_ids überlappen. Schneiden Sie in diesem Fall die Straße ab. Es wird geschnitzt und mit so etwas wie sub_id versehen, um etwas Einzigartiges zu erzeugen.

Beiseite

Ich habe die rtree-Bibliothek in einem anderen Fall verwendet, aber die Suche nach Nahdaten und der Bereichssuche ist extrem schnell. Außerdem war es zu dieser Zeit eine Entfernungssuche nach 8-dimensionalen Daten. Übrigens können durch Angabe von Eigenschaften mehrere Dimensionen realisiert werden. p.dimension = 3 Der Hauptgrund, warum ich mich für diese Bibliothek entschieden habe, ist, dass sie mehrere Dimensionen unterstützt. → Wenn 2D als mehrdimensional bezeichnet wird, ist es wahrscheinlich alles mehrdimensional. Ich denke, es gab wenige Dinge, die in 8 Dimensionen getan werden konnten.

Ursprünglich habe ich eine Datenbank verwendet, um eine 8-dimensionale Entfernungsberechnung durchzuführen (die euklidische Entfernung sein sollte). Ich habe eine Abfrage gemacht, um 5 Elemente in aufsteigender Reihenfolge der Entfernung zu erhalten. Die Anzahl der Datensätze beträgt Hunderttausende, aber eine Suche dauert weniger als 10 Sekunden. Als ich jedoch nach R-Tree suchte, dauerte es weniger als 3 Sekunden und ich konnte das Ergebnis in 1/3 der Zeit erhalten. groß!

Seitdem habe ich mich daran gewöhnt, R-Tree für alles zu verwenden.

Recommended Posts

Ziel GIS Master # 2 Durchsuchen Sie nahe gelegene Straßen mit hoher Geschwindigkeit mit R-Tree
Ziel GIS Master # 3 Ich habe die netzartige Geokodierungsmethode untersucht