Obliczanie uśrednionych współrzędnych szerokości i długości geograficznej

19

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?

aneuryzm
źródło
3
Myślę, że stosowność uśrednienia zależy od twojego przypadku użycia. Jeśli tylko grupujesz lokalizacje restauracji miejskich w celu uzyskania mapy internetowej, z pewnością uśrednianie będzie działać przez większość czasu. Jednak w niektórych miejscach możesz napotkać błędy ... w przypadku prototypowej lub niskobudżetowej aplikacji może to jest w porządku. Jeśli jednak robisz coś poważniejszego lub obejmuje szeroki obszar, prawdopodobnie musisz wziąć pod uwagę niuanse projekcji.
Glenn
1
Jak zebrano te punkty? Zamiast pytać, jak uśrednić współrzędne, może zapytać, czy uśrednianie jest odpowiednim sposobem na skompensowanie błędów pomiaru. Ten ebook ma wiele definicji błędów.
Kirk Kuykendall
Wystarczy zauważyć, że istnieją pewne przypadki brzegowe, w których „punkt średni” nie jest dobrze zdefiniowany: np. Gdziekolwiek wzdłuż równika może być „średnia” biegunów N. i S.
Dan S.

Odpowiedzi:

15

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 :

Poniższe konwertuje współrzędne kartezjańskie na szerokość / długość geograficzną (w stopniach): Usuń RAD2DEGstał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. LatitudeRadiansJest 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.

winwaed
źródło
1
świetny punkt. Nie mogę uwierzyć, że zapomniałem o tym wspomnieć ... Ugryzanie mnie przed biegunami i linią dat wcześniej mnie gryzie.
Glenn
3
(+1) Problem nie ogranicza się do biegunów i południka + -180 stopni: gdy szerokości geograficzne punktów, które mają być uśrednione, różnią się znacznie, proste uśrednienie współrzędnych lat / lon jest równoznaczne z zastosowaniem rzutu płytki Carree, który wprowadza zmienne zniekształcenie metryczne rosnące wraz z szerokością geograficzną. Nie ma problemów numerycznych, ale średnia jest po prostu w złym miejscu. Z tego powodu obliczenia lat / lon sugerowane w odpowiedzi @ Glenna są rzadko akceptowane, z wyjątkiem stosunkowo małych regionów niepolarnych.
whuber
@winwaed dzięki, czy możesz zasugerować jakiś fragment kodu (Java) lub dobry samouczek, aby to zrobić?
aneuryzm
1
Matematyka znajduje się na stronie en.wikipedia.org/wiki/Spherical_coordinates w sekcji „Współrzędne kartezjańskie”. (moja implementacja jest w C # i częściowo zoptymalizowana - plus piszę to u dentystów !!)
Winwaed
1
Myślę, że w przypadku precyzyjnych zastosowań inżynieryjnych masz rację. Jednak, chyba że wymagana jest ekstremalna precyzja, uśrednianie współrzędnych WGS84 lat, lng w mieście, a nawet na obszarach regionalnych działa całkiem dobrze i daje wyniki, które są akceptowalnie dokładne dla większości zastosowań, w których zastosowano by uśrednianie.
Glenn
3

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.

Glenn
źródło
@winwaed ma świetny punkt na temat uśredniania współrzędnych w pobliżu biegunów, a także dodałbym międzynarodową linię daty. Na przykład, jeśli masz jeden punkt z jednej strony i jeden z drugiej, otrzymujesz złe średnie (a także ramki graniczne). To rzadko pojawia się, ale kiedy tak się dzieje, debugowanie jest prawdziwym bólem
Glenn
@whuber ma dobrą rację na temat dryfowania środka, gdy jesteś średni. Podczas gdy uśrednianie da ci coś, co wygląda blisko środka gromady, będzie trochę off z powodu niedokładności projekcji spowodowanej tym, że stopnie długości nie zawsze są w tej samej odległości od siebie w km / milach. Im większy jest średni obszar, tym większe zniekształcenie.
Glenn
0

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ą.

GuillaumeC
źródło
W twojej odpowiedzi avg = arytmetyka?
aneuryzm
1
Tak, poprawnie. Przepraszam za brak jasności. Zaktualizowałem odpowiedź. Ale nie jestem pewien, czy przynoszę tutaj coś strasznie przydatnego ...
GuillaumeC