Jak obliczyć odległość między dwoma punktami określonymi przez szerokość i długość geograficzną?
Dla wyjaśnienia chciałbym odległość w kilometrach; punkty wykorzystują system WGS84 i chciałbym zrozumieć względne dokładności dostępnych podejść.
Jak obliczyć odległość między dwoma punktami określonymi przez szerokość i długość geograficzną?
Dla wyjaśnienia chciałbym odległość w kilometrach; punkty wykorzystują system WGS84 i chciałbym zrozumieć względne dokładności dostępnych podejść.
Odpowiedzi:
Ten link może być dla Ciebie pomocny, ponieważ zawiera szczegółowe informacje na temat użycia formuły Haversine do obliczania odległości.
Fragment:
źródło
Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
zamiast tegoMath.asin(Math.sqrt(h))
, która byłaby bezpośrednią implementacją formuły, której używa artykuł z Wikipedii? Czy jest bardziej wydajny i / lub bardziej stabilny numerycznie?(sin(x))²
równa(sin(-x))²
Musiałem obliczyć wiele odległości między punktami dla mojego projektu, więc poszedłem dalej i spróbowałem zoptymalizować kod, który znalazłem tutaj. Przeciętnie w różnych przeglądarkach moja nowa implementacja działa 2 razy szybciej niż najbardziej pozytywna odpowiedź.
Możesz grać z moim jsPerf i zobaczyć wyniki tutaj .
Ostatnio musiałem zrobić to samo w Pythonie, więc oto implementacja Pythona :
I dla kompletności: Haversine na wiki.
źródło
// 2 * R; R = 6371 km
oznacza? a obecna metoda zapewnia odpowiedź w km lub milach? potrzebuje lepszej dokumentacji. DziękiOto implementacja C #:
źródło
double dlon = Radians(lon2 - lon1);
idouble dlat = Radians(lat2 - lat1);
RADIUS
wartość musi wynosić 6371, jak w innych odpowiedziach?Oto implementacja formuły Haversine w Javie.
Zauważ, że tutaj zaokrąglamy odpowiedź do najbliższego kilometra.
źródło
6371000
jako promienia ziemi? (średni promień ziemi wynosi 6371000 metrów) lub przeliczasz kilometry na metry z Twojej funkcji?0.621371
Dziękuję bardzo za wszystko. Użyłem następującego kodu w mojej aplikacji na iPhone'a Objective-C:
Szerokość i długość geograficzna są w systemie dziesiętnym. Nie użyłem min () do wywołania asin (), ponieważ odległości, których używam, są tak małe, że nie wymagają tego.
Dał niepoprawne odpowiedzi, dopóki nie podałem wartości w radianach - teraz jest prawie taki sam jak wartości uzyskane z aplikacji Apple's Map :-)
Dodatkowa aktualizacja:
Jeśli korzystasz z iOS4 lub nowszego, Apple udostępnia kilka metod, aby to zrobić, aby uzyskać tę samą funkcjonalność:
źródło
pow(sin(dlat / 2), 2) + cos(convertToRadians(place1.latitude))
jest niepoprawny. Usuń je, a wynik będzie zgodny z tym, co otrzymam, gdy użyję innych implementacji na tej stronie lub od podstaw zastosuję formułę Haversine z Wikipedii .()
tą sumą, otrzymuję 3869.75. Bez nich dostaję 3935,75, czyli prawie to, co pojawia się w wyszukiwarce.Jest to prosta funkcja PHP, która da bardzo rozsądne przybliżenie (poniżej +/- 1% marginesu błędu).
Jak powiedziano wcześniej; ziemia NIE jest kulą. To jak stary, stary baseball, z którym Mark McGwire postanowił ćwiczyć - jest pełen wgnieceń i nierówności. Prostsze obliczenia (takie jak to) traktują to jak kulę.
Różne metody mogą być mniej lub bardziej precyzyjne w zależności od tego, gdzie znajdujesz się na tym nieregularnym owalnym ORAZ i jak daleko od siebie są twoje punkty (im bliżej, tym mniejszy margines błędu bezwzględnego). Im bardziej precyzyjne są twoje oczekiwania, tym bardziej złożona jest matematyka.
Aby uzyskać więcej informacji: wikipedia odległość geograficzna
źródło
Zamieszczam tutaj mój przykład działania.
Wymień wszystkie punkty w tabeli posiadające odległość między wyznaczonym punktem (używamy losowego punktu - lat: 45,20327, długi: 23,7806) mniej niż 50 KM, z szerokością i długością geograficzną, w MySQL (pola tabeli to: współrzędna_lokalna i współrzędna_długa):
Wymień wszystkie posiadające ODLEGŁOŚĆ <50, w Kilometrach (rozpatrywany promień Ziemi 6371 KM):
Powyższy przykład został przetestowany w MySQL 5.0.95 i 5.5.16 (Linux).
źródło
W pozostałych odpowiedziach implementacja w r brakuje.
Obliczanie odległości między dwoma punktami jest dość proste dzięki
distm
funkcji zgeosphere
pakietu:gdzie:
Ponieważ Ziemia nie jest idealnie kulista, formuła Vincenta dla elipsoidów jest prawdopodobnie najlepszym sposobem obliczania odległości. Zatem w
geosphere
pakiecie, którego używasz, to:Oczywiście nie musisz koniecznie używać
geosphere
pakietu, możesz również obliczyć odległość w bazieR
za pomocą funkcji:źródło
Herweryna jest zdecydowanie dobrą formułą dla prawdopodobnie większości przypadków, inne odpowiedzi już ją zawierają, więc nie zamierzam zajmować miejsca. Należy jednak pamiętać, że bez względu na zastosowaną formułę (tak, nie tylko jedną). Ze względu na ogromny możliwy zakres dokładności, a także wymagany czas obliczeń. Wybór formuły wymaga nieco więcej przemyślenia niż prostej odpowiedzi bez zastanowienia.
Ten post od osoby z nasa jest najlepszy, jaki znalazłem podczas omawiania opcji
http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html
Na przykład, jeśli sortujesz wiersze według odległości w promieniu 100 mil. Formuła płaskiej ziemi będzie znacznie szybsza niż haverine.
Zauważ, że jest tylko jeden cosinus i jeden pierwiastek kwadratowy. Wersety 9 z nich dotyczące formuły Haversine.
źródło
Możesz użyć kompilacji w CLLocationDistance do obliczenia tego:
W twoim przypadku, jeśli chcesz kilometry po prostu podziel przez 1000.
źródło
Nie lubię dodawać kolejnej odpowiedzi, ale interfejs API Google Maps v.3 ma geometrię sferyczną (i więcej). Po konwersji WGS84 na stopnie dziesiętne możesz to zrobić:
Żadnego słowa o tym, jak dokładne są obliczenia Google, a nawet o tym, jaki model jest używany (choć mówi raczej „sferyczny” niż „geoidowy”. Nawiasem mówiąc, odległość „linii prostej” będzie oczywiście różna od odległości, jeśli podróżujemy powierzchnia ziemi, którą wszyscy przypuszczają.
źródło
Implikacja Pythona Origin jest centrum przyległych Stanów Zjednoczonych.
Aby uzyskać odpowiedź w kilometrach, po prostu ustaw mile = fałsz.
źródło
Może być prostsze i bardziej poprawne rozwiązanie: obwód Ziemi wynosi 40 000 km na równiku, około 37 000 w cyklu Greenwich (lub dowolnej długości geograficznej). A zatem:
Zgadzam się, że powinien on być dostrojony, ponieważ sam powiedziałem, że jest to elipsoida, więc promień, który należy pomnożyć przez cosinus, jest różny. Ale to jest trochę dokładniejsze. W porównaniu z Mapami Google znacznie zmniejszyło błąd.
źródło
Wszystkie powyższe odpowiedzi zakładają, że Ziemia jest kulą. Jednak dokładniejszym przybliżeniem byłoby przybliżenie sferoidy spłaszczonej.
źródło
Oto implementacja SQL do obliczania odległości w km,
Aby uzyskać więcej informacji na temat implementacji poprzez programowanie języka, możesz po prostu przejść przez skrypt php podany tutaj
źródło
Oto implementacja maszynopisu formuły Haversine
źródło
Jak wskazano, dokładne obliczenia powinny uwzględniać, że ziemia nie jest idealną kulą. Oto kilka porównań różnych algorytmów tutaj oferowanych:
Na małych odległościach algorytm Keerthany wydaje się pokrywać z algorytmem Google Maps. Mapy Google nie wydają się stosować żadnego prostego algorytmu, co sugeruje, że może to być najdokładniejsza metoda tutaj.
Tak czy inaczej, oto implementacja JavaScript algorytmu Keerthana:
źródło
Ten skrypt [w PHP] oblicza odległości między dwoma punktami.
źródło
źródło
Aby obliczyć odległość między dwoma punktami na kuli, musisz wykonać obliczenia Wielkiego Kręgu .
Istnieje wiele bibliotek C / C ++, które pomagają w rzutowaniu mapy w MapTools, jeśli chcesz zmienić odległość na płaską powierzchnię. Aby to zrobić, potrzebujesz ciągu rzutowego różnych układów współrzędnych.
MapWindow może być również przydatnym narzędziem do wizualizacji punktów. Również jako open source jest przydatnym przewodnikiem po tym, jak korzystać z biblioteki proj.dll, która wydaje się być podstawową biblioteką projekcji open source.
źródło
Oto implementacja zaakceptowanej odpowiedzi przeniesiona na Javę na wypadek, gdyby ktoś jej potrzebował.
źródło
Oto implementacja VB.NET, ta implementacja da ci wynik w KM lub Milach na podstawie przekazywanej wartości Enum.
źródło
Skondensowałem obliczenia, upraszczając formułę.
Oto w Ruby:
źródło
Rozwiązanie Chucka, ważne także dla mil.
źródło
Oto moja implementacja Java do obliczania odległości w stopniach dziesiętnych po pewnym wyszukiwaniu. Użyłem średniego promienia świata (z wikipedii) w km. Jeśli chcesz mile wynikowe, użyj promienia świata w milach.
źródło
W Mysql użyj poniższej funkcji, aby przekazać parametry jak za pomocą
POINT(LONG,LAT)
źródło
źródło
oto przykład w postgres sql (w km, dla wersji mil, zamień 1.609344 na wersję 0.8684)
źródło
Oto kolejny przekonwertowany na kod Ruby :
źródło
jest tutaj dobry przykład do obliczania odległości za pomocą PHP http://www.geodatasource.com/developers/php :
źródło