Πώς μπορώ να καθορίσει εάν μια συντεταγμένη είναι στην περιοχή ορατό χάρτη;

ψήφοι
2

Έχω μια λίστα με μερικές εκατοντάδες τοποθεσίες και το μόνο που θέλουν να εμφανίσετε μια MKPinAnnotation για αυτές τις θέσεις επί του παρόντος στην οθόνη. Η οθόνη αρχίζει με την τρέχουσα θέση του χρήστη με μια ακτίνα δύο μιλίων. Φυσικά, ο χρήστης μπορεί να μεταβείτε και ζουμ στην οθόνη. Αυτή τη στιγμή, έχω περιμένει για μια εκδήλωση ενημέρωση χάρτη, και στη συνέχεια βρόχο μέσω λίστας θέση μου, και να ελέγξετε τις συντεταγμένες ως εξής:

-(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. Θα πρέπει να ορίσετε ένα άνω φράγμα για το x και y πάρα πολύ.

Εδώ είναι μερικά κωδικό που λειτούργησε για μένα (μου είπε το ορατό σχολιασμούς στο χάρτη μου, ενώ looping μέσω του σχολιασμού):

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

Μετά από λίγη ανάγνωση δεν μπορώ να βρω κάτι που λέει ότι αυτό είναι μια κακή ιδέα. Έχω κάνει ένα κομμάτι των δοκιμών στην εφαρμογή μου και έχω πάντα σωστά αποτελέσματα. Τα φορτία app πολύ πιο γρήγορα, όταν μπορώ να προσθέσω μόνο τις συντεταγμένες που θα εμφανιστούν στην περιοχή ορατό χάρτη αντί για όλα τα 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