2014-01-19 89 views
0

我有一個NSDictionary大約2000個位置經緯度和長度,我放在地圖上的針腳,如果他們在可見的地圖區域。搜索NSDictionary的緯度經度與一定的距離

當前每次平移地圖時,我只需循環查看我的字典並計算距離以查看位置是否可見,如果是這樣就放下一個別針。

CLLocationCoordinate2D centre = [self.map centerCoordinate]; 
CLLocation *mapCenter =[[CLLocation alloc] initWithLatitude: centre.latitude longitude: centre.longitude]; 

     for (int i=0; i < [self.dealersSource count]; i++) { 

      CLLocation *d = [[CLLocation alloc] initWithLatitude: [[[self.dealersSource objectAtIndex:i] valueForKey:@"lat"] floatValue] 
                  longitude: [[[self.dealersSource objectAtIndex:i] valueForKey:@"long"] floatValue]]; 

       CLLocationDistance distance = [d distanceFromLocation:mapCenter]; 
       float dist =(distance/1609.344); 

      if (dist <= radius && dist !=0) { 
       // this will be visible on the map, add to list of annotations 
      } 
} 

這工作,但似乎非常低效,並且可以在較舊的iPad慢 - 特別是當越來越多的位置被添加到這個列表。我希望能夠使用某種NSPredicate在我開始循環之前過濾我的初始列表。

+0

我假設你有和2000字典的NSArray,其中每個字典都有@「lat」和@「lon」鍵值。 您可以使用NSPredicate爲給定的謂詞過濾NSArray。 I.e.像這樣:NSArray * filteredarray = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@「(lat> =%d)」,16.0989]]; 也看看這個鏈接,其中詳細解釋了NSPredicate過濾:http://stackoverflow.com/questions/110332/filtering-nsarray-into-a-new-nsarray-in-objective-c –

+0

我想我的混亂是我需要做一個> =和一個<=都正確的基於可見的地圖?對於經濟和經濟都很正常 – Slee

+0

。謂詞就像語句條件一樣,所以你需要寫出滿足你最終需求的條件。 Addind(a> = some_value && a <= some_value)應該可以解決問題。 –

回答

0

實際上沒有任何標準的Objective-C結構非常適合在一個範圍內查找值 - 您幾乎必須逐個搜索(儘管您可以使用「謂詞」來「隱藏」在filteredArray...操作等內搜索,因此編寫更少的代碼行)。

有效地找到行之間的邊界之間的值的最佳結構可能是按二進制搜索算法搜索的值排序的數組。你會做一個二進制搜索的下界和另一個上界。這是log(n)複雜度,對於大型列表非常有效(如果不需要經常對列表進行排序)。

準確地說,如何做到這一點的2D表面更難以算出。也許首先使用上述技術在X方向上找到「候選」,然後檢查它們的Y座標。雖然不會是日誌(n)。

相關問題