¿Cómo determino si hay una coordenada en la región del mapa actualmente visible?

votos
2

Tengo una lista de cientos de ubicaciones y solo deseo mostrar una MKPinAnnotation para esas ubicaciones actualmente en la pantalla. La pantalla comienza con la ubicación actual del usuario con un radio de 2 millas. Por supuesto, el usuario puede desplazarse y hacer zoom en la pantalla. En este momento, espero un evento de actualización del mapa, y luego recorro mi lista de ubicaciones y verifico las coordenadas de esta manera:

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

Así que le pregunto a convertCoordinate dónde estaría el punto en la pantalla (a menos que malinterprete este método, que es muy posible). Si la coordenada no está en la pantalla, nunca la agregue a mapView.

Entonces mi pregunta, ¿es esta la forma correcta de determinar si el latitud / longitud de una ubicación aparecería en la vista actual y debería agregarse a la vista de mapa? ¿O debería estar haciendo esto de otra manera?

Publicado el 29/07/2009 a las 00:59
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
7

En su código, debe pasar una vista para la toPointToView:opción. Se lo di a mi mapView. Tiene que especificar un límite superior para la xey también.

Aquí hay un código que funcionó para mí (me dijo que las anotaciones actualmente visibles en mi mapa, mientras que bucle a través de la anotación):

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);
    }
}
Respondida el 04/02/2010 a las 05:47
fuente por usuario

votos
3

Sé que esto es un hilo de edad, no está seguro de lo que estaba disponible en ese entonces ... pero se debe hacer más:

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

    // Do your stuff

}

No hay necesidad de convertir de nuevo al espacio de pantalla. Además no estoy seguro de la razón por la que usted está tratando de hacer esto, creo que esto es extraño para no añadir anotaciones cuando no están en la pantalla ... MapKit ya se optimiza esto y sólo crea (y recicla) las vistas de anotación que son visibles .

Respondida el 22/10/2015 a las 16:12
fuente por usuario

votos
2

Después de leer un poco, no encuentro nada que diga que es una mala idea. He hecho algunas pruebas en mi aplicación y siempre obtengo los resultados correctos. La aplicación se carga mucho más rápido cuando solo agrego las coordenadas que aparecerán en la región del mapa actualmente visible en lugar de todas las más de 300 coordenadas a la vez.

Lo que estaba buscando era un método como [mapView isCoordinateInVisibleRegion: myCoordinate], pero hasta ahora este método es rápido y parece preciso.

También cambié el título para que dijera "en la región del mapa visible" en lugar del anterior porque creo que el título incorrecto puede haber confundido mi significado.

Respondida el 10/08/2009 a las 14:09
fuente por usuario

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