Wie kann ich feststellen, ob eine Koordinate in der aktuell sichtbaren map Region ist?

stimmen
2

Ich habe eine Liste von mehreren hundert Standorten und will nur eine MKPinAnnotation für diese Orte auf dem Bildschirm zur Zeit angezeigt werden soll. Der Bildschirm beginnt mit dem aktuellen Standort des Benutzers mit einem 2 Meile Radius. Natürlich kann der Benutzer blättern, und auf dem Bildschirm vergrößern oder verkleinern. Gerade jetzt, ich warte auf ein Karten-Update-Ereignis, und dann die Schleife durch meine Ortsliste, und überprüfen Sie die Koordinaten wie folgt aus:

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

So frage ich convertCoordinate, wo der Punkt auf dem Bildschirm sein würde (es sei denn, ich diese Methode falsch verstehen, die sehr gut möglich ist). Wenn das nicht auf dem Bildschirm koordinieren ist, dann füge ich es nie auf die mapView.

Also meine Frage, ist dies der richtige Weg, um zu bestimmen, ob ein Standort der lat / long in der aktuellen Ansicht erscheinen würde und soll den den mapView hinzugefügt werden? Oder sollte ich dies auf eine andere Weise tun?

Veröffentlicht am 29/07/2009 um 00:59
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
7

In Ihrem Code, sollten Sie einen Blick für die Pass - toPointToView:Option. Ich habe es meinen mapView. Sie haben eine obere Grenze für die x- und y auch angeben.

Hier einige Code, der für mich gearbeitet (sagte mir, die aktuell sichtbaren Anmerkungen auf meiner Karte, während sie durch die Annotation 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);
    }
}
Beantwortet am 04/02/2010 um 05:47
quelle vom benutzer

stimmen
3

Ich weiß, das ist ein alter Thread, nicht sicher, was dann zur Verfügung zurück war ... Aber Sie sollten lieber tun:

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

    // Do your stuff

}

Keine Notwendigkeit, den Platz auf dem Bildschirm zu konvertieren zurück. Auch ich bin nicht sicher, ob der Grund, warum Sie versuchen, dies zu tun, ich denke, das ist seltsam, nicht Anmerkungen hinzufügen, wenn sie nicht auf dem Bildschirm sind ... MapKit bereits optimiert diese und nur schafft (und recycelt) Beschriftungsansichten, die sichtbar sind .

Beantwortet am 22/10/2015 um 19:12
quelle vom benutzer

stimmen
2

Nach einem wenig Lektüre kann ich nichts finden, das sagt die eine schlechte Idee ist. Ich habe ein wenig getestet in meiner app getan, und ich habe immer korrekte Ergebnisse. Die App lädt viel schneller, wenn ich nur Koordinaten hinzufügen, die in der aktuell sichtbaren Kartenregion auftauchen wird statt alle 300+ Koordinaten auf einmal.

Was ich suchte, war ein Verfahren, wie [mapView isCoordinateInVisibleRegion: myCoordinate], aber so weit diese Methode ist schnell und scheint genau.

Ich habe ich verändern auch den Titel „im sichtbaren Kartenregion“ statt den bisherigen zu lesen, weil ich der falsche Titel denken hat meinen Sinn verwirrt kann.

Beantwortet am 10/08/2009 um 14:09
quelle vom benutzer

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