Как проверить широту и долготу

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

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

Ответ 1

latitude должно быть числом от -90 до 90, а longitude между -180 и 180.

Ответ 2

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

С 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})?))$

Ответ 3

Я бы сделал что-то вроде этого

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
}

Ответ 4

Пройдя много вопросов 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;

 }

Ответ 5

В Kotlin мы можем сделать что-то вроде этого:

fun isValidLatLang(latitude: Double?, longitude: Double?): Boolean {
    return latitude?.toInt() in -90 until 90 && longitude?.toInt() in -180 until 180
}

Ответ 6

CLLocationCoordinate2D p1;
        p1.latitude  = [[punto latitud] doubleValue];
        p1.longitude = [[punto longitud] doubleValue];
        if (CLLocationCoordinate2DIsValid(p1))
        {
            [Mapa addAnnotation:annotationPoint];
        }