2009-07-28 92 views
2

我有一個數百個位置的列表,只想顯示當前在屏幕上的那些位置的MKPinAnnotation。屏幕以2英里半徑的用戶當前位置開始。當然,用戶可以滾動並放大屏幕。現在,我等待地圖更新事件,然後依次通過我的位置列表,並檢查座標如下:如何確定座標是否在當前可見的地圖區域中?

-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView { 
    CGPoint point; 
    CLLocationCoordinate2D coordinate; 

    . . . 
    /* in location loop */ 
    coordinate.latitude = [nextLocation getLatitude]; 
    coordinate.longitude = [nextLocation getLongitude]; 

    /* Determine if point is in view. Is there a better way then this? */ 
    point = [mapView convertCoordinate:coordinate toPointToView:nil]; 
    if((point.x > 0) && (point.y>0)) { 
    /* Add coordinate to array that is later added to mapView */ 
    } 

所以我問convertCoordinate點在哪裏就在屏幕上(除非我誤解這種方法很可能)。如果座標不在屏幕上,那麼我絕不會將它添加到mapView。

所以我的問題是,這是確定位置的lat/long是否會出現在當前視圖中並且應該添加到mapView的正確方法?或者我應該以不同的方式做到這一點?

+0

這似乎不適用於我。出於某種原因,我的所有物品似乎都匹配。大部分x和y的值非常高。有任何想法嗎? – 2009-08-20 03:45:45

+0

我不確定,此刻我正在旅行,無法訪問Mac。首先想到的是檢查地圖區域。但即使如此,如果點不在屏幕上(至少在我的測試中),convertCoordinate方法總是返回0.一旦我回到我的Mac前面,我將檢查它。 – ryanday 2009-08-20 22:45:52

回答

2

經過一番閱讀後,我找不到任何說這是個不好的主意。我在我的應用程序中做了一些測試,並且總是得到正確的結果。當我只添加將顯示在當前可見地圖區域中的座標而不是所有300+座標時,該應用程序加載得更快。

我在找的是一種類似於[mapView isCoordinateInVisibleRegion:myCoordinate]的方法,但到目前爲止,這種方法很快且看起來很準確。

我也改變了標題閱讀「在可見的地圖區域」,而不是以前,因爲我認爲不正確的標題可能混淆了我的意思。

+0

你能否提供一些[mapView isCoordinateInVisibleRegion:myCoordinate]的示例代碼?因此,我可以知道我應該如何在我的應用程序中使用。 – Nit 2012-02-06 04:50:33

7

在您的代碼中,您應該通過toPointToView:選項的視圖。我給了它我的mapView。你必須爲x和y指定一個上界。

下面是一些代碼,工作對我來說(告訴我在我的地圖當前可見的註解,同時通過註釋循環):

for (Shop *shop in self.shops) { 
    ShopAnnotation *ann = [ShopAnnotation annotationWithShop:shop]; 
    [self.mapView addAnnotation:ann]; 

    CGPoint annPoint = [self.mapView convertCoordinate:ann.coordinate 
      toPointToView:self.mapView]; 

    if (annPoint.x > 0.0 && annPoint.y > 0.0 && 
      annPoint.x < self.mapView.frame.size.width && 
      annPoint.y < self.mapView.frame.size.height) { 
     NSLog(@"%@ Coordinate: %f %f", ann.title, annPoint.x, annPoint.y); 
    } 
} 
3

我知道這是一個古老的線程,不知道什麼是可回然後...但你應該這樣做:

// -- Your previous code and CLLocationCoordinate2D init -- 
MKMapRect visibleRect = [mapView visibleMapRect]; 
if(MKMapRectContainsPoint(visibleRect, MKMapPointForCoordinate(coordinate))) { 

    // Do your stuff 

} 

無需轉換回屏幕空間。 另外我不確定你爲什麼要這樣做的原因,我認爲這是奇怪的不添加註釋時,他們不在屏幕上...... MapKit已經優化了這一點,只創建(和回收)註釋視圖是可見。

相關問題