【发布时间】:2011-12-08 12:30:11
【问题描述】:
我有两个 UITextFields,用户可以输入纬度和经度,然后使用这些坐标在 MKMapView 上创建图钉。
我想找到一种方法来验证他们输入的值是实际的 GPS 坐标还是只是一堆垃圾。有没有办法做到这一点?
【问题讨论】:
标签: geolocation gps coordinates mkmapview mkannotation
我有两个 UITextFields,用户可以输入纬度和经度,然后使用这些坐标在 MKMapView 上创建图钉。
我想找到一种方法来验证他们输入的值是实际的 GPS 坐标还是只是一堆垃圾。有没有办法做到这一点?
【问题讨论】:
标签: geolocation gps coordinates mkmapview mkannotation
【讨论】:
以下是在 JavaScript 中验证它的函数。
const isLatitude = num => isFinite(num) && Math.abs(num) <= 90;
const isLongitude = num => isFinite(num) && Math.abs(num) <= 180;
【讨论】:
使用跟随经纬度正则表达式,我们可以验证。
在 Objective-C 中使用转义字符:
纬度正则表达式:
@"^(\\+|-)?((\\d((\\.)|\\.\\d{1,6})?)|(0*?[0-8]\\d((\\.)|\\.\\d{1,6})?)|(0*?90((\\.)|\\.0{1,6})?))$"
经度正则表达式:
@"^(\\+|-)?((\\d((\\.)|\\.\\d{1,6})?)|(0*?\\d\\d((\\.)|\\.\\d{1,6})?)|(0*?1[0-7]\\d((\\.)|\\.\\d{1,6})?)|(0*?180((\\.)|\\.0{1,6})?))$"
纬度和经度的正则表达式:
纬度正则表达式:
^(\+|-)?((\d((\.)|\.\d{1,6})?)|(0*?[0-8]\d((\.)|\.\d{1,6})?)|(0*?90((\.)|\.0{1,6})?))$
经度正则表达式:
^(\+|-)?((\d((\.)|\.\d{1,6})?)|(0*?\d\d((\.)|\.\d{1,6})?)|(0*?1[0-7]\d((\.)|\.\d{1,6})?)|(0*?180((\.)|\.0{1,6})?))$
【讨论】:
在 Kotlin 中我们可以这样做:
fun isValidLatLang(latitude: Double?, longitude: Double?): Boolean {
return latitude?.toInt() in -90 until 90 && longitude?.toInt() in -180 until 180
}
【讨论】:
我会做这样的事情
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:A Global Map Based Station for Reporting Aliens, Monsters, Zombies and Other Interesting Events(iPhone/iPad 应用程序)的纬度/经度验证时所寻找的内容。无耻,我知道,但我认为我应得的,因为我提出了一个完整而优雅的答案/解决方案(改编了上面 Craig 的简短回答)!
我正在使用新的 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;
}
【讨论】:
CLLocationCoordinate2D p1;
p1.latitude = [[punto latitud] doubleValue];
p1.longitude = [[punto longitud] doubleValue];
if (CLLocationCoordinate2DIsValid(p1))
{
[Mapa addAnnotation:annotationPoint];
}
【讨论】: