最も近い緯度と経度を検索する 質問する

最も近い緯度と経度を検索する 質問する

私は小さなプログラムを書いていますが、効率を上げるために、配列内で最も近い緯度と経度を見つける必要があります。

次のコードがあると仮定します。

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�� の値です。

おすすめ記事