2011-10-15 61 views
11

Tengo dos UITextFields que los usuarios pueden ingresar en latitud y longitud, estas coordenadas se usan para crear un pin en un MKMapView.Cómo validar latitud y longitud

Quiero encontrar una manera de validar si los valores que ingresan son coordenadas GPS reales o solo una carga de basura. ¿Hay alguna forma de hacer esto?

Respuesta

38

El latitude debe ser un número entre -90 y 90 y el longitude entre -180 y 180.

+2

Genial, ¿Es esto cierto? – Pacerier

+1

Una respuesta con una explicación, http://stackoverflow.com/a/6536279/368691. Sí, es la respuesta correcta. Sin embargo, esto supone tierra y mar. – Gajus

+2

¿Deberíamos incluir el borde? (largo> = -180 && long <= 180) o (largo> -180 && largo <180)? – Mehmed

0

me gustaría hacer algo como esto

numberFormatter = [[NSNumberFormatter alloc] init]; 
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
NSNumber *latitude = [numberFormatter numberFromString:theInputString];  
if((latitude != nil) 
{ 
    //check it is within lat/long range 
} else { 
    //not even a valid number, reject it 
} 
-1
CLLocationCoordinate2D p1; 
     p1.latitude = [[punto latitud] doubleValue]; 
     p1.longitude = [[punto longitud] doubleValue]; 
     if (CLLocationCoordinate2DIsValid(p1)) 
     { 
      [Mapa addAnnotation:annotationPoint]; 
     } 
+3

Esta respuesta se encuentra en la cola de revisión de publicaciones de baja calidad porque es solo código sin explicación. Por favor, mejore su respuesta explicando qué hace su código y cómo responde la pregunta. Por favor, lea [este consejo sobre cómo responder las preguntas de programación de forma útil] (http://msmvps.com/blogs/jon_skeet/archive/2009/02/17/answering-technical-questions-helpfully.aspx). –

3

El uso de latitud y longitud seguimiento expresiones regulares, podemos validar.

Con caracteres de escape en Objective-C:

Latitud RegEx:

@"^(\\+|-)?((\\d((\\.)|\\.\\d{1,6})?)|(0*?[0-8]\\d((\\.)|\\.\\d{1,6})?)|(0*?90((\\.)|\\.0{1,6})?))$" 

Longitud RegEx:

@"^(\\+|-)?((\\d((\\.)|\\.\\d{1,6})?)|(0*?\\d\\d((\\.)|\\.\\d{1,6})?)|(0*?1[0-7]\\d((\\.)|\\.\\d{1,6})?)|(0*?180((\\.)|\\.0{1,6})?))$" 

Las expresiones regulares normal que tanto la latitud & longitud:

Latitud RegEx:

^(\+|-)?((\d((\.)|\.\d{1,6})?)|(0*?[0-8]\d((\.)|\.\d{1,6})?)|(0*?90((\.)|\.0{1,6})?))$ 

Longitud RegEx:

^(\+|-)?((\d((\.)|\.\d{1,6})?)|(0*?\d\d((\.)|\.\d{1,6})?)|(0*?1[0-7]\d((\.)|\.\d{1,6})?)|(0*?180((\.)|\.0{1,6})?))$ 
0

Después de pasar por un montón de preguntas StackOverflow, pensé que esta pregunta se hizo de una manera sencilla y directa, que describía lo que estaba buscando en la solución de mi latitud/longitud validación para AMZO:A Global Map Based Station for Reporting Aliens, Monsters, Zombies and Other Interesting Events (aplicación iPhone/iPad). Desvergonzado, lo sé, pero creo que me lo merezco por encontrar una respuesta/solución completa y elegante (adaptando la breve respuesta de Craig).

Estoy utilizando el nuevo AlertController que llama a cada una de las siguientes validaciones para entradas de texto de latitud y longitud.

- (BOOL) validateInput1: (NSString *) latitude 
{ 
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
    NSNumber *latitude1 = [numberFormatter numberFromString:latitude]; 

    if (latitude1 != nil) 

    { 
     //check it is within lat/long range 

     if ((latitude1.floatValue > -90.0) && (latitude1.floatValue < 90.0)) { 

      NSLog(@"Hello Latitude!!!"); 

      return 1; 
     } 

    } else { 

     //not even a valid number, reject it 

     return 0; 

    } 

     return 0; 

} 


- (BOOL) validateInput2: (NSString *) longitude 
{ 
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
    NSNumber *longitude1 = [numberFormatter numberFromString:longitude]; 

    if (longitude1 != nil) 

    { 
     //check it is within lat/long range 

     if ((longitude1.floatValue > -180.0) && (longitude1.floatValue < 180.0)) { 

      NSLog(@"Hello Longitude!!!"); 

      return 1; 
     } 

    } else { 

     //not even a valid number, reject it 

     return 0; 

    } 

    return 0; 

} 
Cuestiones relacionadas