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

我正在建立一个小程序,从用户那里获取两个地理坐标,然后计算它们之间的距离(考虑地球的曲率)。所以我在维基百科上查到了这个公式

我基本上是基于此设置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.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