何晓东 梁中义
摘要:监测数据保存在数据库中,可以查询显示为列表形式,为使显示更直观,本文采用C/S结构,使用C#语言实现了监测数据在离线电子地图的可视化。
关键词:监测数据;GPS;电子地图
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2020)23-0195-02
监测数据由无线FM监测模块采集,通过手机发送到数据库保存,数据库采用MS SQL Server2012。监测数据包括频率、位置(GPS坐标)、信号场强、采集时间等,将监测数据显示在电子地图具有直观、用户体验更好的优点。
1 系统功能
设计能按时间、采集终端号查询指定的无线采集模块在指定时间段采集的保存在数据库中的监测数据,读取数据后,根据每条采集数据中GPS坐标信息,在程序窗口的电子地图上逐一用图标标识,当鼠标悬停某标识时,会显示该图标对应的采集的完整的监测数据。也可以以某GPS坐标为圆心,设置半径数值,查询显示该圆形区域的监测数据并显示。电子地图采用离线地图,考虑实践使用范围,仅下载安徽省地图。
2 系统设计
2.1 系统结构
采用分层设计,系统由表示层、业务处理层、数据接入层三层组成。表示层负责用户交互,包括查询功能区和监测数据显示功能区,查询功能区负责接收用户输入的查询参数,调用业务层函数,并将返回的结果在显示功能区中的电子地图上逐一标识。数据接入层负责操作数据库,執行数据查询命令,返回查询结果给调用者。业务处理层负责实现表示层查询功能区查询请求,调用数据接入层函数进行数据查询,并把接入层返回的查询结果数据返回给表示层调用者。
2.2 数据库
本方案中监测数据保存的用数据库是MS SQL Server2012,核心的表有table_DeviceInfor(监测模块信息表)、table_AcqInfor(监测数据表)等。监测模块信息表用于保存监测设备信息,包括设备ID、 设备名称、设备SN等字段。监测数据表存储监测模块发送的监测数据,包括记录ID、设备ID、频率、场强、信噪比、GPS经度、GPS纬度、采集时间等字段。
2.3 电子地图
本方案采用高德地图,下载安徽省地图数据供离线使用。
3 程序设计
方案采用VS2015开发,采用C#Windows桌面模式。表示层采用WindowsForm实现,核心的地图显示等操作使用专用控件GMap.NET。 业务逻辑层由业务模型和业务服务组成,业务模型负责建立主要业务对应模型(业务类),业务服务层为表示层提供服务。数据接入层负责连接数据库,进行相关的数据查询操作。
3.1表示层
表示层核心功能是把监测数据在电子地图上进行标识,涉及地图的相关操作,考虑复杂度,本方案采用已有的电子地图操作控件GMap.NET。GMap.NET是一个强大、免费、开源的.NET控件,可以运行在Windows Forms 和WPF环境,支持包括百度、高德、google等多种地图, 可实现GEO地图定位和地图计算功能。下载后把相关库导入到开发项目引用。关键代码:在地图上显示监测数据
public void ShowAcqMarkers(IEnumerable
{ //获取指定显示的overlay
GMapOverlay overlay= gMapControl1.Overlays.FirstOrDefault(x => x.Id == overlayid);
if(overlay==null)
{ //若无,则创建
overlay= new GMapOverlay(overlayid);
}
//遍历监测数据,逐条标识到地图
foreach (AcqDataItem item in items)
{ //创建图标,定位
GMapMarker marker = new GMarkerGoogle(new PointLatLng(item.gpsa, item.gpsl), GMarkerGoogleType.blue_dot);
marker.Tag = item.gsId; //设置图标Tag值为监测数据记录Id
//设置图标提示信息
marker.ToolTipText = string.Format("纬度:{0},经度:{1},"+"\r\n"+"频率:{2};场强:{3};信噪比:{4},"+"\r\n"+"时间:{5}",item.gpsa,item.gpsl, item.freq, item.ES, item.SN,item.rtime);
overlay.Markers.Add(marker);//把图标加入overlay
}
}
3.2 业务层
业务模型包括设备类(AcqDataItem)和监测数据类(DeviceInfor),分别表示设备和监测数据。服务类(ACQService)为表示层提供服务,例如查询指定坐标、指定半径、指定频率的监测数据,由函数GetAcqDataByALAndFreq实现。
public IEnumerable
{ //创建数据接入类实例
BMDBRepository mybmdbrepository = new BMDBRepository();
//调用DAO中的函数GetAcqDataByALAndFreq
return mybmdbrepository.GetAcqDataByALAndFreq(gpsa, gpsl, radius, freq);
}
3.3 数据接入层
数据接入层由BMDBRepository类和DeviceRepository类构成,分别对数据表table_AcqInfor、table_table_DeviceInfor进行操作。
BMDBRepository类中主要函数GetAcqDataByALAndFreq为上层提供按指定坐标、指定半径、指定频率的查询监测数据服务,其通过调用存储过程sp_GetAcqDataByALAndFreq实现功能。代码如下:
public IEnumerable
{
IList
SqlConnection connection = new SqlConnection(_connectionString);
SqlCommand command = connection.CreateCommand();
command.Connection = connection;
SqlCommand cmd = new SqlCommand("sp_GetAcqDataByALAndFreq", connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@Altitude", SqlDbType.Decimal));
cmd.Parameters["@Altitude"].Value = gpsa;
cmd.Parameters.Add(new SqlParameter("@Logitude", SqlDbType.Decimal));
cmd.Parameters["@Logitude"].Value = gpsl;
cmd.Parameters.Add(new SqlParameter("@Radio", SqlDbType.Decimal));
cmd.Parameters["@Radio"].Value = radio;
cmd.Parameters.Add(new SqlParameter("@Freq", SqlDbType.BigInt));
cmd.Parameters["@Freq"].Value = freq;
using (connection)
{
connection.Open();
SqlDataReader myread = cmd.ExecuteReader();
if (myread.HasRows)
{ while (myread.Read())
{
AcqDataItem item = new AcqDataItem();
item.gsId = Guid.Parse(myread["GSID"].ToString());
item.freq = Int32.Parse(myread["Freq"].ToString());
item.ES = float.Parse(myread["ES"].ToString());
item.SN = float.Parse(myread["SN"].ToString());
item.gpsl = double.Parse(myread["gpsl"].ToString());
item.gpsa = double.Parse(myread["gpsa"].ToString());
item.rtime = DateTime.Parse(myread["rtime"].ToString());
acqdataitems.Add(item);
}
}
}
return acqdataitems;
}
4 測试
某次查询的监测数据在地图显示(图1),一个蓝色水滴标识代表一个监测数据,鼠标悬浮图标会弹出该点监测数据详细信息。
5 小结
本方案采用VS2015平台和相关控件,实现了监测数据在电子地图的显示直观、清晰,达到了设计目的。
参考文献:
[1] Scott Mollett.ASP.NET设计模式[M].北京:清华大学出版社,2011.
[2] Simon Robinson,K.Scott Allen,等.著,杨浩,杨铁男,等译.C#高级编程[M].北京:清华大学出版社,2002.
【通联编辑:闻翔军】