Come posso calcolare la media tra diversi punti di latitudine e longitudine?
Devo solo calcolare la media aritmetica sia per lat che per lng?
Come posso calcolare la media tra diversi punti di latitudine e longitudine?
Devo solo calcolare la media aritmetica sia per lat che per lng?
Risposte:
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 c # :
Quanto segue converte le coordinate cartesiane in latitudine / longitudine (in gradi): Rimuovi le RAD2DEG
costanti 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.
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.
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.