📄 gpsprotocol.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 + -