Exemple #1
0
        //=======================================================================

        //=======================================================================
        public static bool TryParse(string inputString, out GgaData ggaData)
        {
            try
            {
                ggaData = Parse(inputString);
                return(true);
            }
            catch
            {
                ggaData = null;
                return(false);
            }
        }
Exemple #2
0
        //=======================================================================
        #region -= static methods =-

        //=======================================================================
        public static GgaData Parse(string inputString)
        {
            if (string.IsNullOrEmpty(inputString) || inputString.IndexOf("*", StringComparison.Ordinal) < 0)
            {
                return(null);
            }
            //---- declare vars
            GgaData data       = new GgaData();
            string  dataString = inputString.Substring(0, inputString.IndexOf('*')); // strip off the checksum

            string[] values = dataString.Split(',');

            //---- if we don't have 15 (header + 14), it's no good
            if (values.Length < 15)
            {
                throw new FormatException();
            }

            //---- if the time is six digits
            if (values[1].Length == 9)
            {
                //---- make sure that they're actually numbers
                //int temp;
                //if (int.TryParse(values[1], out temp))
                //{
                //---- should add more validation here
                int hour        = int.Parse(values[1].Substring(0, 2));
                int minute      = int.Parse(values[1].Substring(2, 2));
                int second      = int.Parse(values[1].Substring(4, 2));
                int millisecond = 0;
                if (values[1].Length >= 9)
                {
                    millisecond = Convert.ToInt32(double.Parse(values[1].Substring(6, 3)) * 1000);
                }
                data.UtcTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour, minute, second, millisecond);
                //}
                //else { throw new FormatException("Date or time string is invalid"); }
            }
            //由于长春老网口版,上面会抛异常所以注销掉,20160323
            //else { throw new FormatException("Date or time string is invalid"); }

            //---- lat/long position
            data.Position = Position.Parse(values[2] + "," + values[3] + ";" + values[4] + "," + values[5]);

            //---- quality
            data.Quality = (Quality)Enum.Parse(typeof(Quality), values[6]);
            switch (int.Parse(values[6]))
            {
            case 0:
                data.Quality = Quality.NoFix;
                break;

            case 1:
                data.Quality = Quality.GpsFix;
                break;

            case 2:
                //data.Quality = Quality.DifferentialGpsFix;
                //todo:北斗星通,E,2时认为是高精度
                data.Quality = Quality.FixedRealTimeKinematic;
                break;

            case 3:
                data.Quality = Quality.PulsePerSecond;
                break;

            case 4:
                data.Quality = Quality.FixedRealTimeKinematic;
                break;

            case 5:
                data.Quality = Quality.FloatRealTimeKinematic;
                break;

            case 6:
                data.Quality = Quality.Estimated;
                break;

            case 7:
                data.Quality = Quality.ManualInput;
                break;

            case 8:
                data.Quality = Quality.Simulated;
                break;

            default:
                data.Quality = Quality.Unknown;
                break;
            }

            //---- number of satellites
            data.NumberOfSatelitesInUse = int.Parse(values[7]);

            //---- HDOP
            data.HorizontalDilutionOfPrecision = (string.IsNullOrEmpty(values[8]) ? 0 : decimal.Parse(values[8]));

            //---- elevation
            if (!string.IsNullOrEmpty(values[9]) && !string.IsNullOrEmpty(values[10]))
            {
                data.Elevation = Elevation.Parse(values[9] + "," + values[10]);
            }

            //---- geoidal separation
            if (!string.IsNullOrEmpty(values[11]) && !string.IsNullOrEmpty(values[12]))
            {
                data.GeoidalSeparation = GeoidalSeparation.Parse(values[11] + "," + values[12]);
            }

            //---- age
            data.DifferenceCorrection.Age = (string.IsNullOrEmpty(values[13]) ? 0M : decimal.Parse(values[13]));

            //---- station ID
            if (!string.IsNullOrEmpty(values[14]))
            {
                data.DifferenceCorrection.StationID = values[14];
            }

            //---- return
            return(data);

            //eg3. $GPGGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh
            //1    = UTC of Position
            //2    = Latitude
            //3    = N or S
            //4    = Longitude
            //5    = E or W
            //6    = GPS quality indicator (0=invalid; 1=GPS fix; 2=Diff. GPS fix)
            //7    = Number of satellites in use [not those in view]
            //8    = Horizontal dilution of position
            //9    = Antenna altitude above/below mean sea level (geoid)
            //10   = Meters  (Antenna height unit)
            //11   = Geoidal separation (Diff. between WGS-84 earth ellipsoid and
            //       mean sea level.  -=geoid is below WGS-84 ellipsoid)
            //12   = Meters  (Units of geoidal separation)
            //13   = Age in seconds since last update from diff. reference station
            //14   = Diff. reference station ID#
            //15   = Checksum
        }
Exemple #3
0
        private static void ParseSentence(GpsReading gpsReading, string sentence)
        {
            var cmd = ParseCommand(sentence);

            if (string.IsNullOrEmpty(cmd))
            {
                return;
            }

            //GPNTR
            switch (cmd.ToUpper())
            {
            case "$GPGGA":
            case "$GNGGA":
            case "$BDGGA":
                gpsReading.FixedGpsData = GgaData.Parse(sentence);
                break;

            case "$GPVTG":
            case "$GNVTG":
            case "$BDVTG":
                gpsReading.GroundVector = VtgData.Parser(sentence);
                break;

            case "$GPRMC":
            case "$GNRMC":
            case "$BDRMC":
                gpsReading.Summary = RmcData.Parse(sentence);
                break;

            case "#HEADINGA":
                gpsReading.Heading = HgaData.Parse(sentence);
                break;

            case "#BESTUTMA":
                gpsReading.Utm = UtmData.Parse(sentence);
                break;

            case "$GPNTR":
                gpsReading.NtrData = NtrData.Parse(sentence);
                break;

            //case "$GPGSA":
            //    gpsReading.DopActiveSatellites = GsaData.Parse(sentence);
            //    break;
            //case "$GPGSV":
            //    gpsReading.SatellitesInView.Add(GsvData.Parse(sentence));
            //    break;
            //case "$GPHDT":
            //    gpsReading.HdtData = HdtData.Parse(sentence);
            //    break;
            case "$PTNL":
                if (sentence.IndexOf("AVR", System.StringComparison.Ordinal) > 0)
                {
                    gpsReading.AvrData = AvrData.Parse(sentence);
                }
                else if (sentence.IndexOf("VGK", System.StringComparison.Ordinal) > 0)
                {
                    gpsReading.VgkData = VgkData.Parse(sentence);
                }
                break;
            }
        }