何曉東 梁中義
摘要:監(jiān)測數(shù)據(jù)保存在數(shù)據(jù)庫中,可以查詢顯示為列表形式,為使顯示更直觀,本文采用C/S結(jié)構(gòu),使用C#語言實現(xiàn)了監(jiān)測數(shù)據(jù)在離線電子地圖的可視化。
關(guān)鍵詞:監(jiān)測數(shù)據(jù);GPS;電子地圖
中圖分類號:TP311? ? 文獻標識碼:A
文章編號:1009-3044(2020)23-0195-02
監(jiān)測數(shù)據(jù)由無線FM監(jiān)測模塊采集,通過手機發(fā)送到數(shù)據(jù)庫保存,數(shù)據(jù)庫采用MS SQL Server2012。監(jiān)測數(shù)據(jù)包括頻率、位置(GPS坐標)、信號場強、采集時間等,將監(jiān)測數(shù)據(jù)顯示在電子地圖具有直觀、用戶體驗更好的優(yōu)點。
1 系統(tǒng)功能
設(shè)計能按時間、采集終端號查詢指定的無線采集模塊在指定時間段采集的保存在數(shù)據(jù)庫中的監(jiān)測數(shù)據(jù),讀取數(shù)據(jù)后,根據(jù)每條采集數(shù)據(jù)中GPS坐標信息,在程序窗口的電子地圖上逐一用圖標標識,當鼠標懸停某標識時,會顯示該圖標對應(yīng)的采集的完整的監(jiān)測數(shù)據(jù)。也可以以某GPS坐標為圓心,設(shè)置半徑數(shù)值,查詢顯示該圓形區(qū)域的監(jiān)測數(shù)據(jù)并顯示。電子地圖采用離線地圖,考慮實踐使用范圍,僅下載安徽省地圖。
2 系統(tǒng)設(shè)計
2.1 系統(tǒng)結(jié)構(gòu)
采用分層設(shè)計,系統(tǒng)由表示層、業(yè)務(wù)處理層、數(shù)據(jù)接入層三層組成。表示層負責用戶交互,包括查詢功能區(qū)和監(jiān)測數(shù)據(jù)顯示功能區(qū),查詢功能區(qū)負責接收用戶輸入的查詢參數(shù),調(diào)用業(yè)務(wù)層函數(shù),并將返回的結(jié)果在顯示功能區(qū)中的電子地圖上逐一標識。數(shù)據(jù)接入層負責操作數(shù)據(jù)庫,執(zhí)行數(shù)據(jù)查詢命令,返回查詢結(jié)果給調(diào)用者。業(yè)務(wù)處理層負責實現(xiàn)表示層查詢功能區(qū)查詢請求,調(diào)用數(shù)據(jù)接入層函數(shù)進行數(shù)據(jù)查詢,并把接入層返回的查詢結(jié)果數(shù)據(jù)返回給表示層調(diào)用者。
2.2 數(shù)據(jù)庫
本方案中監(jiān)測數(shù)據(jù)保存的用數(shù)據(jù)庫是MS SQL Server2012,核心的表有table_DeviceInfor(監(jiān)測模塊信息表)、table_AcqInfor(監(jiān)測數(shù)據(jù)表)等。監(jiān)測模塊信息表用于保存監(jiān)測設(shè)備信息,包括設(shè)備ID、 設(shè)備名稱、設(shè)備SN等字段。監(jiān)測數(shù)據(jù)表存儲監(jiān)測模塊發(fā)送的監(jiān)測數(shù)據(jù),包括記錄ID、設(shè)備ID、頻率、場強、信噪比、GPS經(jīng)度、GPS緯度、采集時間等字段。
2.3 電子地圖
本方案采用高德地圖,下載安徽省地圖數(shù)據(jù)供離線使用。
3 程序設(shè)計
方案采用VS2015開發(fā),采用C#Windows桌面模式。表示層采用WindowsForm實現(xiàn),核心的地圖顯示等操作使用專用控件GMap.NET。 業(yè)務(wù)邏輯層由業(yè)務(wù)模型和業(yè)務(wù)服務(wù)組成,業(yè)務(wù)模型負責建立主要業(yè)務(wù)對應(yīng)模型(業(yè)務(wù)類),業(yè)務(wù)服務(wù)層為表示層提供服務(wù)。數(shù)據(jù)接入層負責連接數(shù)據(jù)庫,進行相關(guān)的數(shù)據(jù)查詢操作。
3.1表示層
表示層核心功能是把監(jiān)測數(shù)據(jù)在電子地圖上進行標識,涉及地圖的相關(guān)操作,考慮復(fù)雜度,本方案采用已有的電子地圖操作控件GMap.NET。GMap.NET是一個強大、免費、開源的.NET控件,可以運行在Windows Forms 和WPF環(huán)境,支持包括百度、高德、google等多種地圖, 可實現(xiàn)GEO地圖定位和地圖計算功能。下載后把相關(guān)庫導(dǎo)入到開發(fā)項目引用。關(guān)鍵代碼:在地圖上顯示監(jiān)測數(shù)據(jù)
public void ShowAcqMarkers(IEnumerable
{? ?//獲取指定顯示的overlay
GMapOverlay overlay= gMapControl1.Overlays.FirstOrDefault(x => x.Id == overlayid);
if(overlay==null)
{? ?//若無,則創(chuàng)建
overlay= new GMapOverlay(overlayid);
}
//遍歷監(jiān)測數(shù)據(jù),逐條標識到地圖
foreach (AcqDataItem item in items)
{? ?//創(chuàng)建圖標,定位
GMapMarker marker = new GMarkerGoogle(new PointLatLng(item.gpsa, item.gpsl), GMarkerGoogleType.blue_dot);
marker.Tag = item.gsId;? ? //設(shè)置圖標Tag值為監(jiān)測數(shù)據(jù)記錄Id
//設(shè)置圖標提示信息
marker.ToolTipText = string.Format("緯度:{0},經(jīng)度:{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 業(yè)務(wù)層
業(yè)務(wù)模型包括設(shè)備類(AcqDataItem)和監(jiān)測數(shù)據(jù)類(DeviceInfor),分別表示設(shè)備和監(jiān)測數(shù)據(jù)。服務(wù)類(ACQService)為表示層提供服務(wù),例如查詢指定坐標、指定半徑、指定頻率的監(jiān)測數(shù)據(jù),由函數(shù)GetAcqDataByALAndFreq實現(xiàn)。
public IEnumerable
{? ? ? ? ? //創(chuàng)建數(shù)據(jù)接入類實例
BMDBRepository mybmdbrepository = new BMDBRepository();
//調(diào)用DAO中的函數(shù)GetAcqDataByALAndFreq
return mybmdbrepository.GetAcqDataByALAndFreq(gpsa, gpsl, radius, freq);
}
3.3 數(shù)據(jù)接入層
數(shù)據(jù)接入層由BMDBRepository類和DeviceRepository類構(gòu)成,分別對數(shù)據(jù)表table_AcqInfor、table_table_DeviceInfor進行操作。
BMDBRepository類中主要函數(shù)GetAcqDataByALAndFreq為上層提供按指定坐標、指定半徑、指定頻率的查詢監(jiān)測數(shù)據(jù)服務(wù),其通過調(diào)用存儲過程sp_GetAcqDataByALAndFreq實現(xiàn)功能。代碼如下:
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 測試
某次查詢的監(jiān)測數(shù)據(jù)在地圖顯示(圖1),一個藍色水滴標識代表一個監(jiān)測數(shù)據(jù),鼠標懸浮圖標會彈出該點監(jiān)測數(shù)據(jù)詳細信息。
5 小結(jié)
本方案采用VS2015平臺和相關(guān)控件,實現(xiàn)了監(jiān)測數(shù)據(jù)在電子地圖的顯示直觀、清晰,達到了設(shè)計目的。
參考文獻:
[1] Scott Mollett.ASP.NET設(shè)計模式[M].北京:清華大學(xué)出版社,2011.
[2] Simon Robinson,K.Scott Allen,等.著,楊浩,楊鐵男,等譯.C#高級編程[M].北京:清華大學(xué)出版社,2002.
【通聯(lián)編輯:聞翔軍】