Sur la base de la réponse de @ kazuhito, j'ai rassemblé une seule expression hacky dans la calculatrice de champ QGIS qui devrait faire la même chose en une seule étape.
Cependant, je peux imaginer que cela nécessitera beaucoup de ressources sur de plus grands ensembles de données. Je pense que le problème est mieux adapté à une implémentation Python, qui gère évidemment le référencement et l'itération bien mieux que le Field Calculator.
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))
Cela crée d'abord un «tableau» de numéros de nœuds en utilisant generate_series()
, en spécifiant le maximum comme le nombre de nœuds dans chaque polygone - c'est-à- num_points($geometry)
dire moins 1 pour ignorer le premier / dernier nœud répété.
Vous pouvez ensuite passer les valeurs de ce tableau via une fonction pour générer un autre tableau à l'aide array_foreach()
. Ici, nous transmettons le numéro de nœud du polygone (représenté par @element
) à point_n()
, qui renvoie la géométrie réelle de ce nœud, puis nous l'introduisons dans line_locate_point()
pour déterminer sa longueur le long de la ligne spécifiée (voir la remarque importante ci-dessous).
Le tableau résultant est ensuite trié par ordre croissant en utilisant array_sort()
ce qui nous permet ensuite d'obtenir les distances "les plus à gauche" et "les plus à droite" le long de la ligne en utilisant array_last()
et array_first()
. Soustrayez les deux et le résultat est la "longueur" du polygone le long de la ligne.
Voir ci-dessous pour un exemple de l'expression ci-dessus montrée comme une étiquette dans les polygones (plus les distances de ligne "les plus à gauche" et "les plus à droite" séparées de l'expression ci-dessus). Pour comparaison, j'ai également inclus des sommets extraits et des valeurs de distance de ligne pertinentes. Les sommets verts sont les sommets "les plus à gauche" et "les plus à droite" le long de la ligne. Notez le polygone en haut à gauche où le point vert est en fait plus loin le long de la ligne que le point à droite en dessous, en raison de l'angle de la ligne ...
Remarque importante :
La géométrie de la couche linéaire est référencée ici à l'aide de aggregate()
. Vous aurez besoin de changer le nom de la couche ( 'lines'
) au besoin, et si vous avez plusieurs lignes, vous devez ajouter un filtre pour spécifier la ligne que vous voulez comparer avec, par exemple: aggregate('lines','collect',$geometry,"name"='TrainLine1')
. Pour que cela fonctionne automatiquement sur la ligne la plus proche, je recommande vraiment SQL ou Python sur Field Calc.
En outre, cela calcule la "longueur" du polygone LE LONG de la ligne, y compris si la ligne est pliée selon mon exemple. Si vous voulez la distance en ligne droite ... peut-être calculer le distance()
entre les nœuds pertinents?