2016-12-26 19 views
5

私は小さなプログラムを書いており、効率を改善するために、私は自分の配列に最も近い緯度と経度を見つける必要があります。最も近い緯度と経度を見つけよう

では、次のコードを持っていると仮定します

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) 

私は単一値の最も近いセルを取得する方法を知っていますが、私はラムダ関数を考慮したいと思いますどちらの値でも私は完全にはわかりません。助けて?

+0

使用 'min'をdictsの元のリストに - にそれを分離する際に役に立ちません2つのリスト - あなたの主要な機能にピタゴラスの定理を使用します。 –

+0

最低の経度値を正しく取得しています。あなたはそれらの値を分離しています。値を切り離さず、一緒に緯度と経度の距離*を計算してください。 –

+0

ただユークリッド距離を使用する - )) – marmeladze

答えて

13

グローブ上のポイント間の距離を正確に計算するには、Haversineの式が必要です。 this answerで提供されるPython実装を使用して、あなたはこのようにそれをコーディングすることができます:

from math import cos, asin, sqrt 

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

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

善良で威厳のある大きな火球。それは最高です。とても速い。それは古いラップトップで0.03 MSでクロッキングされました。ありがとう! – booky99

1

を地球が平面であれば、

from itertools import combinations 
from math import sqrt 

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


def euclidean(l1, l2): 
    return ((l1[0]**2)-(l2[0]**2)) + ((l1[1]**2)-(l2[1]**2)) 

pairs = [j for j in combinations([i.values() for i in coords], 2)] 
pairs.sort(key= lambda x: euclidean(*x)) 
print pairs[-1] 
関連する問題