Python 需要帮助计算地理距离吗
我正在建立一个小程序,从用户那里获取两个地理坐标,然后计算它们之间的距离(考虑地球的曲率)。所以我在维基百科上查到了这个公式 我基本上是基于此设置python函数的,这就是我想到的:Python 需要帮助计算地理距离吗,python,latitude-longitude,great-circle,Python,Latitude Longitude,Great Circle,我正在建立一个小程序,从用户那里获取两个地理坐标,然后计算它们之间的距离(考虑地球的曲率)。所以我在维基百科上查到了这个公式 我基本上是基于此设置python函数的,这就是我想到的: def geocalc(start_lat, start_long, end_lat, end_long): start_lat = math.radians(start_lat) start_long = math.radians(start_long) end_lat = math.ra
def geocalc(start_lat, start_long, end_lat, end_long):
start_lat = math.radians(start_lat)
start_long = math.radians(start_long)
end_lat = math.radians(end_long)
end_long = math.radians(end_long)
d_lat = start_lat - end_lat
d_long = start_long - end_long
EARTH_R = 6372.8
c = math.atan((math.sqrt( (math.cos(end_lat)*d_long)**2 +( (math.cos(start_lat)*math.sin(end_lat)) - (math.sin(start_lat)*math.cos(end_lat)*math.cos(d_long)))**2)) / ((math.sin(start_lat)*math.sin(end_lat)) + (math.cos(start_lat)*math.cos(end_lat)*math.cos(d_long))) )
return EARTH_R*c
问题是结果确实不准确。我是python新手,因此非常感谢您的帮助或建议 您可以使用具有内置距离计算功能的geopy模块,向下滚动到下面链接中的“计算距离”:
我想你错过了一个数学题。开始的时候,sin(d_long)应该是这样的:
c = math.atan((math.sqrt( (math.cos(end_lat)*math.sin(d_long))**2 +( (math.cos(start_lat)*math.sin(end_lat)) - (math.sin(start_lat)*math.cos(end_lat)*math.cos(d_long)))**2)) / ((math.sin(start_lat)*math.sin(end_lat)) + (math.cos(start_lat)*math.cos(end_lat)*math.cos(d_long))) )
这项工作(打印f返回2887.26公里,根据工作示例@):
请注意您提交的内容中的这一行:
end\u lat=math.radians(end\u long)
您有4、5或6个问题:
(1) end\u lat=math.radians(end\u long)
应该是end\u lat=math.radians(end\u lat)
(2) 你遗漏了一些已经有人提到的东西,很可能是因为
(3) 您的代码难以辨认(行太长,多余的括号,17个“数学”的无意义实例)
(4) 您没有注意到维基百科文章中关于使用atan2()
(5) 输入坐标时,您可能正在交换lat和lon
(6) delta(纬度)
计算不必要;它没有出现在公式中
总而言之:
from math import radians, sqrt, sin, cos, atan2
def geocalc(lat1, lon1, lat2, lon2):
lat1 = radians(lat1)
lon1 = radians(lon1)
lat2 = radians(lat2)
lon2 = radians(lon2)
dlon = lon1 - lon2
EARTH_R = 6372.8
y = sqrt(
(cos(lat2) * sin(dlon)) ** 2
+ (cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dlon)) ** 2
)
x = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(dlon)
c = atan2(y, x)
return EARTH_R * c
>>> geocalc(36.12, -86.67, 33.94, -118.40)
2887.2599506071115
>>> geocalc(-6.508, 55.071, -8.886, 51.622)
463.09798886300376
>>> geocalc(55.071, -6.508, 51.622, -8.886)
414.7830891822618
请给出一个具体的例子(输入、预期输出、实际输出)。我输入了这些坐标(-6.508,55.071)和(-8.886,51.622)。预期输出为414Km。实际结果是6473公里,我认为这是不准确的,这是错误的><不准确可能是420公里,你是对的。然而,我仍然得到了完全错误的答案。您不需要
fabs()
,因为cos(-x)==cos(x)
-1这可能会出现惊人的错误,因为您使用的是atan
而不是atan2
。示例:从纬度45度到纬度-45度正南行驶为10010公里(正常),但从纬度45.1度到纬度-45.1度(稍微长一点的距离)行驶为-9988公里。从北极到南极的旅行产生零公里@JohnMachin关于fabs()的评论您对于这个特定的实现是正确的,但是当教授delta的概念时,绝对值的使用是正确的,而不是简单的减法。我不理解您所说的“教授delta的概念”是什么意思。如果我在(x1,y1)
,我想在(x2,y2)
,我告诉我的步进电机deltax,deltay=(x2-x1,y2-y1)
,没有abs()
;你做什么?更多:(2)无论如何,维基百科的文章把它们称为“差异”,而不是“三角洲”。在我的家乡,差异有一个标志。(3) 在本页中提到的众多三角洲中,您指的是哪一个?感谢您指出所有这些问题。它看起来确实比我做的干净多了,而且很有效!这是一个很好的建议,但如果您能包含一些关于如何实现OP目标的代码,您的答案会更好。
from math import radians, sqrt, sin, cos, atan2
def geocalc(lat1, lon1, lat2, lon2):
lat1 = radians(lat1)
lon1 = radians(lon1)
lat2 = radians(lat2)
lon2 = radians(lon2)
dlon = lon1 - lon2
EARTH_R = 6372.8
y = sqrt(
(cos(lat2) * sin(dlon)) ** 2
+ (cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dlon)) ** 2
)
x = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(dlon)
c = atan2(y, x)
return EARTH_R * c
>>> geocalc(36.12, -86.67, 33.94, -118.40)
2887.2599506071115
>>> geocalc(-6.508, 55.071, -8.886, 51.622)
463.09798886300376
>>> geocalc(55.071, -6.508, 51.622, -8.886)
414.7830891822618