首页 > 解决方案 > 验证 gps 坐标 lat 和 long

问题描述

我从这里获取了两个正则表达式:https ://stackoverflow.com/a/26119160/2829150 它应该正确验证纬度和经度。尽管如此,还是有问题,对于有效坐标,它给了我错误。

示例(有效)坐标直到得到,因为根据方法正则表达式它是无效的。

Lat: 53.0102721
Lon: 18.6048094

代码:

public static bool IsValidLatitude(string latitude)
{
      var reg = new Regex(@"^(\+|-)?((\d((\.)|\.\d{1,6})?)|(0*?[0-8]\d((\.)|\.\d{1,6})?)|(0*?90((\.)|\.0{1,6})?))$");
      return reg.IsMatch(latitude);
}

public static bool IsValidLongitude(string longtitude)
{
      var reg = new Regex(@"^(\+|-)?((\d((\.)|\.\d{1,6})?)|(0*?\d\d((\.)|\.\d{1,6})?)|(0*?1[0-7]\d((\.)|\.\d{1,6})?)|(0*?180((\.)|\.0{1,6})?))$");
      return reg.IsMatch(longtitude);
}

请注意:它不需要是正则表达式。无论分隔符的 PC 设置是什么,都可以记住检查是否使用了点 (.)。我对任何其他提议持开放态度。

标签: c#regex

解决方案


验证坐标的一种更简单的方法是将字符串解析为数值,并验证它在 -90 和 90(纬度)和 -180 和 180(经度)之间:

string latitudeString = "53.0102721";
string longitudeString = "18.6048094";

        bool latitudeIsValid = decimal.TryParse(latitudeString, NumberStyles.AllowDecimalPoint|NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var latitude) 
                              && Math.Abs(latitude) < 90);
        bool longitudeIsValid = decimal.TryParse(longitudeString, NumberStyles.AllowDecimalPoint|NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var longitude) 
                              && Math.Abs(longitude) < 180);

根据您使用.小数分隔符保存为字符串的要求:首先,我建议您在存储系统中使用数字数据类型(如果可能)。如果必须存储为字符串,则可以使用原始字符串,或使用decimal.ToString正确的文化和格式说明符:

string latitudeAsString = latitude.ToString("N7", CultureInfo.InvariantCulture);    

推荐阅读