私は小さなプログラムを書いていますが、効率を上げるために、配列内で最も近い緯度と経度を見つける必要があります。
次のコードがあると仮定します。
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)
単一の値に最も近いセルを取得する方法はわかっていますが、ラムダ関数で両方の値を考慮するようにしたいのですが、その方法がよくわかりません。助けてください。
ベストアンサー1
地球上の地点間の距離を正確に計算するには、次のようなものが必要です。ヘイバーシン式。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))
ハーバサイン式
この式はWikipediaで次のように説明されています。
1 − cos(��)
hav(��) = ──────────
2
...ここで、�� は緯度の差 (��) または経度の差 (��) のいずれかです。2 点間の実際の角度 �� については、式は次のようになります。
hav(��) = hav(��₂ − ��₁) + cos(��₁)cos(��₂)hav(��₂ − ��₁)
つまり次のようになります:
1 − cos(��₂ − ��₁) 1 − cos(��₂ − ��₁)
hav(��) = ──────────────── + cos(��₁)cos(��₂)────────────────
2 2
距離は、次の式を使用して計算されます (Wikipedia にもあります)。
�� = 2�� arcsin(√hav(��))
上記のスクリプトでは:
p
度数で表された角度をラジアンに変換する係数: π/180 = 0.017453292519943295...hav
上記の式を使用して計算された半正弦曲線12742 は km で表された地球の直径であり、上記の式の 2�� の値です。