3S基礎知識:在VC++中嵌入MapX的集成二次開發

  MapX是MapInfo公司向用戶提供的具有強大地圖分析功能的ActiveX控件產品。由於它是一種基於Windows操作系統的標準控件,因而能支持絕大多數標準的可視化開發環境如Visual C++、Visual Basic、Delphi、PowerBuilder等。編程人員在開發過程中可以選用自己最熟悉的開發語言,輕鬆地將地圖功能嵌入到應用中,並且可以脫離MapInfo的軟件平臺運行。這裏談到的VC++嵌入MapX進行二次開發可分爲以下幾個步驟來實現:

  1 對應用工程的預設置

  在創建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控件,將創建一新的.cpp文件,但是該文本沒有包括所有的MapX對象。

  2 對MapX屬性的操作

  對於C++程序來說,每個MapX對象(Objects)都在MapX.h 和 MapX.cpp中用一個類來實現,類的名字和MapX對象的名字相同,且已經在CmapX中定義了。

  例如,DataSet對象用類CmapXDataset實現。這和C++類的定義相一致。而每個MapX對象的屬性(Properties)是用類的成員函數來實現的。比如DataSet對象的名字(Name),就是用Name()函數來實現的,不過,Name()有兩種使用方法,即Get和Set。如:

  CString GetName();//獲取對象名字

  void SetName(LPCTSTR);//設置對象名字

  3 部分MapX工具的應用

  (1) “全圖”工具的改進

  一般全圖工具的代碼爲:

  m_ctrlMapX.SetZoom(m_ctrlMapX.GetGeoSetWidth());

  此方法的缺點是重新顯示全圖後,實際上是以上一個視圖的中心作爲屏幕中心進行顯示,如果上一個視圖在全圖中的邊緣位置,點擊全圖工具後實際上不是初始設置的全圖。因此可以用如下代碼實現:

  CString mapname=m_ctrlMapX.GetGeoSet();//取得當前地圖的名字

  m_ctrlMapX.SetGeoSet(mapname);//設置該地圖爲主視區顯示圖

  (2) 創建“信息”工具

  MapX沒有提供信息工具,該工具是自定製工具。有兩種實現方法,其基本思想是:

  (1) 創建工具的鼠標指針類型(一般爲“+”),當在工具欄上選擇此工具後,設置爲當前工具,然後跟蹤鼠標在地圖上點擊的位置,觸發ToolUsed事件,根據位置信息確定相應的對象,然後讀取對象屬性或綁定的數據庫,彈出對話框,實現信息顯示。此種方法只適用於顯示地圖的最上層對象(在MapX自帶的C++例子“Buffer”中有具體實現代碼)。

  (2) 用選擇工具選中地圖上所要顯示信息的對象,然後再點擊工具欄上的信息工具,彈出對話框,實現信息顯示。此信息工具的實現代碼與(1)不同,沒有鼠標指針,實際上就是讀取選中對象的屬性或綁定的數據庫的操作。此方法適合顯示地圖上的任意圖層。

  兩種方法各有特點,第一種方法直接,但在實際應用中容易出現異常,第二種方法要多點擊一次,但應用穩定,而且適用地圖上的任意圖層。

  (3) “測距”工具的使用注意事項

  MapX的Distance()函數是針對地球地圖的,在非地球地圖中使用要注意數值轉換。否則測出的數據與實際相差甚遠。

  4 用MapX進行GIS二次開發

  (1) 創建數據庫

  空間數據庫可以通過兩種方法創建,一種是通過MapX的圖層生成功能創建。MapX生成的每一圖層都對應一張表(table),該表中除了存有地理對象的位置座標以外,還可以包含其他屬性字段;另一種方法是通過導入帶有地理位置信息的其他數據庫生成。MapX可以通過數據綁定把這些數據庫中的地理信息映射到地圖圖層上,MapX支持對多種常用數據庫的訪問。

  (2) 設置圖層控制和地圖投影

  在把地圖加入到MapX之前,我們可以使用MapX附帶的圖層管理工具Geoset Manager把要加入的圖層匹配在一起,建成一個圖層組,該圖層組規定了其中各個圖層的名稱、內容、屬性及各圖層之間的顯示順序。MapX中可以給圖層設置四種屬性:可顯示、可選擇、可編輯和自動標註。一般圖層的屬性是可顯示的,需要查詢的圖層設置爲可選擇,需要修改的圖層設置爲可編輯,而自動標註可以自動顯示圖層中地理對象的標籤。合理地設置這些屬性將有助於系統實現地理信息的維護和查詢功能。在匹配各個圖層時,應該注意各個圖層投影的設置。全部圖層必須使用一致的投影方法才能精確匹配。MapX中的地圖分爲地球地圖和非地球地圖,地球地圖中對象的座標用經緯度來表示,非地球地圖中對象的座標通常是相對座標,是相對於圖中的某個基準點來設置的。如果圖層的座標不一致的話,必須先轉換座標才能進行匹配。

  (3) 設計編輯功能

  MapX提供標準的地理對象類型定義,在MapX所提供的點、線、面類型選擇對話框中可以方便地選擇地理對象的類型,包括所使用的符號的形狀、顏色、大小等屬性。利用MapX提供的畫圖工具,可以爲用戶設計出多種多樣的地理對象生成工具。利用MapX提供的多種地理信息對象的選擇工具(如矩形、圓形選擇工具),用戶可以調用這些選擇工具並和MapX所提供的編輯(刪除、修改等)地理對象功能相結合,以完成地理信息系統中地理對象的編輯操作。但要注意,對於地理數據和非地理數據要分別對待。

  (4) 設計查詢功能和分析統計功能

  對於地理信息系統中所要求的有關地理信息查詢功能和分析統計功能,MapX提供了一定的查詢和分析手段,如MapX可以根據圖層表中的字段值查詢相對應的地理對象;可以提供對應於圖層表中某個或某幾個字段的分析餅圖等。對於非地理信息,就要依據系統的具體要求用面向對象的語言設計查詢和分析統計功能。

  結束語

  在開發GIS的過程中,首先要考慮的就是選擇好的開發工具。單獨使用可視化的編程語言不能方便地實現地理地圖功能,而通常的GIS軟件是一個非常專業的界面,並且不能完全滿足各種GIS用戶的需要,而使用“GIS組件 + 面向對象可視化編程語言”的模式就比較適合於各種應用的需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章