Jak mogę określić, czy koordynować jest aktualnie widocznej mapy regionu?

głosy
2

Mam listę kilkuset miejscach i tylko chcesz wyświetlić MKPinAnnotation dla tych lokalizacjach aktualnie na ekranie. Ekran zaczyna aktualnej lokalizacji użytkownika o promieniu 2 mil. Oczywiście, użytkownik może przewijać i powiększać na ekranie. Teraz czekam na imprezę aktualizacji map, a następnie przez pętlę mojej liście lokalizacji i sprawdzić współrzędne jak to:

-(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 */
  }

Więc pytam convertCoordinate gdzie punkt będzie na ekranie (chyba że źle zrozumieć tę metodę, która jest bardzo możliwe). Jeśli współrzędnych nie jest wyświetlane na ekranie, a następnie nigdy nie dodawać go do MapView.

Więc moje pytanie, czy jest to prawidłowy sposób ustalić, czy lat / long wydaje lokalizacja w bieżącym widoku i powinny być dodane do tej MapView? Czy powinienem to robić w inny sposób?

Utwórz 29/07/2009 o 00:59
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
7

W kodzie, należy przejść do widoku toPointToView:opcji. Dałem z siebie mapView. Trzeba określić górną granicę dla X i Y zbyt.

Oto niektóre kodu, który pracował dla mnie (powiedziano mi aktualnie widoczne adnotacje na mojej mapie, podczas zapętlenie poprzez adnotacją):

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);
    }
}
Odpowiedział 04/02/2010 o 05:47
źródło użytkownik

głosy
3

Wiem, że to stary wątek, nie wiem, co było dostępne wtedy ... Ale trzeba raczej zrobić:

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

    // Do your stuff

}

Nie ma potrzeby, aby przekształcić z powrotem do miejsca na ekranie. Również nie jestem pewien, dlatego staramy się to zrobić, myślę, że to dziwne, aby nie dodawać adnotacje, gdy nie są na ekranie ... MapKit już optymalizuje ten i tylko tworzy (i recykling) widoki adnotacji, które są widoczne ,

Odpowiedział 22/10/2015 o 19:12
źródło użytkownik

głosy
2

Po trochę czytania nie mogę znaleźć niczego, co mówi, że to zły pomysł. Zrobiłem trochę testów w mojej aplikacji i zawsze uzyskać prawidłowe wyniki. Obciążenia aplikacji znacznie szybciej, kiedy tylko dodać współrzędne, które pojawią się w aktualnie widocznego obszaru mapy zamiast cały 300+ współrzędne naraz.

Co szukałem była metoda jak [MapView isCoordinateInVisibleRegion: myCoordinate], ale do tej pory ta metoda jest szybka i wydaje się trafne.

Ja również zmienił tytuł na czytanie „w widzialnym mapy regionu” zamiast poprzedniego, ponieważ myślę, że błędny tytuł może mylić mój sens.

Odpowiedział 10/08/2009 o 14:09
źródło użytkownik

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