private Dictionary <int, MGPS> 查询最后位置(out DataTable __位置表, out Dictionary <int, DataRow> __位置映射)
        {
            var __结果 = new Dictionary <int, MGPS>();

            __位置表  = new DataTable();
            __位置映射 = new Dictionary <int, DataRow>();

            using (var __连接 = new SqlConnection(_连接字符串))
            {
                using (var __适配器 = 创建访问器(__连接))
                {
                    __连接.Open();
                    __适配器.Fill(__位置表);
                }
            }
            foreach (DataRow __row in __位置表.Rows)
            {
                var __号码 = __row.Field <int>("号码");
                __结果[__号码] = new MGPS
                {
                    经度 = (double)__row.Field <decimal>("经度"),
                    纬度 = (double)__row.Field <decimal>("纬度"),
                    时间 = __row.Field <DateTime>("时间"),
                    方向 = __row.Field <short>("方向"),
                    高度 = __row.Field <short>("高度"),
                    精度 = __row.Field <short>("精度"),
                    速度 = __row.Field <short>("速度"),
                };
                __位置映射[__号码] = __row;
            }
            return(__结果);
        }
示例#2
0
 void _IB回放_位置更新(MGPS __GPS)
 {
     _IV.UI线程执行(() =>
     {
         _IV.接收GPS.增加(_回放参数.显示参数.称, __GPS);
     });
 }
示例#3
0
        void 更新位置(string __号码, MGPS __GPS)
        {
            if (!_标识参数.ContainsKey(__号码))
            {
                return;
            }
            if (_标识图标.ContainsKey(__号码))
            {
                _IV地图.除图标(new List <ulong> {
                    _标识图标[__号码]
                });
            }
            if (_标识参数[__号码].图片 == null && 更新图片 != null)
            {
                var __状态 = _状态检测.查询状态(__号码);
                _标识参数[__号码].图片 = 更新图片(__号码, __状态);
                if (_标识参数[__号码].图片 == null)
                {
                    return;
                }
                return;
            }
            var __结果 = _IV地图.添加图标(new List <M图标> {
                new M图标 {
                    业务标识 = __号码, 位置 = __GPS, 显示参数 = _标识参数[__号码]
                }
            });

            _标识图标[__号码] = __结果[0];
        }
 public void 保存(int __号码, MGPS __位置)
 {
     _数据缓存.TryAdd(new M号码位置 {
         号码 = __号码, GPS = __位置
     });
     _最后位置[__号码] = __位置;
 }
示例#5
0
 private EGPS状态 计算状态(MGPS __位置)
 {
     try
     {
         var __最后时间 = __位置.时间;
         var __当前时间 = 时间偏移 == null ? DateTime.Now : 时间偏移();
         if (__最后时间.AddSeconds(_失效间隔) < __当前时间)
         {
             return(EGPS状态.停止显示);
         }
         if (__最后时间.AddSeconds(_很久未更新间隔) < __当前时间)
         {
             return(EGPS状态.很久未更新);
         }
         if (__最后时间.AddSeconds(_短期未更新间隔) < __当前时间)
         {
             return(EGPS状态.短期未更新);
         }
         return(EGPS状态.最近更新);
     }
     catch (Exception ex)
     {
         H调试.记录异常(ex, __位置 == null ? "位置为null" : "");
     }
     return(EGPS状态.停止显示);
 }
示例#6
0
        void _IB订阅_GPS数据上报(string __号码, MGPS __GPS)
        {
            m_lock.EnterReadLock();
            if (!_当前显示号码集.ContainsKey(__号码))
            {
                //H调试.记录(_类型名 + ": _IB订阅_GPS数据上报", __号码 + "不在当前显示号码集中");
                m_lock.ExitReadLock();
                return;
            }
            var __号码属性 = _当前显示号码集[__号码];

            if (__号码属性.绘图标识.HasValue)
            {
                _IF地图.除点(__号码属性.绘图标识.Value);
            }
            var __图标 = _IV.生成图片(__号码, _IB订阅.查询GPS更新状态(__号码));

            if (__图标 == null)
            {
                m_lock.ExitReadLock();
                return;
            }
            var __显示参数 = __号码属性.显示参数;
            var __标识   = _IF地图.添加点(__GPS.转M经纬度(), __图标, __显示参数.昵称, new M号码绑定对象(__号码));

            __号码属性.绘图标识 = __标识;
            __号码属性.位置   = __GPS.转M经纬度();
            m_lock.ExitReadLock();
        }
示例#7
0
 void _IB回放_位置更新(string __号码, MGPS __GPS)
 {
     _IV.UI线程执行(() =>
     {
         _IV.接收GPS.增加(__号码, __GPS);
     });
 }
示例#8
0
        public void 增加(string 标识, MGPS GPS)
        {
            var __状态变更 = _状态检测.接收GPS数据(标识, GPS);

            if (!__状态变更)
            {
                _IV地图.UI线程执行(() => 更新位置(标识, GPS));
            }
        }
示例#9
0
        protected virtual void OnGps上报(string arg1, MGPS arg2)
        {
            var handler = GPS上报;

            if (handler != null)
            {
                handler(arg1, arg2);
            }
        }
示例#10
0
        protected virtual void OnGps上报(string __号码, MGPS __GPS)
        {
            var handler = _GPS上报;

            if (handler != null)
            {
                handler(__号码, __GPS);
            }
        }
示例#11
0
        protected virtual void On位置更新(string arg1, MGPS arg2)
        {
            var handler = 位置更新;

            if (handler != null)
            {
                handler(arg1, arg2);
            }
        }
示例#12
0
        protected virtual void On位置更新(string __名称, MGPS __位置)
        {
            var handler = 位置更新;

            if (handler != null)
            {
                handler(__名称, __位置);
            }
        }
 void 设置行(DataRow __行, int __号码, MGPS __位置)
 {
     __行["号码"] = __号码;
     __行["时间"] = __位置.时间;
     __行["经度"] = __位置.经度;
     __行["纬度"] = __位置.纬度;
     __行["高度"] = __位置.高度;
     __行["速度"] = __位置.速度;
     __行["方向"] = __位置.方向;
     __行["精度"] = __位置.精度;
 }
        public M轨迹查询结果 查询轨迹(M轨迹查询条件 __条件)
        {
            var __结果 = new M轨迹查询结果 {
                列表 = new List <MGPS>()
            };
            var __表名   = _表前缀 + __条件.开始时间.Date.ToString("yyyyMMdd");
            var __页码   = __条件.页码 ?? 1;
            var __每页数量 = __条件.每页数量 ?? 10000;

            using (var __连接 = new SqlConnection(_连接字符串))
            {
                var __sql = string.Format("SELECT 1 FROM SYSOBJECTS WHERE XTYPE='U' AND NAME = '{0}'", __表名);
                var __数量  = (int)SQLHelper.ExecuteScalar(__连接, __sql);
                if (__数量 == 0)
                {
                    return(__结果);
                }

                __sql = string.Format("SELECT COUNT(*) FROM {0} WHERE 号码 = @号码 AND 时间 >= @开始时间 AND 时间 <= @结束时间 ", __表名);
                var __号码   = new SqlParameter("号码", __条件.号码);
                var __开始时间 = new SqlParameter("开始时间", __条件.开始时间);
                var __结束时间 = new SqlParameter("结束时间", __条件.结束时间);
                __数量 = (int)SQLHelper.ExecuteScalar(__连接, __sql, new DbParameter[] { __号码, __开始时间, __结束时间 });
                if (__数量 == 0)
                {
                    return(__结果);
                }
                __结果.总数量 = __数量;

                __sql  = 获取分页SQL(__表名, "时间, 经度, 纬度, 高度, 速度, 方向, 精度", "号码 = @号码 AND 时间 >= @开始时间 AND 时间 <= @结束时间", "时间 ASC", __页码, __每页数量);
                __号码   = new SqlParameter("号码", __条件.号码);
                __开始时间 = new SqlParameter("开始时间", __条件.开始时间);
                __结束时间 = new SqlParameter("结束时间", __条件.结束时间);
                using (var __访问器 = SQLHelper.ExecuteReader(__连接, __sql, new DbParameter[] { __号码, __开始时间, __结束时间 }))
                {
                    while (__访问器.Read())
                    {
                        var __GPS = new MGPS
                        {
                            时间 = __访问器.GetDateTime(0),
                            经度 = (double)__访问器.GetDecimal(1),
                            纬度 = (double)__访问器.GetDecimal(2),
                            高度 = __访问器.GetInt16(3),
                            速度 = __访问器.GetInt16(4),
                            方向 = __访问器.GetInt16(5),
                            精度 = __访问器.GetInt16(6),
                        };
                        __结果.列表.Add(__GPS);
                    }
                }
            }
            return(__结果);
        }
示例#15
0
 public bool 判断合法(string __号码, MGPS __GPS)
 {
     if (!_MGPS过滤.启用)
     {
         return(true);
     }
     if (_边界坐标.Count == 0)
     {
         return(true);
     }
     return(_边界坐标.Exists(__子区域 => 判断点在多边形内(new PointF {
         X = (float)__GPS.经度, Y = (float)__GPS.纬度
     }, __子区域)));
 }
示例#16
0
        /// <returns>true: 状态已变更; false: 状态未变更</returns>
        public bool 接收GPS数据(string __标识, MGPS __GPS, bool __修改GPS时间 = false)
        {
            M状态 __状态;

            _状态锁.EnterReadLock();
            if (!_所有状态.ContainsKey(__标识))
            {
                _状态锁.ExitReadLock();
                _状态锁.EnterWriteLock();
                _所有状态[__标识] = new M状态();
                __状态        = _所有状态[__标识];
                _状态锁.ExitWriteLock();
            }
            else
            {
                __状态 = _所有状态[__标识];
                _状态锁.ExitReadLock();
            }
            __状态.位置缓存.Add(__GPS);
            if (__状态.位置缓存.Count > _单号码轨迹缓存数量)
            {
                __状态.位置缓存.RemoveAt(0);
            }

            if (__修改GPS时间)
            {
                if (__状态.最后位置 != null)
                {
                    __GPS.时间 = DateTime.Now; //未用报文中的时间,因为涉及到时间判断,需要客户端与服务器同步, 但要排除从服务器接收到的第一次缓存数据
                }
            }
            __状态.最后位置 = __GPS;
            var __旧状态 = __状态.跟踪状态;
            var __新状态 = 计算状态(__GPS);

            if (__旧状态 != __新状态)
            {
                __状态.跟踪状态 = __新状态;
                On状态变化(__标识, __新状态);
                return(true);
            }
            return(false);
        }
示例#17
0
        void _IB插件_GPS上报(string __号码, MGPS __GPS)
        {
            if (!_号码状态缓存.ContainsKey(__号码))
            {
                _号码状态缓存[__号码] = new M号码状态()
                {
                    最后位置 = __GPS
                };
            }
            _号码状态缓存[__号码].最后位置 = __GPS;

            var __地址列表 = 查询号码(__号码);

            if (__地址列表.Count == 0)
            {
                return;
            }
            _IT服务端.触发事件("订阅", "GPS上报", new Dictionary <string, string> {
                { "号码", __号码.ToString() }, { "GPS", HJSON.序列化(__GPS) }
            }, __地址列表);
        }
示例#18
0
 public static M经纬度 转M经纬度(this MGPS GPS)
 {
     return(new M经纬度(GPS.经度, GPS.纬度));
 }
示例#19
0
 void _IB插件_GPS上报(string __号码, MGPS __GPS)
 {
     _位置缓存[__号码] = __GPS;
     _IDGPS数据.保存(__号码, __GPS);
 }
 public void 保存(int __号码, MGPS __位置)
 {
     _最后位置缓存[__号码] = __位置;
 }
示例#21
0
 public void 保存(string __号码, MGPS __位置)
 {
     _最后位置缓存[__号码] = __位置;
 }