Problem
Chciałbym wiedzieć, jak obliczyć odległość i namiar między 2 punktami GPS . Zbadałem formułę haversine. Ktoś powiedział mi, że mogę również znaleźć łożysko, korzystając z tych samych danych.
Edytować
Wszystko działa dobrze, ale łożysko jeszcze nie działa. Wynik łożyska jest ujemny, ale powinien wynosić od 0 do 360 stopni. Ustawione dane powinny stanowić łożysko poziome 96.02166666666666
i są następujące:
Start point: 53.32055555555556 , -1.7297222222222221
Bearing: 96.02166666666666
Distance: 2 km
Destination point: 53.31861111111111, -1.6997222222222223
Final bearing: 96.04555555555555
Oto mój nowy kod:
from math import *
Aaltitude = 2000
Oppsite = 20000
lat1 = 53.32055555555556
lat2 = 53.31861111111111
lon1 = -1.7297222222222221
lon2 = -1.6997222222222223
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * atan2(sqrt(a), sqrt(1-a))
Base = 6371 * c
Bearing =atan2(cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1), sin(lon2-lon1)*cos(lat2))
Bearing = degrees(Bearing)
print ""
print ""
print "--------------------"
print "Horizontal Distance:"
print Base
print "--------------------"
print "Bearing:"
print Bearing
print "--------------------"
Base2 = Base * 1000
distance = Base * 2 + Oppsite * 2 / 2
Caltitude = Oppsite - Aaltitude
a = Oppsite/Base
b = atan(a)
c = degrees(b)
distance = distance / 1000
print "The degree of vertical angle is:"
print c
print "--------------------"
print "The distance between the Balloon GPS and the Antenna GPS is:"
print distance
print "--------------------"
atan2(sqrt(a), sqrt(1-a))
jest taki sam jakasin(sqrt(a))
Odpowiedzi:
Oto wersja Pythona:
źródło
import math
, musisz określićmath.pi
,math.sin
itp. Dzięki temufrom math import *
uzyskasz bezpośredni dostęp do całej zawartości modułu. Sprawdź „przestrzenie nazw” w samouczku Pythona (np. Docs.python.org/tutorial/modules.html )Większość z tych odpowiedzi to „zaokrąglenie” promienia Ziemi. Jeśli porównasz je z innymi kalkulatorami odległości (takimi jak geopy), te funkcje będą wyłączone.
To działa dobrze:
źródło
Istnieje również wektoryzowana implementacja , która pozwala na użycie 4 tablic numpy zamiast wartości skalarnych dla współrzędnych:
źródło
Obliczenie łożyska jest nieprawidłowe, musisz zamienić dane wejściowe na atan2.
Zapewni to prawidłowe łożysko.
źródło
haversine formula
słyszę to po raz pierwszy, dziękuję.Możesz spróbować następujących rzeczy:
źródło
Oto numpy wektoryzowana implementacja formuły Haversine podana przez @Michael Dunn, która daje 10-50-krotną poprawę w stosunku do dużych wektorów.
źródło
Możesz rozwiązać problem ujemnego łożyska, dodając 360 °. Niestety, może to skutkować łożyskami większymi niż 360 ° dla łożysk dodatnich. To dobry kandydat na operator modulo, więc w sumie powinieneś dodać linię
na końcu metody.
źródło
Y w atan2 jest domyślnie pierwszym parametrem. Oto dokumentacja . Będziesz musiał zmienić dane wejściowe, aby uzyskać prawidłowy kąt namiaru.
źródło
Skorzystaj z tego linku: /gis/84885/whats-the-difference-between-vincenty-and-great-circle-distance-calculations
w rzeczywistości daje to dwa sposoby uzyskania odległości. To Haversine i Vincentys. Z moich badań dowiedziałem się, że Vincentys jest stosunkowo dokładny. Użyj również instrukcji importu, aby wykonać implementację.
źródło
Oto dwie funkcje do obliczania odległości i namiaru, które są oparte na kodzie z poprzednich wiadomości i https://gist.github.com/jeromer/2005586 (dodany typ krotki dla punktów geograficznych w formacie lat, lon dla obu funkcji dla przejrzystości ). Przetestowałem obie funkcje i wydaje się, że działają poprawnie.
źródło