Ich habe heute angefangen, mit SpatiaLite zu spielen und bin bereits auf ein Problem gestoßen.
Für jede in tableOne gespeicherte Punktposition möchte ich einen nächstgelegenen (linearen Abstand) Punkt aus tableTwo auswählen.
Bisher habe ich eine ungeschickte Lösung gefunden, die VIEW verwendet:
CREATE VIEW testview AS
SELECT
A.id ,
B.myValue,
Distance(A.Geometry, B.Geometry) AS distance
FROM tableOne AS A, tableTwo AS B
WHERE distance < 10000
ORDER BY A.Id, distance;
Und dann:
SELECT * FROM testview
WHERE distance = (SELECT MIN(distance) FROM testview AS t WHERE t.id = testview.id)
scheint den Job zu machen.
Zwei Fragen:
Gibt es eine Möglichkeit, eine solche Abfrage durchzuführen, ohne eine ANSICHT zu erstellen?
Gibt es eine andere Möglichkeit, diese Abfrage für eine bessere Leistung zu optimieren? In einem realen Szenario wird tableOne Hunderttausende von Datensätzen und tableTwo - 1,3 Millionen haben.
sql
spatialite
nearest-neighbor
Radek
quelle
quelle
Antworten:
Ich habe gerade dieses SQL getestet und es funktioniert:
Wie Sie hier lesen können "Die naive Möglichkeit, eine Abfrage zum nächsten Nachbarn durchzuführen, besteht darin, die Kandidatentabelle nach Entfernung von der Abfragegeometrie zu ordnen und dann den Datensatz mit der geringsten Entfernung zu nehmen".
Freundliche Grüße,
Andrea
quelle
Wenn Sie die Abstände zwischen allen Punktkombinationen nicht berechnen möchten, können Sie einen räumlichen Index für eine der Tabellen verwenden:
quelle
f_table_name = 'A'
Muss ich für die Zeile 'A' durch den tatsächlichen Tabellennamen (Tabelle 1) ersetzen? Ich habe es so oder so versucht und es gibt immer noch nichts zurück, warum könnte das seinf_table_name = 'A'
sollte seinf_table_name = 'tableOne'
. Beachten Sie, dass diese Anforderung Spatialite> 4.x voraussetzt (SpatialIndex
virtuelle Tabelle wird verwendet). Haben Sie versucht, dassearch_frame
für Ihren Anwendungsfall anzupassen ? Im obigen Beispiel wird angenommen, dass sich die Punkte in einer maximalen Entfernung von 10000 Metern befinden.Seit Version 4.4.0 unterstützt SpatiaLite einen virtuellen KNN-Tabellenindex für Probleme mit dem nächsten Nachbarn. Hier ist eine Abfrage, die die nächstgelegene Linie in einer Linestring-Tabelle zu jedem Punkt in einer Punktetabelle findet.
quelle
Sie können Ihre Abfrage so vereinfachen.
Für eine allgemeinere Lösung kann es sich lohnen, diese PostGIS Nearest Neighbor-Funktion zu konvertieren: http://blog.mackerron.com/2011/03/postgis-nearest-neighbour/
quelle
SQL error: "misuse of aggregate: MIN()"