Comment puis-je déterminer si une coordonnée est dans la région de la carte actuellement visible?

voix
2

J'ai une liste de plusieurs centaines d'emplacements et ne veux afficher un MKPinAnnotation pour les emplacements actuellement à l'écran. L'écran commence par l'emplacement actuel de l'utilisateur avec un rayon de 2 mile. Bien sûr, l'utilisateur peut faire défiler et zoomer à l'écran. En ce moment, j'attends un événement de mise à jour de la carte, puis boucle dans ma liste d'emplacement, et vérifier les coordonnées comme celui-ci:

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

Je demande donc convertCoordinate où le point serait à l'écran (à moins que je comprends mal cette méthode qui est très possible). Si la coordonnée est pas à l'écran, je ne l'ajoute à la Mapview.

Donc, ma question, est-ce la bonne façon de déterminer si un emplacement de latitude / longitude apparaît dans la vue actuelle et devrait être ajoutée au Mapview du? Ou devrais-je faire cela d'une manière différente?

Créé 29/07/2009 à 00:59
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
7

Dans votre code, vous devez passer une vue de l' toPointToView:option. Je lui ai donné mon mapView. Vous devez spécifier une limite supérieure pour x et y aussi.

Voici un code qui a fonctionné pour moi (m'a dit que les annotations actuellement visibles sur ma carte, tout en boucle à travers l'annotation):

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);
    }
}
Créé 04/02/2010 à 05:47
source utilisateur

voix
3

Je sais que c'est un vieux fil, pas sûr ce qui était disponible à l'époque ... Mais vous devriez plutôt faire:

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

    // Do your stuff

}

Pas besoin de se reconvertir à l'espace de l'écran. Aussi je ne suis pas sûr de la raison pour laquelle vous essayez de le faire, je pense que cela est étrange de ne pas ajouter des annotations quand ils ne sont pas sur l'écran ... MapKit optimise déjà et ne crée (et recycle) des vues d'annotation visibles .

Créé 22/10/2015 à 19:12
source utilisateur

voix
2

Après un peu de lecture, je ne trouve rien qui dit cela est une mauvaise idée. Je l'ai fait un peu de tests dans mon application et je reçois toujours des résultats corrects. Les charges d'applications beaucoup plus rapide quand j'ajoute que les coordonnées qui apparaîtront dans la région de la carte actuellement visible au lieu de toutes les coordonnées 300+ à la fois.

Ce que je cherchais était une méthode comme [Mapview isCoordinateInVisibleRegion: myCoordinate], mais jusqu'à présent, cette méthode est rapide et semble exacte.

J'ai aussi changé le titre pour lire « dans la région de la carte visible » au lieu de la précédente parce que je pense que le titre incorrect peut avoir confondu mon sens.

Créé 10/08/2009 à 14:09
source utilisateur

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