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?