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?
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.