Hvordan finner jeg ut om en koordinat er i den synlige kartet region?

stemmer
2

Jeg har en liste med flere hundre steder og bare ønsker å vise et MKPinAnnotation for disse stedene som er på skjermen. Skjermen starter med brukerens nåværende posisjon med en to kilometers radius. Selvfølgelig kan brukeren bla og zoome på skjermen. Akkurat nå venter jeg på en kartoppdatering hendelse, og deretter sløyfe gjennom min plassering liste, og sjekke koordinatene som dette:

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

Så jeg spør convertCoordinate der poenget ville være på skjermen (med mindre jeg misforstår denne metoden som er meget mulig). Hvis koordinere ikke er på skjermen, så jeg aldri legge det til mapView.

Så spørsmålet mitt er dette den riktige måten å avgjøre om en plassering er lat / long vil vises i gjeldende visning og bør legges til den mapView? Eller bør jeg gjøre dette på en annen måte?

Publisert på 28/07/2009 klokken 23:59
kilden bruker
På andre språk...                            


3 svar

stemmer
7

I koden din, bør du passere en visning for toPointToView:alternativet. Jeg ga mitt mapView. Du må angi en øvre grense for x og y også.

Her er noen kode som jobbet for meg (fortalt meg de synlige kommentarene på kartet mitt, mens looping gjennom merknaden):

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);
    }
}
Svarte 04/02/2010 kl. 04:47
kilden bruker

stemmer
3

Jeg vet dette er en gammel tråd, ikke sikker på hva som var tilgjengelig da ... Men du bør heller gjøre:

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

    // Do your stuff

}

Du trenger ikke å konvertere tilbake til plass på skjermen. Også er jeg ikke sikker på grunnen til at du prøver å gjøre dette, tror jeg dette er rart å ikke legge til kommentarer når de ikke er på skjermen ... MapKit optimaliserer allerede dette, og bare skaper (og resirkulerer) merknads visninger som er synlige .

Svarte 22/10/2015 kl. 19:12
kilden bruker

stemmer
2

Etter litt lesing jeg finner ikke noe som sier at dette er en dårlig idé. Jeg har gjort litt av testing i app min og jeg får alltid riktige resultater. App laster mye raskere når jeg bare legge til koordinatene som vil dukke opp i den synlige kartområdet i stedet for alle de 300 + koordinatene på en gang.

Det jeg var ute etter var en metode som [mapView isCoordinateInVisibleRegion: myCoordinate], men så langt denne metoden er rask og synes nøyaktig.

Jeg har også endret tittelen for å lese "i det synlige kartområdet" i stedet for den tidligere fordi jeg tror det er feil tittelen kan ha forvekslet min mening.

Svarte 10/08/2009 kl. 13:09
kilden bruker

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