Jak obliczyć średnią między kilkoma punktami szerokości i długości geograficznej?
Czy powinienem po prostu obliczyć średnią arytmetyczną dla obu lat i lng?
Jak obliczyć średnią między kilkoma punktami szerokości i długości geograficznej?
Czy powinienem po prostu obliczyć średnią arytmetyczną dla obu lat i lng?
Odpowiedzi:
Mówiąc prościej, nie chcesz uśredniać współrzędnych długości i szerokości geograficznej. Może to działać całkiem dobrze na niższych szerokościach geograficznych, ale na wyższych szerokościach geograficznych zacznie dawać słabe wyniki i całkowicie rozpadać się w pobliżu biegunów.
Metodą, której użyłem do tego typu rzeczy, jest konwersja współrzędnych długości / szerokości geograficznej na współrzędne kartezjańskie 3d (x, y, z). Uśrednij je (aby uzyskać wektor kartezjański), a następnie ponownie przekonwertuj. Zauważ, że prawdopodobnie nie musisz normalizować wektora, więc rzeczywisty średni proces może być prostą sumą.
Edytuj, oto mój kod c # :
Poniższe konwertuje współrzędne kartezjańskie na szerokość / długość geograficzną (w stopniach): Usuń RAD2DEG
stałe dla radianów.
Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);
A tutaj obliczamy współrzędne kartezjańskie na podstawie szerokości / długości geograficznej (określonej w radianach):
private void CalcCartesianCoord()
{
_x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
_y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
_z = Math.Cos(LatitudeRadians);
}
Oba są wycięte i wklejone z prawdziwego kodu, stąd połączenie stopni i radianów. Istnieją tutaj właściwości, które wykonują niektóre konwersje (np. LatitudeRadians
Jest właściwością, która zwraca wartość radianową).
Pamiętaj, że optymalizacja jest możliwa: na przykład duplikaty obliczeń sinusoidalnych. Również wyliczenia wyzwalaczy mogą być buforowane, jeśli często je wywołujesz.
Opcje klastrowania : Myślę, że pojęciowym słowem szumu, które obejmuje ten rodzaj operacji, jest „klastrowanie”. Uśrednianie jest zdecydowanie najłatwiejsze do wdrożenia i działa dobrze w większości celów. Chciałbym użyć czegoś innego tylko wtedy, gdy martwisz się wartościami odstającymi [Edytuj] -> lub biegunami lub międzynarodową linią danych. [Edycja] -> również uśrednianie, podczas gdy da ci coś, co wygląda blisko środka gromady, będzie nieco wyłączone z powodu niedokładności projekcji spowodowanej tym, że stopnie lang nie zawsze są tej samej odległości od siebie w km / milach. Im większy jest średni obszar, tym większe zniekształcenie.
Oto porównanie kilku opcji grupowania
Średnia (łatwa, najszybsza, niedokładna): wystarczy zsumować wartości lat i podzielić przez liczbę i zrobić to samo dla wartości lng. Pamiętaj, aby zwrócić uwagę na przepełnienie, jeśli używasz Int32, niektóre systemy (zwłaszcza c #) po cichu przepełnią z powrotem do niskich liczb. Można uniknąć tych błędów, stosując precyzję zmiennoprzecinkową dla akumulatora sumarycznego. Jednym z problemów związanych z tą metodą jest to, że wartości odstające mogą wypaczać Twoją lokalizację. [Edytuj] -> Kolejną jest to, że matematyka w pobliżu biegunów i międzynarodowa linia dat nie są przeciętne i źle wypaczają lokalizacje.
Najbliższy sąsiad (nieco trudniejszy, wolniejszy, nie stronniczy). Zamiast uśredniania można wybrać rzeczywistą lokalizację z najmniejszą średnią odległością do wszystkich sąsiadów. To trochę jak „mediana”. Wadą jest to, że jest to kosztowne obliczeniowo, ponieważ porównujesz każdy punkt z każdym innym punktem i obliczasz odległość między nimi. Na przykład grupowanie 10 000 punktów wymagałoby obliczeń 100 milionów odległości. Nie tak wolno, ale zdecydowanie nie skaluje się dobrze.
Siatka komórki (wymaga trochę dodatkowej konfiguracji, znacznie szybciej, nie jest stronnicza) Jest to podobne do najbliższego sąsiada, ale znacznie szybsze. Możesz wybrać dowolny poziom dokładności, powiedzmy .01 deg lat lng (czyli około 1 km w przybliżeniu na zaludnionych szerokościach geograficznych) i pogrupować swoje punkty w przedziały 0,01 x 0,01 stopnia. Następnie możesz wybrać wiadro z największą liczbą punktów i albo wziąć średnią z tych punktów, albo przeprowadzić analizę najbliższego sąsiada tylko tych punktów. Często używam tej metody z naprawdę dużymi zestawami danych (setki miliardów rekordów) i uważam, że jest to równowaga między precyzją a szybkością.
Wypukły kadłub Centroid (twarde, wolniejsze, schludne wyniki): Możesz również narysować pas wokół swoich punktów, aby zdefiniować kształt, który obejmuje je wszystkie ( patrz wikipedia ), a następnie obliczyć punkt środkowy tego kształtu. Typowe funkcje środka ciężkości nie są ważone centralnie, więc trzeba by wykonać jakąś odwrotną analizę najbliższego sąsiada, używając punktów próbki wewnątrz swojego kształtu, aż znajdziesz tę najdalszą od krawędzi. Ta metoda jest naprawdę bardziej interesująca ze względu na sam wypukły kadłub niż na faktyczny algorytm znajdowania środka, który nie jest ani szybki, ani szczególnie dokładny ... ale kształt kadłuba może mieć inne przydatne zastosowania z danymi.
Nie wiem, co próbujesz osiągnąć, ale punkt, którego szerokość jest średnią szerokości oryginalnego zestawu punktów, a długość geograficzna jest średnią długości oryginalnego zestawu punktów, będzie średnią wartością oryginalnego zestawu punktów. [AKTUALIZACJA]: W powyższym śr. Jest średnią arytmetyczną.