Как проверить широту и долготу - PullRequest
22 голосов
/ 16 октября 2011

У меня есть два поля UITextField, которые пользователи могут вводить по широте и долготе, затем эти координаты используются для создания булавки на MKMapView.

Я хочу найти способ проверить, введены ли введенные значенияфактические координаты GPS или просто мусор.Есть ли способ сделать это?

Ответы [ 5 ]

71 голосов
/ 16 октября 2011

Широта должна быть числом от -90 до 90, а долгота - от -180 до 180.

4 голосов
/ 30 сентября 2014

Используя регулярные выражения широты и долготы, мы можем проверить.

С помощью escape-символов в Objective-C:

Широта RegEx:

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

Долгота RegEx:

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

Нормальные Регулярные выражения для широты и долготы:

Широта RegEx:

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

Долгота 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 голосов
/ 02 октября 2015

Пройдя через множество вопросов StackOverflow, я подумал, что этот вопрос был задан простым и понятным образом, описывающим то, что я искал при решении проверки широты и долготы для AMZO: станция на основе глобальной карты для Репортажи об иностранцах, монстрах, зомби и других интересных событиях (приложение для iPhone / iPad). Бесстыдно, я знаю, но я думаю, что заслуживаю этого за то, что придумал полный и элегантный ответ / решение (адаптируя краткий ответ Крэйга выше)!

Я использую новый AlertController, который вызывает каждую из следующих проверок для ввода текста широты и долготы.

 - (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;

 }
0 голосов
/ 23 июля 2014
CLLocationCoordinate2D p1;
        p1.latitude  = [[punto latitud] doubleValue];
        p1.longitude = [[punto longitud] doubleValue];
        if (CLLocationCoordinate2DIsValid(p1))
        {
            [Mapa addAnnotation:annotationPoint];
        }
0 голосов
/ 16 октября 2011

Я бы сделал что-то подобное

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
}
...