當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]地理信息系統(tǒng)的嵌入式開發(fā)技術(shù)

地理信息系統(tǒng)(GIS)是近年來興起的一門新興技術(shù),由于它能夠直觀有效地利用和表達(dá)地理信息數(shù)據(jù),滿足了信息綜合管理和數(shù)據(jù)服務(wù)可視化的需要,因此在地質(zhì)勘測(cè)、城市規(guī)劃、交通管理、遙控遙測(cè)等許多領(lǐng)域獲得了普遍應(yīng)用。目前國(guó)內(nèi)流行的基礎(chǔ)GIS軟件主要有MapInfo、ARC/INFO、MGE等幾種。為支持應(yīng)用系統(tǒng)的開發(fā),多數(shù)通用GIS系統(tǒng)都提供了專用的開發(fā)工具和編程語言,但與通用的編程工具如Visual C++、Visual Basic等相比,其功能十分有限且不夠靈活。如果在設(shè)計(jì)應(yīng)用GIS系統(tǒng)時(shí)采用嵌入式技術(shù),則既能夠發(fā)揮通用編程工具的強(qiáng)大程序開發(fā)能力,又能充分利用現(xiàn)有GIS系統(tǒng)的豐富功能,從而給開發(fā)工作帶來極大的方便。

1 嵌入式開發(fā)技術(shù)簡(jiǎn)介

  所謂嵌入式開發(fā)技術(shù)是指以在應(yīng)用程序中嵌入由其他程序所提供的數(shù)據(jù)或?qū)ο蟮姆绞絹慝@得特定功能的程序設(shè)計(jì)方法。由于這種嵌入是通過窗口嵌套技術(shù)和程序進(jìn)程間的數(shù)據(jù)通信技術(shù)來實(shí)現(xiàn)的,可以使兩個(gè)不同的程序完全“無縫”地集成到一起,因此所開發(fā)出的應(yīng)用程序與普通程序看起來并沒有什么區(qū)別。使用嵌入式技術(shù)的GIS應(yīng)用程序與為其提供支持的GIS系統(tǒng)之間是一種并行的同時(shí)運(yùn)行的關(guān)系,在功能上不受任何限制,可以象正常程序一樣使用操作系統(tǒng)所提供的一切資源。絕大多數(shù)的GIS系統(tǒng)和通用編程工具都對(duì)嵌入式開發(fā)提供支持。本文將以目前流行的MapInfo地理信息系統(tǒng)和Visual Basic 5.0程序設(shè)計(jì)語言為例,系統(tǒng)地介紹利用嵌入式技術(shù)開發(fā)GIS應(yīng)用軟件的方法。

  MapInfo是一個(gè)功能強(qiáng)大的通用地理信息和空間數(shù)據(jù)管理系統(tǒng),能提供豐富的地理信息數(shù)據(jù)編輯轉(zhuǎn)換、分析處理、瀏覽顯示、查詢檢索等功能,是目前應(yīng)用最為廣泛的GIS基礎(chǔ)平臺(tái)之一。為了支持二次開發(fā),MapInfo提供了簡(jiǎn)單易用的MapBasic語言,并在4.0以后的版本中全面支持嵌入式技術(shù)。在應(yīng)用程序中嵌入MapInfo系統(tǒng)所使用的主要方法有OLE自動(dòng)化、回應(yīng)方法和動(dòng)態(tài)數(shù)據(jù)交換三種。下面分別對(duì)這些方法作進(jìn)一步的介紹。

2 OLE自動(dòng)化技術(shù)

  OLE自動(dòng)化技術(shù)是在微軟公司的對(duì)象鏈接和嵌入(OLE)技術(shù)和組件對(duì)象模型技術(shù)(COM)基礎(chǔ)上發(fā)展起來的一種程序設(shè)計(jì)標(biāo)準(zhǔn),它允許一個(gè)程序模塊控制其他程序模塊的執(zhí)行。換句話說,支持自動(dòng)化的程序模塊的行為是可以通過編程來控制的,這種控制通過應(yīng)用程序?qū)ψ詣?dòng)化支持程序所提供的對(duì)象的訪問來完成。OLE自動(dòng)化實(shí)質(zhì)上是兩個(gè)不同的應(yīng)用程序之間以客戶機(jī)/服務(wù)器方式進(jìn)行的動(dòng)態(tài)信息交換過程,作為服務(wù)器一方的應(yīng)用程序提供一組具有特定方法和屬性的對(duì)象模型,客戶程序則使用標(biāo)準(zhǔn)的通信接口對(duì)其進(jìn)行訪問和控制。MapInfo所提供的OLE自動(dòng)化對(duì)象模型如圖1所示。

從圖1可以看出,MapInfo提供的OLE自動(dòng)化對(duì)象體系具有很明顯的層次結(jié)構(gòu)。最高層是Application對(duì)象即MapInfo系統(tǒng)本身的運(yùn)行實(shí)例,其下是MapBasic應(yīng)用程序?qū)ο蠹螹BApplications及其公共變量對(duì)象集合MBGlobals。所有的對(duì)象和對(duì)象集合都有相應(yīng)的方法和屬性,應(yīng)用程序可以調(diào)用這些方法和屬性來實(shí)現(xiàn)特定的功能。以VB5.0為例,要想在程序中嵌入MapInfo對(duì)象,首先要聲明一個(gè)ActiveX對(duì)象變量并用其創(chuàng)建MapInfo運(yùn)行實(shí)例,方法如下:

  Public MapInfo As Object

  Set MapInfo = CreateObject(″MapInfo.Application″)

  上述代碼將使MapInfo系統(tǒng)啟動(dòng)并自動(dòng)在后臺(tái)運(yùn)行。與獨(dú)立運(yùn)行時(shí)相比,作為自動(dòng)化對(duì)象的MapInfo系統(tǒng)沒有自己的啟動(dòng)窗體和用戶界面(菜單、工具條等),其行為完全由調(diào)用它的應(yīng)用程序控制。通過訪問Application對(duì)象的屬性和方法可以獲得MapInfo系統(tǒng)的絕大多數(shù)功能。常用的方法主要有三種:Do方法將一個(gè)代表MapBasic語句的字符串傳遞給MapInfo系統(tǒng)執(zhí)行;Eval方法將一個(gè)代表MapBasic表達(dá)式的字符串傳遞給MapInfo系統(tǒng)并返回其值;RunMenuCommand方法通知MapInfo系統(tǒng)執(zhí)行指定的菜單功能項(xiàng)。如果需要使用MapInfo的地圖顯示功能,可以把其地圖窗口嵌入到指定的窗體或圖形控件中。例如,下面的代碼可以使MapInfo的地圖窗口顯示在應(yīng)用程序窗體2的Picture控件中:[!--empirenews.page--]

  MapInfo.Do ″Set Application Window″ & Form2.Picture1.hwnd

  MapInfo.Do″Set Next Document Parent″ & Form2.Picture1.hwnd & ″Style 1″

  在地圖窗口嵌入后,應(yīng)用程序還可以象對(duì)待正常窗口一樣對(duì)其進(jìn)行放大、縮小和移動(dòng)操作。同樣的方法也可以用來嵌入MapInfo系統(tǒng)所能提供的其他窗口,如圖例窗口、布局窗口、信息窗口和數(shù)據(jù)瀏覽窗口等。

在進(jìn)行一些比較復(fù)雜的地理信息操作時(shí),僅僅使用Do方法一條條地發(fā)送MapBasic指令顯然是不方便的,應(yīng)當(dāng)采用編寫Mapbasic程序的方式處理,并把執(zhí)行結(jié)果返回給應(yīng)用程序。這樣能夠避免在應(yīng)用程序和MapInfo系統(tǒng)之間過于頻繁的數(shù)據(jù)交換,從而節(jié)省了系統(tǒng)資源、提高了運(yùn)行效率。調(diào)用MapBasic程序的代碼如下:

  MapBasic.Do ″Run Application″ & Mbfilename

  要實(shí)現(xiàn)對(duì)MapBasic程序的控制并從中獲取數(shù)據(jù),可以使用MBApplications對(duì)象集合。把MBApplications稱作對(duì)象集合是因?yàn)樗砹水?dāng)前所有在MapInfo系統(tǒng)中運(yùn)行的MapBasic程序。與Application對(duì)象的使用方法相同,我們首先要?jiǎng)?chuàng)建MBApplications對(duì)象,然后再訪問其屬性和方法。如果要訪問一個(gè)具體的MapBasic程序?qū)ο?可以在集合對(duì)象后加上序號(hào)來指定。下面的代碼通過訪問MBApplication對(duì)象集合把當(dāng)前正在運(yùn)行的所有MapBasic程序名稱返回給數(shù)組Mbfilename():

  Dim MbApplist As Object

  Set MbApplist=MapInfo.MBApplications

  i=1

  Do While i <=MbApplist.Count

  Mbfilename(i)=MbApplist(i).Name

  i=i+1

  Loop

  MBApplications對(duì)象集合的屬性是只讀的,其值不能由應(yīng)用程序改變。如果要對(duì)某一MapBaisc程序?qū)ο筮M(jìn)行控制,必須使用其Do方法。MapBasic程序?qū)o方法的響應(yīng)是通過執(zhí)行RemoteMsgHandler()過程來完成的。在Do方法被調(diào)用時(shí),MapInfo會(huì)自動(dòng)執(zhí)行指定程序的RemoteMsgHandler()過程,這時(shí)可以用CommandInfo()函數(shù)來獲得Do方法的調(diào)用參數(shù),加以判斷后再轉(zhuǎn)到相應(yīng)的執(zhí)行代碼。類似的,要從MapBasic程序中返回?cái)?shù)據(jù)可以使用其Eval方法,而程序返回什么值由其RemoteQueryHandler()函數(shù)中的代碼決定。對(duì)于在MapBasic程序中使用的公共變量,應(yīng)用程序也可以通過MBGlobals對(duì)象集合來直接訪問。比如要將序號(hào)為1的MapBasic程序中的公共變量global1的值加1,可以使用下面的代碼:

  Dim globinfo As Object, Oldval As Integer

  Set globinfo = Mapinfo.MBApplications(1).MBGlobals

  Oldval = globinfo(″global1″).Value

  globinfo(″global1″).Value = Oldval + 1

  通過OLE自動(dòng)化技術(shù),應(yīng)用程序可以使用MapInfo系統(tǒng)幾乎所有的功能。不過,由于采用了客戶機(jī)/服務(wù)器的運(yùn)行模式,在OLE自動(dòng)化方式下應(yīng)用程序總是處于絕對(duì)主動(dòng)的地位,而MapInfo系統(tǒng)只能作為被動(dòng)的服務(wù)提供方。這樣在實(shí)際應(yīng)用中,一些需要由MapInfo主動(dòng)提供信息的情況就變得很難處理了。因此僅使用OLE自動(dòng)化技術(shù)還不能完全滿足應(yīng)用需要,必須用其他方法來補(bǔ)充其功能。采用下面要介紹的CallBack(回應(yīng))方法可以很好地解決這一問題。

3 回應(yīng)方法

  為完成某些功能,有時(shí)我們要允許用戶對(duì)以自動(dòng)化方式嵌入應(yīng)用程序中的MapInfo系統(tǒng)進(jìn)行直接操作。比如,用戶可能想通過用鼠標(biāo)點(diǎn)擊圖形對(duì)象的方式來查看與之相關(guān)的信息,或者是要在地圖窗口中繪制一個(gè)新的圖形對(duì)象。在這種情況下,應(yīng)用程序并不知道用戶操作事件發(fā)生和結(jié)束的具體時(shí)間,要想及時(shí)獲得操作信息并作出處理,只能借助直接接受該操作的MapInfo系統(tǒng)的主動(dòng)通知。這種由自動(dòng)化服務(wù)程序主動(dòng)通知客戶程序用戶事件信息的技術(shù)就是回應(yīng)方法。[!--empirenews.page--]

  在MapInfo系統(tǒng)中,回應(yīng)方法通過使用OLE技術(shù)實(shí)現(xiàn)。引發(fā)回應(yīng)信息的事件主要有三類:地圖窗口狀態(tài)的改變、特定功能控件(菜單、按鈕、工具條)的選擇以及在繪圖或?qū)ο筮x擇等特定狀態(tài)下地圖窗口內(nèi)的用戶輸入事件。要在應(yīng)用程序中使用回應(yīng)方法,首先要?jiǎng)?chuàng)建一個(gè)專門負(fù)責(zé)回應(yīng)信息接收和處理的OLE對(duì)象類(class),然后在其中定義不同的方法以處理不同類型的回應(yīng)信息。以獲取地圖窗口狀態(tài)變化的回應(yīng)信息為例,首先在VB工程中添加一個(gè)自定義類MIResponder,并在其中添加如下過程:

  Public Sub WindowContentsChanged (ByVal CommandInfoStr As Integer)

  然后創(chuàng)建接收CallBack信息的OLE類對(duì)象theResponder:

  Set theResponder = New MIResponder

  MapInfo.SetCallback theResponder

  則當(dāng)某一地圖窗口狀態(tài)因用戶操作而改變時(shí),theResponder對(duì)象的WindowContentsChanged 方法就會(huì)因MapInfo系統(tǒng)的調(diào)用而自動(dòng)執(zhí)行。此時(shí)的CommandInfoStr參數(shù)就是MapInfo傳來的一個(gè)整數(shù)值即通知窗口狀態(tài)改變的回應(yīng)信息,代表發(fā)生變化的地圖窗口的標(biāo)識(shí)號(hào),而WindowContentsChanged方法中的代碼就可以利用這個(gè)參數(shù)從MapInfo中獲取詳細(xì)的信息并作出處理。

  在絕大多數(shù)情況下,使用OLE自動(dòng)化技術(shù)和回應(yīng)方法已經(jīng)可以實(shí)現(xiàn)MapInfo系統(tǒng)與應(yīng)用程序的完美集成。不過在某些比較復(fù)雜的應(yīng)用情況中,有可能需要讓MapBasic程序主動(dòng)從應(yīng)用程序中提取數(shù)據(jù)。在OLE自動(dòng)化方式下,作為服務(wù)器程序的MapInfo系統(tǒng)只能被動(dòng)接受應(yīng)用程序的操控,即使用回應(yīng)方式也只是做到了主動(dòng)通知,真正的數(shù)據(jù)交換還是必須由應(yīng)用程序控制完成。為了讓MapBasic程序在自動(dòng)化方式下取得數(shù)據(jù)交換的主動(dòng)權(quán),可以采用標(biāo)準(zhǔn)的進(jìn)程間通信方式:動(dòng)態(tài)數(shù)據(jù)交換(DDE)技術(shù)。

4 動(dòng)態(tài)數(shù)據(jù)交換技術(shù)

  DDE是Windows環(huán)境下不同應(yīng)用程序之間通過主動(dòng)鏈接完成數(shù)據(jù)交換的協(xié)議標(biāo)準(zhǔn),它可以讓兩個(gè)應(yīng)用程序通過一條即時(shí)建立的數(shù)據(jù)通道進(jìn)行動(dòng)態(tài)實(shí)時(shí)的信息傳遞。在一次DDE會(huì)話過程中,主動(dòng)申請(qǐng)建立數(shù)據(jù)交換通道的應(yīng)用程序稱為客戶程序,它是數(shù)據(jù)交換服務(wù)的接受者;響應(yīng)鏈接請(qǐng)求的應(yīng)用程序稱為服務(wù)器程序,它是數(shù)據(jù)交換服務(wù)的提供者。DDE技術(shù)允許一個(gè)應(yīng)用程序同時(shí)與其他程序建立多個(gè)DDE會(huì)話,在一個(gè)DDE會(huì)話中作為客戶方的程序也可以同時(shí)是另一個(gè)會(huì)話中的服務(wù)器。DDE會(huì)話有三個(gè)要素:會(huì)話對(duì)象名稱(ApplicationName)、會(huì)話主題(LinkTopic)和數(shù)據(jù)項(xiàng)(LinkItem)。其中對(duì)象名稱應(yīng)當(dāng)是一個(gè)支持DDE功能且正在運(yùn)行的應(yīng)用程序,會(huì)話主題和數(shù)據(jù)項(xiàng)則要符合服務(wù)器程序的定義。MapInfo系統(tǒng)和使用VB開發(fā)的應(yīng)用程序都支持DDE功能,并且定義了一套會(huì)話主題供其他程序使用。

  要實(shí)現(xiàn)DDE會(huì)話,應(yīng)用程序首先要向Windows操作系統(tǒng)申請(qǐng)建立數(shù)據(jù)通道,并提供會(huì)話對(duì)象的名稱和主題作為參數(shù)。操作系統(tǒng)隨后將這一請(qǐng)求轉(zhuǎn)發(fā)給擁有該名稱和主題的應(yīng)用程序,在得到響應(yīng)后就在內(nèi)存中建立一個(gè)數(shù)據(jù)交換通道,并把其標(biāo)識(shí)返回給會(huì)話雙方。數(shù)據(jù)通道建立后,會(huì)話雙方就可以互相傳遞數(shù)據(jù)項(xiàng)完成信息交換。只要服務(wù)器程序支持,在一個(gè)數(shù)據(jù)通道內(nèi)可以傳遞多個(gè)數(shù)據(jù)項(xiàng)。在數(shù)據(jù)交換完成后,客戶程序應(yīng)當(dāng)主動(dòng)提出終止會(huì)話,操作系統(tǒng)隨即關(guān)閉數(shù)據(jù)通道并釋放其占用的內(nèi)存資源。以MapBasic程序向VB應(yīng)用程序申請(qǐng)數(shù)據(jù)交換服務(wù)的DDE會(huì)話為例,建立數(shù)據(jù)交換通道的程序代碼如下:

  Dim channelID As Integer

  ChannelID = DDEInitiate(″vbappname″, ″form1″)

  其中vbappname是VB應(yīng)用程序的名稱,form1是其擁有的一個(gè)支持DDE功能的窗體。由于VB對(duì)DDE的支持是以控件為單位,因此其提供的DDE會(huì)話數(shù)據(jù)項(xiàng)就是擁有所請(qǐng)求數(shù)據(jù)的控件,而該控件所在的窗體就是會(huì)話主題。一旦與窗體建立了DDE數(shù)據(jù)通道,就可以與該窗體中所有支持DDE功能的控件進(jìn)行數(shù)據(jù)交換。在MapBasic程序中,如果要從數(shù)據(jù)項(xiàng)獲取數(shù)據(jù)可以使用函數(shù)DDERequest$(),發(fā)送數(shù)據(jù)則使用DDEPoke語句。例如,下面的代碼將讀取VB文本控件Text1的值,隨后返回一個(gè)新的字符串值:

  Dim Oldtext As string, Newtext as string

  Oldtext = DDERequest$(ChannelID, ″text1″)

  Newtext = Oldtext & ″newstring″

  DDEPoke ChannelID, ″text1″, Newtext

  數(shù)據(jù)交換結(jié)束后,可以用DDETerminate語句來終止對(duì)話:

  DDETerminate ChannelID[!--empirenews.page--]

  對(duì)于同時(shí)有多個(gè)DDE會(huì)話的情況,也可以用DDETerminateAll來關(guān)閉所有的會(huì)話。

  隨著Windows操作系統(tǒng)的日益流行,嵌入式開發(fā)技術(shù)目前已成為設(shè)計(jì)大型軟件系統(tǒng)的主流方法。由于充分利用了已有的軟件成果,采用嵌入式技術(shù)可以縮短應(yīng)用軟件的開發(fā)周期、減少開發(fā)成本,并且使系統(tǒng)具有清晰的層次結(jié)構(gòu),有利于進(jìn)行調(diào)試和維護(hù)。本文以MapInfo系統(tǒng)和VB5.0為例,詳細(xì)介紹了三種主要的嵌入式集成設(shè)計(jì)技術(shù):OLE自動(dòng)化、回應(yīng)方法和動(dòng)態(tài)數(shù)據(jù)交換。這些方法已經(jīng)被應(yīng)用在智能交通調(diào)度系統(tǒng)、車輛監(jiān)控系統(tǒng)、油田綜合信息管理系統(tǒng)等多項(xiàng)GIS工程項(xiàng)目中,實(shí)踐證明效果良好。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉