【问题标题】:How to validate latitude and longitude如何验证纬度和经度
【发布时间】:2011-12-08 12:30:11
【问题描述】:

我有两个 UITextFields,用户可以输入纬度和经度,然后使用这些坐标在 MKMapView 上创建图钉。

我想找到一种方法来验证他们输入的值是实际的 GPS 坐标还是只是一堆垃圾。有没有办法做到这一点?

【问题讨论】:

    标签: geolocation gps coordinates mkmapview mkannotation


    【解决方案1】:

    latitude 必须是介于 -90 和 90 之间的数字,longitude 必须是介于 -180 和 180 之间的数字。

    【讨论】:

    • 一个带有解释的答案,stackoverflow.com/a/6536279/368691。是的,这是正确答案。但是,这是假设陆地和海洋。
    • 我们应该包括边界吗? (long >= -180 && long -180 && long
    • @Mehmed 否。应该是 (long > -180 && long -90 && lat
    • @SahilSharma 这样做有什么原因吗?如果其中一个坐标恰好位于极端之一(例如:google.com.br/maps/place/…),会发生什么?
    • 是的,包括边界,但只了解经度,-180 和 180 是同一个点。对于纬度,90 是地理北极,-90 是地理南极。
    【解决方案2】:

    以下是在 JavaScript 中验证它的函数。

    1. 纬度必须是 -90 到 90 之间的数字
    const isLatitude = num => isFinite(num) && Math.abs(num) <= 90;
    
    1. 经度必须是介于 -180 和 180 之间的数字
    const isLongitude = num => isFinite(num) && Math.abs(num) <= 180;
    

    【讨论】:

      【解决方案3】:

      使用跟随经纬度正则表达式,我们可以验证。

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

      【讨论】:

      • 我不知道这对接受的答案有什么影响(而不是使事情复杂化)
      【解决方案4】:

      在 Kotlin 中我们可以这样做:

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

      【讨论】:

        【解决方案5】:

        我会做这样的事情

        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
        }
        

        【讨论】:

          【解决方案6】:

          在经历了很多 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;
          
           }
          

          【讨论】:

            【解决方案7】:
            CLLocationCoordinate2D p1;
                    p1.latitude  = [[punto latitud] doubleValue];
                    p1.longitude = [[punto longitud] doubleValue];
                    if (CLLocationCoordinate2DIsValid(p1))
                    {
                        [Mapa addAnnotation:annotationPoint];
                    }
            

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多