使用特定经度和纬度计算距离时的值域错误

时间:2019-03-17 08:38:40

标签: python pandas function math

所以我使用了在“ https://gist.github.com/nickjevershed/6480846”上找到的距离函数,如下所示

def dist(lat1, long1, lat2, long2):

        # Convert latitude and longitude to 
        # spherical coordinates in radians.
        degrees_to_radians = math.pi/180.0

        # phi = 90 - latitude
        phi1 = (90.0 - lat1)*degrees_to_radians
        phi2 = (90.0 - lat2)*degrees_to_radians

        # theta = longitude
        theta1 = long1*degrees_to_radians
        theta2 = long2*degrees_to_radians

        # Compute spherical distance from spherical coordinates.

        # For two locations in spherical coordinates 
        # (1, theta, phi) and (1, theta, phi)
        # cosine( arc length ) = 
        #    sin phi sin phi' cos(theta-theta') + cos phi cos phi'
        # distance = rho * arc length

        cos = (math.sin(phi1)*math.sin(phi2)*math.cos(theta1 - theta2) + 
               math.cos(phi1)*math.cos(phi2))
        arc = math.acos( cos )

        # Remember to multiply arc by the radius of the earth 
        # in your favorite set of units to get length.
        return arc * 3959

但是,当我尝试使用它来计算下面的值时,它给了我一个数学域错误。

    dist(47.62, 122.35, 47.62, 122.35)

    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-164-c70b6ce05167> in <module>()
    ----> 1 dist(47.62, 122.35, 47.62, 122.35)

    <ipython-input-78-5d1b406c1007> in dist(lat1, long1, lat2, long2)
         24     cos = (math.sin(phi1)*math.sin(phi2)*math.cos(theta1 - theta2) + 
         25            math.cos(phi1)*math.cos(phi2))
    ---> 26     arc = math.acos( cos )
         27 
         28     # Remember to multiply arc by the radius of the earth

    ValueError: math domain

我尝试了其他值,并且一切正常。距离函数中是否缺少一些隐藏的逻辑,或者是否需要计算值?

1 个答案:

答案 0 :(得分:0)

问题来了,您想计算相同点之间的距离,因此结果应为零。

但由于舍入问题,您的值cos> 1

因此是错误的原因。我建议您添加一个测试:

    # with your sample dist(47.62, 122.35, 47.62, 122.35)
    # cos = 1.0000000000000002, not good
    cos = (math.sin(phi1)*math.sin(phi2)*math.cos(theta1 - theta2) + 
           math.cos(phi1)*math.cos(phi2))
    cos = min(cos,1.0) #to securise the value

在这种情况下,您有等待的结果:0.0