Как определить, есть ли координаты в настоящее время видимой области карты?

голоса
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.

Так что мой вопрос, это правильный путь, чтобы определить, есть ли место-х Шир / появится в текущем виде и должны быть добавлены к в MAPview? Или я должен делать это по-другому?

Задан 29/07/2009 в 00:59
источник пользователем
На других языках...                            


3 ответов

голоса
7

В коде, вы должны передать представление для toPointToView:варианта. Я дал моему mapView. Вы должны указать верхний предел для й и у тоже.

Вот код, который работал для меня (мне сказали, видимые в данный момент аннотаций на моей карте, в то время как цикл через аннотацию):

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);
    }
}
Ответил 04/02/2010 в 05:47
источник пользователем

голоса
3

Я знаю, что это старый поток, не уверен, что было доступно тогда ... Но вы скорее должны сделать:

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

    // Do your stuff

}

Нет необходимости конвертировать обратно в пространство экрана. Кроме того, я не уверен, что причина, почему вы пытаетесь сделать это, я думаю, что это странно, чтобы не добавлять аннотации, когда они не на экране ... MapKit уже оптимизирует это и создает только (и перерабатывает) просмотров аннотаций, которые видны ,

Ответил 22/10/2015 в 19:12
источник пользователем

голоса
2

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

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

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

Ответил 10/08/2009 в 14:09
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more