2013-02-06 2 views
2

특정 위치에 대한 날씨 조회 기능이있는 iPhone 앱을 만들고 있는데 다음과 같은 문제가 있습니다. 태클에 대한 최선의 방법이 확실하지 않습니다.Lat/Longs 목록에서 위도와 경도의 가장 가까운 일치 찾기

나는 위치의 위도와 경도를 가지고 5000 개 위치

5000 개 위치는 기상청 된 Datapoint의 API에서 JSON 피드에서오고있는 목록에서 가장 가까운 위도/경도 일치를 찾으려면 NSDictionary의 NSArray 형태로 NSDictionary에는 id, lat, long 및 name이 포함됩니다.

본사를 Met Office의 목록에서 가장 가까운 위치에 일치시키고 ID 키 값을 가져오고 싶습니다. 사전

답변

3

...

- (CLLocation*)closestLocationToLocation:(CLLocation*)currLocation 
{ 
    CLLocationDistance minDistance; 

    CLLocation *closestLocation = nil; 

    for (CLLocation *location in arrayOfLocations) { 
     CLLocationDistance distance = [location distanceFromLocation:currLocation]; 

     if (distance <= minDistance 
      || closestLocation == nil) { 
      minDistance = distance; 
      closestLocation = location; 
     } 
    } 

    //closestLocation is now the location from your array which is closest to the current location or nil if there are no locations in your array. 

    return closestLocation; 

} 

는이 일을 더 빠른 방법이있을 수 있지만 그것은 끝낼 것입니다. CLLocation 기능

+1

그냥 궁금 해서요 : CLLocation의 내장 distanceFromLocation : 메서드를 사용하여 2D 거리 수식 대신 곡률을 계산하는 이유는 무엇입니까? – Anna

+0

나는 그것이 존재했는지 몰랐기 때문에 그것을 사용하지 않았다. D 그에 따라 코드를 편집 해 주겠다. 감사 : D – Fogmeister

+1

몇 가지 빠른 테스트와 함께 작동하는 오래된 버전이 이제이 새로운 버전을 구현할 것이다. @AnnaKarenina & Fogmeister에게 감사의 말을 전합니다. –

-1

에서

많은 덕분에 나는이 같은 것을 건의 할 것입니다 :

NSMutableArray *tempArray = [NSMutableArray new]; 
for (NSMutableDictionary *location in yourArrayOfLocations){ 
    CLLocation coord; 
    coord.latitude = [location objectForKey:@"latitude"]; 
    coord.longitude = [location objectForKey:@"longitude"]; 

    [location setValue:[usersLocation distanceFromLocation:coord] forKey:@"distance"]; 
    [tempArray addObject:location]; 
} 
// Now sort the array 
NSArray *sortedArray = [tempArray sortedArrayUsingComparator:^(id o1, id o2) { 
      NSDictionary *location1 = (NSDictionary *)o1; 
      NSDictionary *location2 = (NSDictionary *)o2; 

      return [[location1 objectForKey:@"distance"] compare:[location2 objectForKey:@"distance"]]; 
     }]; 
[tempArray release]; 

는 이제 거리의 지시 배열을 가지고있다. 사용자가 가장 가까운 인덱스 0에있는 객체를 사용할 수 있습니다.

행운을 빌어 요! 난 당신이에 CLLocation 객체를 사용하고 있으리라 믿고있어

+0

답장을 보내 주셔서 감사합니다. –

0

를 사용하는

EDITED 내가했던 비슷한 일 번 (찾는 모든 위도/경도 최대 반경 지점을 둘러싼 객체.)와 공식은 여기에 주어진 사용 : http://www.movable-type.co.uk/scripts/latlong.html 그러나 그 꽤 많은 시간이 걸렸다. 그래서 나는 일종의 "박스형"물체를 주먹으로합니다. 위의 계산 (물론 복귀)을 바탕으로 정확히 최대 거리를 가진 북쪽, 서쪽, 남쪽 및 동쪽 좌표의 위도와 경도를 계산했습니다. 호스 최대 값과 최소값 (위도와 경도)에 문제의 모든 물체를 질문했습니다. 그리고 나는 정확한 거리를 계산하여 결과 목록에 포함 시켰거나 제외 시켰습니다.

그러나 지금까지 문제가 귀하의 문제와 정확히 일치하지 않습니다. 그러나 나는 계산을 더욱 더 고정하려고 노력했다. 그것을 위해 나는 검색된 물건에서 내 물건까지의 정확한 거리가 필요하지 않지만 상자 좌표 중 하나보다 더 가깝다는 것을 아는 것이 즐겁다. 그리고 그 부분은 귀하의 질문에 잘 맞는 부분입니다.

귀하의 사례는 훨씬 쉬울 수 있습니다. 문제의 위치 (최단 거리)가 할당하려고하는 한 위치 근처에 있다고 가정하면이 모든 복잡한 수학은 역할을 수행하지 않을 수 있습니다. 정확한 거리가 필요하지 않습니다. 당신이 필요로하는 것은 cosest 하나입니다. 이를 위해 나는 지구가 평평하고 경도 (또는 위도) 사이의 거리가 선형이라고 가정합니다. 그것은 물론 사실이 아니지만 알아낼 수있을만큼 좋아야합니다. 어느 것이 가장 가깝습니다. 거기에서 피타고라스를 사용할 수 있습니다. 거리를 비교하고 가장 짧은을 찾는 단순한 목적

Distance = sqrt(sqr(difference-in-lat) + sqr(difference-in-lon)); 

은, 당신도 훨씬 더 빠른 sqare의 작업과 사각형 경로를 소비하는 시간을 대체 할 수 있습니다.

Square-Of-Distance = sqr(difference-in-lat) + sqr(difference-in-lon). 

그런 다음 거리가 아닌 다양한 Square-Of-Distance를 비교하십시오. 결과는 동일하지만 훨씬 빠릅니다.

실제로 PHP 프로젝트였습니다. 그래서 샘플 코드를 제공 할 수는 없지만 알고리즘을 설명하면됩니다.

+0

회신 해 주셔서 감사합니다. –

+0

이것은 좋은 생각이 아니며 잘못된 결과를 줄 것입니다. 위도와 경도는 48도 위도에서 같은 배율이 아닙니다. cos (48)의 왜곡이 있습니다. 위도는 약 0,66입니다. – AlexWien

+0

맞아요, 그들은 전 세계에서 같은 규모가 아닙니다. 아이디어는 거리의 정확한 비교 (absoute 값, 그냥 비교)를 제공하기 위해 비교할 개체가 가까이있는 영역에서 눈금이 서로 충분히 유사하다는 것입니다. 척도에서의 변화가 1도에서 다음 정도로 말할 때 (극 지역에 가깝지 않은 경우) 오히려 작기 때문에 "2도 멀리"한 점은 멀리 "1도 멀리"더 멀리 떨어져있을 것입니다. 몇 분만 에라도 괜찮습니다. 데이트 라인에는 또 다른 문제가 있지만 "if"를 사용하면 쉽게 해결할 수 있습니다. –

관련 문제