Я використовую PostGIS для обчислення найближчих сусідів багатокутників. Що я хочу обчислити - це мінімальна відстань від кожного багатокутника, до найближчого багатокутника.
До сих пір я отримав велику допомогу від Mike Toews ' відповіді (який я цитую зі зміною незначного) тут:
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, яку я повинен використовувати.
EDIT: Використовуючи одну із пропозицій Нікласа, я експериментую з 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?