2013-02-06 72 views
2

我正在創建一個具有特定位置的天氣查找功能的iPhone應用程序,並且存在以下問題,我不確定是否需要解決的最佳方法。在緯度/經度列表中找到緯度和經度的最接近的匹配

我有一個位置的緯度和經度,並希望找到的5000+位置

的5000+的位置來從氣象局的數據點API一個JSON飼料,是一個列表中最接近的經/緯匹配以NSDictionaries的NSArray的形式,NSDictionary包括id,lat,long和name。

我想將我的位置與Met Office的列表中距離最近的位置相匹配,並獲取ID鍵值。

提前

回答

3

我假設你正在使用這個CLLocation對象...

- (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處使用該對象,因爲它最接近用戶的位置。

祝你好運!

+0

感謝您的時間回覆。 –

0

我做了類似的事情一次(查找所有經/緯度,圍繞着一個最大半徑的點對象。),並用於此處給出的公式: http://www.movable-type.co.uk/scripts/latlong.html 然而,相當耗時。所以我有點「拳擊」拳頭。根據上面的計算(當然還原了),我計算了具有最大距離的那些座標的北,西,南和東的經度和緯度。使用軟管最大值和最小值(對於緯度和經度)我查詢了所有有問題的物體。只有那些我計算出確切的距離,並將它們包括在結果列表中或排除它們。

但是,到目前爲止,這並不完全符合您的問題。但我試圖進一步加強計算。爲此,我對自己說,我不需要從搜索到的對象到我的確切距離,但是知道它比其中一個盒子座標更接近它。並且該部分是與您的問題很好對應的部分:

您的情況可能會更容易。假設有問題的位置(最短的一次)接近你想要分配的位置,所有這些複雜的數學可能不起作用。你不需要確切的距離。你需要的是最後一個。爲此,我假設地球是平坦的,而經度(或緯度)之間的距離是線性的。當然這不是真的,但應該足以弄清楚,哪些是最接近的。 從那裏你可以使用畢達哥拉斯。

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

爲了比較的距離,並找到最短的單純目的,你甚至可以取代費時,並且具有較快sqare操作廣場的路線。

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

然後比較各種平方距離而不是距離。結果將是相同的,但更快。

順便說一句,那是一個PHP項目。這就是爲什麼我不能提供示例代碼,只是解釋算法。

+0

感謝您的回覆。 –

+0

這不是一個好主意,並會給出錯誤的結果。 lat和long的比例不一樣,在48度緯度上,你有一個cos(48)的失真,在緯度上大約爲0.66 – AlexWien

+0

對,他們在全球範圍內沒有相同的比例。這個想法是,在要比較的物體靠近的那些區域,爲了提供精確的距離比較(沒有絕對值,只是比較),這個比例尺足夠相似。由於規模差異可以說從一個學位到另一個學位都很小(除了接近極點地區),「兩度以外」的地點總是會更遠離一個「一度」距離。即使是在幾分鐘內,它也沒問題。日期線上還有另一個問題,但用「if」很容易解決。 –