Cum pot determina dacă o coordonată este în regiunea vizibilă a hărții în prezent?

voturi
2

Am o listă de câteva sute de locații și doriți doar să afișeze o MKPinAnnotation pentru acele locații în prezent pe ecran. Ecranul începe cu locația utilizatorului curent, cu o rază de 2 mile. Desigur, utilizatorul poate derula și zoom pe ecran. Chiar acum, am așteptați pentru un eveniment hartă actualizare, apoi bucla prin lista mea de locație, și verificați coordonatele ca aceasta:

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

Deci, eu cer convertCoordinate în cazul în care punctul ar fi pe ecran (dacă nu înțeleg greșit această metodă, care este foarte posibil). În cazul în care nu este de coordonate pe ecran, atunci eu nu-l adăugați la mapView.

Deci, întrebarea mea, este aceasta modul corect de a determina dacă lat / lung ar apărea o locație în vizualizarea curentă și ar trebui să fie adăugate la The mapView? Sau ar trebui să fac acest lucru într-un mod diferit?

Întrebat 29/07/2009 la 00:59
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
7

În codul dvs., ar trebui să treacă o vizualizare pentru toPointToView:opțiunea. I-am dat mea mapView. Trebuie să specificați prea o limită superioară pentru x și y.

Iată un exemplu de cod care a lucrat pentru mine (mi-a spus adnotările vizibile in prezent pe harta mea, în timp ce looping prin adnotare):

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);
    }
}
Publicat 04/02/2010 la 05:47
sursa de către utilizator

voturi
3

Știu că acest lucru este un fir de vechi, nu sunt sigur ce a fost disponibil atunci ... Dar ar trebui să faceți mai degrabă:

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

    // Do your stuff

}

Nu este nevoie pentru a converti înapoi la spațiul ecranului. De asemenea, nu sunt sigur motivul pentru care încercați să faceți acest lucru, cred că acest lucru este ciudat să nu adăugați adnotări atunci când acestea nu sunt pe ecran ... MapKit optimizează deja acest lucru și creează doar (și reciclează) vederi adnotări care sunt vizibile .

Publicat 22/10/2015 la 19:12
sursa de către utilizator

voturi
2

După un pic de lectură eu nu pot găsi nimic care spune acest lucru este o idee proastă. Am făcut un pic de testare în aplicația mea și am obține întotdeauna rezultate corecte. Sarcinile app mult mai rapid atunci când am adăuga doar coordonatele care vor apărea în regiune hartă vizibilă în prezent în locul tuturor +300 coordonatele dintr-o dată.

Ceea ce am fost în căutarea a fost o metodă ca [mapView isCoordinateInVisibleRegion: myCoordinate], dar până în prezent această metodă este rapidă și precisă pare.

M-am schimbat, de asemenea, titlul de a citi „în regiunea vizibilă a hărții“, în loc de anterioare, deoarece cred că titlul incorect poate fi confundat sensul meu.

Publicat 10/08/2009 la 14:09
sursa de către utilizator

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