找到最近的纬度和经度

新手上路,请多包涵

我正在写一个小程序,为了提高效率,我需要能够在我的数组中找到最接近的纬度和经度。

假设您有以下代码:

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

tempLatList = []
tempLonList = []

for item in tempDataList:
    tempLatList.append(item['lat'])
    tempLonList.append(item['lon'])

closestLatValue = lambda myvalue: min(tempLatList, key=lambda x: abs(x - myvalue))
closestLonValue = lambda myvalue: min(tempLonList, key=lambda x: abs(x - myvalue))

print(closestLatValue(39.7622290), closestLonValue(-86.1519750))

我得到的结果是:

 (39.7622292, -86.1519681)

它应该是什么(在这个例子中,列表中的最后一个对象)

 (39.7622292, -86.1578917)

我知道如何获取单个值最接近的单元格,但是,我想让 lambda 函数考虑这两个值,但我不完全确定如何。帮助?

原文由 booky99 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 764
2 个回答

要正确计算地球上各点之间的距离,您需要像 Haversine 公式这样的东西。使用 此答案 中提供的 Python 实现,您可以这样编码:

 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))

半正弦公式

维基百科上给出的公式如下:

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

…其中 𝛳 是纬度差 (𝜑) 或经度差 (𝜆)。对于两点之间的实际角度𝛳,公式为:

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

这样就变成了:

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

距离是从中计算出来的,使用这个公式(也在维基百科上):

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

在上面的脚本中:

  • p 是将以度数表示的角度转换为弧度的因数:π/180 = 0.017453292519943295…

  • hav 是用上面的公式计算出来的haversine

  • 12742是以千米为单位的地球直径,因此就是上式中2𝑟的值。

原文由 trincot 发布,翻译遵循 CC BY-SA 4.0 许可协议

你也可以简单地做:

 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))

原文由 Chiefir 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题