Я использую PostGIS для вычисления ближайших соседей полигонов. То, что я хочу вычислить, - это минимальное расстояние от каждого многоугольника до ближайшего многоугольника.
До сих пор мне очень помог ответ Майка Тьюса (который я цитирую с небольшим изменением) здесь:
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
Тогда я рассчитал минимум:
SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt
Однако моя задача состоит в том, чтобы рассчитать это для большого числа полигонов (1 000 000). Поскольку приведенный выше расчет сравнивает каждый многоугольник с любым другим многоугольником, я удивлялся, как можно улучшить вычисление, чтобы мне не приходилось выполнять 10 ^ 12 вычислений.
Одна мысль, которую я имел, состояла в том, чтобы буферизовать каждый полигон, а затем вычислить ближайших соседей всех значений в буфере для этого полигона и записать минимум. Я не уверен, является ли это лучшим подходом, или есть ли в PostGIS функция, которую я должен использовать.
РЕДАКТИРОВАТЬ: Используя одно из предложений Никласа, я экспериментирую с 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
Это возвращает таблицу идентификатора каждого многоугольника, и находится ли он на определенном расстоянии или нет. Можно ли построить оператор IF/ELSE
типа с использованием SQL? (Я читал об использовании CASE
условия) Или я должен попытаться соединить таблицу, которую я создаю, с исходной таблицей, а затем снова выполнить запрос, используя ST_Distance?