/// <summary> /// 获取上一个GPS节点 /// </summary> /// <param name="obj"></param> /// <param name="StrCodePrefix"></param> /// <returns></returns> public GPSDataEntity GetLastGPSData(YW3000Data data) { return CacheUtility.GetCurrentInfoFromHT(data.FullGpsCode); }
public YW3000Data NewYW3000Data(ref string[] headers, ref string[] options) { try { double pvalue = 0; YW3000Data data = new YW3000Data(); data.BaseData.IsLocatedData = true; data.BaseData.GPSCode = headers[1]; data.FullGpsCode = mStrCodePrefix + data.BaseData.GPSCode; DateTime time = DateTime.MinValue; if (!CommandHelper.ParseGpsTime(options[1], out time)) data.BaseData.IsLocatedData = false; else time = time.AddHours(8); data.BaseData.ReportTime = time; data.BaseData.ReceiveTime = DateTime.Now; data.BaseData.Longitude = (decimal)CommandHelper.ParseLongitude(options[2]); data.BaseData.Latitude = (decimal)CommandHelper.ParseLatitude(options[3]); data.BaseData.Speed = (decimal)(double.TryParse(options[5], out pvalue) ? pvalue : 0); data.BaseData.Direction = (decimal)(double.TryParse(options[6], out pvalue) ? pvalue : 0); switch (options[0]) { case "0": case "1": data.IsAlarm = false; break; case "2"://发生事件位置 switch (headers[0]) { case "%AP"://报警通知 if (options[8] == "25") data.IsAlarm = true; break; default: data.IsAlarm = false; break; } break; default: data = null; break; } //过滤掉经纬度为0的记录 if (data.BaseData.Longitude == 0 || data.BaseData.Latitude == 0) data = null; return data; } catch { return null; } }
/// <summary> /// 检查异常漂移 /// </summary> ///<param name="obj">GPS信息</param> /// <param name="aPreviousValidGPSData">有效的上一点GPS数据</param> /// <param name="MaxSpeedMeterPerSecond">最大速度:米/秒</param> private bool ComputeMileAgeAndVerifyData(ref YW3000Data aGPSInfo, GPSDataEntity aPreviousValidGPSData, double MaxSpeedMeterPerSecond) { bool flag = false; if (aGPSInfo == null) return false; if (aGPSInfo.BaseData.IsLocatedData == false) { return false; } //是否是第一个点 bool blnIsFirstGPSData = false; if (aPreviousValidGPSData == null) { blnIsFirstGPSData = true; } TimeSpan dtSpan; double dclMileage = 0; bool blnIsGPSOverflow = false; //是否要记录里程 bool blnShoudBeStillness = false; //是否前条时间超过后一条时间 bool blnIsArrivalDelayed = false; if (!blnIsFirstGPSData) { if (DateTime.Compare(aGPSInfo.BaseData.ReportTime, aPreviousValidGPSData.ReportTime) <= 0 || aGPSInfo.BaseData.ReportTime >= DateTime.Now.AddHours(1)) { //当前时间小于上一点时间,为补传数据。2010-01-13 gxl 若当前数据时间大于服务器时间1小时,认为是异常数据,也标记为补传数据 aGPSInfo.BaseData.IsFetchData = true; blnIsArrivalDelayed = true; flag = true; } double CurrentLatitude =(double)aGPSInfo.BaseData.Latitude; double CurrentLongitude =(double)aGPSInfo.BaseData.Longitude; double LastLatitude = (double)aPreviousValidGPSData.Latitude; double LastLongitude = (double)aPreviousValidGPSData.Longitude; if ((CurrentLatitude != LastLatitude) || (CurrentLongitude != LastLongitude)) { dclMileage =Transfer.GetDistance(LastLatitude, LastLongitude, CurrentLatitude, CurrentLongitude); } //计算当前点与其上一点之间的时间差 dtSpan = aGPSInfo.BaseData.ReportTime - aPreviousValidGPSData.ReportTime; //两点之间最大比较里程 double dclMaxMileage = Math.Abs(Convert.ToDouble(MaxSpeedMeterPerSecond * dtSpan.TotalSeconds)); //最大比较速度:换算为公里/每小时 double maxSpeed = MaxSpeedMeterPerSecond * 3.6; //速度过大或里程过大,均认为是漂移数据 if (dclMileage > dclMaxMileage || aGPSInfo.BaseData.Speed > (decimal)maxSpeed) { //异常:GPS漂移数据 blnIsGPSOverflow = true; aGPSInfo.BaseData.IsOverflowGPSData = blnIsGPSOverflow; } //是否要记录里程 if ((aGPSInfo.BaseData.Speed == 0) && (aPreviousValidGPSData.Speed == 0) && (dtSpan.TotalMinutes < 30)) { blnShoudBeStillness = true; } aGPSInfo.BaseData.StarkMileage = aPreviousValidGPSData.StarkMileage; } if (((!blnIsGPSOverflow) && (!blnIsFirstGPSData) && (!blnShoudBeStillness)) && (!blnIsArrivalDelayed)) { aGPSInfo.BaseData.Mileage = (decimal)dclMileage; aGPSInfo.BaseData.StarkMileage = aGPSInfo.BaseData.StarkMileage + aGPSInfo.BaseData.Mileage; } return flag; }