2012-03-20 37 views
6

Actualmente estoy trabajando con MKMapView y estoy tratando de que los datos aparezcan en la pantalla. Para lograr esto, he decidido corregir un pequeño MapDataProvider que escupe una matriz de objetos MKAnnotation, cada uno con una coordenada con valores aleatorios de latitud y longitud.MKMapView Latitud y longitud Coordenadas

Ya me he asegurado de que mi MKMapView está conectado a mi controlador y la matriz de objetos MKAnnotation provienen correctamente de mi MapDataProvider ... pero por alguna razón ... cuando trato de especificar coordenadas en Norteamérica (ej. 48, -84) ... no aparece nada en MKMapView.

Después de jugar descubrí que cualquier longitud de valor inferior a 0 me da este problema.

He intentado verificar el valor de las coordenadas para cada objeto MKAnnotation en mi colección, pero CLLocation2DIsValue() sigue devolviendo falso.

Pregunta:

Qué rango de valores puedo entrar a la latitud y longitud para una CLLocationCoordinate2D así que mis pasadores se muestran en América del Norte?

para dar un poco más de contexto, aquí está el método que se invoca en el MapDataProvider:

+ (NSArray *) getMockMapData {

NSMutableArray *tempMapData = [[NSMutableArray alloc] initWithCapacity:15]; 

for (int i=0; i< 15; i++) { 

    double latitude = rand()%20 +50; 
    double longitude = -107 + rand()%10; 

    CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(latitude, longitude); 

    if(CLLocationCoordinate2DIsValid(coord) == NO) 
     continue; 

    [tempMapData addObject:[MockMapData 
          dataForValues:[@"Item " stringByAppendingString:[[NSNumber numberWithInt:i] description]] 
           subTitle:[@"Item " stringByAppendingString:[[NSNumber numberWithInt:i]description]] 
           coordinate:coord]]; 
    } 
    return tempMapData; 
} 
+1

Latitude puede ser de -90 a 90 y la longitud puede ser de -180 a 180, por lo que 48, -84 es válido. ¿Puedes publicar el código que agrega las anotaciones? – Anna

+0

Gracias por su respuesta. Después de jugar con eso un poco más, cambié de Arrandom por rand y ese cambio corrige mi problema. – dpalmajr

+0

Se actualizó la fuente con la última corrección. – dpalmajr

Respuesta

3

Su código original era la siguiente:

double latitude = arcrandom()%20 +50; 
double longitude = -107 + arcrandom()%10; 

(En realidad, probablemente tenía arc4random, no arcrandom.)


La función arc4random devuelve un valor entero sin signo.

Restar un número entero (-107) de ese valor resultó en un desbordamiento que dio valores como 4294967189. Eso definitivamente sería una longitud inválida.

En lugar de cambiar a rand (que la documentación dice que es un "generador de números aleatorios malo"), utilice arc4random (que creo que es el preferido) y forzar un cálculo de coma flotante por escrito -107.0 en lugar de -107:

double latitude = arc4random()%20 +50; 
double longitude = -107.0 + arc4random()%10; 


un punto relacionado es que si NOCLLocationCoordinate2DIsValid dice, que se acaba de hacer un return sin enviar de vuelta cualquier valor (lo que usted necesita de acuerdo a la declaración del método). O bien, haga return tempMapData; o continue;.

+0

Respuesta completa. Gracias por explicar las diferencias entre los generadores de números aleatorios que encontré. En cuanto a la declaración de "devolución" al azar, tiene toda la razón. Normalmente no hago eso, pero a los efectos de darles a todos un poco más de contexto (y simplemente poner algo en marcha) pensé que haría la excepción. – dpalmajr

0

se utiliza un lenguaje de programación simple, mdsl, que se utiliza para generar código Objective-C para iOS. Tienen un control de mapa que le permite lograr lo que necesita de un simple descriptor. Como muestra este ejemplo, puede utilizar ubicaciones estáticas contacto del empuje, o las dinámicas:

map venuMap (32,610,708,360) { 
    Standard ; 
    show user ; 
    area .1,.1; 
    //location 30.275806,-97.740128 ('TX Capital' , '1200 N Congress'); 
    locationReference lat, long (sDetTitle, address); 
} 

El código generado es abierta, por lo que sólo puede copiar y pegar de nuevo en su aplicación.

Cuestiones relacionadas