Ответ 1
latitude должно быть числом от -90 до 90, а longitude между -180 и 180.
У меня есть два UITextFields, которые пользователи могут вводить в широте и долготе, эти координаты затем используются для создания вывода на MKMapView.
Я хочу найти способ проверить, являются ли введенные значения фактическими координатами GPS или просто грузом мусора. Есть ли способ сделать это?
latitude должно быть числом от -90 до 90, а longitude между -180 и 180.
Используя следующие регулярные выражения широты и долготы, мы можем подтвердить.
С 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})?))$
Я бы сделал что-то вроде этого
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
}
Пройдя много вопросов 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;
}
В Kotlin мы можем сделать что-то вроде этого:
fun isValidLatLang(latitude: Double?, longitude: Double?): Boolean {
return latitude?.toInt() in -90 until 90 && longitude?.toInt() in -180 until 180
}
CLLocationCoordinate2D p1;
p1.latitude = [[punto latitud] doubleValue];
p1.longitude = [[punto longitud] doubleValue];
if (CLLocationCoordinate2DIsValid(p1))
{
[Mapa addAnnotation:annotationPoint];
}