Biorąc pod uwagę zestaw punktów szerokości i długości geograficznej, jak mogę obliczyć szerokość i długość geograficzną punktu środkowego tego zestawu (czyli punktu, który wyśrodkowuje widok we wszystkich punktach)?
EDYCJA: rozwiązanie Pythona, którego używałem:
Convert lat/lon (must be in radians) to Cartesian coordinates for each location.
X = cos(lat) * cos(lon)
Y = cos(lat) * sin(lon)
Z = sin(lat)
Compute average x, y and z coordinates.
x = (x1 + x2 + ... + xn) / n
y = (y1 + y2 + ... + yn) / n
z = (z1 + z2 + ... + zn) / n
Convert average x, y, z coordinate to latitude and longitude.
Lon = atan2(y, x)
Hyp = sqrt(x * x + y * y)
Lat = atan2(z, hyp)
math
latitude-longitude
geo
zeke
źródło
źródło
z
, proszę?Odpowiedzi:
Proste podejście polegające na zwykłym uśrednieniu ich ma dziwne przypadki krawędziowe z kątami, gdy zawijają się od 359 'z powrotem do 0'.
Znacznie wcześniej pytanie na SO poproszony o znalezienie średni zestaw kompasu kątami.
Rozszerzeniem zalecanego tam podejścia dla współrzędnych sferycznych byłoby:
źródło
Dzięki! Oto wersja C # rozwiązań OP przy użyciu stopni. Wykorzystuje klasę System.Device.Location.GeoCoordinate
źródło
Uważam, że ten post jest bardzo przydatny, więc oto rozwiązanie w PHP. Używałem tego z powodzeniem i po prostu chciałem zaoszczędzić trochę czasu innemu deweloperowi.
źródło
Bardzo przydatny post! Zaimplementowałem to w JavaScript, niniejszym mój kod. Użyłem tego z powodzeniem.
źródło
Wersja JavaScript oryginalnej funkcji
źródło
Aby ewentualnie zaoszczędzić komuś minutę lub dwie, oto rozwiązanie, które zostało użyte w Objective-C zamiast w Pythonie. Ta wersja pobiera NSArray of NSValues, który zawiera MKMapCoordinates, który został wywołany w mojej implementacji:
źródło
<GLKit/GLKMath.h>
i używajGLKMathDegreesToRadians
iGLKMathRadiansToDegrees
bardzo fajne rozwiązania, właśnie to, czego potrzebowałem do mojego szybkiego projektu, więc oto szybki port. dzięki, a oto projekt placu zabaw: https://github.com/ppoh71/playgounds/tree/master/centerLocationPoint.playground
źródło
Jeśli jesteś zainteresowany uzyskaniem bardzo uproszczonego „środka” punktów (na przykład, aby po prostu wyśrodkować mapę do środka Twojego wielokąta gmaps), oto podstawowe podejście, które zadziałało.
Zwraca środkową współrzędną szerokości / długości dla środka wielokąta.
źródło
W Django jest to trywialne (i faktycznie działa, miałem problemy z wieloma rozwiązaniami, które nie zwracały poprawnie negatywów dla szerokości geograficznej).
Na przykład, powiedzmy, że używasz django-geopostkodów (których jestem autorem).
point
jestPoint
instancją Django, której można następnie używać do wykonywania takich czynności, jak pobieranie wszystkich obiektów znajdujących się w promieniu 10 km od tego punktu centralnego;Zmiana tego na surowy Python jest trywialna;
Pod maską Django używa GEOS - więcej szczegółów na https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/
źródło
Wersja Java, jeśli ktoś jej potrzebuje. Stałe zdefiniowano jako static, aby nie obliczać ich dwukrotnie.
źródło
Oto wersja Androida oparta na odpowiedzi C # @ Yodacheese przy użyciu interfejsu API Map Google:
w aplikacji build.gradle dodaj:
źródło
Implementacja Dart dla Flutter, aby znaleźć punkt środkowy dla wielu szerokości i długości geograficznych.
import pakietu matematycznego
Lista szerokości i długości geograficznej
źródło
Jest to to samo, co problem średniej ważonej, w którym wszystkie wagi są takie same i istnieją dwa wymiary.
Znajdź średnią wszystkich szerokości geograficznych dla swojej środkowej szerokości geograficznej i średnią wszystkich długości geograficznych dla środkowej szerokości geograficznej.
Caveat Emptor: Jest to przybliżenie z bliskiej odległości i błąd stanie się niesforny, gdy odchylenia od średniej będą większe niż kilka mil z powodu krzywizny Ziemi. Pamiętaj, że szerokości i długości geograficzne to stopnie (nie są to tak naprawdę siatki).
źródło
Jeśli chcesz wziąć pod uwagę używaną elipsoidę, możesz znaleźć wzory tutaj http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf
patrz Aneks B.
Dokument zawiera wiele innych przydatnych rzeczy
b
źródło
Brak obiektu w PHP. Biorąc pod uwagę tablicę par współrzędnych, zwraca środek.
Pomysł zaczerpnięty z # 4
źródło
Oto wersja Pythona do znajdowania punktu środkowego. Lat1 i lon1 to listy szerokości i długości geograficznej. przywróci szerokość i długość geograficzną punktu środkowego.
źródło
Dart / Flutter Oblicz punkt środkowy wielu par współrzędnych szerokość / długość geograficzna
źródło
Jeśli chcesz, aby wszystkie punkty były widoczne na obrazie, chciałbyś uzyskać ekstrema w szerokości i długości geograficznej i upewnij się, że twój widok zawiera te wartości z dowolną krawędzią.
(Z odpowiedzi Alnitaka, sposób obliczania ekstremów może być trochę problematyczny, ale jeśli są one kilka stopni po obu stronach zawijającej się długości geograficznej, wtedy sprawdzisz strzał i wybierzesz właściwy zakres.)
Jeśli nie chcesz zniekształcać mapy, na której znajdują się te punkty, dostosuj współczynnik kształtu obwiedni tak, aby pasował do wszystkich pikseli, które przypisałeś do widoku, ale nadal zawiera ekstrema.
Aby punkty były wyśrodkowane na jakimś dowolnym poziomie powiększenia, oblicz środek obwiedni, która „po prostu pasuje” do punktów, jak powyżej, i zachowaj ten punkt jako środek.
źródło
Zrobiłem to zadanie w javascript jak poniżej
źródło
W ramach podziękowania za ten wątek, oto mój mały wkład w implementację w Rubim, mając nadzieję, że zaoszczędzę komuś kilka minut z ich cennego czasu:
źródło
Użyłem formuły, którą dostałem z www.geomidpoint.com i napisałem następującą implementację w C ++.
array
Igeocoords
są moje własne zajęcia, których funkcjonalność powinna być oczywista.źródło