天天看點

畢業設計——第三章 開發方法及系統實作(2)

3.3.1地圖操作類CMapControl 類的成員屬性和方法

表 3-2 CMapControl類中實作的成員屬性[5]

名稱

資料類型

說明

ErrorCode

int

該類中形成的錯誤資訊

LintPtCount

管線點的總數

mapZoomFull

MapObjects2.Rectange

圖層縮放處理

Message

string

消息(包括錯誤資訊)

Model

global.Model

目前模式

objMap

AxMapObjects2.AxMap

地圖控件對象

PointCount

高程點總數

CMapControl類的方法如下表所示:

表 3-3 CMapControl類的成員方法

參數

傳回值

CMapControl

構造函數

重載構造函數

AddLayerFromFolder

string,string

bool

加載資料庫檔案

AddLine

MapObjects2.Point

添加線對象

AddPoint

添加點對象

BasePoint

MapObjects2.Point,global.Model

地圖基本處理

getZ

ptZD2,MapObjects2.Point

計算點的高程

GetCross

兩直線的交點

LocationRect

計算最短距離

ptProcess

對點進行處理

ZoomChange

放大、縮小處理

3.3.2地圖操作類CMapControl方法的具體實作

3.3.2.1 資料處理模型

本系統中的資料分為與地理資訊有關的資料和與地理資訊無關的資料。前者指的是與網點、管線位置相關的資料,如網點的坐标值、網點的名稱、唯一标志号;管線的坐标值、名稱唯一标志号等;後者指的是管件的屬性資訊,如口徑、長度、地理位置、埋設年月、供排水流量等。在功能明确基礎上,建立完備的資料字典。

對于與地理資訊有關的資料,可用Shape 格式的圖層表示存儲,這樣便于地理資訊和地圖對象緊密地結合起來。對于與地理資訊無關的資料,可采用SQL 關系資料庫來存儲,這樣便于資料的維護和共享使用。

3.3.2.2 地圖投影模型

空間資料庫的全部圖層必須使用一緻的投影方法才能精确比對,隻有确定了各類投影資料,才能将各種空間資料轉換到統一的地理坐标系中。MapObjects 中的地圖坐标系統分為地理坐标系統和笛卡兒平面坐标系統,地理坐标系統中對象的坐标用經緯度來表示,平面坐标中對象的坐标通常是相對坐标,是相對于圖中的某個基準點來設定的。如果圖層的坐标不一緻的話,必須先轉換坐标才能進行比對。

MapObjects 包含有預定義的坐标系統和坐标轉換。空間資料shape 檔案作為地理圖層MapLayer 被添加到MapObjects 中的時候,投影的詳細資訊也會被儲存在磁盤上的一個投影檔案(.prj)裡,Shapefiles 使用的投影檔案是可被MapObjects 進行寫操作的投影中繼資料的格式。使用者可以将任何投影資料放在一個共同的投影裡進行浏覽和分析,也可以将地圖圖層都輸出到一個新的投影裡。

3.3.2.3 地圖圖層的加載與顯示

MapObjects 可以在程式設計期間載入圖層,也可在程式運作中添加、删除圖層或改變圖層的屬性,這些都可操縱MapObjects 對象的程式設計語句實作。在本例中采用窗體生成的時候自動加載圖層并在控件中顯示。

當加載使用者自定義圖層時,可使用MapObjects對象的圖層管理對象來加載使用者自定義的圖層。代碼實作如下:

在實作過程中,我們調用了MapObjects的Connect方法連接配接Shape檔案。詳細設計代碼如下:

作 用

連接配接到地圖資料庫

參 數

(1) DbFolderName 資料庫所在檔案夾

(2) LayerName 需加載層名

true 加載圖層成功,false 加載失敗

public bool AddLayerFormFolder(string DbFolderName,string LayerName)

{

       bool DbConn=false;

       MapObjects2.DataConnection mapDataConnection;

mapDataConnection =new MapObjects2.DataConnectionClass();

       MapObjects2.MapLayer mapLayer=new MapObjects2.MapLayerClass();

       MapObjects2.Symbol mapSymbol=new MapObjects2.SymbolClass();

       try

       {

              mapDataConnection.Database=DbFolderName;

              DbConn=mapDataConnection.Connect();

              if(!DbConn)

              {

                     this._msg+="/n連接配接到地圖資料庫 "+DbFolderName+" 時,發生錯誤!";

                     return false;

              }else{

                     mapLayer.GeoDataset=mapDataConnection.FindGeoDataset(LayerName);

                     mapSymbol.CharacterIndex=1;

                     mapSymbol.Color=(uint) MapObjects2.ColorConstants.moGreen;

                     mapLayer.Symbol=mapSymbol;

                     this._map.Layers.Add(mapLayer);

                     this._map.Refresh();

                     return true;

              }

       }

       catch

              this._msg+="/n未發現 "+ LayerName +" 的層!";

              return false;

       finally

              mapDataConnection.Disconnect();

}

3.3.2.4 地理資訊增、删、改功能的實作

本系統中的使用MapObjects對象可以對MapObjects 中的地理對象通常使用點(如管線節點、井口等)、線(河流、街道、管線等)、面(運動場、城市和土地區域等)來表示。

MapObjects 提供标準的地理對象類型定義,在MapObjects 所提供的點、線、面類型中,使用者可以友善地設計地理對象的類型,包括所使用的符号的形狀、顔色、大小等屬性。結合程式設計語言還可以給使用者設計出完善的畫圖工具,可以調用它們為使用者設計出多種多樣的地理對象生成工具。還可以設計出多種地理資訊對象的選擇工具,如矩形選擇工具、圓形選擇工具等。 可以把這些選擇工具與MapObjects 所提供的删除地理對象功能相結合以完成地理資訊系統中地理對象的删除功能;在實作地理資訊的修改功能時,可以使用面向對象語言所提供的對于資料庫和MapObjects 控件圖層表的通路功能來通路地理資訊。同時,對于地理資料和非地理資料處理方式是不同的。

在本例子中,使用MapObjects 提供的各種圖形工具來實作地理資訊的增、删、改。根據工具欄barGraphics 上按鈕選擇,在圖層上添加注記、節點和供排水管線等對象的操作,各種操作對象的函數實作定義在CMapControl類中,詳細代碼見附錄代碼。

圖層的基本操作選擇函數

(1) point 滑鼠點選的點對象

(2) gloModel 全局變量global對象的EditModel狀态

public void BaseProcess(MapObjects2.Point point,global.Model gloModel)

       this._model=gloModel;

       switch(gloModel)

              case (global.Model.ZoomIn):     //圖像放大

                     MapObjects2.Rectangle inRect=_map.TrackRectangle();

                     if(inRect==null || inRect.Width<0.00005 || inRect.Height<0.00005)

                     {

                            inRect=this._map.Extent;

                            inRect.ScaleRectangle(0.6667);

                            inRect.Offset(-(inRect.Center.X-point.X),-(inRect.Center.Y-point.Y));

                     }

                     _map.Extent=inRect;

                     break;

              case(global.Model.ZoomOut):   //縮小圖像

                     MapObjects2.Rectangle rect=_map.TrackRectangle();

                     if(rect==null || rect.Width<0.0005 || rect.Height<0.0005)

                            rect=_map.Extent;

                            rect.ScaleRectangle(1.5);

                            rect.Offset(-(rect.Center.X-point.X),-(rect.Center.Y-point.Y));

                     else

                            double _times=_map.Extent.Width/rect.Width;

                            rect.ScaleRectangle(_times);

                     _map.Extent=rect;

                     break;   

              case(global.Model.Pan):     //移動圖像

                     this._map.MousePointer=MapObjects2.MousePointerConstants.moPanning;

                     this._map.Pan();

                     this._map.MousePointer=MapObjects2.MousePointerConstants.moPan;

              case(global.Model.AddPoint):

                     CDbProcess DbProc=new CDbProcess(); //新的類操作對象

                     DbProc.m_Dg=this.m_Dg;

                     DbProc.AddPointToDg(point);                      this.AddPoint(point,0,global.Model.AddPoint);

              case(global.Model.AddLine):

                     this.AddLine(point);

              default:

       }    

3.3.2.5 地理資訊查詢和分析功能的實作

對于地理資訊系統中有關地理資訊查詢功能和分析統計功能,由MapObjects 提供強大的查詢和分析手段:

(1)按照地理目标之間相對距離的關系搜尋(SearchByDistance);如查詢距離道路以15m 内的建築物的位置、名稱、面積和使用情況。

(2) 按邏輯查詢,即按SQL語句的條件從句查詢圖形特征(SearchByExpression),如搜尋距離某管線最近的節點的位置。

(3)根據與已知圖形的關系來查詢其它的圖形特征,如選擇被已知圖形包含的其它圖形特征(SearchByShape)。

對于非地理資訊資料,使用C# 中ADO.NET 資料庫中的資料的方法進行顯示、查詢和處理。

3.4.1資料操作類CDbProcess的成員屬性和方法

CDbProcess類的成員屬性見下表:

表 3-4 CDbProcess類的成員屬性

m_ClickID

目前點選的ID

m_Dg

Datagrid

存儲資料的DataGrid對象

m_Model

CDbProcess類的成員方法如下表:

表 3-5 CDbProcess類的成員方法

CDbProcess

AddPointToDg

添加點資料至控件

MapObjects2.Point,int

FillPointData

DataGrid

初始化資料控件

Initialization

初始化變量

ShowErrorMessage

顯示該類的錯誤資訊