gpt4 book ai didi

python - 找到最近的纬度和经度

转载 作者:太空狗 更新时间:2023-10-29 20:36:28 26 4
gpt4 key购买 nike

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

假设您有以下代码:

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 函数考虑这两个值,但我不完全确定如何。帮忙?

最佳答案

为了正确计算地球上各点之间的距离,您需要类似 Haversine 的东西公式。使用 this answer 中提供的 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))

Haversine 公式

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

              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𝑟的值。

关于python - 找到最近的纬度和经度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41336756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com