Dzisiaj zacząłem grać ze SpatiaLite i już natknąłem się na problem.
Dla każdego położenia punktu zapisanego w tableOne chciałbym wybrać jeden, najbliższy (odległość liniowa) punkt z tableTwo.
Do tej pory wymyśliłem niezdarne rozwiązanie, które wykorzystuje VIEW:
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;
I wtedy:
SELECT * FROM testview
WHERE distance = (SELECT MIN(distance) FROM testview AS t WHERE t.id = testview.id)
zdaje się wykonywać pracę.
Dwa pytania:
Czy istnieje sposób na wykonanie takiego zapytania bez tworzenia WIDOKU?
Czy istnieje inny sposób optymalizacji tego zapytania w celu uzyskania lepszej wydajności? W rzeczywistym scenariuszu tableOne będzie miało setki par tysięcy rekordów, a tableTwo - 1,3 miliona.
sql
spatialite
nearest-neighbor
radek
źródło
źródło
Odpowiedzi:
Właśnie przetestowałem ten SQL i działa:
Jak można przeczytać tutaj: „Naiwnym sposobem wykonania zapytania najbliższego sąsiada jest uporządkowanie tabeli kandydatów na odległość od geometrii zapytania, a następnie zapisanie rekordu z najmniejszą odległością”.
Z poważaniem,
Andrea
źródło
Jeśli nie chcesz obliczać odległości między wszystkimi kombinacjami punktów, możesz użyć indeksu przestrzennego na jednej z tabel:
źródło
f_table_name = 'A'
, czy muszę zastąpić „A” rzeczywistą nazwą tabeli (tabela pierwsza)? Próbowałem w obu kierunkach i nadal nic nie zwraca, dlaczego tak może byćf_table_name = 'A'
powinno byćf_table_name = 'tableOne'
. Zauważ, że to żądanie zakłada spatialite> 4.x (SpatialIndex
używana jest wirtualna tabela). Czy próbowałeś dostosowaćsearch_frame
swój przypadek użycia? W powyższym przykładzie zakłada się, że punkty znajdują się w maksymalnej odległości 10000 metrów.Od wersji 4.4.0 SpatiaLite obsługuje indeks tabeli wirtualnej KNN dla problemów z najbliższym sąsiadem. Oto zapytanie, które znajduje najbliższą linię w tabeli linii do każdego punktu w tabeli punktów.
źródło
Możesz uprościć swoje zapytanie w ten sposób.
Aby uzyskać bardziej ogólne rozwiązanie, warto spróbować przekonwertować tę funkcję PostGIS Nearest Neighbor: http://blog.mackerron.com/2011/03/postgis-nearest-neighbour/
źródło
SQL error: "misuse of aggregate: MIN()"