Algorithme: déplacer une polyligne source vers une polyligne de référence (complètement ou peut-être partiellement)

10

Dans notre système, nous avons besoin de déplacer certaines lignes source (avec une faible précision) vers des lignes de référence (avec une haute précision). Les images suivantes donnent les cas d'utilisation normaux. Le rouge est une ligne source et le bleu est une ligne de référence.

Le rouge est la ligne source et le bleu est la ligne de référence

Dans ce cas, la ligne source serait déplacée partiellement et le résultat serait comme le montre la ligne verte:

Déplacer le résultat 1

Il y a des situations où la ligne source doit être déplacée complètement.

Exemple 2

Résultat:

Déplacer le résultat 2

Actuellement, notre solution consiste à projeter le point de tête / extrémité de la ligne source sur la ligne de référence et vice versa, puis à trouver les points projetés sur la ligne source et de référence. Avec ces points projetés, nous pouvons extraire la partie nécessaire de la ligne source et de référence, puis les combiner en une nouvelle.

Cela fonctionne pour la plupart des cas, mais il y a des cas où cette méthode ne fonctionne pas. Plus précisément, lorsque l'une des lignes a la forme d'un "C" ou que le point de tête est très proche du point final. Les deux images suivantes donnent le scénario.

C comme ligne de forme

En appliquant mon algorithme, nous obtenons le résultat:

Résultats

D'une certaine manière, cela est compréhensible car l'algorithme actuel trouve simplement les points projetés et extrait les lignes.

Ce que nous attendions est quelque chose comme ceci:

Résultats attendus

Donc, j'ai besoin d'un algorithme plus robuste pour le faire afin qu'il puisse également gérer des cas spéciaux comme le précédent. J'ai essayé de projeter tous les points d'une ligne à une autre et de trouver les deux points projetés les plus proches du point de tête / extrémité de la ligne projetée, mais il n'y a pas eu de chance. Je peux toujours trouver des cas qui donnent des résultats inattendus.

Quelqu'un a-t-il déjà rencontré des problèmes similaires? Ce serait également formidable s'il existe un logiciel ou une bibliothèque capable de faire un travail similaire. Toute réponse sera appréciée.

mfdev
la source
1
Peut-être que cela vous aidera lorsque vous regarderez comment la topologie dans ArcGIS vérifie si les objets sont coïncidents: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… paragraphe "Traitement de cluster".
Jens
Merci pour votre réponse, @Jens. Mais je crains que ce n'est pas ce que je veux.
mfdev
Ces lignes représentent-elles un réseau? Existe-t-il des relations topologiques entre eux?
julien
Il n'est pas nécessaire que ce soit un réseau et éventuellement aucune relation topologique.
mfdev

Réponses:

4

Mon estimation est que les cas finaux seront souvent des exceptions qui ne sont pas programmables par machine. J'ai travaillé avec des problèmes similaires et ils nécessitaient toujours une certaine quantité d'édition manuelle. Ce dont vous avez besoin pour régler ce sont les exceptions qui sont produites par le cas et les servir dans un système de gestion du travail à un utilisateur final.

lewis
la source
Un exemple quelque peu similaire de cela peut être vu ici: vividsolutions.com/jcs JCS va un long chemin pour automatiser la fusion de la géométrie, mais comprend également un contrôle qualité manuel pour les géométries qu'il ne peut pas fusionner complètement. vividsolutions.com/… est construit à partir de celui-ci et permet un contrôle qualité et ajoute un suivi des problèmes pour les géométries difficiles.
DPierce
1
Toutes les solutions topologiques ne peuvent pas être automatisées par programmation et, dans les grandes entreprises, ces solutions sont développées de manière similaire à l'exemple, car la chute de la confusion peut être importante et cyclique par nature avec des géométries de transport complexes avec un taux de changement élevé.
lewis
2

Vous aurez besoin d'une tolérance d'accrochage et d'une tolérance de virage pour cet algorithme (je suppose que vous avez déjà une tolérance d'accrochage).

Projetez le point de tête de la ligne source à la ligne de référence. Brisez la ligne de référence à ce point projeté.

Traversez la ligne source du point de tête au premier sommet pour obtenir la direction du déplacement le long de la ligne source. Parcourez chacune de vos deux lignes de référence du point source projeté au sommet suivant. Si la direction de déplacement se situe dans la tolérance de virage de la direction de déplacement à partir du point de tête sur votre ligne source, appliquez votre algorithme normalement, mais uniquement en utilisant cette section de la ligne de référence. Si l'algorithme atteint la fin de la ligne source, vous avez terminé. Sinon, coupez la ligne source entre la pièce transformée et la pièce non transformée (qui inclura le point final).

Maintenant, prenez la pièce non transformée et projetez le point final sur la ligne de référence d'origine. Suivez la même procédure que précédemment ... parcourez la source du point final au premier sommet pour trouver le sens de la marche. Rompez la ligne de référence au point final du projet et parcourez chacun pour trouver si la direction de déplacement à partir du point final projeté se situe dans la tolérance de virage. Si c'est le cas, utilisez cette partie de la ligne de référence pour appliquer l'algorithme normalement.

N'oubliez pas qu'à ce stade, vous n'utilisez que la pièce non transformée, de sorte que vous ne chevaucherez pas avec la transformation du point de tête.

Enfin, si nécessaire, fusionnez les deux pièces de ligne résultantes: la pièce transformée du point de tête du point de tête projeté au point de rupture non transformé, puis sur la pièce transformée du point de fin du point de rupture non transformé au point de fin projeté.

blord-castillo
la source