2016-12-26 25 views
5

Küçük bir program yazıyorum ve verimliliği artırmak için dizimde en yakın enlem ve boylamı bulabilmem gerekir.En yakın enlem ve boylamı bulun

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

alıyorum sonucudur:

aşağıdaki kodu var varsayalım

(39.7622292, -86.1519681) 

o (listedeki son nesne bu örnekte) 'dir olmalıdır Ne

(39.7622292, -86.1578917) 

Tek bir değerin en yakın hücresini nasıl alacağımı biliyorum, ancak lambda işlevini göz ardı etmek istiyorum iki değer de var ama nasıl emin değilim. Yardım et?

+0

Kullanım 'min' dicts orijinal listesinde - ayrılarak hiçbir kullanım iki liste - ve anahtar fonksiyonunuzda Pisagor teoremi kullanın. –

+0

En düşük boylam değerini doğru şekilde alıyorsunuz. Bu değerleri ayırıyorsunuz. Değerleri ayırmayın, enlem ve boylam için uzaklığı * birlikte hesaplayın *. –

+0

sadece öklid mesafesini kullanın -)) – marmeladze

cevap

13

Dünyadaki noktalar arasındaki mesafenin doğru bir şekilde hesaplanması için, Haversine formülü gibi bir şeye ihtiyacınız vardır. this answer sunulan Python uygulaması kullanarak, şöyle kodu yazabilirsiniz:

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

İyilik merhametli büyük ateş topları. Bu mükemmel. O kadar hızlı ki. Eski bir dizüstü bilgisayardaki 0.03 MS'de çalıştı. Teşekkürler! – booky99

1

dünya planı ise,

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] 
İlgili konular