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

8

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

ingrese la descripción de la imagen aquí

Tengo miles de polígonos para ser "proyectados" en 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 se cruzan con la línea, parte de ellos no.

He intentado:

  1. Localice entidades a lo largo de la herramienta de línea en ArcGIS Pro, pero solo proporciona la longitud de la línea para la superposición de parte de un polígono (descripción de la herramienta aquí, ayuda de ESRI )

  2. Geometría de límite mínimo con la opción 'casco convexo', pero solo da la distancia entre los puntos antipodales de un polígono, que no es paralelo a mi línea (descripción de la herramienta aquí ayuda de ESRI

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

Konrad Gje
fuente
¿Es tu línea una línea recta?
JiyuuSensei
Dado que tiene un requisito único, no parece irrazonable que dicha herramienta no exista. Ciertamente, podría codificar dicha herramienta utilizando funciones trigonométricas y varias funciones auxiliares de geometría, pero primero debe elegir una plataforma de software.
Vince
@JiyuuSensei no, en realidad es una red de polilínea, como una red de carreteras o de tuberías. Entonces, esto debería funcionar como calcular esta "longitud de polígono" para el segmento de línea más cercano de la red. Básicamente, es la idea de cómo funciona la herramienta Localizar características a lo largo de la línea .
Konrad Gje el

Respuestas:

7

Usando QGIS:

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

ingrese la descripción de la imagen aquí

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

(3) Inicie la Calculadora de campo y;

(3A) Cree 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")

NB: deberá cambiar 'Lines'su nombre de capa de línea real y '1'el ID de línea que tiene en su tabla de atributos.

(3B) Cree 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")

ingrese la descripción de la imagen aquí

Dado que la capa Vértices mantiene el campo fid de los identificadores de polígono 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 abarca de 8,688 a 24,45, mientras que el segundo polígono fid = 2 es de 35,062 a 42,496).

Kazuhito
fuente
5

No sé cómo hacerlo con QGIS o ArcGIS, pero lo que quieres se siente como un ancho de un cuadro delimitador orientado. Como prueba de concepto, roté su imagen de muestra para que la línea de proyección sea horizontal.

ingrese la descripción de la imagen aquí

Luego digitalicé los polígonos de la imagen y generé sobres para ellos. El ancho del sobre responde a su pregunta.

ingrese la descripción de la imagen aquí

Lo que falta es una herramienta que cree un cuadro delimitador en un ángulo dado. QGIS tiene una herramienta de cuadro de límite mínimo orientado, pero el usuario no puede dar un ángulo fijo para eso. Probablemente podría adoptar la solución PostGIS de la respuesta aceptada a esta pregunta ¿ Creando un "cuadro delimitador oblicuo" con una relación máxima ancho / alto? .

usuario30184
fuente
Esta respuesta sería el mejor enfoque porque es muy fácil obtener un cuadro delimitador orientado en QGIS (con el ancho y la altura del sobre), pero dos lados de este cuadro delimitador orientado necesariamente deben ser paralelos a la línea de referencia y esta condición no está garantizada. . Este es el problema con el polígono irregular.
xunilk
2

Basado en la respuesta de @ kazuhito, reuní una sola expresión hacky en la Calculadora de campo QGIS que debería hacer lo mismo en un solo paso.

Sin embargo, me imagino que esto requerirá muchos recursos en conjuntos de datos más grandes. Creo que el problema se adapta mejor a una implementación de Python, que obviamente maneja las referencias 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))

Esto crea primero una 'matriz' de números de nodos usando 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.

Luego puede pasar los valores de esta matriz a través de una función para generar otra matriz usando 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, luego lo introducimos line_locate_point()para determinar su longitud a lo largo de la línea especificada (vea la Nota importante a continuación).

La matriz resultante se ordena en orden ascendente utilizando lo array_sort()que nos permite obtener las distancias "más a la izquierda" y "más a la derecha" a lo largo de la línea usando 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 que se muestra como una etiqueta en los polígonos (más las distancias de línea "más a la izquierda" y "más a la derecha" separadas de la expresión anterior). A modo de comparación, también he incluido vértices extraídos y 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" a lo largo de la línea. Tenga en cuenta el polígono superior izquierdo donde el punto verde en realidad está más 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 :

Aquí se hace referencia a la geometría de la capa de línea utilizando aggregate(). Usted tendrá que cambiar el nombre de la capa ( 'lines') según sea necesario, y si tiene varias líneas, se debe añadir un filtro para especificar la línea que desea compararlo con, 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, incluso si la línea está doblada según mi ejemplo. Si desea la distancia en línea recta ... ¿tal vez calcular distance()entre los nodos relevantes?

ingrese la descripción de la imagen aquí

she_weeds
fuente
1

El mejor enfoque en QGIS para hacer eso (considerando que miles de polígonos se "proyectarán" en una línea de referencia) es determinar el cuadro delimitador girado 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. A partir del ejemplo de la siguiente imagen, el ángulo requerido se determina con el valor en la tabla de atributos de la capa Vértices que emplea esta fórmula:

90 - 63.91873763467915 = 26.081262365320853 grados.

ingrese la descripción de la imagen aquí

Introduciendo el ángulo anterior en la herramienta Rotar de Processing Toolbox y ejecutándolo:

ingrese la descripción de la imagen aquí

se produce una capa girada cuyo cuadro delimitador tiene en su tabla de atributos la longitud del polígono proyectado en la línea de referencia. Finalmente se puede observar ejecutando esta herramienta de Processing Toolbox:

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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 girada 26.081262365320853 grados (obtenida con la herramienta Rotar de Processing Toolbox) es paralela al eje X.

ingrese la descripción de la imagen aquí

xunilk
fuente