/// <summary> /// Format the given longitude /// Possible formats: /// d - Dezimalgrad, zum Beispiel -122.2° /// g - Grad, Minuten, Sekunden, zum Beispiel 122°05'06.24"W /// m - Grad, Dezimalminuten, zum Beispiel 122° 36.875' W /// Grad, Dezimalgrad ohne Grad-Zeichen /// </summary> /// <param name="longitude"></param> /// <param name="format">Format to be used: d, g or m</param> /// <returns></returns> public static string ToLongString(this SexagesimalCoordinate longitude, string format = "") { var longChar = longitude.DecimalValue >= 0 ? "O" : "W"; switch (format) { case "d": return($"{longitude}°"); case "g": return($"{Math.Abs(longitude.Degrees)}° {longitude.Minutes}' {longitude.Seconds:F2}\" {longChar}"); case "m": return($"{Math.Abs(longitude.Degrees)}° {longitude.Minutes + longitude.Seconds / 60.0:F4}' {longChar}"); } return($"{longitude}"); }
public static SexagesimalCoordinate Parse(string text) { text = text .Trim() .ToUpper() .Replace(",", "."); // -32° 18.385' var match = new Regex(@"^([+-]?[0-9]+)\s*°\s*([0-9]+(\.([0-9]+))?)\s*'$").Match(text); if (match.Success) { var degrees = int.Parse(match.Groups[1].Value, NumberStyles.Integer | NumberStyles.AllowLeadingSign); var minutes = double.Parse(match.Groups[2].Value, NumberStyles.Float, CultureInfo.InvariantCulture); var coordinate = new SexagesimalCoordinate(degrees, minutes); return(coordinate); } // 32° 18.385' N match = new Regex(@"^([+-]?[0-9]+)\s*°\s*([0-9]+(\.([0-9]+))?)\s*'\s*([NSOW])$").Match(text); if (match.Success) { var degrees = int.Parse(match.Groups[1].Value, NumberStyles.Integer | NumberStyles.AllowLeadingSign); var minutes = double.Parse(match.Groups[2].Value, NumberStyles.Float, CultureInfo.InvariantCulture); if ("SW".Contains(match.Groups[5].Value)) { degrees = -degrees; } var coordinate = new SexagesimalCoordinate(degrees, minutes) { Type = "NS".Contains(match.Groups[5].Value) ? SexagesimalCoordinate.CoordinateType.Latitude : SexagesimalCoordinate.CoordinateType.Longitude }; return(coordinate); } // 37°25'19.07"N match = new Regex("^([0-9]+)\\s*°\\s*([0-9]+)\\s*'\\s*([0-9]+(\\.([0-9]+))?)\\s*\"\\s*([NSOW])$").Match(text); if (match.Success) { var degrees = int.Parse(match.Groups[1].Value, NumberStyles.Integer | NumberStyles.AllowLeadingSign); var minutes = int.Parse(match.Groups[2].Value, NumberStyles.Integer); var seconds = double.Parse(match.Groups[3].Value, NumberStyles.Float, CultureInfo.InvariantCulture); if ("SW".Contains(match.Groups[6].Value)) { degrees = -degrees; } var coordinate = new SexagesimalCoordinate(degrees, minutes, seconds) { Type = "NS".Contains(match.Groups[6].Value) ? SexagesimalCoordinate.CoordinateType.Latitude : SexagesimalCoordinate.CoordinateType.Longitude }; return(coordinate); } // -37.7° match = new Regex("^([+-]?[0-9]+(\\.([0-9]+))?)\\s*°?$").Match(text); if (match.Success) { var degrees = double.Parse(match.Groups[1].Value, NumberStyles.Float | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture); var coordinate = new SexagesimalCoordinate(degrees); return(coordinate); } // 37.7° S match = new Regex("^([0-9]+(\\.([0-9]+))?)\\s*°?\\s*([NSOW])$").Match(text); if (match.Success) { var degrees = double.Parse(match.Groups[1].Value, NumberStyles.Float | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture); if ("SW".Contains(match.Groups[4].Value)) { degrees = -degrees; } var coordinate = new SexagesimalCoordinate(degrees) { Type = "NS".Contains(match.Groups[4].Value) ? SexagesimalCoordinate.CoordinateType.Latitude : SexagesimalCoordinate.CoordinateType.Longitude }; return(coordinate); } // 37 25 19.07 match = new Regex("^([0-9]+)\\s*([0-9]+)\\s*([0-9]+(\\.([0-9]+))?)\\s*([NSOW])?$").Match(text); if (match.Success) { var degrees = int.Parse(match.Groups[1].Value, NumberStyles.Integer | NumberStyles.AllowLeadingSign); var minutes = int.Parse(match.Groups[2].Value, NumberStyles.Integer); var seconds = double.Parse(match.Groups[3].Value, NumberStyles.Float, CultureInfo.InvariantCulture); if (!string.IsNullOrEmpty(match.Groups[6].Value) && "SW".Contains(match.Groups[6].Value)) { degrees = -degrees; } var coordinate = new SexagesimalCoordinate(degrees, minutes, seconds) { Type = "NS".Contains(match.Groups[6].Value) ? SexagesimalCoordinate.CoordinateType.Latitude : SexagesimalCoordinate.CoordinateType.Longitude }; return(coordinate); } return(new SexagesimalCoordinate(0.0)); }