何曉東 梁中義

摘要:監測數據保存在數據庫中,可以查詢顯示為列表形式,為使顯示更直觀,本文采用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.
【通聯編輯:聞翔軍】