Estoy usando PostGIS para calcular los vecinos más cercanos de los polígonos. Lo que queremos calcular es la distancia mínima de cada polígono, el más cercano polígono.
Hasta ahora tengo la gran ayuda de Mike Toews' respuesta (que cito con un cambio menor) 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
A continuación, he calculado el mínimo:
SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt
Sin embargo, mi reto es para calcular esto para un gran número de polígonos (1,000,000). Como el cálculo anterior se compara cada polígono a cada polígono, me pregunté cómo podría mejorar el cálculo, de forma que no tengo que realizar 10^12 cálculos.
Uno pensaba que yo tenía era la de búfer de cada polígono y, a continuación, para calcular la más cercana a los vecinos de todos los valores del buffer para que el polígono, y registrar el mínimo. No estoy seguro de si es el mejor enfoque, o si hay una función en PostGIS que me debe utilizar.
EDIT: el Uso de uno de Nicklas sugerencias, estoy experimentando con el 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 ID de cada polígono, y si es dentro de una cierta distancia o no. Es posible construir una IF/ELSE
tipo de declaración utilizando SQL? (He leído acerca del uso de la CASE
condición) O debo tratar de unirse a la mesa de lo que producen a la tabla original y, a continuación, ejecutar la consulta de nuevo el uso de ST_Distance?