Necesito calcular la longitud de los polígonos a lo largo / proyectados en una línea. Una imagen para mostrar la idea:
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:
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 )
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?
Respuestas:
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).
(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:
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:
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).
fuente
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.
Luego digitalicé los polígonos de la imagen y generé sobres para ellos. El ancho del sobre responde a su pregunta.
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? .
fuente
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.
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 esnum_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
) apoint_n()
, que devuelve la geometría real de ese nodo, luego lo introducimosline_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 usandoarray_last()
yarray_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?fuente
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.
Introduciendo el ángulo anterior en la herramienta Rotar de Processing Toolbox y ejecutándolo:
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:
En la siguiente imagen, la longitud del polígono proyectado en una línea es el valor encontrado en el ancho del campo .
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.
fuente