Find the closest latitude and longitude

For a correct calculation of the distance between points on the globe, you need something like the Haversine formula. Using the Python implementation offered in this answer, you could code it like this:

from math import cos, asin, sqrt

def distance(lat1, lon1, lat2, lon2):
    p = 0.017453292519943295
    hav = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p)*cos(lat2*p) * (1-cos((lon2-lon1)*p)) / 2
    return 12742 * asin(sqrt(hav))

def closest(data, v):
    return min(data, key=lambda p: distance(v['lat'],v['lon'],p['lat'],p['lon']))

tempDataList = [{'lat': 39.7612992, 'lon': -86.1519681}, 
                {'lat': 39.762241,  'lon': -86.158436 }, 
                {'lat': 39.7622292, 'lon': -86.1578917}]

v = {'lat': 39.7622290, 'lon': -86.1519750}
print(closest(tempDataList, v))

Haversine formula

The formula is given on Wikipedia as follows:

              1 − cos(𝛳)  
     hav(𝛳) = ──────────  
                  2

...where 𝛳 is either the difference in latitude (𝜑), or the difference in longitude (𝜆). For the actual angle 𝛳 between two points, the formula is given as:

     hav(𝛳) = hav(𝜑₂ − 𝜑₁) + cos(𝜑₁)cos(𝜑₂)hav(𝜆₂ − 𝜆₁)

So that becomes:

              1 − cos(𝜑₂ − 𝜑₁)                 1 − cos(𝜆₂ − 𝜆₁)
     hav(𝛳) = ──────────────── + cos(𝜑₁)cos(𝜑₂)────────────────
                  2                                   2

The distance is calculated from that, using this formula (also on Wikipedia):

     𝑑 = 2𝑟 arcsin(√hav(𝛳))

In the above script:

  • p is the factor to convert an angle expressed in degrees to radians: π/180 = 0.017453292519943295...

  • hav is the haversine calculated using the above formula

  • 12742 is the diameter of the earth expressed in km, and is thus the value of 2𝑟 in the above formula.


Also u can simple do:

import mpu
def distance(point1, point2):
    return mpu.haversine_distance(point1, point2)

def closest(data, this_point):
    return min(data, key=lambda x: distance(this_point, x))

Tags:

Python