Calcolo delle coordinate medie di latitudine e longitudine


19

Come posso calcolare la media tra diversi punti di latitudine e longitudine?

Devo solo calcolare la media aritmetica sia per lat che per lng?


3
Penso che l'adeguatezza della media dipenda dal tuo caso d'uso. Se stai solo raggruppando le posizioni dei ristoranti delle città per una mappa web, la media funzionerà per la maggior parte del tempo. Tuttavia otterrai alcuni bug in alcuni posti .. per un prototipo o un'app a basso budget forse va bene. Tuttavia, se stai facendo qualcosa di più serio o stai coprendo una vasta area, probabilmente dovrai prendere in considerazione le sfumature della proiezione.
Glenn,

1
Come sono stati raccolti questi punti? Invece di chiedere come calcolare la media delle coordinate, magari chiedere se la media è un modo appropriato per compensare gli errori di misurazione. Questo ebook ha molte definizioni di errori.
Kirk Kuykendall,

Solo una nota che ci sono alcuni casi limite in cui un "punto medio" non è ben definito: ad esempio, ovunque lungo l'equatore potrebbe essere immaginabile la "media" dei poli N. e S.
Dan S.

Risposte:


15

Per una media semplice, non si desidera mediare le coordinate di longitudine e latitudine. Questo potrebbe funzionare abbastanza bene alle latitudini più basse, ma alle latitudini più alte inizierà a dare scarsi risultati e si romperà completamente vicino ai poli.

Il metodo che ho usato per questo tipo di cose è convertire le coordinate di longitudine / latitudine in coordinate cartesiane 3d (x, y, z). Media questi (per dare un vettore cartesiano), e poi riconvertirli di nuovo. Si noti che probabilmente non è necessario normalizzare il vettore, quindi il processo medio effettivo potrebbe essere una somma semplice.


Modifica, ecco il mio codice :

Quanto segue converte le coordinate cartesiane in latitudine / longitudine (in gradi): Rimuovi le RAD2DEGcostanti per i radianti.

Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);

E qui calcoliamo le coordinate cartesiane da latitudine / longitudine (specificate in radianti):

private void CalcCartesianCoord()
{
    _x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
    _y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
    _z = Math.Cos(LatitudeRadians); 
}

Entrambi sono tagliati e incollati dal codice reale, da cui il mix di gradi e radianti. Ci sono proprietà qui che fanno alcune delle conversioni (es. LatitudeRadiansÈ una proprietà che restituisce un valore radiante).

Si noti che l'ottimizzazione è possibile: i calcoli sinusoidali duplicati, ad esempio. Inoltre, i calcoli dei trigoni potrebbero essere memorizzati nella cache se li si chiama molto.


1
ottimo punto. Non posso credere di aver dimenticato di menzionare che ... la media vicino ai poli e la linea della data mi hanno morso prima.
Glenn,

3
(+1) Il problema non si limita ai poli e al meridiano + -180 gradi: quando le latitudini dei punti da calcolare in media variano considerevolmente, una media lineare delle coordinate lat / lon equivale all'utilizzo di una proiezione Plate Carree, che introduce una distorsione metrica variabile che aumenta con la latitudine. Non ci sono problemi numerici ma la media è semplicemente nella posizione sbagliata. Per questo motivo i calcoli lat / lon suggeriti nella risposta di @ Glenn sono raramente accettabili, tranne per le regioni non polari relativamente piccole.
whuber

@winwaed grazie, puoi suggerire qualche frammento di codice (Java) o un buon tutorial per farlo?
aneuryzm,

1
La matematica è su en.wikipedia.org/wiki/Spherical_coordinates sotto 'Coordinate cartesiane'. (la mia implementazione è in C # e parzialmente ottimizzata - in più sto scrivendo questo dal dentista !!)
vinto il

1
Penso che per casi precisi di uso ingegneristico tu abbia ragione. Tuttavia, a meno che non sia richiesta un'estrema precisione, la media del WGS84 lat, le coordinate dell'ng in città e persino le aree regionali funzionano piuttosto male e danno risultati che sono accettabilmente accurati per la maggior parte degli usi in cui verrebbe utilizzata la media.
Glenn,

3

Opzioni di clustering : penso che la parola d'ordine concettuale che copre questo tipo di operazione sia "clustering". La media è di gran lunga la più semplice da implementare e funziona bene per la maggior parte degli scopi. L'unica volta che userei qualcos'altro è se sei preoccupato per i valori anomali [Modifica] -> o i poli o la linea dati internazionale. [Modifica] -> anche la media, mentre ti darà qualcosa che sembra vicino al centro del cluster, sarà un po 'fuori a causa delle imprecisioni di proiezione causate dal fatto che i gradi lat lng non sono sempre alla stessa distanza a parte in km / miglia. Maggiore è l'area nella media, maggiore è la distorsione.

Ecco un confronto di alcune opzioni di clustering

Media (facile, veloce, imprecisa): basta sommare i valori lat e dividere per il conteggio e fare lo stesso per i valori lng. Assicurati di cercare l'overflow se stai usando un Int32 alcuni sistemi (in particolare c #) torneranno silenziosamente ai numeri bassi. È possibile evitare questi errori utilizzando la precisione in virgola mobile per l'accumulatore di somma. Un problema con questo metodo è che gli outlier potrebbero distorcere la tua posizione. [Modifica] -> Un altro è che la matematica vicino ai poli e la linea di data internazionale non hanno una media buona e distorcono male le posizioni.

Il vicino più vicino (un po 'più difficile, più lento, non distorto) Piuttosto che fare la media potresti andare con la posizione attuale del latng con la minima distanza media da tutti i suoi vicini. È un po 'come prendere una "mediana". Il lato negativo è che questo è computazionalmente costoso perché si confronta ogni punto con ogni altro punto e si calcola la distanza tra di loro. Ad esempio, il raggruppamento di 10.000 punti richiederebbe 100 milioni di calcoli di distanza .. non così lenti ma sicuramente non si adattano bene.

Grid Cell (necessita di un piccolo setup extra, molto più veloce, non distorto in modo anomalo) È simile al vicino più vicino ma molto più veloce. Potresti scegliere un livello arbitrario di precisione, diciamo .01 gradi lat lng (che è di circa 1 km all'incirca a latitudini popolate) e raggruppa i tuoi punti in secchi di 0,01 x .01 gradi. È quindi possibile selezionare il bucket con il maggior numero di punti e prendere la media di quei punti o eseguire un'analisi del vicino più vicino solo su quei punti. Uso molto questo metodo con set di dati davvero grandi (centinaia di miliardi di record) e trovo un buon equilibrio tra precisione e velocità.

Centroide convesso dello scafo (risultati duri, più lenti, accurati): puoi anche disegnare una banda attorno ai tuoi punti per definire una forma che li copra tutti ( vedi Wikipedia ), quindi calcolare il punto centrale di questa forma. Le tipiche funzioni del centroide non sono ponderate al centro, quindi è necessario eseguire una sorta di analisi del vicino più vicino inverso utilizzando i punti campione all'interno della forma fino a quando non si trova quello più lontano dai bordi. Questo metodo è davvero più interessante a causa dello scafo convesso stesso anziché dell'attuale algoritmo di ricerca del centro che non è né veloce né particolarmente preciso .. ma la forma dello scafo può avere altre utili applicazioni con i tuoi dati.


@winwaed fa un grande punto sulla media delle coordinate vicino ai poli e aggiungerei anche la linea di data internazionale. Ad esempio, se hai un punto su un lato e uno su un altro ottieni delle medie sbagliate (e anche dei riquadri di delimitazione). Questo raramente si presenta, ma quando lo fa è un vero dolore eseguire il debug
Glenn,

@whuber fa un buon punto sulla deriva centrale quando in media. Mentre la media ti darà qualcosa che sembra vicino al centro del cluster, sarà un po 'fuori a causa delle imprecisioni di proiezione causate dal fatto che i gradi lat lng non sono sempre la stessa distanza in km / miglia. Maggiore è l'area nella media, maggiore è la distorsione.
Glenn,

0

Non sei sicuro di cosa stai cercando di raggiungere, ma il punto la cui latitudine è la media delle latitudini del set di punti originale e la longitudine è la media delle longitudini del set di punti originale, sarà il punto medio del set di punti originale. [AGGIORNAMENTO]: in quanto sopra, avg è la media aritmetica.


Nella tua risposta, avg = media aritmetica?
aneuryzm,

1
Si corretto. Questo è ciò che volevo dire scusa per la mancanza di chiarezza. Ho aggiornato la risposta. Ma non sono sicuro che sto portando qualcosa di terribilmente utile al tavolo qui ...
GuillaumeC
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.