2015-04-13 4 views
0

Я продолжаю получать следующую ошибку с помощью кода ниже: ValueError: ошибка в области математики. Я могу получить расстояние между двумя точками GPS с другими формулами, но не с приведенной ниже формулой. Любая помощь будет принята с благодарностью,Расстояние между двумя точками GPS (Python)

Спасибо,

Gavin

from math import radians, cos, sin, acos 

#Formula below does not work :(

#JFK 
lat1 = 40.639751 
lon1 = -73.778925 

#DUB 
lat2 = 53.421333 
lon2 = -6.270075 

lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) 

r = 6373 
distance = acos((sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2)) * r) 

print(distance) 
+0

Можете ли вы дать полное исключение? – TheBlackCat

+0

Не уверен, что вы имеете в виду. Дополнительная пара кронштейнов отлично работала. Спасибо –

ответ

-1

Результатом cos не может быть вне [-1,1] диапазона в действительных числах, поэтому acos из значения вне этого диапазона является мнимым , Тем не менее, вы умножаетесь на 6373, в результате чего стоите вне значения [-1,1]. Это является причиной ошибки.

Если вы пытаетесь взять acos из значения вне [-1,1], вы либо делаете что-то не в порядке с математикой, или вы ищете воображаемой результат, в этом случае вы должны использовать сложный вариант acos, который составляет cmath.acos.

+0

Он просто сделал математику неправильно. – ArekBulski

+0

Кто бы ни отклонил этот ответ, можете ли вы объяснить, почему? – TheBlackCat

1

Эта формула не правильная. Я считаю, что формула acos(some_trig) * r и не acos(some_trig * r) В заключение

distance = acos((sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2))) * r 
+1

Да. Сначала вы вычисляете длину дуги между двумя точками на сфере, а затем масштабируете радиус сферы радиусом, чтобы получить расстояние – valentin

+0

Прошу прощения. Википедия поддерживает вашу математику. https://en.wikipedia.org/wiki/Great-circle_distance – ArekBulski

0

Эта формула была размещена на Calculating shortest path between 2 points on a flat map of the Earth , а также посмотреть на https://en.wikipedia.org/wiki/Great-circle_distance

Вы умножать значения с r, который говорит acos разрешить 4435.6 в угол, который является абсурдным. Косинус, возможно, никогда не производил такого числа, больше, чем 1.

Возможно, вам следует использовать угол, заданный acos, в другую формулу для окружности круга.

from math import radians, cos, sin, acos, pi 

#JFK 
lat1 = 40.639751 
lon1 = -73.778925 

#DUB 
lat2 = 53.421333 
lon2 = -6.270075 

lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) 

r = 6373 
d = acos((sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2))) 
length = d * r 

print(length) 

5104.62871371

Смежные вопросы