⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpsprotocol.cs

📁 自己编写的对于NMEA0813解析的C#代码
💻 CS
字号:
/*
 *  author:         sky
 *  email:          kairen6645@163.com
 *  date:           2008.8.12
 *  description:    解析GPGGA卫星数据为经纬度坐标
 */

using System;
using System.Collections.Generic;
using System.Text;

using System.IO;


namespace iLocateEngine.GPS
{
    public class GPGGA
    {
        public float latitude;
        public float longitude;
        public float altitude;
        public float geoideAltitude;
        public char northHemi;
        public char eastHemi;
        public int numberOfSatellites;

        public GPGGA()
        {
            this.altitude = -1000;
            this.geoideAltitude = -1000;

            this.latitude = 400;
            this.longitude = 400;
            this.numberOfSatellites = 0;
            this.northHemi = (char)0x0;
            this.eastHemi = (char)0x0;
        }
    }

    public class GPSProtocol
    {
        private float latitude;
        private float longitude;
        private float altitude;
        private float geoideAltitude;
        private float direction;
        private float speed;
        private char status;

        bool _isWorking = false;

        string lastReport = null;

        private static GPSProtocol instance = null;

        public static GPSProtocol Instance
        {
            get
            {
                if (instance == null)
                    instance = new GPSProtocol();
                return instance;
            }
        }

        private GPSProtocol()
        {
            latitude = longitude = altitude = geoideAltitude = direction = speed = 0f;

            _isWorking = true;
            lastReport = "";
        }

        //public bool GetGpsInfo(string scr)
        //{
        //    if (scr.Length < 1)
        //        return false;
        //    bool ret = false;

        //    if (scr.StartsWith("$GPGGA"))
        //        ret = GetAltitudeFromGGA(scr);
        //    else if (scr.StartsWith("$GPRMC"))
        //        ret = GetGpsInfoFromRMC(scr);

        //    if ((this.latitude <= 90 && this.latitude >= -90) &&
        //        (this.longitude <= 360 && this.longitude >= -360))
        //        return ret;
        //    else
        //        return false;
        //}

        public bool GetAltitudeFromGGA(string scr, GPGGA ggadata)
        {
            int latiDegree = 400, longiDegree = 400;
            float latiMinute = 400, longiMinute = 400;
            float latitudeTemp = 400, longitudeTemp = 400;

            string[] fields;
            bool paramChanged = false;

            fields = scr.Split(',');
            if (fields.GetLength(0) < 15)
                return false;

            // Lati 
            if (fields[2].Length > 5)
            {
                if (System.Text.RegularExpressions.Regex.Match(fields[2], @"^[0-9]+[.]?([\d]+)?").Value == fields[2])
                {
                    latiDegree = Convert.ToInt32(fields[2].Substring(0, 2), 10);
                    latiMinute = Convert.ToSingle(fields[2].Substring(2, fields[2].Length - 2));
                    paramChanged = true;
                }
            }
            // NSHemisphere 
            if (fields[3].Length == 1)
            {
                ggadata.northHemi = Convert.ToChar( fields[3]);
                //'s' 'S' 
                if (string.Equals(fields[3], "S", StringComparison.CurrentCultureIgnoreCase))
                {
                    latitudeTemp = -latitudeTemp;
                }
            }
            // long 
            if (fields[4].Length > 5)
            {
                if (System.Text.RegularExpressions.Regex.Match(fields[4], @"^[0-9]+[.]?([\d]+)?").Value == fields[4])
                {
                    longiDegree = Convert.ToInt32(fields[4].Substring(0, 3), 10);
                    longiMinute = Convert.ToSingle(fields[4].Substring(3, fields[4].Length - 3));
                    paramChanged = true;
                }
            }
            // EWHemisphere 
            if (fields[5].Length == 1)
            {
                ggadata.eastHemi = Convert.ToChar( fields[5]);
                //'w' 'W' 
                if (string.Equals(fields[5], "W", StringComparison.CurrentCultureIgnoreCase))
                {
                    longitudeTemp = -longitudeTemp;
                }
            }
            // number of satellites 
            if (fields[7].Length == 2)
            {
                if (System.Text.RegularExpressions.Regex.Match(fields[7], @"^[0-9]+[.]?([\d]+)?").Value == fields[7])
                {
                    ggadata.numberOfSatellites = Convert.ToInt32(fields[7]);
                }
            }

            // 获取altitude 
            if (fields[9].Length > 2)
            {
                if (System.Text.RegularExpressions.Regex.Match(fields[9], @"^[0-9]+[.]?([\d]+)?").Value == fields[9])
                {
                    ggadata.altitude = Convert.ToSingle(fields[9]);
                }
            }
            // 获取geoideAltitude 
            if (fields[11].Length > 2)
            {
                if (System.Text.RegularExpressions.Regex.Match(fields[11], @"^[0-9]+[.]?([\d]+)?").Value == fields[11])
                {
                    ggadata.geoideAltitude = Convert.ToSingle(fields[11]);
                }
            }

            if ((latiDegree != 400) && (latiMinute != (float)400.0))
            {
                latitudeTemp = (float)(latiDegree + latiMinute / 60.0);
            }
            if ((longiDegree != 400) && (longiMinute != (float)400.0))
            {
                longitudeTemp = (float)(longiDegree + longiMinute / 60.0);
            }
            if (paramChanged)
            {

                ggadata.latitude = latitudeTemp;
                ggadata.longitude = longitudeTemp;
            }

            //高度信息作为辅助信息,不单独报告,只有当经纬度这样的主信息发生变化的时候跟随主信息一起上报 
            return true;// paramChanged; 
        }



        private bool GetGpsInfoFromRMC(string scr)
        {
            int latiDegree = 400, longiDegree = 400;
            float latiMinute = 400, longiMinute = 400, speedTemp = 0, directionTemp = this.direction;
            char statusTemp = (char)0x0;
            float latitudeTemp = 400, longitudeTemp = 400;
            bool paramChanged = false;

            string[] fields = scr.Split(',');

            if (fields.GetLength(0) < 12)
                return false;
            // 状态 

            if (fields[2].Length == 1)
            {
                statusTemp = Convert.ToChar(fields[2]);
            }
            // Lati 
            if (fields[3].Length > 5)
            {
                if (System.Text.RegularExpressions.Regex.Match(fields[3], @"^[0-9]+[.]?([\d]+)?").Value == fields[3])
                {
                    latiDegree = Convert.ToInt32(fields[3].Substring(0, 2), 10);
                    latiMinute = Convert.ToSingle(fields[3].Substring(2, fields[3].Length - 2));
                    paramChanged = true;
                }
            }
            // NSHemisphere 
            if (fields[4].Length == 1)
            {
                //'s' 'S' 
                if (string.Equals(fields[4], "S", StringComparison.CurrentCultureIgnoreCase))
                {
                    latitudeTemp = -latitudeTemp;
                }
            }
            // long 
            if (fields[5].Length > 5)
            {
                if (System.Text.RegularExpressions.Regex.Match(fields[5], @"^[0-9]+[.]?([\d]+)?").Value == fields[5])
                {
                    longiDegree = Convert.ToInt32(fields[5].Substring(0, 3), 10);
                    longiMinute = Convert.ToSingle(fields[5].Substring(3, fields[5].Length - 3));
                    paramChanged = true;
                }
            }
            // EWHemisphere 
            if (fields[6].Length == 1)
            {
                //'w' 'W' 
                if (string.Equals(fields[6], "W", StringComparison.CurrentCultureIgnoreCase))
                {
                    longitudeTemp = -longitudeTemp;
                }
            }
            // speed 
            if (fields[7].Length > 2)
            {
                if (System.Text.RegularExpressions.Regex.Match(fields[7], @"^[0-9]+[.]?([\d]+)?").Value == fields[7])
                {
                    speedTemp = (float)(Convert.ToSingle(fields[7]) * 1.852);
                    paramChanged = true;
                }
            }
            // direction 
            if (fields[8].Length > 2)
            {
                if (System.Text.RegularExpressions.Regex.Match(fields[8], @"^[0-9]+[.]?([\d]+)?").Value == fields[8])
                {
                    directionTemp = Convert.ToSingle(fields[8]);
                    paramChanged = true;
                }
            }
            if ((latiDegree != 400) && (latiMinute != (float)400.0))
            {
                latitudeTemp = (float)(latiDegree + latiMinute / 60.0);
            }
            if ((longiDegree != 400) && (longiMinute != (float)400.0))
            {
                longitudeTemp = (float)(longiDegree + longiMinute / 60.0);
            }
            if (paramChanged)
            {
                if ((this.latitude == latitudeTemp) &&
                    (this.longitude == longitudeTemp) &&
                    (this.speed == speedTemp) &&
                    (this.direction == directionTemp) &&
                    (this.status == statusTemp))
                    return false;
                else
                {
                    this.latitude = latitudeTemp;
                    this.longitude = longitudeTemp;
                    this.direction = directionTemp;
                    this.speed = speedTemp;
                    this.status = statusTemp;
                    return true;
                }
            }
            else
                return false;
        }

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -