Ejemplo n.º 1
0
 /// <summary>
 /// 获取上一个GPS节点
 /// </summary>
 /// <param name="obj"></param>
 /// <param name="StrCodePrefix"></param>
 /// <returns></returns>
 public GPSDataEntity GetLastGPSData(YW3000Data data)
 {
     return CacheUtility.GetCurrentInfoFromHT(data.FullGpsCode);
 }
Ejemplo n.º 2
0
        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; }
        }
Ejemplo n.º 3
0
        /// <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;
        }