9 votos

Cálculo de todas las distancias de los puntos individuales a los polígonos múltiples

Tengo dos capas: una capa de puntos que define las propiedades (95 objetos), y una capa de polígonos que define las parcelas asociadas a 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 a ese punto (borde más cercano o centroide del polígono, cualquiera de los dos sirve). 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 indicación en ArcGIS 10 o QGIS 2.2+ sería muy útil.

0 votos

Esto puede hacerse con un análisis cercano en ArcGIS, pero hacerlo para cada punto requerirá un poco de automatización. ¿Está usted familiarizado con las secuencias de comandos de Python?

0 votos

Emil - No, no estoy familiarizado con Python, pero quizás debería aprender.

6voto

sashkello Puntos 325

Esto es bastante sencillo de conseguir usando QGIS (creo que cualquier versión servirá) y una sentencia SQL muy sencilla en el gestor de BD. Pero para eso su debe estar en algún tipo de base de datos espacial (Postgis o spatialite). Como es más accesible para la mayoría de la gente, supondré que se utiliza spatialite, pero las sentencias SQL son las mismas para Postgis.

  1. Crear una nueva base de datos Spatialite;
  2. Importe sus capas de puntos y polígonos a la nueva base de datos;
  3. Abra el plugin DB manager, seleccione la base de datos y ejecute una de las siguientes sentencias SQL:

Distancia de todos los puntos a todos los límites de los 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 de todos los puntos a los límites de los 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 de todos los puntos a los centroides de los 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)

Observe que puede añadir 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)

0 votos

Si necesitas más información sobre cómo crear la base de datos spatialite e importar la capa, házmelo saber y editaré la respuesta.

0 votos

Hola Alexandre, ¿por qué unirse y no un simple DÓNDE?

0 votos

Bueno, es algo que pillé de una de las presentaciones de Paul Ramsey. No recuerdo la razón por la que aboga por el uso explícito de Join, pero si lo dice... :-P Intentaré ejecutar EXPLAIN sobre ambas consultas para ver si hay alguna diferencia.

5voto

Steve Puntos 11

El Generar tabla de proximidad en ArcGIS hará lo que usted quiere, pero requiere una licencia avanzada y lo hará por todo puntos/polígonos - no sólo los asociados entre sí. Esto significa que para cada uno de sus 95 objetos obtendrá la distancia clasificada para las 211 propiedades, es decir, 20.045 filas en la tabla. Tendría que filtrar la tabla resultante o, como sugiere Emil, automatizar la tarea para crear selecciones basadas en la asociación y ejecutarla sólo en esos grupos.

En cuanto al filtrado, sí, un join (seguido de una consulta de definición o selección) es todo lo que necesitas. El resultado de la herramienta te da IN_FID y NEAR_FID. Dependiendo de cómo se ejecute la herramienta (propiedades cerca del punto, o punto cerca de la propiedad), se determinará qué FID es cada uno. A continuación, unirás tus tablas de puntos y propiedades (ambas) al resultado de la herramienta en función del FID correspondiente.

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 deben coincidir - campo nombre del punto = campo nombre del punto asociado a la propiedad. Los casos en los que no coinciden son polígonos que no están asociados a ese punto, por lo que no te importa su distancia a ese punto.

1voto

Mue Puntos 2469

Puede utilizar el Matriz de distancias en QGIS para conseguirlo. Primero tendría que convertir sus polígonos en puntos del centroide ya sea por Vector > Herramientas de geometría > Centros de polígono o mediante la versión SAGA de los centroides de los polígonos. La razón de esto es la Matriz de distancias sólo puede analizar entre 2 capas de 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 poder editar manualmente el diseño utilizando otro software como Microsoft Excel.

0 votos

Gracias Joseph -- Para un recién llegado al SIG como yo, esta es la forma más sencilla de obtener las respuestas que quería.

0 votos

De nada, amigo. Este procedimiento (y los resultados) son básicos, pero cuando te familiarices con el software SIG, puedes intentar utilizar procedimientos más avanzados que se describen en las otras respuestas.

1 votos

@nickN Sólo una nota menor a este método, los centroides no siempre caen dentro de un polígono dependiendo de su forma. Es posible podría obtener algunas distancias/clasificaciones incorrectas, pero depende de sus datos y requisitos para saber si sería un problema. Por lo demás, esto es esencialmente la versión de QGIS del GNT de ArcGIS, excepto que este último puede manejar más que puntos y no estoy seguro de cómo QGIS maneja los nombres/IDs en el resultado.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X