Estoy usando PostGIS para calcular los vecinos más cercanos de polígonos. Lo que quiero calcular es la distancia mínima desde cada polígono hasta el polígono más cercano.
Hasta ahora he recibido una gran ayuda de la respuesta de Mike Toews (que cito con un pequeño cambio) aquí:
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
Luego calculé el mínimo:
SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt
Sin embargo, mi desafío es calcular esto para una gran cantidad de polígonos (1,000,000). Como el cálculo anterior compara cada polígono con cualquier otro polígono, me pregunté cómo podría mejorar el cálculo para no tener que realizar 10 ^ 12 cálculos.
Uno pensaba que tenía que almacenar cada polígono en el búfer y luego calcular los vecinos más cercanos de todos los valores dentro del búfer para ese polígono y registrar el mínimo. No estoy seguro de si ese es el mejor enfoque, o si hay una función en PostGIS que debería estar usando.
EDITAR: Utilizando una de las sugerencias de Nicklas, estoy experimentando con 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
Esto devuelve una tabla de la ID de cada polígono, y si está dentro de una cierta distancia o no. ¿Es posible construir una IF/ELSE
declaración de tipo usando SQL? (Leí sobre el uso de la CASE
condición) ¿O debería intentar unir la tabla que produzco a la tabla original y luego volver a ejecutar la consulta usando ST_Distance?