Cálculo de todas las distancias desde puntos individuales hasta polígonos múltiples [cerrado]

9

Tengo dos capas: una capa de puntos que define propiedades (95 objetos) y una capa de polígono que define parcelas de terreno asociadas con las propiedades (211 objetos). Cada punto se relaciona con uno o más polígonos. Lo que me gustaría producir es una tabla de distancias de cada punto a TODOS los polígonos asociados con ese punto (el borde o centroide más cercano del polígono, ya sea). Calcular la distancia más cercana es relativamente fácil en QGIS y ArcGIS, pero esos cálculos omiten todos los polígonos distantes, al menos por los métodos que he estado empleando. Idealmente me gustaría una salida de

Point_ID | distance to polygon 1 | distance to polygon 2 | distance to polygon 3 | etc.

Cualquier puntero en ArcGIS 10 o QGIS 2.2+ sería de gran ayuda.

NickN
fuente
Esto se puede hacer con un análisis cercano en ArcGIS, pero hacerlo para cada punto requerirá un poco de automatización. ¿Conoces las secuencias de comandos de Python?
Emil Brundage
Emil: No, no estoy familiarizado con Python, pero tal vez debería aprender.
NickN

Respuestas:

1

Puede usar la Matriz de distancia en QGIS para lograr esto. Primero debe convertir sus polígonos en puntos de centroide mediante Vector > Herramientas de geometría > Centroides de polígono o mediante la versión SAGA de centroides de polígono. La razón de esto es que la función Matriz de distancia solo puede analizar entre capas de 2 puntos. Además, la salida sería así:

Point_1 | PolygonCentroid_1 | Distance
Point_1 | PolygonCentroid_2 | Distance
Point_1 | PolygonCentroid_3 | Distance
Point_2 | PolygonCentroid_1 | Distance
Point_2 | PolygonCentroid_2 | Distance

La salida sería un archivo .csv para que pueda editar manualmente el diseño utilizando otro software como Microsoft Excel.

José
fuente
Gracias Joseph: para un recién llegado a GIS como yo, esta es la forma más sencilla de obtener las respuestas que quería.
NickN
Muy bienvenido amigo! Este procedimiento (y los resultados) son básicos, pero cuando se familiarice con el software SIG, puede intentar usar procedimientos más avanzados que se describen en las otras respuestas.
Joseph
1
@nickN Solo una nota muy pequeña para este método, los centroides no siempre caen dentro de un polígono dependiendo de su forma. Es posible que pueda obtener algunas distancias / clasificaciones incorrectas, pero depende de sus datos y requisitos en cuanto a si sería un problema. De lo contrario, esta es esencialmente la versión QGIS de GNT de ArcGIS, excepto que esta última puede manejar más que puntos y no estoy seguro de cómo QGIS maneja los nombres / ID en el resultado.
Chris W
5

Esto es bastante simple de lograr usando QGIS (creo que cualquier versión funcionará) y una declaración SQL muy simple en el administrador de bases de datos. Pero para eso debe estar en algún tipo de base de datos espacial (Postgis o spatialite). Dado que es más accesible para la mayoría de las personas, supondré que uso spaceialite, pero las declaraciones SQL son las mismas para Postgis.

  1. Cree una nueva base de datos Spatialite;
  2. Importe sus capas de puntos y polígonos en la nueva base de datos;
  3. Abra el complemento del administrador de base de datos, seleccione la base de datos y ejecute una de las siguientes instrucciones SQL:

Distancia de todos los puntos a todos los límites de polígonos

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f, 
  polygons_table AS g

Distancia a todos los puntos a los límites de polígonos relacionados (suponiendo que exista un campo común)

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Distancia a todos los puntos a centroides de polígonos relacionados :

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Tenga en cuenta que puede agregar cualquier campo de sus capas al resultado:

SELECT 
  f.point_id,
  f.point_number,
  g.polygon_id,
  g.parcel_name,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

O incluso todos los campos:

SELECT 
  f.*,
  g.*,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)
Alexandre Neto
fuente
Si necesita más información sobre cómo crear la base de datos espacial e importar la capa, avíseme y editaré la respuesta.
Alexandre Neto
Hola Alexandre, ¿por qué unirte y no un simple DONDE?
Luigi Pirelli
Bueno, es algo que capté de una de las presentaciones de Paul Ramsey. No puedo recordar la razón por la que defiende el uso explícito de Join, pero si lo dice ...: -PI intentará ejecutar EXPLAIN en ambas consultas para ver si hay alguna diferencia.
Alexandre Neto
Soy nuevo en SpatialLite: esta respuesta parece abordar un problema en el que estoy trabajando. Mi mesa esta en blanco. Quizás no entiendo esto. Tengo una capa de polígono llamada "Pothole VRI" y otra capa de puntos llamada "Grid Pothole Center". Agregué el siguiente código usando sus instrucciones como se indica arriba: SELECCIONE f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) COMO distancia desde 'Grid Pothole Center' AS f, 'Pothole VRI' AS g __ Me sale una tabla vacía x con estos encabezados: id, id: 1, distancia ¿Qué he hecho mal aquí? Usando QGIS 3.6
Mark Thompson
4

La herramienta Generar tabla cercana en ArcGIS hará lo que desee, pero requiere una licencia avanzada y lo hará para todos los puntos / polígonos, no solo para aquellos asociados entre sí. Esto significa que para cada uno de sus 95 objetos obtendrá la distancia clasificada para las 211 propiedades, por lo que 20,045 filas en la tabla. Tendría que filtrar la tabla resultante o, como Emil sugiere, automatice la tarea para crear selecciones basadas en la asociación y solo ejecutarla en esos grupos.

En cuanto al filtrado, sí, una combinación (seguida de una consulta de definición o selección) es todo lo que necesita. El resultado de la herramienta le proporciona IN_FID y NEAR_FID. Dependiendo de cómo ejecute la herramienta (propiedades cerca del punto o punto cerca de la propiedad), determine qué FID es cuál. Luego uniría sus tablas de puntos y propiedades (ambas) al resultado de la herramienta en función del FID apropiado.

Esto supone que cada uno de sus 211 registros de propiedades tiene un atributo que dice a cuál de los 95 puntos pertenecen, porque el siguiente paso es seleccionar (o consultar la definición) todos los registros en la (s) tabla (s) unida (s) donde dos campos de un registro deberían partido - campo de nombre de punto = campo de nombre de punto asociado a propiedad. Los casos en los que no coinciden son polígonos que no están asociados con ese punto, por lo que no le importa su distancia desde ese punto.

Chris W
fuente