From 9663da9cf2f85bcc3d0edfff6705beb07a6b6340 Mon Sep 17 00:00:00 2001 From: mort5161 Date: Fri, 25 Jul 2014 14:21:26 -0700 Subject: [PATCH] Refactor lat/long parsing --- src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs | 8 ++------ src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs | 8 ++------ src/NmeaParser.Shared/Nmea/NmeaMessage.cs | 24 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs b/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs index 436655a..be3704b 100644 --- a/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs +++ b/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs @@ -45,12 +45,8 @@ namespace NmeaParser.Nmea.Gps protected override void LoadMessage(string[] message) { var time = message[0]; - Latitude = int.Parse(message[1].Substring(0, 2), CultureInfo.InvariantCulture) + double.Parse(message[1].Substring(2), CultureInfo.InvariantCulture) / 60; - if (message[2] == "S") - Latitude *= -1; - Longitude = int.Parse(message[3].Substring(0, 3), CultureInfo.InvariantCulture) + double.Parse(message[3].Substring(3), CultureInfo.InvariantCulture) / 60; - if (message[4] == "W") - Longitude *= -1; + Latitude = NmeaMessage.StringToLatitude(message[1], message[2]); + Longitude = NmeaMessage.StringToLongitude(message[3], message[4]); Quality = (FixQuality)int.Parse(message[5], CultureInfo.InvariantCulture); NumberOfSatellites = int.Parse(message[6], CultureInfo.InvariantCulture); Hdop = double.Parse(message[7], CultureInfo.InvariantCulture); diff --git a/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs b/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs index 943f9a6..1919c02 100644 --- a/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs +++ b/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs @@ -38,12 +38,8 @@ namespace NmeaParser.Nmea.Gps int.Parse(message[0].Substring(2, 2)), int.Parse(message[0].Substring(4, 2)), DateTimeKind.Utc); Active = (message[1] == "A"); - Latitude = int.Parse(message[2].Substring(0, 2), CultureInfo.InvariantCulture) + double.Parse(message[2].Substring(2), CultureInfo.InvariantCulture) / 60; - if (message[3] == "S") - Latitude *= -1; - Longitude = int.Parse(message[4].Substring(0, 3), CultureInfo.InvariantCulture) + double.Parse(message[4].Substring(3), CultureInfo.InvariantCulture) / 60; - if (message[5] == "W") - Longitude *= -1; + Latitude = NmeaMessage.StringToLatitude(message[2], message[3]); + Longitude = NmeaMessage.StringToLongitude(message[4], message[5]); Speed = double.Parse(message[6], CultureInfo.InvariantCulture); Course = double.Parse(message[7], CultureInfo.InvariantCulture); MagneticVariation = double.Parse(message[9], CultureInfo.InvariantCulture); diff --git a/src/NmeaParser.Shared/Nmea/NmeaMessage.cs b/src/NmeaParser.Shared/Nmea/NmeaMessage.cs index ebe4e7c..d3c7a40 100644 --- a/src/NmeaParser.Shared/Nmea/NmeaMessage.cs +++ b/src/NmeaParser.Shared/Nmea/NmeaMessage.cs @@ -16,6 +16,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Reflection; using System.Text; @@ -109,5 +110,28 @@ namespace NmeaParser.Nmea { return string.Format("${0},{1}", MessageType, string.Join(",", MessageParts)); } + + internal static double StringToLatitude(string value, string ns) + { + try + { + double latitude = int.Parse(value.Substring(0, 2), CultureInfo.InvariantCulture) + double.Parse(value.Substring(2), CultureInfo.InvariantCulture) / 60; + if (ns == "S") + latitude *= -1; + return latitude; + } + catch { return double.NaN; } + } + internal static double StringToLongitude(string value, string ew) + { + try + { + double longitude = int.Parse(value.Substring(0, 3), CultureInfo.InvariantCulture) + double.Parse(value.Substring(3), CultureInfo.InvariantCulture) / 60; + if (ew == "W") + longitude *= -1; + return longitude; + } + catch { return double.NaN; } + } } }