Come faccio a determinare se una coordinata si trova nella regione della mappa attualmente visibile?

voti
2

Ho una lista di diverse centinaia di località e voglio solo per visualizzare una MKPinAnnotation per quelle posizioni attualmente visualizzata sullo schermo. Lo schermo inizia con l'attuale posizione dell'utente con un raggio di 2 miglia. Naturalmente, l'utente può scorrere, e lo zoom sullo schermo. In questo momento, mi aspetto un evento di aggiornamento delle mappe, e poi scorrere la mia lista la posizione e controllare le coordinate di questo tipo:

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

Così mi chiedo convertCoordinate dove il punto sarebbe sullo schermo (a meno che non mi fraintendere questo metodo che è molto possibile). Se le coordinate non è sullo schermo, quindi non ho mai aggiungo al MapView.

Quindi la mia domanda, è questo il modo corretto per determinare se latitudine / longitudine sembrerebbe di una posizione nella vista corrente e deve essere aggiunto al il MapView? O dovrei fare questo in un modo diverso?

È pubblicato 29/07/2009 alle 00:59
fonte dall'utente
In altre lingue...                            


3 risposte

voti
7

Nel codice, si dovrebbe passare una vista per l' toPointToView:opzione. Ho dato la mia mapView. È necessario specificare un limite superiore per la xey troppo.

Ecco alcuni codice che ha funzionato per me (mi ha detto le annotazioni attualmente visibili sulla mia mappa, mentre scorrendo l'annotazione):

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);
    }
}
Risposto il 04/02/2010 a 05:47
fonte dall'utente

voti
3

So che questo è un vecchio filo, non so cosa era disponibile allora ... ma si dovrebbe piuttosto fare:

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

    // Do your stuff

}

Non c'è bisogno di riconvertire lo spazio dello schermo. Anche io non sono sicuro che il motivo per cui si sta cercando di fare questo, credo che questo è strano di non aggiungere annotazioni quando non sono sullo schermo ... MapKit ottimizza già presente e crea solo (e ricicla) viste di annotazione che sono visibili .

Risposto il 22/10/2015 a 19:12
fonte dall'utente

voti
2

Dopo un po 'di lettura non riesco a trovare nulla che dice che questa è una cattiva idea. Ho fatto un po 'di test nella mia app e ottengo sempre risultati corretti. I carichi app molto più veloce quando aggiungo solo le coordinate che verrà visualizzato nella regione della mappa attualmente visibile invece di tutti i 300 + coordinate in una sola volta.

Quello che cercavo era un metodo come [MapView isCoordinateInVisibleRegion: myCoordinate], ma finora questo metodo è semplice e sembra accurata.

Ho anche cambiato il titolo per leggere "nella regione della mappa visibile" al posto del precedente, perché penso che il titolo non corretto può aver confuso il mio significato.

Risposto il 10/08/2009 a 14:09
fonte dall'utente

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