【正文】
編程工作量,使開(kāi)發(fā)者避開(kāi)某些應(yīng)用的具體編程,直接調(diào)用控件,實(shí)現(xiàn)這些具體應(yīng)用,不僅可以縮短程序開(kāi)發(fā)周期,使編程過(guò)程更簡(jiǎn)潔,用戶(hù)界面更友好,可以使程序更加靈活、簡(jiǎn)便。這種方式省時(shí)省心,但進(jìn)行二次開(kāi)發(fā)的宏語(yǔ)言,作為編程語(yǔ)言只能算是二流,功能極弱,用它們內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 5 來(lái)開(kāi)發(fā)應(yīng)用程序仍然不盡如人意。該屬 性在設(shè)計(jì)時(shí)無(wú)效,在運(yùn)行時(shí)為只讀。Clear To Send 是調(diào)制解調(diào)器發(fā)送到相聯(lián)計(jì)算機(jī)的信號(hào),指示傳輸可以進(jìn)行。例如,當(dāng)在 CD(Carrier Detect)線或 RTS(Request To Send)線上有字符到達(dá)或發(fā)生了改變,在這種情況下,可以使用 MSComm 控件的 OnComm 事件捕獲和處理這些通信事件。 VC++應(yīng)用程序的開(kāi)發(fā)主要有兩種模式,一種是 WIN API 方式 ,另一種則是 MFC方式,傳統(tǒng)的 WIN API 開(kāi)發(fā)方式比較繁瑣,而 MFC 則是對(duì) WIN API 再次封裝,所以MFC 相對(duì)于 WIN API 開(kāi)發(fā)更具備效率優(yōu)勢(shì)。 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 2 MapX 為開(kāi)發(fā)人員提供了一個(gè)快速、易用、功能強(qiáng)大的地圖化組件。 VC++是目前較流行的可視化開(kāi)發(fā)編程工具之一,支持面向?qū)ο蠛褪录?qū)動(dòng)機(jī)制的程序開(kāi)發(fā),利用其強(qiáng)大的集成開(kāi)發(fā)環(huán)境,程序員僅需要較少代碼即可生成標(biāo)準(zhǔn)的“ Windows” 界面,并且能在 VC 開(kāi)發(fā)平臺(tái)下 可以較為方便的集成組件。在集成二次開(kāi)發(fā)的基礎(chǔ)上,首先實(shí)現(xiàn)了地圖的導(dǎo)入、地圖 放大縮小及 圖層控制等 電子導(dǎo)航 的 基本功能, 其次 以測(cè)量 折線 距離為例實(shí)現(xiàn)了自定義工具的功能, 再次 介紹了最優(yōu)路徑分析,最后實(shí)現(xiàn) GPS 導(dǎo)航功能。 關(guān)鍵詞: 電子導(dǎo)航; GIS 開(kāi)發(fā); VC++; MapX 控件; 最優(yōu)路徑 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) II Electronic Navigation Systems Based On VC++ Abstract Since the beginning of 1960s,Geographic Information System (GIS) has gradually bee a mature technology. In transportation, tourism, environment and many other fields of application GIS has been accepted by an increasing number of users for the people working and living as a powerful tool. The design used VC + + as a development platform, MapX control as a graphics platform, MSComm control as a munications has devised the GIS applications such as electronic navigation Basic functions(zoom control,the whole map, Roaming, for example), Calculating the distance, Layer Control, Analysis of the optimal path and GPS Navigation Features. This article has described the design of electronic navigation systems background, MapX control,VC++ and MSComm control. It has analyzed GIS development in three ways and proposed system design:Secondary development of integrated. First of all, It has realized the basic functions of GIS such as the insert map,Layer Control, Zoom control in the integrated development of the basis of secondary. Second, it has used a custom tool as an example to measure the distance, and then it has introduced the analysis of the optimal path. Finally, it has realized GPS navigation. Key words: Electronic navigation。 本文主要介紹利用 MapX 控件,采用 VC++編程語(yǔ)言進(jìn)行組件式 GIS 應(yīng)用軟件開(kāi)發(fā)的主要過(guò)程和基本模式,來(lái)實(shí)現(xiàn)電子導(dǎo)航的目的。在 VB, Delphi,PowerBuilder, VC 等可視化開(kāi)發(fā)環(huán)境中,只需在設(shè) 計(jì)階段將 MapX 控件放入窗體中,并對(duì)其進(jìn)行編程,設(shè)置屬性或調(diào)用方法或相應(yīng)事件,即可實(shí)現(xiàn)數(shù)據(jù)可視化,專(zhuān)題分析,地理查詢(xún),地理編碼等豐富的地圖信息系統(tǒng)功能。 VC 基于 C, C++語(yǔ)言,主要由是 MFC 組成,是與系統(tǒng)聯(lián)系非常緊密的編程工具,它兼有高級(jí),和低級(jí)語(yǔ)言的雙重性,功能強(qiáng)大,靈活,執(zhí)行效率高,幾乎可說(shuō) VC 在 Windows 平臺(tái)無(wú)所不能。 OnComm 也可以捕獲和處理通信中的錯(cuò)誤。該屬性在設(shè)計(jì)時(shí)無(wú)效,在運(yùn)行時(shí)為只讀。 Settings 屬性 : 設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位參數(shù)。 (3)集成二次開(kāi)發(fā) 集成二次開(kāi)發(fā)是指利用專(zhuān)業(yè)的 GIS 工具軟件,如 MapInfo、 ArcView 等,實(shí)現(xiàn) GIS的基本功能,以通用軟件開(kāi)發(fā)工具尤其是可視化開(kāi)發(fā)工具,如 Visual C++、 Delphi、 Visual Basic、 Power Builder 等為開(kāi)發(fā)平臺(tái),進(jìn)行二者的集成開(kāi)發(fā)。與利用 OLE Automation 技術(shù)作為服務(wù)器的 MapInfo 相比,利用控件開(kāi) 發(fā)速度快,占用資源少,而且易實(shí)現(xiàn)許多底層的編程和開(kāi)發(fā)功能 [4]。 1) 在 文件中,加入 對(duì)象的頭文件,并聲明 CMapX 類(lèi)型的變量 m_ctrlMapX。 代碼如下: int CVCDZDHView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (!(NULL,WS_VISIBLE,CRect(0,0,100,100),this,IDC_MAP)) return 1。 void CVCDZDHView::OnSetFocus(CWnd*pOldWnd) { 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 9 CView::OnSetFocus(pOldWnd)。打開(kāi)類(lèi)向?qū)?,選擇視圖類(lèi) CVCDZDHView,為菜單項(xiàng)內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 10 ID_ZOOM_IN 添加 COMMAND 消息映射函數(shù) OnZoomIn(),并編輯代碼如下。 = VT_ERROR。 } catch (COleException *e) { eReportError()。 define MYTOOL_DISTANCE 1 然后,在 文件中的 OnCreate()函數(shù)中加入如下代碼,從而創(chuàng)建一個(gè)用戶(hù)自定義工具。切換到 VCDZDHView. h 文件中,聲明事件響應(yīng)函數(shù),代碼如下。 n=()。 (總距離為 :%f公里 ,dDistanceTot)。 調(diào)用自定義工具 在“工具”下拉菜單中添加“折線距離”子菜單項(xiàng), ID 為 ID_DISTANCE_TOOL。 實(shí)現(xiàn)過(guò)程及其算法分析 Dijkstra(迪杰斯特拉 )算法 是典型的最短路徑路由算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 19 3. 遍歷考察這個(gè)點(diǎn)的子節(jié)點(diǎn)。從所有未標(biāo)記的結(jié)點(diǎn)中, 選取 dj 中最小的一個(gè) i: di=min[ dj, 所內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 20 有未標(biāo)記的點(diǎn) j] ,點(diǎn) i就被選為最短路徑中的一點(diǎn),并設(shè)為已標(biāo)記的。 public VERTEX Prev。//每個(gè) Link 對(duì)象的 v1 都應(yīng)該指向它所附屬的點(diǎn)節(jié)點(diǎn) 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 21 public VERTEX v2。 } VERTEX 類(lèi)用來(lái)存儲(chǔ)點(diǎn)節(jié)點(diǎn), Link 類(lèi)用來(lái)存儲(chǔ)鄰接關(guān)系, SearchLink 是一個(gè)臨時(shí)的中間鄰接關(guān)系,在尋徑時(shí)替代 VERTEX 實(shí)例進(jìn)行運(yùn)算,用來(lái)維持鄰接多重表。 RoadNode[indexP].Neighbor=null。 pFeatCsrL=(null,false)。 p2=()。 =(double)(int)((Weight))。 } 點(diǎn)的數(shù)組建立完成之后,可以開(kāi)始遍歷線層元素,每取得一個(gè)線元素,則可以得到首尾節(jié)點(diǎn)的 ID,根據(jù)首尾節(jié)點(diǎn) ID(即首尾節(jié)點(diǎn)在數(shù)組中的索引)得到首尾節(jié)點(diǎn),分別為首尾節(jié)點(diǎn)建立鄰接關(guān)系 vLink1 和 vLink2,從線元素獲得首尾節(jié)點(diǎn)的過(guò)程的時(shí)間復(fù)雜度為 O( 1),而外層 while 循環(huán)是遍歷線層元素,時(shí)間復(fù)雜度為 O( n),經(jīng)過(guò)這一過(guò)程 ,拓?fù)潢P(guān)系基本建立完成,由于采用數(shù)組存儲(chǔ) VERTEX 元素的目的是建立索引,減少建立拓?fù)潢P(guān)系時(shí)點(diǎn)的搜索時(shí)間,因此,拓?fù)潢P(guān)系建立完成后,為了方便運(yùn)算,也為了盡量減少數(shù)組元素所占用的大塊內(nèi)存區(qū)域,把 VERTEX 元素從數(shù)組中摘下并建立環(huán)狀鏈表: vWork=vHead。 } } =vHead。=vWork。 } 由于鄰接多重表可以重復(fù)使用,因此 在一次尋徑后,鏈表中的節(jié)點(diǎn)的一些屬性值可能被改變,因此需要重新初始化節(jié)點(diǎn)的屬性值,如查詢(xún)狀態(tài) Searched、最短路徑前導(dǎo)節(jié)點(diǎn) ShortPathPre,最短路徑值 Weight 等。 =。!=2)//一旦鏈表 sOpen 變?yōu)榭?,或終點(diǎn)內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 27 的最短路徑已經(jīng)找到,則查詢(xún)結(jié)束 { sTemp=。 =1。 =。外循環(huán)用來(lái)遍歷鏈表內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 29 sClose,直到鏈表 sClose 變?yōu)榭?,或者最短路徑的終點(diǎn) vTail 的最短路徑被找到( Searched字段變?yōu)?2)。現(xiàn)不僅應(yīng)用于物理勘探、電離層測(cè)量和航天器導(dǎo)航等諸多民用領(lǐng)域,在軍事領(lǐng)域更是取得了廣泛的應(yīng)用 —— 在彈道導(dǎo)彈、野戰(zhàn)指揮系統(tǒng)、精確彈道測(cè)量以及軍用地圖快速測(cè)繪等領(lǐng)域均大量采用了衛(wèi)星導(dǎo)航定位技術(shù)。嚴(yán)格而言,載波相位應(yīng)被稱(chēng)為載波拍頻相位,它是收到的受多普勒頻移影響的衛(wèi)星信號(hào)載波相位與接收機(jī)本機(jī)振蕩產(chǎn)生信號(hào)相位之差。在定位觀測(cè)時(shí) ,若接收機(jī)相對(duì)于地球表面靜止,則稱(chēng)為靜態(tài)定位,在進(jìn)行控制網(wǎng)觀測(cè)時(shí),一般均采用這種方式由幾臺(tái)接收機(jī)同時(shí)觀測(cè),它能最太限度地發(fā)揮 GPS 的定位精度,專(zhuān)用于這種目的的接收機(jī)被稱(chēng)為大地型接收機(jī),是接收機(jī)中性能最好的一類(lèi)。打開(kāi)通信端口 ,即將 PortOpen 屬性設(shè)為 True。//1:表示 以二進(jìn)制方式檢取數(shù)據(jù) (1)。//接收每字節(jié)的平均允許時(shí)間 = 0。 = ONESTOPBIT 。olRead)。 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 35 3 緯度 , 格式為 4 標(biāo)明南北半球 , N 為北半球、 S 為南半球 5 徑度,格式為 6 標(biāo)明東西半球, E 為東半球、 W 為西半球 7 地面上的速度,范圍為 到 8 方位角,范圍為 到 度 9 日期 , 格式為 ddmmyy 10 地磁變化,從 到 度 11 地磁變化方向,為 E 或 W 至于其他幾種幀格式,除了特殊用途外,平時(shí)并不常用,雖然接收機(jī)也在源源不斷地向主機(jī)發(fā)送各種數(shù)據(jù)幀,但在處理時(shí)一般先通過(guò)對(duì)幀頭的判斷而只對(duì) $GPRMC幀進(jìn)行數(shù)據(jù)的提取處理。 if(Data[i]==10){//幀尾 } if(Data[i]==39。 break。 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書(shū)(畢業(yè) 論文 ) 37 } } } 現(xiàn)在已將所需信息提取到內(nèi)存,即時(shí)間、日期以及經(jīng)緯度分別保存在 CString 型變量 m_sTime、 m_Data、 m_sPositionY 和 m_sPositionX 中。 //提取出月份 //buf第 3 字節(jié)為天, 5 字節(jié)為年,提取方法同上 ?? ::strcpy(buf,m_sPositionY)。 (%c%c%c%c%c%c%c,buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9])。//提取出經(jīng)度 (單位為分 ) } if(()==9) //經(jīng)度未超過(guò) 90 度 (如東經(jīng) 89 度 ) { //處理方法同上,只是 buf的第 0、 1 字節(jié)為度數(shù), 2~9 為分?jǐn)?shù)。 PositionV