2009-07-28 2 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 очень велики. Есть идеи? –

+0

Я не уверен, сейчас я в командировке и не имею доступа к Mac. Первое, что приходит на ум, - это проверить регион карты. Но даже тогда, если точка не на экране (по крайней мере, в моем тестировании), метод convertCoordinate всегда возвращается 0. Я проверю его, как только вернусь к моему mac. – ryanday

ответ

2

После небольшого чтения я не могу найти ничего, что говорит, что это плохая идея. Я провел немного тестирования в своем приложении, и я всегда получаю правильные результаты. Приложение загружается намного быстрее, когда я добавляю только координаты, которые будут отображаться в текущей видимой области карты, а не все 300+ координат одновременно.

То, что я искал, было методом, подобным [mapView isCoordinateInVisibleRegion: myCoordinate], но пока этот метод быстрый и кажется точным.

Я также изменил заголовок, чтобы читать «в области видимой карты» вместо предыдущего, потому что, по-моему, неправильный заголовок может смутить мое значение.

+0

Можете ли вы указать пример кода для [mapView isCoordinateInVisibleRegion: myCoordinate] ?. Итак, я могу знать, как я могу использовать его в своем приложении. – Nit

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 уже оптимизирует это и создает (и перерабатывает) аннотации, которые видимый.

+0

Человек, я помню этот проект :) Я не помню подробностей, которые еще далеко назад. Я думаю, что проблема заключается в том, что мое приложение загружается намного быстрее, если я показываю только координаты, которые должны отображаться. Может быть, mapkit еще не оптимизирован? Я думаю, что это был ios4. – ryanday

+0

Да, я подумал, что стоит упомянуть, что сегодня это может быть не так. Спасибо за ответ, я ценю. –

+0

Я думаю, вы должны были использовать 'MKMapPointForCoordinate (<# CLLocationCoordinate2D coord #>)' вместо или 'координировать' напрямую. – gklka

Смежные вопросы