8 votos

¿Calcular la longitud de un polígono a lo largo de una línea?

Necesito calcular la longitud de los polígonos a lo largo de / proyectados en una línea. Una imagen para mostrar la idea:

enter image description here

Tengo miles de polígonos que hay que "proyectar" sobre líneas para verificar a cuántos metros de la línea pertenecen. Los polígonos son irregulares, con diferente orientación, parte de ellos intersecan la línea, parte no.

Lo he intentado:

  1. Herramienta de localización de elementos a lo largo de una línea en ArcGIS Pro, pero sólo da la longitud de la línea para la superposición de parte de un polígono (herramienta descripción aquí Ayuda de ESRI )

  2. Geometría de límites mínimos con la opción "casco convexo", pero sólo da la distancia entre los puntos antipodales de un polígono, que no es no es paralela a la línea de mi (descripción de la herramienta aquí Ayuda de ESRI

¿Me falta una herramienta para esto en ArcGIS o QGIS? ¿Tendría una solución para esto?

0 votos

¿Es su línea una línea recta?

0 votos

Dado que tiene un requisito único, no parece descabellado que no exista una herramienta de este tipo. Ciertamente se podría codificar una herramienta de este tipo utilizando funciones trigonométricas y varias funciones de ayuda a la geometría, pero primero hay que elegir una plataforma de software.

0 votos

@JiyuuSensei no, en realidad es una red de polilíneas - como una red de carreteras o de tuberías. Así que esto debería funcionar como el cálculo de esta "longitud de polígono" para el segmento de línea más cercano de la red. Así que es básicamente la idea de cómo Herramienta de localización de elementos a lo largo de una línea funciona como.

7voto

ghotan Puntos 29

Uso de QGIS:

(1) Crear una capa de puntos de los vértices del polígono utilizando Extraer vértices (en la caja de herramientas de procesamiento de QGIS > Geometría vectorial).

enter image description here

(2) Abra la tabla de atributos de la recién creada Vértices capa.

(3) Inicie la calculadora de campo y;

(3A) Crea un nuevo campo, llamémoslo min_poly para almacenar la distancia mínima y dar una expresión:

minimum(
 line_locate_point(
  geometry:=geometry(get_feature_by_id('Lines', '1')), point:=$geometry), 
 group_by:="fid")

Nota: tendrá que cambiar 'Lines' a su nombre de línea real, y '1' a la identificación de la línea que tiene en su tabla de atributos.

(3B) Crea otro campo nuevo, llamémoslo max_poly para almacenar la distancia máxima y dar una expresión:

maximum(
 line_locate_point(
  geometry:=geometry(get_feature_by_id('Lines', '1')), point:=$geometry), 
 group_by:="fid")

enter image description here

Desde el Vértices capa mantiene fid del campo de los polígonos originales, encontrará min_poly y max_poly es la distancia mínima/máxima a lo largo de la línea para cada polígono.

(El ejemplo anterior muestra que el primer polígono fid=1 va de 8,688 a 24,45, mientras que el segundo polígono fid=2 va de 35,062 a 42,496).

5voto

Joe Puntos 16

No sé cómo hacerlo con QGIS o ArcGIS pero lo que quieres se parece a la anchura de un cuadro delimitador orientado. Como prueba de concepto he girado tu imagen de muestra para que la línea de proyección sea horizontal.

enter image description here

Luego digitalicé los polígonos de la imagen y generé sobres para ellos. La anchura del sobre responde a tu pregunta.

enter image description here

Lo que falta es una herramienta que cree un cuadro delimitador en un ángulo determinado. QGIS tiene la herramienta de caja delimitadora mínima orientada, pero el usuario no puede dar un ángulo fijo para ello. Probablemente usted podría adoptar la solución PostGIS de la respuesta aceptada a esta pregunta ¿Creación de un "cuadro delimitador oblicuo" con una relación máxima de anchura/altura? .

0 votos

Esta respuesta sería la mejor aproximación porque es muy fácil obtener un cuadro delimitador orientado en QGIS (con la anchura y la altura de la envolvente) pero dos lados de este cuadro delimitador orientado tienen que ser necesariamente paralelos a la línea de referencia y esta condición no está garantizada. Este es el problema con los polígonos irregulares.

2voto

she_weeds Puntos 126

Basándome en la respuesta de @kazuhito, he elaborado una expresión única y complicada en la calculadora de campos de QGIS que debería hacer lo mismo en un solo paso.

Sin embargo, me imagino que esto consumirá muchos recursos en conjuntos de datos más grandes. Creo que el problema es más adecuado para una implementación de Python, que obviamente maneja la referenciación y la iteración mucho mejor que la calculadora de campo.

array_last(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1)) 
- array_first(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1))

En primer lugar, se crea una "matriz" de números de nodos mediante generate_series() especificando el máximo como el número de nodos en cada polígono - esto es num_points($geometry) menos 1 para omitir el primer/último nodo repetido.

A continuación, puede pasar los valores de esta matriz a través de una función para generar otra matriz utilizando array_foreach() . Aquí pasamos el número de nodo del polígono (representado como @element ) a point_n() que devuelve la geometría real de ese nodo, entonces lo introducimos en line_locate_point() para determinar su longitud a lo largo de la línea especificada (véase Nota importante abajo).

La matriz resultante se ordena en orden ascendente mediante array_sort() que luego nos permite obtener las distancias "más a la izquierda" y "más a la derecha" a lo largo de la línea utilizando array_last() y array_first() . Resta los dos y el resultado es la "longitud" del polígono a lo largo de la línea.

Vea a continuación un ejemplo de la expresión anterior mostrada como una etiqueta en los polígonos (además de las distancias de línea "más a la izquierda" y "más a la derecha" divididas de la expresión anterior). Para comparar, también he incluido los vértices extraídos y los valores de distancia de línea relevantes. Los vértices verdes son los vértices "más a la izquierda" y "más a la derecha" de la línea. Obsérvese el polígono superior izquierdo donde el punto verde está en realidad más lejos a lo largo de la línea que el punto a la derecha debajo de él, debido al ángulo de la línea...

Nota importante :

La geometría de la capa de líneas se referencia aquí utilizando aggregate() . Deberá cambiar el nombre de la capa ( 'lines' ) según sea necesario, y si tiene varias líneas, debería añadir un filtro para especificar con qué línea se quiere comparar, por ejemplo aggregate('lines','collect',$geometry,"name"='TrainLine1') . Para que esto funcione automáticamente en la línea más cercana realmente recomiendo SQL o Python sobre Field Calc.

Además, esto calcula la "longitud" del polígono a lo largo de la línea, incluyendo si la línea está doblada según mi ejemplo. Si quiere la distancia en línea recta... quizás calcule la distance() entre los nodos relevantes?

enter image description here

1voto

Yada Puntos 9489

El mejor enfoque en QGIS para hacer eso (considerando miles de polígonos para ser "proyectados" en una línea de referencia) es la determinación de la caja delimitadora girada por el ángulo entre la línea de referencia y el eje X. Este ángulo se determina fácilmente utilizando la herramienta Extraer vértices (en la caja de herramientas de procesamiento de QGIS -> Geometría vectorial) para la línea de referencia. En el ejemplo de la siguiente imagen, el ángulo requerido se determina con el valor de la tabla de atributos de Vértices capa empleando esta fórmula:

90 - 63,91873763467915 = 26,081262365320853 grados.

enter image description here

Introduciendo el ángulo anterior en la herramienta Rotar de la Caja de Herramientas de Procesamiento y ejecutándolo:

enter image description here

se produce una capa rotada cuya caja delimitadora tiene en su tabla de atributos la longitud del polígono proyectada sobre la línea de referencia. Finalmente se puede observar ejecutando esta herramienta de la Caja de Herramientas de Procesamiento:

enter image description here

En la siguiente imagen, la longitud del polígono proyectada sobre una línea es el valor encontrado en el campo ancho .

enter image description here

Se puede observar en la siguiente imagen que la longitud proyectada del polígono considerado, sería la esperada porque la línea de referencia rotada en 26,081262365320853 grados (obtenida con la herramienta Rotar de Processing Toolbox) es paralela al eje X.

enter image description here

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