2016-12-26 2 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의 원래 목록에 -로 분리 없음 사용 두리스트 - 그리고 당신의 핵심 기능에서 피타고라스의 정리를 사용하십시오. –

+0

가장 낮은 경도 값을 올바르게 얻고 있습니다. 당신은 그 값들을 분리하고 있습니다. 값을 분리하지 말고 함께 위도와 경도의 거리를 계산하십시오 *. –

+0

그냥 유클리드 거리를 사용하십시오 -)) – marmeladze

답변

13

지구상의 점 사이의 거리를 정확하게 계산하려면 Haversine 수식과 같은 것이 필요합니다. this answer에서 제공되는 파이썬 구현을 사용하여, 당신은 이런 식으로 코딩 할 수 :

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] 
관련 문제