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(__结果); }
void _IB回放_位置更新(MGPS __GPS) { _IV.UI线程执行(() => { _IV.接收GPS.增加(_回放参数.显示参数.称, __GPS); }); }
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 = __位置 }); _最后位置[__号码] = __位置; }
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状态.停止显示); }
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(); }
void _IB回放_位置更新(string __号码, MGPS __GPS) { _IV.UI线程执行(() => { _IV.接收GPS.增加(__号码, __GPS); }); }
public void 增加(string 标识, MGPS GPS) { var __状态变更 = _状态检测.接收GPS数据(标识, GPS); if (!__状态变更) { _IV地图.UI线程执行(() => 更新位置(标识, GPS)); } }
protected virtual void OnGps上报(string arg1, MGPS arg2) { var handler = GPS上报; if (handler != null) { handler(arg1, arg2); } }
protected virtual void OnGps上报(string __号码, MGPS __GPS) { var handler = _GPS上报; if (handler != null) { handler(__号码, __GPS); } }
protected virtual void On位置更新(string arg1, MGPS arg2) { var handler = 位置更新; if (handler != null) { handler(arg1, arg2); } }
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(__结果); }
public bool 判断合法(string __号码, MGPS __GPS) { if (!_MGPS过滤.启用) { return(true); } if (_边界坐标.Count == 0) { return(true); } return(_边界坐标.Exists(__子区域 => 判断点在多边形内(new PointF { X = (float)__GPS.经度, Y = (float)__GPS.纬度 }, __子区域))); }
/// <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); }
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) } }, __地址列表); }
public static M经纬度 转M经纬度(this MGPS GPS) { return(new M经纬度(GPS.经度, GPS.纬度)); }
void _IB插件_GPS上报(string __号码, MGPS __GPS) { _位置缓存[__号码] = __GPS; _IDGPS数据.保存(__号码, __GPS); }
public void 保存(int __号码, MGPS __位置) { _最后位置缓存[__号码] = __位置; }
public void 保存(string __号码, MGPS __位置) { _最后位置缓存[__号码] = __位置; }