國育家,孫歧軍,劉海良
(山東中移通信技術(shù)有限公司,山東 濟(jì)南 250000)
隨著移動(dòng)通信技術(shù)的高速發(fā)展,LTE 網(wǎng)絡(luò)規(guī)模不斷擴(kuò)大,5G 網(wǎng)絡(luò)建設(shè)也持續(xù)推進(jìn)。移動(dòng)通信技術(shù)已經(jīng)成為當(dāng)今社會(huì)最重要的通信方式。隨著移動(dòng)用戶的數(shù)量增長(zhǎng)以及用戶在網(wǎng)時(shí)間的延長(zhǎng),用戶對(duì)網(wǎng)絡(luò)感知的要求也越來越高。因此,移動(dòng)網(wǎng)絡(luò)的網(wǎng)絡(luò)規(guī)劃逐漸成為各大運(yùn)營商從規(guī)模建設(shè)向精細(xì)化建設(shè)轉(zhuǎn)變的工作重點(diǎn)[1]??傮w掌握網(wǎng)絡(luò)分布,快速定位問題區(qū)域,掌握覆蓋區(qū)域周邊地理分布,能為用戶提供更好的網(wǎng)絡(luò)服務(wù),是提升用戶感知,加強(qiáng)網(wǎng)絡(luò)優(yōu)化,增強(qiáng)深度覆蓋力度,提升網(wǎng)絡(luò)質(zhì)量的關(guān)鍵。
本文介紹的基于C#和GMap.NET 的移動(dòng)網(wǎng)絡(luò)規(guī)劃軟件可以通過在線或者離線緩存地圖直觀地向網(wǎng)絡(luò)優(yōu)化工程師呈現(xiàn)無線網(wǎng)絡(luò)分布的地理位置、周邊建筑分布、周邊基站分布和當(dāng)前位置到問題網(wǎng)絡(luò)點(diǎn)的路線等信息,有效幫助優(yōu)化工程師總體掌握網(wǎng)絡(luò)分布情況,極大地提高了網(wǎng)絡(luò)優(yōu)化人員合理規(guī)劃網(wǎng)絡(luò)與解決網(wǎng)絡(luò)覆蓋問題的工作效率。
根據(jù)實(shí)際工作需求,該軟件系統(tǒng)是以PC 機(jī)為主要規(guī)劃平臺(tái),利用G map.Net 加載的電子地圖模擬實(shí)際地理環(huán)境,通過人機(jī)交互來完成對(duì)網(wǎng)絡(luò)工程參數(shù)的采集、存儲(chǔ)、分析、顯示和規(guī)劃輸出的功能。
從軟件系統(tǒng)架構(gòu)出發(fā),該軟件系統(tǒng)是由C#結(jié)構(gòu)和G Map.NET 軟件結(jié)構(gòu)兩大部分組成,軟件模塊功能設(shè)計(jì),如圖1 所示。
圖1 軟件系統(tǒng)功能模塊
本軟件系統(tǒng)基于C#編程語言、Win Form 應(yīng)用、Aspose.Cells 與G Map.NET 開源組件以及SQ Lite 數(shù)據(jù)庫引擎進(jìn)行的設(shè)計(jì)與開發(fā),實(shí)現(xiàn)了對(duì)谷歌中國地圖、高德地圖等電子地圖數(shù)據(jù)的調(diào)用。網(wǎng)絡(luò)優(yōu)化工程師可以使用在線或者離線緩存的地圖數(shù)據(jù)和網(wǎng)絡(luò)參數(shù),通過數(shù)據(jù)交互的方式實(shí)現(xiàn)對(duì)區(qū)域內(nèi)的無線網(wǎng)絡(luò)可視化呈現(xiàn)與規(guī)劃。
GMap.NET 在默認(rèn)情況下沒有自帶國內(nèi)地圖服務(wù)商提供的地圖產(chǎn)品接口,需要開發(fā)者在項(xiàng)目中創(chuàng)建相對(duì)應(yīng)的類才能調(diào)用,創(chuàng)建高德地圖類Amap Provider Base,使其繼承Gmap Provider,并在窗體代碼中對(duì)地圖進(jìn)行初始化。
網(wǎng)絡(luò)規(guī)劃軟件系統(tǒng)在開發(fā)過程中,需要考慮到網(wǎng)絡(luò)數(shù)據(jù)經(jīng)常會(huì)有變動(dòng),包括更新、刪除以及增加。將網(wǎng)絡(luò)數(shù)據(jù)存儲(chǔ)到SQ Lite 數(shù)據(jù)庫,便于用戶在操作軟件時(shí)進(jìn)行查詢和更新,降低了系統(tǒng)內(nèi)存的耗費(fèi)[5]。SQ Lite Helper 類是一個(gè)幫助類,不僅可以幫助用戶創(chuàng)建和訪問SQLite 數(shù)據(jù)庫,而且提供了對(duì)數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行增、刪、改、查等功能。
在系統(tǒng)的數(shù)據(jù)庫中設(shè)計(jì)了2 張表,分別為 base_gongcan,new_modify。其中,base_gongcan 中存放了網(wǎng)絡(luò)基礎(chǔ)數(shù)據(jù)。new_modify 中存放了變更的數(shù)據(jù),包括新增加的網(wǎng)絡(luò)數(shù)據(jù)、刪除的網(wǎng)絡(luò)數(shù)據(jù)等。base_gongcan表信息,如表1 所示。
表1 base_gongcan 表信息
圓形規(guī)劃是通過自定義Gmap Marker Circle 類并繼承Gmap Marker 類來實(shí)現(xiàn)的。通過監(jiān)聽鼠標(biāo)操作實(shí)現(xiàn)圓形規(guī)劃操作,具體實(shí)現(xiàn)流程為以下幾步。
第一步:創(chuàng)建圖層top Circle,定義圓形規(guī)劃標(biāo)志,聲明一個(gè)布爾類型變量open Circle Plan 來判斷是否選擇圓形規(guī)劃,如果開啟圓形規(guī)劃,那么open Circle Plan 為true。
第二步:為Gmap Control 添加Mouse Down 監(jiān)聽事件private void g Map Control1_Mouse Down99(object sender,Mouse Event Args e),如果開啟了圓形規(guī)劃功能,獲取按下的地圖坐標(biāo)為圓心,Point Lat Lng pcircle=g Map Control1.From Local To Lat Lng (e.X,e.Y),并將pcircle 作為參數(shù)傳入自定義方法 private void Deal With Select Circle Click(Point Lat Lng p)中。
第三步:在Deal With Select Circle Click 方法中創(chuàng)建List
第四步:將圓心和這個(gè)點(diǎn)的坐標(biāo)通過Gmap Route類進(jìn)行兩點(diǎn)之間的直線繪制,作為圓的半徑標(biāo)注。通過Gmap Route.Distance 屬性獲得兩點(diǎn)之間的直線距離即半徑。創(chuàng)建自定義類Gmap Marker Circle 繼承自Gmap Marker,以圓心坐標(biāo)為參數(shù)1,兩個(gè)點(diǎn)之間的距離作為參數(shù)2,構(gòu)造圓形初始化。new G Map Marker Circle(this.list Point Test[0],(int)Math.Floor(g Map Route.Distance* 1000.0))。
第五步:計(jì)算連線相對(duì)于正北方向的角度。將經(jīng)緯度轉(zhuǎn)換成度分秒的形式,經(jīng)緯度中的整數(shù)部分作為度,經(jīng)緯度中的小數(shù)部分×60 的整數(shù)部分就是分,最后經(jīng)緯度的小數(shù)部分×3 600 就是秒。為了修正因緯度不斷變化的球半徑長(zhǎng)度,記為EC。
當(dāng)前點(diǎn)所在緯度的緯度圈的半徑,記為Ed:
再計(jì)算兩點(diǎn)連線相對(duì)于正北方向的夾角。
第六步:規(guī)劃完成后,點(diǎn)擊鼠標(biāo)右鍵選擇導(dǎo)出。通過SQ Lite Helper 類連接數(shù)據(jù)庫,將數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)取出,并依次計(jì)算與圓心點(diǎn)之間的距離,凡是小于規(guī)劃圓形半徑的點(diǎn)即為符合要求的點(diǎn),并將這些點(diǎn)納入到List
圖2 圓形規(guī)劃
對(duì)于多邊形規(guī)劃,最少需要3 個(gè)點(diǎn)才能確定一個(gè)多邊形,因此在多邊形規(guī)劃時(shí)需要確定至少3 個(gè)端點(diǎn)。多邊形規(guī)劃是通過自定義Deal With Select Circle Click 方法,監(jiān)聽鼠標(biāo)按下并抬起事件,獲取多邊形的端點(diǎn),進(jìn)而運(yùn)用GmapRoute 方法根據(jù)臨近的兩個(gè)端點(diǎn)繪制多邊形的邊界。
具體規(guī)劃原理為以下幾步。
第一步:定義多邊形規(guī)劃標(biāo)志,聲明一個(gè)布爾類型變量open Polygon Plan 來判斷是否選擇多邊形規(guī)劃。如果開啟多邊形規(guī)劃,那么open Circle Plan 為true。
第二步:創(chuàng)建List
第三步:為G map Control 添加Mouse Down 監(jiān)聽事件,將每次鼠標(biāo)按下的點(diǎn)坐標(biāo)添加到pointsg,當(dāng)pointsg中的元素達(dá)到2 個(gè)時(shí),通過G map Route 繪制兩點(diǎn)之間的連線。當(dāng)pointsg 中的元素達(dá)到3 個(gè)時(shí),清除索引為0 的元素,再通過Gmap Route 類繪制兩點(diǎn)之間的連線作為臨時(shí)邊界。
第四步:當(dāng)規(guī)劃完成時(shí),需要對(duì)多邊形的點(diǎn)個(gè)數(shù)進(jìn)行判斷。如果小于3 個(gè)點(diǎn),則提示:Message Box.Show(“規(guī)劃一個(gè)多邊形至少需要3 個(gè)點(diǎn),而現(xiàn)在只有‘+new polygon.Count+’個(gè)點(diǎn)”);如果至少有3 個(gè)點(diǎn),執(zhí)行畫多邊形,會(huì)自動(dòng)進(jìn)行第一個(gè)端點(diǎn)和最后一個(gè)端點(diǎn)進(jìn)行相連(見圖3)。
圖3 完成多邊形規(guī)劃
第五步:選擇導(dǎo)出規(guī)劃的數(shù)據(jù)時(shí),通過SQ Lite Helper 類連接數(shù)據(jù)庫,將數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)取出,并通過G map Polygon 類的Is Inside 方法判斷小區(qū)的經(jīng)緯度是否在規(guī)劃的多邊形范圍內(nèi)。
在網(wǎng)絡(luò)規(guī)劃中,需要考慮實(shí)際中網(wǎng)絡(luò)設(shè)備的新增和刪除。為了將小區(qū)參數(shù)從子窗體傳遞到主窗體,應(yīng)用了C#中的委托delegate 和事件event 并進(jìn)行關(guān)聯(lián)。在子窗體中根據(jù)具體需求聲明一個(gè)委托set Form Value,根據(jù)這個(gè)委托聲明該類型的事件set Form All Value,將委托與動(dòng)作進(jìn)行關(guān)聯(lián)。在子窗體中的Button 按鈕中實(shí)現(xiàn)該委托事件。
在主窗體中,實(shí)例化子窗體時(shí),同時(shí)初始化在子窗體中實(shí)現(xiàn)的委托事件:add.set Form All Value +=new Add.set Form Value(add_set Form Text Value);在刪除小區(qū)模塊中,通過設(shè)置一個(gè)類型為G Map Polygon 全局變量Selected Polygon 用于存儲(chǔ)點(diǎn)擊的多邊形扇區(qū)。當(dāng)點(diǎn)擊查看某個(gè)小區(qū)的扇區(qū)時(shí),會(huì)將該多邊形對(duì)象賦值給Selected Polygon,當(dāng)點(diǎn)擊刪除按鈕時(shí),觸發(fā)gMap Overlay.Polygons.Remove (Selected Polygon),將所選中的多邊形進(jìn)行刪除。
為進(jìn)一步合理規(guī)劃網(wǎng)絡(luò)和提升用戶的網(wǎng)絡(luò)感知,本系統(tǒng)基于VS2019 開發(fā)工具,設(shè)計(jì)了基于C#與GMap.NET 的移動(dòng)網(wǎng)絡(luò)規(guī)劃軟件系統(tǒng),具有界面簡(jiǎn)潔、操作簡(jiǎn)單、可擴(kuò)展等特性,滿足網(wǎng)絡(luò)規(guī)劃應(yīng)用的實(shí)際需求。