Posizione del progetto su un percorso (grande cerchio)


9

Sto cercando questo sito SE da un paio d'ore ormai, e sto ancora lottando per trovare una soluzione alla mia domanda. Il mio obiettivo è quello dato un modo in OSM e la mia posizione (coordinate lat / lon), voglio trovare la posizione più vicina (coordinate lat / lon) in quel modo. Il punto può essere ovunque lungo la strada, non limitato ai punti utilizzati per definire la strada.

Quindi sto pensando al seguente algoritmo:

  1. Separare il percorso in bordi separati, ogni bordo collega solo due punti.
  2. Seleziona il bordo più vicino.
  3. Proietta la mia posizione su quel bordo.

Ora ci sono molte domande sul calcolo della distanza tra una posizione e un percorso:

Anche una domanda molto simile di cui non riesco a ottenere i calcoli giusti o verificati:

Ci sono anche alcune informazioni da parte del Dr. Math sull'argomento. Tuttavia, non riesco a trovare un algoritmo per calcolare la posizione nel passaggio 3. Dato che non ho toccato l'algebra (vettoriale) da un po 'di tempo, non capisco bene la logica in quelle risposte.

Qualcuno può mostrare un algoritmo per fare questo? Una soluzione in qualsiasi linguaggio di programmazione ragionevole va bene per me.


1
Dal momento che sembra fondamentale per il tuo "rifiuto" delle altre domande, ti preghiamo di approfondire "proiettare la mia posizione su quel bordo". La proiezione potrebbe non essere al limite. Credo che il problema sia affrontato nelle altre domande. (Ben fatto, per la ricerca, BTW.)
Martin F


@MartinF quella domanda calcola la distanza da un punto a una linea, ma non il punto più vicino sulla linea stessa.
bouke

V'è una soluzione a gis.stackexchange.com/a/23500/3195 anche se è forse difficile da comprendere.
Martin F,

Ah sì grazie, ho aggiornato rif. 3. La "soluzione" in quella particolare domanda si collega a una spiegazione generale del campo del problema. Anche se questo potrebbe essere sufficiente per matematici ben fondati, non capisco bene la matematica in quel documento.
bouke

Risposte:


7

L'uso di un modello sferico della terra può fornire un'accuratezza adeguata e portare a semplici calcoli veloci.

Converti tutte le coordinate in coordinate cartesiane centrate sulla terra (3D). Ad esempio, la formula

(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))

andrà bene. (Utilizza una misura della distanza in cui il raggio terrestre è un'unità, il che è conveniente.)

Scrivendo X0 = (x0, y0, z0) per il punto iniziale e X1 = (x1, y1, z1) per il punto di destinazione, che definiscono il grande cerchio (purché X0 sia distinto da X1 e i due non siano diametralmente opposti), sia U il prodotto incrociato normalizzato di X0 e X1. Questo viene calcolato in due passaggi:

V = (xv, yv, zv) = (y0*z1 - z0*y1, z0*x1 - x0*z1, x0*y1 - y0*x1)

La lunghezza di V è

|V| = sqrt(xv^2 + yv^2 + zv^2)

La normalizzazione estende V alla lunghezza dell'unità:

U = (xu, yu, zu) = V / |V| = (xv/|V|, yv/|V|, zv/|V|).

La distanza 3D orientata tra qualsiasi punto X = (x, y, z) e il piano di questo grande cerchio è solo il prodotto punto di X con Z, dato da

d = X * U = x*xu + y*yu + z*zu

Il punto più vicino in termini di distanza sulla superficie terrestre è quello più vicino al piano: quindi ha il valore assoluto più piccolo di d .

figura

Questa figura mostra un grande cerchio (in nero) determinato dai due punti bianchi e 2000 punti casuali sulla sfera colorati e ombreggiati in base alla loro distanza 3D assoluta dal piano di quel grande cerchio; cioè, | d |.

Dopo aver trovato il punto più vicino, proiettalo sul grande cerchio proiettandolo prima sul piano del grande cerchio (in 3D) e poi estendendolo radialmente verso l'esterno alla superficie terrestre. La proiezione sottrae semplicemente d * U:

X' = (x', y', z') = X - d*U = (x - d*xu, y - d*yu, z - d*zu).

La proiezione radiale semplicemente rinormalizza X 'nello stesso modo in cui V è stato rinormalizzato in U:

X'' = X' / |X'|.

(Ciò sarà problematico se | X '| = 0, che si verifica quando il punto più vicino è uno dei poli del grande cerchio. Includere un test nel codice per questa condizione, se ciò può accadere, e affrontarlo separatamente, usando il segno di d per identificare quale polo.)

Se lo desideri, converti le coordinate di X '' in (lat, lon) usando le solite formule .


Una domanda. Considera il caso non troppo insolito in cui possiamo scegliere qualsiasi X1 e X0 (sul grande cerchio), dal punto di vista dell'accuratezza, è meglio scegliere X1 e X0 vicini o molto distanti (sempre a condizione che X0 sia distinto da X1 e i due non sono diametralmente opposti)?
user189035

1
@ user189035 Selezionali a 90 gradi di distanza. Quando sono molto vicini, il loro prodotto incrociato è numericamente incerto: c'è molta cancellazione nelle sottrazioni, che porta alla perdita di cifre significative.
whuber
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.