Haversine Formula in Python (Bearing and Distance between two GPS points)

后端 未结 10 1843
死守一世寂寞
死守一世寂寞 2020-11-22 09:47

Problem

I would like to know how to get the distance and bearing between 2 GPS points. I have researched on the haversine formula. Someone told me

10条回答
  •  感动是毒
    2020-11-22 10:18

    Here are two functions to calculate distance and bearing, which are based on the code in previous messages and https://gist.github.com/jeromer/2005586 (added tuple type for geographical points in lat, lon format for both functions for clarity). I tested both functions and they seem to work right.

    #coding:UTF-8
    from math import radians, cos, sin, asin, sqrt, atan2, degrees
    
    def haversine(pointA, pointB):
    
        if (type(pointA) != tuple) or (type(pointB) != tuple):
            raise TypeError("Only tuples are supported as arguments")
    
        lat1 = pointA[0]
        lon1 = pointA[1]
    
        lat2 = pointB[0]
        lon2 = pointB[1]
    
        # convert decimal degrees to radians 
        lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2]) 
    
        # haversine formula 
        dlon = lon2 - lon1 
        dlat = lat2 - lat1 
        a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
        c = 2 * asin(sqrt(a)) 
        r = 6371 # Radius of earth in kilometers. Use 3956 for miles
        return c * r
    
    
    def initial_bearing(pointA, pointB):
    
        if (type(pointA) != tuple) or (type(pointB) != tuple):
            raise TypeError("Only tuples are supported as arguments")
    
        lat1 = radians(pointA[0])
        lat2 = radians(pointB[0])
    
        diffLong = radians(pointB[1] - pointA[1])
    
        x = sin(diffLong) * cos(lat2)
        y = cos(lat1) * sin(lat2) - (sin(lat1)
                * cos(lat2) * cos(diffLong))
    
        initial_bearing = atan2(x, y)
    
        # Now we have the initial bearing but math.atan2 return values
        # from -180° to + 180° which is not what we want for a compass bearing
        # The solution is to normalize the initial bearing as shown below
        initial_bearing = degrees(initial_bearing)
        compass_bearing = (initial_bearing + 360) % 360
    
        return compass_bearing
    
    pA = (46.2038,6.1530)
    pB = (46.449, 30.690)
    
    print haversine(pA, pB)
    
    print initial_bearing(pA, pB)
    

提交回复
热议问题