結(jié)合GIS工具軟件與當(dāng)今可視化開發(fā)語言的集成二次開發(fā)方式是GIS應(yīng)用開發(fā)的主流。它的優(yōu)點(diǎn)是既可以充分利用GIS工具軟件對空間數(shù)據(jù)庫的管理,、分析功能,又可以利用其它可視化開發(fā)語言具有的高效,、方便等編程優(yōu)點(diǎn),,集二者之所長……
MapX是MapInfo公司向用戶提供的具有強(qiáng)大地圖分析功能的ActiveX控件產(chǎn)品。由于它是一種基于Windows操作系統(tǒng)的標(biāo)準(zhǔn)控件,,因而能支持絕大多數(shù)標(biāo)準(zhǔn)的可視化開發(fā)環(huán)境如Visual C++,、Visual Basic、Delphi,、PowerBuilder等,。編程人員在開發(fā)過程中可以選用自己最熟悉的開發(fā)語言,,輕松地將地圖功能嵌入到應(yīng)用中,并且可以脫離MapInfo的軟件平臺運(yùn)行,。這里談到的VC++嵌入MapX進(jìn)行二次開發(fā)可分為以下幾個步驟來實(shí)現(xiàn):
1 對應(yīng)用工程的預(yù)設(shè)置
在創(chuàng)建MapX控件之前,,必須將MapX.h和MapX.cpp文件加入到工程中。對于Visual C++5.0及以上版本,,從Project菜單中選擇Add To Project -> Files命令,,打開InsertFiles into Project對話框,選擇MapX.cpp和MapX.h文件加入到工程中(在MapX自帶的C++例子中有這兩個文件),。
注意:不要選擇Project菜單中的Add TO Project->Components And Controls命令,。如果選擇該命令加入MapX控件,將創(chuàng)建一新的.cpp文件,,但是該文本沒有包括所有的MapX對象,。
2 對MapX屬性的操作
對于C++程序來說,每個MapX對象(Objects)都在MapX.h 和 MapX.cpp中用一個類來實(shí)現(xiàn),,類的名字和MapX對象的名字相同,,且已經(jīng)在CmapX中定義了。
例如,,DataSet對象用類CmapXDataset實(shí)現(xiàn),。這和C++類的定義相一致。而每個MapX對象的屬性(Properties)是用類的成員函數(shù)來實(shí)現(xiàn)的,。比如DataSet對象的名字(Name),,就是用Name()函數(shù)來實(shí)現(xiàn)的,不過,,Name()有兩種使用方法,,即Get和Set。如:
CString GetName();//獲取對象名字
void SetName(LPCTSTR);//設(shè)置對象名字
3 部分MapX工具的應(yīng)用
(1) “全圖”工具的改進(jìn)
一般全圖工具的代碼為:
m_ctrlMapX.SetZoom(m_ctrlMapX.GetGeoSetWidth());
此方法的缺點(diǎn)是重新顯示全圖后,,實(shí)際上是以上一個視圖的中心作為屏幕中心進(jìn)行顯示,,如果上一個視圖在全圖中的邊緣位置,點(diǎn)擊全圖工具后實(shí)際上不是初始設(shè)置的全圖,。因此可以用如下代碼實(shí)現(xiàn):
CString mapname=m_ctrlMapX.GetGeoSet();//取得當(dāng)前地圖的名字
m_ctrlMapX.SetGeoSet(mapname);//設(shè)置該地圖為主視區(qū)顯示圖
(2) 創(chuàng)建“信息”工具
MapX沒有提供信息工具,,該工具是自定制工具。有兩種實(shí)現(xiàn)方法,,其基本思想是:
?。?)創(chuàng)建工具的鼠標(biāo)指針類型(一般為“+”),當(dāng)在工具欄上選擇此工具后,,設(shè)置為當(dāng)前工具,,然后跟蹤鼠標(biāo)在地圖上點(diǎn)擊的位置,觸發(fā)ToolUsed事件,根據(jù)位置信息確定相應(yīng)的對象,,然后讀取對象屬性或綁定的數(shù)據(jù)庫,,彈出對話框,實(shí)現(xiàn)信息顯示,。此種方法只適用于顯示地圖的最上層對象(在MapX自帶的C++例子“Buffer”中有具體實(shí)現(xiàn)代碼),。
(2) 用選擇工具選中地圖上所要顯示信息的對象,,然后再點(diǎn)擊工具欄上的信息工具,,彈出對話框,實(shí)現(xiàn)信息顯示,。此信息工具的實(shí)現(xiàn)代碼與(1)不同,,沒有鼠標(biāo)指針,實(shí)際上就是讀取選中對象的屬性或綁定的數(shù)據(jù)庫的操作,。此方法適合顯示地圖上的任意圖層,。
兩種方法各有特點(diǎn),第一種方法直接,,但在實(shí)際應(yīng)用中容易出現(xiàn)異常,第二種方法要多點(diǎn)擊一次,,但應(yīng)用穩(wěn)定,,而且適用地圖上的任意圖層。
(3) “測距”工具的使用注意事項(xiàng)
MapX的Distance()函數(shù)是針對地球地圖的,,在非地球地圖中使用要注意數(shù)值轉(zhuǎn)換,。否則測出的數(shù)據(jù)與實(shí)際相差甚遠(yuǎn)。
4 用MapX進(jìn)行GIS二次開發(fā)
(1) 創(chuàng)建數(shù)據(jù)庫
空間數(shù)據(jù)庫可以通過兩種方法創(chuàng)建,,一種是通過MapX的圖層生成功能創(chuàng)建,。MapX生成的每一圖層都對應(yīng)一張表(table),該表中除了存有地理對象的位置坐標(biāo)以外,,還可以包含其他屬性字段,;另一種方法是通過導(dǎo)入帶有地理位置信息的其他數(shù)據(jù)庫生成。 MapX可以通過數(shù)據(jù)綁定把這些數(shù)據(jù)庫中的地理信息映射到地圖圖層上,,MapX支持對多種常用數(shù)據(jù)庫的訪問,。
(2) 設(shè)置圖層控制和地圖投影
在把地圖加入到MapX之前,我們可以使用MapX附帶的圖層管理工具Geoset Manager把要加入的圖層匹配在一起,,建成一個圖層組,,該圖層組規(guī)定了其中各個圖層的名稱、內(nèi)容,、屬性及各圖層之間的顯示順序,。MapX中可以給圖層設(shè)置四種屬性:可顯示、可選擇、可編輯和自動標(biāo)注,。一般圖層的屬性是可顯示的,,需要查詢的圖層設(shè)置為可選擇,需要修改的圖層設(shè)置為可編輯,,而自動標(biāo)注可以自動顯示圖層中地理對象的標(biāo)簽,。合理地設(shè)置這些屬性將有助于系統(tǒng)實(shí)現(xiàn)地理信息的維護(hù)和查詢功能。在匹配各個圖層時,,應(yīng)該注意各個圖層投影的設(shè)置,。全部圖層必須使用一致的投影方法才能精確匹配。MapX中的地圖分為地球地圖和非地球地圖,,地球地圖中對象的坐標(biāo)用經(jīng)緯度來表示,,非地球地圖中對象的坐標(biāo)通常是相對坐標(biāo),是相對于圖中的某個基準(zhǔn)點(diǎn)來設(shè)置的,。如果圖層的坐標(biāo)不一致的話,,必須先轉(zhuǎn)換坐標(biāo)才能進(jìn)行匹配。
(3) 設(shè)計(jì)編輯功能
MapX提供標(biāo)準(zhǔn)的地理對象類型定義,,在MapX所提供的點(diǎn),、線、面類型選擇對話框中可以方便地選擇地理對象的類型,,包括所使用的符號的形狀,、顏色、大小等屬性,。利用MapX提供的畫圖工具,,可以為用戶設(shè)計(jì)出多種多樣的地理對象生成工具。利用MapX提供的多種地理信息對象的選擇工具(如矩形,、圓形選擇工具),,用戶可以調(diào)用這些選擇工具并和MapX所提供的編輯(刪除、修改等)地理對象功能相結(jié)合,,以完成地理信息系統(tǒng)中地理對象的編輯操作,。但要注意,對于地理數(shù)據(jù)和非地理數(shù)據(jù)要分別對待,。
(4) 設(shè)計(jì)查詢功能和分析統(tǒng)計(jì)功能
對于地理信息系統(tǒng)中所要求的有關(guān)地理信息查詢功能和分析統(tǒng)計(jì)功能,,MapX提供了一定的查詢和分析手段,如MapX可以根據(jù)圖層表中的字段值查詢相對應(yīng)的地理對象,;可以提供對應(yīng)于圖層表中某個或某幾個字段的分析餅圖等,。對于非地理信息,就要依據(jù)系統(tǒng)的具體要求用面向?qū)ο蟮恼Z言設(shè)計(jì)查詢和分析統(tǒng)計(jì)功能,。
結(jié)束語
在開發(fā)GIS的過程中,,首先要考慮的就是選擇好的開發(fā)工具。單獨(dú)使用可視化的編程語言不能方便地實(shí)現(xiàn)地理地圖功能,而通常的GIS軟件是一個非常專業(yè)的界面,,并且不能完全滿足各種GIS用戶的需要,,而使用“GIS組件 + 面向?qū)ο罂梢暬幊陶Z言”的模式就比較適合于各種應(yīng)用的需要。 |