Używam PostGIS do obliczania najbliższych sąsiadów wielokątów. Chcę obliczyć minimalną odległość od każdego wielokąta do najbliższego wielokąta.
Do tej pory mam wielką pomoc od Mike'a Toews' odpowiedzi (które cytuję ze zmianą moll) tutaj:
SELECT
a.hgt AS a_hgt,
b.hgt AS b_hgt,
ST_Distance(a.the_geom, b.the_geom) AS distance_between_a_and_b
FROM
public."TestArea" AS a, public."TestArea" AS b
WHERE
a.hgt != b.hgt AND ST_Distance(a.the_geom, b.the_geom) < 400
Następnie obliczyłem minimum:
SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt
Jednak moim wyzwaniem jest obliczenie tego dla dużej liczby wielokątów (1 000 000). Ponieważ powyższe obliczenia porównują każdy wielokąt z każdym innym wielokątem, zastanawiałem się, jak mogę poprawić obliczenia, aby nie musiałem wykonywać obliczeń 10 ^ 12.
Jedną z moich myśli było buforowanie każdego wielokąta, a następnie obliczenie najbliższych sąsiadów wszystkich wartości w buforze dla tego wielokąta i zapisanie minimum. Nie jestem pewien, czy jest to najlepsze podejście, czy też jest funkcja w PostGIS, z której powinienem korzystać.
EDYCJA: Korzystając z jednej z sugestii Nicklas, eksperymentuję z ST_Dwithin()
:
CREATE TABLE mytable_withinRange AS SELECT
a.hgt AS a_hgt,
b.hgt AS b_hgt,
ST_DWithin(a.the_geom, b.the_geom, 400)
FROM
public."lon_TestArea" AS a, public."lon_TestArea" AS b
Zwraca tabelę identyfikacyjną każdego wielokąta i informację, czy znajduje się w pewnej odległości, czy nie. Czy można zbudować IF/ELSE
instrukcję typu za pomocą SQL? (Przeczytałem o użyciu CASE
warunku) Czy powinienem spróbować dołączyć tabelę, którą tworzę, do oryginalnej tabeli, a następnie ponownie uruchomić zapytanie przy użyciu ST_Distance?