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

问题描述 投票:1回答:1

所以我使用了“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

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

python pandas function math
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.