r-lidar-lab / ALSroads

Road corrections and measurements from ALS data
19 stars 4 forks source link

Contrôle plus fin des segments à snapper #45

Closed jfbourdon closed 2 years ago

jfbourdon commented 2 years ago

Lié en quelque sorte à #44. Présentement, advanced_snap() assume toujours que seulement les segments où CLASS %in% 1:2 est vrai sont ceux qu'on veut snapper ensemble. En ajoutant le paramètre updatable qui est un vecteur de booléens, on peut indiquer plus finement quels segments snapper parmi un groupe. À noter qu'il ne faut qu'un seul segment TRUE dans un nœud pour que le snapping soit effectué (pas de changement comportement par rapport à présentement).

Le seul changement de comportement plus important est que par défaut, tous les segments feront l'objet d'un snapping. Pour avoir le même résultat que st_snap_lines(roads, ref) actuellement, l'utilisateur devrait utiliser st_snap_lines(roads, ref, updatable = roads[["CLASS"]] %in% 1:2).

Jean-Romain commented 2 years ago

Je ne suis pas sur de comprendre. Avant si on avait trois routes classées 1,1,4 les deux première avait un poids non nul pour bouger les nœuds et la troisième n'avait aucun effet. Avec ton changement la route 4 "tire" les nœuds avec le même poids que les routes 1?

jfbourdon commented 2 years ago

Les sections de code déterminant spécifiquement la position d'un nouveau nœud ne sont pas affectées par cette PR. C'est dans mes premières suggestions de snapping que la position des noeuds était pondérée selon le poids de la classe.

Il y a deux grandes étapes dans la fonction de snapping avancé:

  1. La fonction find_best_connexion() trouve quels deux segments sont les plus probables d'être le prolongement de l'autre. Les variables influençant ce choix sont, en ordre, l'angle entre les pairs de segments, la classe et finalement le score des segments. Donc théoriquement, avec ton exemple, s'il y a un segment de classe 1 qui est parfaitement aligné dans le prolongement d'un segment de classe 4, mais pas du tout avec l'autre segment de classe 1, la connexion ne se fera pas entre les deux de classe 1. Toutefois, si les angles sont similaires entre le 1 et le 4, alors là le 1 gagnera.

  2. Les segments restant sont prolongés jusqu'à leur intersection avec les deux segments principaux (via la fonction distance_line_intersection()) et le nœud est positionné le long de ceux-ci. Dans le cas où il y a plus d'un segment restant (intersection à 4 voies ou plus), c'est la moyenne des positions d'intersection le long des segments principaux qui détermine l'emplacement du nœud.

Jean-Romain commented 2 years ago

Ok

jfbourdon commented 2 years ago

Tu me fais penser que je pourrais justement utiliser la classe pour pondérer la position du noeud à l'étape 2 au lieu de faire une bête moyenne comme présentement: https://github.com/Jean-Romain/ALSroads/blob/b294bdecfd2f06b1581b28e180829278a055386a/R/snap_tools.R#L280

Ça n'aurait toutefois un effet que pour les intersections à 4 voies et plus, ce qui n'est pas si fréquent en milieu forestier par rapport à 3 voies. Je mets ça dans la liste de choses à explorer peut-être un jour.