Algoritmo: sposta una polilinea di origine su una polilinea di riferimento (completamente o forse parzialmente)


10

Nel nostro sistema, ci sono i requisiti che vogliamo spostare alcune linee di origine (con bassa precisione) su linee di riferimento (con alta precisione). Le immagini seguenti mostrano i normali casi d'uso. Quello rosso è una linea di origine e quello blu è una linea di riferimento.

Quello rosso è la linea di origine e quello blu è la linea di riferimento

In questo caso, la linea di origine verrebbe spostata parzialmente e il risultato sarebbe come mostrato dalla linea verde:

Sposta risultato 1

Ci sono situazioni in cui è necessario spostare completamente la linea di origine.

Esempio 2

Risultato:

Sposta risultato 2

Attualmente la nostra soluzione è proiettare il punto di testa / fine della linea di origine sulla linea di riferimento e viceversa, quindi trovare punti proiettati sulla linea di origine e di riferimento. Con questi punti proiettati, possiamo estrarre la parte necessaria della sorgente e della linea di riferimento e poi combinarli in uno nuovo.

Questo funziona nella maggior parte dei casi, ma ci sono casi in cui questo metodo non funziona. In particolare, quando una delle linee ha una forma simile a "C" o il punto della testa è molto vicino al punto finale. Le prossime due immagini danno lo scenario.

C come linea di forma

Applicando il mio algoritmo, otteniamo il risultato:

risultati

In un certo senso è comprensibile perché l'algoritmo corrente trova solo punti proiettati ed estrae linee.

Quello che ci aspettavamo è qualcosa del genere:

risultati aspettati

Quindi quello di cui ho bisogno è un algoritmo più robusto per farlo in modo che possa gestire anche casi speciali come quello precedente. Ho cercato di proiettare tutti i punti da una linea all'altra e di trovare i due punti proiettati più vicini al punto principale / finale della linea proiettata, ma non c'è stata fortuna. Posso ancora trovare casi che danno risultati inaspettati.

Qualcuno ha riscontrato problemi simili prima? Sarebbe anche bello se ci fosse un software o una libreria in grado di fare un lavoro simile. Ogni risposta sarà apprezzata.


1
Forse ti aiuterà quando guarderai come la Topologia in ArcGIS controlla se gli oggetti sono coincidenti: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… paragrafo "Elaborazione dei cluster".
Jens

Grazie per la tua risposta, @Jens. Ma temo che non sia quello che voglio.
mfdev

Queste linee rappresentano una rete? Ci sono relazioni topologiche tra loro?
luglio

Non deve essere una rete e forse nessuna relazione topologica.
mfdev,

Risposte:


4

La mia stima è che i casi finali saranno spesso eccezioni che non sono programmabili dalla macchina. Ho lavorato con problemi simili e hanno sempre richiesto una certa quantità di modifica manuale. Ciò che è necessario sintonizzare sono le eccezioni che vengono prodotte dal caso e che vengono servite in un sistema di gestione del lavoro a un utente finale.


Un esempio un po 'simile di questo può essere visto qui: vividsolutions.com/jcs JCS fa molto per automatizzare la conflazione della geometria, ma include anche il QA manuale per le geometrie che non può fondere completamente. vividsolutions.com/… È costruito da esso e consente il controllo qualità e aggiunge il rilevamento dei problemi per geometrie difficili.
DPierce

1
Tutte le soluzioni topologiche non possono essere automatizzate mediante la programmazione e, nelle grandi imprese, tali soluzioni sono sviluppate in modo simile all'esempio in quanto la conflazione può essere ampia e ciclica in natura con geometrie di trasporto complesse con un alto tasso di variazione.
Lewis

2

Avrai bisogno di una tolleranza di snap e di una tolleranza di turno per questo algoritmo (suppongo che tu abbia già una tolleranza di snap).

Proiettare il punto di testa dalla linea di origine alla linea di riferimento. Rompere la linea di riferimento in questo punto proiettato.

Attraversare la linea della sorgente dal punto di testa al primo vertice per ottenere la direzione di viaggio lungo la linea della sorgente. Attraversa ciascuna delle tue due linee di riferimento dal punto sorgente proiettato al vertice successivo. Se la direzione del viaggio rientra nella tolleranza di virata della direzione del viaggio dal punto di testa sulla linea di origine, applica l'algoritmo normalmente, ma usando solo quella sezione della linea di riferimento. Se l'algoritmo raggiunge la fine della linea di origine, il gioco è fatto. In caso contrario, interrompere la linea di origine tra il pezzo trasformato e il pezzo non trasformato (che includerà il punto finale).

Ora prendi il pezzo non trasformato e proietta il punto finale sulla linea di riferimento originale. Esegui la stessa procedura di prima ... attraversa la sorgente dal punto finale al primo vertice per trovare la direzione di marcia. Interrompere la linea di riferimento sul punto finale del progetto e attraversare ciascuno di essi per scoprire se la direzione di spostamento dal punto finale previsto rientra nella tolleranza di virata. In tal caso, utilizzare quel pezzo della linea di riferimento per applicare l'algoritmo normalmente.

Ricorda, a questo punto stai usando solo il pezzo non trasformato, quindi non ti sovrapporrai alla trasformazione del punto di testa.

Infine, unire i due pezzi di linea risultanti, se necessario: il punto di testa ha trasformato il pezzo dal punto di testa proiettato al punto di interruzione non trasformato e quindi sul punto finale ha trasformato il pezzo dal punto di interruzione non trasformato al punto finale proiettato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.