張亞軍 王川 詹家賓
摘要:地理信息系統(tǒng)是一項以計算機為基礎(chǔ)的新興技術(shù)。該文首先概述了地理信息系統(tǒng)的基本概念,然后介紹了地理信息系統(tǒng)軟件MapInfo MapX及其開發(fā)技術(shù)。最后,通過一個具體的示例演示了MapX在Visual C++環(huán)境進行開發(fā)的過程。
關(guān)鍵詞:地理信息系統(tǒng);MapInfo MapX;Visual C++
中圖分類號: TP311 文獻標識碼 A 文章編號:1009-3044(2015)08-0086-03
Abstract: Geographic Information System is a new technique based on computer. This paper begins with an overview of GIS; then details the MapInfo MapX and; finally gives an instance of how to develop application using Mapx based on visual C++.
Key words: GIS; MapInfo MapX; Visual C++
1 引言
1.1 地理信息系統(tǒng)GIS簡介
地理信息系統(tǒng)(Geographic Information System, GIS),system)直譯為地理信息系統(tǒng),是一種處理地理空間數(shù)據(jù)的信息系統(tǒng)[1],是一項以計算機為基礎(chǔ)的新興技術(shù),它是在計算機硬、軟件系統(tǒng)支持下,對整個或部分地球表層(包括大氣層)空間中的有關(guān)地理分布數(shù)據(jù)進行采集、存儲、管理、運算、分析、顯示和描述的技術(shù)系統(tǒng)。地理信息系統(tǒng)處理、管理的對象是多種地理空間實體數(shù)據(jù)及其關(guān)系,包括空間定位數(shù)據(jù)、圖形數(shù)據(jù)、遙感圖像數(shù)據(jù)、屬性數(shù)據(jù)等,用于分析和處理在一定地理區(qū)域分布的各種現(xiàn)象和過程,解決復(fù)雜的規(guī)劃、決策和管理問題[2]。地理信息系統(tǒng)的出現(xiàn),改變了地理信息交換的方式,并為地理學(xué)的研究注入了新活力,正如陳述彭先生所說:“ 如果說地圖是地理學(xué)的第二代語言, 那么地理信息系統(tǒng)就是地理學(xué)的第三代語言?!?[3]
地理信息系統(tǒng)按內(nèi)容分為兩類:應(yīng)用型GIS與工具型GIS。應(yīng)用型GIS是以某一專業(yè)、領(lǐng)域或工作為主要內(nèi)容,而工具型GIS是支撐軟件,包括空間數(shù)據(jù)輸入、存儲、管理、分析與輸出等基本功能。目前開發(fā)應(yīng)用型GIS是開發(fā)者最關(guān)心的問題。二次開發(fā)有以下三種實現(xiàn)方式:
獨立開發(fā)。獨立開發(fā)不依賴于任何GIS工具軟件,從空間數(shù)據(jù)的采集、編輯到數(shù)據(jù)的處理分析及結(jié)果輸出,所有的算法都由開發(fā)者獨立設(shè)計,然后選用某種程序設(shè)計語言,在一定的操作系統(tǒng)平臺上編譯實現(xiàn)。獨立開發(fā)的優(yōu)點是:不依賴任何商業(yè)GIS工具軟件,可減少開發(fā)成本。不足之處是:對大多數(shù)開發(fā)者來講,開發(fā)出來的產(chǎn)品很難在功能上與商業(yè)GIS工具軟件相比,且在GIS工具軟件上省下的錢,可能抵不上開發(fā)者在開發(fā)過程中絞盡腦汁所付出的代價。
單純二次開發(fā)。單純二次開發(fā)完全借助于GIS工具關(guān)鍵提供的開發(fā)語言進行應(yīng)用系統(tǒng)開發(fā)。GIS工具軟件大多提供了可供用戶進行二次開發(fā)的宏語言,如ArcView提供了Avenue語言,MapInfo公司研制的MapInfo Professional提供了MapBasic語言等。用戶可以利用這些宏語言,以原GIS工具軟件為開發(fā)平臺,開發(fā)出針對不同應(yīng)用對象的應(yīng)用程序。這種方式雖省時省心,但進行二次開發(fā)的宏語言作為變成語言智能算是二流語言,功能極弱,用它們來開發(fā)應(yīng)用程序仍然不盡如人意。
集成二次開發(fā)。集成二次開發(fā)指利用專業(yè)的GIS工具軟件,如ArcView、MapInfo等,實現(xiàn)GIS的基本功能,以通用軟件開發(fā)攻擊尤其是可視化開發(fā)工具,如Delphi、Visual C++、Visua Basic、PowerBuilder等為開發(fā)平臺,進行二者的集成開發(fā)。
1.2 MapInfo MapX簡介
MapInfo MapX是美國MapInfo公司開發(fā)的低價高效、強大的ActiveX組件,可以很方便的集成到使用標準可視化編程工具開發(fā)的商業(yè)應(yīng)用中。MapInfo MapX支持將地圖功能添加到任何應(yīng)用中,提供了一種高度可視化的方法,來顯示和分析基于位置的數(shù)據(jù),從而更好的為客戶服務(wù),更好的進行商業(yè)決策,更好的管理資產(chǎn)和運營。
MapInfo MapX支持開發(fā)商方便快捷的將地圖功能集成到新的或已有的應(yīng)用中??梢允褂脴藴实木幊陶Z言——Visual Basic、Visual C++、Delphi、PowerBuilder和Oracle Express Objects。因為不需要學(xué)習(xí)新的或高難度的編程語言,開發(fā)者可以快速展開工作,方便的適合和實現(xiàn)地圖功能和特性。
MapInfo MapX提供了大量的方法和事件以及其他向?qū)韼椭喕瘧?yīng)用開發(fā)。
2 Visual C++中創(chuàng)建MapX地圖
在Visual C++中使用MapX,項目當中必須包含MapX.cpp和MapX.h兩個文件,可以在MapX的示例當中找到這兩個文件。在Visual C++中創(chuàng)建MapX地圖,可以根據(jù)需要在主視圖或?qū)υ捒蛑袆?chuàng)建。下面分別對這兩種方式進行簡單介紹。
2.1 在主視圖中創(chuàng)建地圖
首先,用Visual C++創(chuàng)建一個工程。通過菜單File->New,在Projects窗口選中MFC AppWizard(exe),在右側(cè)填寫項目名稱。在接下來的第一步,選擇Single document,其他步驟選擇默認設(shè)置。
工程建立完畢以后,為了使用MapX,將MapX.cpp、MapX.h兩個文件復(fù)制到工程的根目錄里面,然后使用菜單Project->Add To Project->Files,選擇MapX.cpp和MapX.h兩個文件,將其加入到成當中。添加到工程以后,Visual C++中的ClassView當中會顯示MapX提供的類,如圖1所示。所有MapX相關(guān)類都以“CMapX”開頭,后面為具體的類名。不要選擇“項目”->“組件和控件”命令。這樣做將會創(chuàng)建一個 .cpp 文件,但該文件將是不完整的[4]。
1)為在工程中使用MapX,在自己創(chuàng)建的視圖類CMapView的頭文件中,添加如下代碼:
3 簡單開發(fā)實例
本節(jié)通過在對話框插入MapX,然后開發(fā)工具測量地圖上任意兩點間的距離,演示采用Visual C++進行MapX開發(fā)的基本方法。
3.1 為對話框添加快捷菜單
通過菜單Project->Add To Project->Components and Controls …打開Components and Controls Gallery對話框,選擇“Visual C++ Components”文件夾里面的“Pop-up Menu”,雙擊和點擊“Insert”插入快捷菜單,在彈出的Pop-up Menu對話框中,在“Add pop-up menu to:”里面選擇MapX所對應(yīng)的對話框。
然后在ResourceView窗口選中新建的快捷菜單進行編輯,保留“開始測距”和“結(jié)束測距”兩個菜單,ID分別為ID_MAP_BDIS和ID_MAP_EDIS。運行程序,右鍵點擊地圖,即可得到快捷菜單。
3.2 開發(fā)地圖上任意兩點間距離的計算
在MapX當中,提供了計算兩點間距離的函數(shù)double CMapX::Distance(double X1, double Y1, double X2, double Y2),其中(X1,Y1)、(X2,Y2)分別對應(yīng)了地圖上兩點的經(jīng)緯度。但是,用鼠標獲取的點的坐標都是屏幕坐標,不能直接用該函數(shù)計算距離,必須轉(zhuǎn)化成地圖上的經(jīng)緯度。MapX提供了一個經(jīng)緯度和屏幕坐標間相互轉(zhuǎn)化的函數(shù),void CMapX::ConvertCoord(float* ScreenX, float* ScreenY, double* MapX, double* MapY, short Direction),從參數(shù)名稱可以對其功能一目了然,Direction則是一個標志位,表示轉(zhuǎn)化是由屏幕坐標轉(zhuǎn)換到地圖坐標,還是由地圖坐標轉(zhuǎn)換到屏幕坐標,取值為miMapToScreen=0,或miSceeenToMap=1。
為了保存鼠標點擊位置,為對話框類CMapdlgDlg增加四個成員變量,double StartX、double StartY、double EndX、double EndY,分別保存鼠標按下和彈起時地圖坐標的經(jīng)緯度。之后再增加成員變量double Distance保存計算得到的兩點間的距離。
通過View->ClassWizard打開ClassWizard對話框,在Class name選擇對話框類“CMapdlgDlg”,然后在Object IDs選擇MapX對應(yīng)的資源符號“IDC_MAP1”,在Message選擇“MouseDown”和“MouseUp”,點擊“Add Function”。
4 結(jié)束語
本文首先概述地理信息系統(tǒng)GIS,然后介紹了在Visual C++下引入MapX的方法,最后通過一個簡單的示例說明了在Visual C++下采用對話框的方式開發(fā)MapX的方法。限于篇幅,該示例非常簡單,但涵蓋了在Visual C++下MapX開發(fā)常用的技術(shù),具有一定的借鑒意義。
參考文獻:
[1] 犁夏,劉凱.GIS 與空間分析原理與方法[M].北京:科學(xué)出版社.2006
[2] 尹旭日,張武軍.Visual C++環(huán)境下MapX的開發(fā)技術(shù)[M].北京:冶金工業(yè)出版社,2009.
[3] 李連營,李清泉,李漢武,等.基于MapX的GIS應(yīng)用開發(fā)[M].武漢:武漢大學(xué)出版社,2003.
[4] Troy. MapX開發(fā)人員指南[M].紐約:MapInfo公司,2002.