¿Cálculo del vecino más cercano en PostGIS?

8

Estoy aprendiendo a usar PostGIS y bases de datos espaciales para el análisis. Lo que estoy tratando de hacer es realizar un cálculo para obtener la distancia para el polígono más cercano en un archivo, usando el cálculo del borde, en lugar de los vértices.

¿Usando esta respuesta de Paul Ramsey para encontrar la distancia mínima de borde a borde de polígonos usando ArcGIS Desktop? que es una pregunta similar:

CREAR TABLA mytable_distances AS SELECT a.id, b.id, ST_Distance (a.geom :: geography, b.geom :: geography) como distancia de mytable a, mytable b;

Estoy intentando aplicarlo a mi base de datos espacial. Sin embargo, no entiendo la estructura de esta consulta. Creo que CREATE TABLE mytable_distances AScrea una tabla para almacenar el resultado, pero después de esta parte estoy perdido. Son ay bnombres de columna? Si es así, ¿por qué debería especificar dos columnas para calcular esto?

Se llama a mi tabla TestAreay he experimentado con algunas consultas básicas con éxito:

SELECT 
  "TestArea".hgt
FROM 
  public."TestArea"
WHERE
  "TestArea".area > 100

La estructura de la base de datos en PGAdmin III es la siguiente, con mi tabla llamada TestArea. No estoy seguro de cómo debería ser el cálculo de vecino más cercano usando mis encabezados de columna (todos estos objetos son polígonos).

ingrese la descripción de la imagen aquí

djq
fuente

Respuestas:

10

ay bson nombres de tabla de alias para la misma tabla. Esto es efectivamente un T1 CROSS JOIN T2habla DB. Esto permite que una autounión diga "qué tan cerca está una parte de otra" en una sola tabla.

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.gid < b.gid AND a.area > 100 AND b.area > 100

Es posible que desee agregar otra WHEREcláusula para limitar el número de filas, por ejemplo, agregar AND ST_Distance(a.the_geom, b.the_geom) < 1000.0para que todas las distancias sean inferiores a un kilómetro (si ha proyectado UTM).

Mike T
fuente
Gracias por tu respuesta Mike. Lo usé y ahora entiendo lo que está sucediendo. Tal vez debería hacer esto como una nueva pregunta, pero ¿hay alguna forma de optimizar el cálculo? Por ejemplo, si tengo 100 polígonos, eso es 10,000 cálculos. Resulta que tengo 1,000,000 de polígonos y me pregunto cómo reducir el cálculo.
djq
1
es exactamente por eso que introduje el último ST_Distancefiltro en la WHEREcláusula ... para decir que "no queremos encontrar distancias entre nada más allá de cierta distancia". ¿Esperaba encontrar el [uno] área más cercana a otra? Esta sería una consulta ligeramente diferente.
Mike T
Pensé que esto no solo registraría los valores por encima de un cierto nivel, sino que aún los calcularía. De ahí mi pregunta posterior ... gis.stackexchange.com/q/11979/803
djq