Estou usando o PostGIS para calcular os vizinhos mais próximos dos polígonos. O que eu quero calcular é a distância mínima de cada polígono até o polígono mais próximo.
Até agora, recebi grande ajuda da resposta de Mike Toews (que cito com uma pequena alteração) aqui:
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
Então eu calculei o mínimo:
SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt
No entanto, meu desafio é calcular isso para um grande número de polígonos (1.000.000). Como o cálculo acima compara cada polígono a qualquer outro polígono, perguntei-me como poderia melhorar o cálculo para não precisar executar 10 ^ 12 cálculos.
Um pensamento que eu tinha era o buffer de cada polígono e, em seguida, calcular os vizinhos mais próximos de todos os valores dentro do buffer desse polígono e registrar o mínimo. Não tenho certeza se essa é a melhor abordagem ou se existe uma função no PostGIS que eu deveria estar usando.
EDIT: Usando uma das sugestões de Nicklas, estou experimentando 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
Isso retorna uma tabela do ID de cada polígono e se está dentro de uma certa distância ou não. É possível construir uma IF/ELSE
instrução de tipo usando SQL? (Li sobre o uso da CASE
condição) Ou devo tentar associar a tabela que produzo à tabela original e executar a consulta novamente usando ST_Distance?