基于組件的GIS開發(fā)Visual Basic和MapObjects實現(xiàn)(終稿_第1頁
基于組件的GIS開發(fā)Visual Basic和MapObjects實現(xiàn)(終稿_第2頁
基于組件的GIS開發(fā)Visual Basic和MapObjects實現(xiàn)(終稿_第3頁
基于組件的GIS開發(fā)Visual Basic和MapObjects實現(xiàn)(終稿_第4頁
基于組件的GIS開發(fā)Visual Basic和MapObjects實現(xiàn)(終稿_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、基于組件的GIS開發(fā)Visual Basic和MapObjects實現(xiàn)一、MapObjects介紹1、 基于組件的GIS開發(fā)技術(shù)利用GIS支撐軟件進(jìn)行二次開發(fā)可以充分利用支撐軟件所具有的強大功能,開發(fā)比較容易,但開發(fā)的系統(tǒng)要在支撐軟件的環(huán)境中運行,系統(tǒng)往往比較龐大,相應(yīng)成本也高,對某些地圖和空間分析只是部分功能的系統(tǒng)來說,二次開發(fā)就不太適合。此外二次開發(fā)受到原有軟件的限制,靈活性沒有底層開發(fā)大。 基于上述原因,用戶希望GIS支撐軟件能組件化,在開發(fā)系統(tǒng)時,根據(jù)需要利用功能組件。為此,一些GIS公司相繼開發(fā)了供開發(fā)人員使用的制圖與GIS功能組件,如ESRI公司的MapObjects、MapInf

2、o公司的MapX等。2、MapObjects產(chǎn)品MapObjects簡稱MO,是ESRI公司開發(fā)的一組供開發(fā)人員使用的制圖與GIS功能組件,目前的版本是2.2。它是建立在微軟的對象鏈結(jié)和嵌入(ActiveX,原先稱OLE)基礎(chǔ)之上的。ActiveX是當(dāng)今得到最廣泛支持的面向目標(biāo)的軟件集成技術(shù)。用戶象用磚塊蓋房子一樣利用ActiveX 組件開發(fā)和集成Windows應(yīng)用。 一個ActiveX控件是一個可重復(fù)使用的軟件組件。ActiveX 控件可以將許多其他ActiveX 對象包裝在一個包中。這個包可以反映某些特定的功能,如統(tǒng)計圖和多媒體等,并可以直接嵌入支持ActiveX 的應(yīng)用中。ActiveX

3、 對象具有特性和方法,可以通過對它們的編程來控制對象的外觀、行為以及相互作用。MO目前使用的主要版本為2.0、2.1和2.2。MO2.0于1999年發(fā)布;MO2.1于2001年3月,增加了CAD、ArcSDE、StreetMap等文件格式的支持功能;MO2.2發(fā)布于2003年1月,主要增加直接讀取GIF和TIFF文件等功能。MapObjects2.2由一個ActiveX 控件(Map控件)和46個可編程ActiveX對象(包括Map控件,可見的對象)所組成。MapObjects控件可以直接插入到許多標(biāo)準(zhǔn)開發(fā)環(huán)境的工具集中,包括VB、Delphi、Visual C+、Microsoft Acce

4、ss、Visual Foxpro等流行的程序設(shè)計環(huán)境。3、利用MapObjects可以實現(xiàn)的功能利用MapObjects,開發(fā)人員可以在熟悉和喜歡開發(fā)環(huán)境中開發(fā)出系統(tǒng)開銷小的GIS系統(tǒng),或在已有的系統(tǒng)中添加GIS功能。利用MapObjects,可以進(jìn)行如下的操作: 1)顯示具有多個圖層的地圖 2)地圖的放大、縮小和漫游 3)增加點、線、圓和多邊形等各種圖形 4)增加文本 5)顯示特征的屬性 6)利用圖形選擇特征 7)利用鄰近分析選擇特征 8)利用SQL表達(dá)式選擇特征 9)選擇特征的統(tǒng)計 10)查詢和更新選擇特征的屬性數(shù)據(jù) 11)各種專題制圖 12)按字段的高程或測量值顯示 13)按字段值對特征

5、進(jìn)行標(biāo)號 14)顯示遙感圖像 15)實時或時間序列數(shù)據(jù)的動態(tài)顯示 16)地理編碼 17)利用特征的測量值顯示點和線事件 18)地圖坐標(biāo)轉(zhuǎn)換 19)地圖的空間操作 20)地圖的旋轉(zhuǎn)4、在Visual Basic下使用MapObjects 安裝MapObjcts之后,打開Visual Basic的程序開發(fā)環(huán)境,在左邊的控件面板上點擊右鍵將彈出控件選擇框,選擇ERSI MapObjcts2.2,控件中將增加一個名叫Map的控件。如果要在應(yīng)用程序中加入地圖,則在控件欄中選擇Map控件,利用該控件畫一個圖框用于顯示地圖。設(shè)置Map控件屬性,包括所要顯示的圖層、顯示順序、每一圖層的顯示特性等(圖11)。根

6、據(jù)需要增加其他控件,并利用MO提供的對象進(jìn)行編程。圖11 Map控件屬性和圖層屬性設(shè)置程序運行界面如圖12所示。圖12 程序運行界面5、 利用MapObjects在線幫助和實例 在地圖控件處于活動狀態(tài)下,按F1將打開MapObjects在線幫助。MapObjects在線幫助含有每個對象、特性、方法、事件和變量的詳細(xì)文檔。學(xué)習(xí)MapObjects的最好方法是在在線幫助中利用編碼例子。大多數(shù)幫助條目含有可以在VB工程中執(zhí)行的例子。此外,MO還有許多實例,它們的Form設(shè)計和代碼可以參考。二、MO對象 MO中有46個對象,可以劃分成5個大類:數(shù)據(jù)操作對象類(10個)、地圖顯示對象類(17個)、投影對

7、象類(8個)、圖形對象類(7個)和地址匹配對象類(4個)。1、數(shù)據(jù)操作對象類數(shù)據(jù)操作對象類中各個對象的關(guān)系如圖21所示。通過定義DataConnection對象可以確定連接的數(shù)據(jù)庫或文件目錄。利用DataConnection對象的GeoDatasets屬性可以得到圖層數(shù)據(jù)的集合對象(GeoDatasets)。利用GeoDatasets的Item方法可以得到其中的一個圖層文件。利用Layers集合的Add方法可以把圖層文件增加到地圖控件中,并作為一個MapLayer對象。利用MapLayer對象的Records屬性可以得到Recordset對象。通過Recordset對象的Fields屬性可以得

8、到Fields集合;通過Fields集合的Item方法可以得到其中的一個Field對象。通過Recordset對象的MoveFirst、MoveNext、MovePrevious方法可以對Recordset對象中的記錄進(jìn)行定位。DataConnection對象GeoDatasets集合GeoDataset對象Recordset對象Fields集合Field對象Statistics對象TableDesc對象Table對象Strings集合通過GeoDatasets屬性通過Item方法通過Fields屬性通過Item方法通過CalculateStatistics方法通過TableDesc屬性通過R

9、ecords屬性通過Database等屬性與數(shù)據(jù)庫或文件目錄建立連接MapLayer對象通過GeoDataset屬性通過Records屬性圖21 數(shù)據(jù)操作對象類中各個對象的關(guān)系2、地圖顯示對象類地圖顯示對象類中各個對象的關(guān)系如圖22所示。Map Control上的圖層包括MapLayer、ImageLayer和TrackingLayer。一個Map Control只有一個TrackingLayer。MapLayer和ImageLayer的集合所對應(yīng)的對象為Layers。MapLayer有不同的顯示方式,通過給MapLayer的Symbol屬性賦值,使MapLayer以新的符號顯示;通過給Map

10、Layer的Renderer屬性賦值,使MapLayer以新的顯示方式顯示。LabelPlacer對象Symbol對象Map控件TextSymbol對象通過Layers屬性Event Renderer對象Layers集合ZRenderer對象MapLayer對象Chart Renderer對象通過Item方法ImageLayer對象ClassBreaks Renderer對象通過TrackingLayers屬性ValueMap Renderer對象GeoEvent對象TrackingLayer對象 DotDensity Renderer對象通過Event屬性 Label Renderer對象

11、Group Renderer對象圖22 地圖顯示對象類中各個對象的關(guān)系3、投影對象類投影對象類中各個對象的關(guān)系如圖23所示。有兩種類型坐標(biāo)系;地理坐標(biāo)系和投影坐標(biāo)系。通過Prime-Meridian、Datum和Unit三個對象可以定義一個地理坐標(biāo)系,其中,Datum包括Spheroid對象的定義。通過GeoCoord、SysProjCoordSys和Unit三個對象可以定義一個投影坐標(biāo)系。Map控件和MapLayer對象有CoordinateSystem屬性,該屬性可以用GeoCoordSys對象或ProjCoordSys對象來賦值。同時GeoCoordSys對象和ProjCoordSys對

12、象又可以通過Type屬性定義具體的坐標(biāo)類型。MapLayer對象有GeographicTransformation屬性,該屬性可以用GeoTransformation對象來賦值, GeoTransformation對象有type屬性用于定義坐標(biāo)變換類型。GeoTransformation對象GeoCoordSys對象ProjCoordSys對象Projection對象Prime Meridian對象Datum對象Unit對象Spheroid對象Map控件MapLayer對象圖23 投影對象類中各個對象的關(guān)系4、圖形對象類圖形對象類中各個對象的關(guān)系如圖24所示通過Point對象的x、y屬性可以定

13、義一個點。通過Points對象的Add方法可以把一個點增加到Points對象中。一個線對象和一個多邊形對象可以是多個部分(Parts)組成,通過Parts屬性可以得到Parts集合。Parts集合的Add方法可以把Points對象增加到Parts集合。Point對象Points對象Line對象Polygon對象Rectangle對象Ellipse對象通過Item方法Parts 集合通過Parts屬性通過Add方法通過Bottom、Left、Top和Right四個屬性可以定義一個Rectangle對象Ellipse對象圖24 投影對象類中各個對象的關(guān)系5、地址匹配對象類 地址匹配對象類共有4個對

14、象(圖25)。AddressLocation對象Standardizer對象Geocoder對象PlaceLocator對象圖25 地址匹配對象類三、地圖與圖層操作在MO中,Map Control(地圖控件)是一個載體,可以在地圖控件上增加一個或多個圖層。Mo支持三種類型圖層:矢量圖層、柵格圖層和動態(tài)(Tracking)圖層,所對應(yīng)的對象分別為MapLayer、ImageLayer和TrackingLayer。矢量圖層和柵格圖層分別用于顯示矢量數(shù)據(jù)和柵格數(shù)據(jù),柵格圖層和動態(tài)圖層的集合所對應(yīng)的對象為Layers(圖層集合對象)。動態(tài)圖層用于顯示動態(tài)數(shù)據(jù),如通過GPS采集到的車輛移動中的位置數(shù)據(jù)。

15、在TrackingLayer層顯示的對象稱為GeoEvent對象。當(dāng)在窗體中增加一個地圖控件時,就會有一個TrackingLayer層,這時,沒有GeoEvent對象,GeoEvent對象的EventCount屬性為0。1、 增加矢量圖層矢量圖層是和具體的數(shù)據(jù)相關(guān)聯(lián),要增加矢量圖層,首先要確定(連接)對應(yīng)的數(shù)據(jù)。連接的方法是利用DataConnection和GeoDataset兩個對象。DataConnection對象表示與包含shapefiles的文件夾或包含SDE數(shù)據(jù)庫的服務(wù)器的連接。如要連接到包含shapefiles的文件夾,把DataConnection對象的Database屬性設(shè)置為

16、文件夾名(字符串,包括路徑),然后應(yīng)用Connect方法,如果返回值為True,表明連接成功。如要連接到SDE數(shù)據(jù)庫,則需要設(shè)置數(shù)據(jù)庫、口令、服務(wù)器和用戶特性,然后應(yīng)用Connect方法檢查是否連接成功。如果連接成功,就可以利用FindGeoDataset方法把文件夾中的一個shapefile文件或SDE數(shù)據(jù)庫中的一個層的數(shù)據(jù)賦給新創(chuàng)建圖層的GeoDataset。接著,在圖層集合中增加該圖層。以下的代碼顯示在地圖控件中增加矢量圖層。Dim dConn As New MapObjects2.DataConnection Dim mLayer As New MapObjects2.MapLayer

17、 dConn.Database = c: Set mLayer.GeoDataset = dConn.FindGeoDataset(landuse) Map1.Layers.Add mLayer2、增加?xùn)鸥駡D層增加圖像文件相對簡單,只要聲明一個新的Imagelayer對象,利用Imagelayer對象的File屬性確定對應(yīng)的圖像文件,再在圖層集合對象中利用Add方法增加該Imagelayer對象。Dim iLayer As New ImageLayer iLayer.File = c:p1.jpg Map1.Layers.Add iLayer3、Tracking層的操作 利用AddEvent方

18、法可在Tracking層中增加一個新的GeoEvent對象:TrackingLayer.AddEvent(shape,SymbolIndex)Shape可以是點、線、多邊形等圖形對象,SymbolIndex是TrackingLayer符號列表中符號索引,0表示缺省符號。下面的代碼將在Tracking層中增加一個新的GeoEvent對象。Dim pt As New MapObjects2.Pointpt.X = Rnd pt.Y = RndMap1.TrackingLayer.AddEvent pt, 0下面的代碼將演示動態(tài)顯示圖形。1)利用Timer控件的Interval屬性來控制執(zhí)行操作的時

19、間間隔。Interval的單位為ms,即千分之一秒。Private Sub Form_Load() Timer1.Interval = 1000End Sub Private Sub Timer1_Timer() Dim pt As New MapObjects2.Point pt.X = Rnd pt.Y = Rnd Map1.TrackingLayer.AddEvent pt, 0End SubRnd函數(shù)返回0和1之間的隨機(jī)數(shù)。如要清除前面的點,增加Map1.TrackingLayer.ClearEvents在窗體上設(shè)置兩個按鈕,可以啟動和暫停動態(tài)顯示。Private Sub Comman

20、d1_Click()Timer1.Enabled = TrueEnd SubPrivate Sub Command2_Click() Timer1.Enabled = FalseEnd Sub4、利用對話框選擇需要增加的圖層增加Visual Basic的CommonDialog控件(Microsoft Common Dialog Control 6.0)以便確定文件的路徑和文件名。雙擊“增加圖層”按鈕進(jìn)行編程。增加以下的Visual Basic語句。 Private Sub Command1_Click() Dim dc As New DataConnectionDim gs As GeoDa

21、tasetDim name As StringDim layer As New MapObjects2.MapLayer CommonDialog1.Filter = Shapefiles(*.shp)|*.shp CommonDialog1.ShowOpen dc.Database = CurDir Name = CommonDialog1.FileTitle Set gs = dc.FindGeoDataset(name) layer.GeoDataset = gs Map1.Layers.Add layer End Sub 執(zhí)行程序,點擊增加圖層按鈕,并選擇所要顯示的Shape文件,選擇

22、的圖層將顯示在地圖中。 CurDir(Drive),指定一個存在的驅(qū)動器。如果沒有指定驅(qū)動器,或drive是零長度字符串(“”),則CurDir會返回當(dāng)前驅(qū)動器的路徑。 5、 利用圖例操作圖層在工程/部件下選中ESRI MapObjects Legend Control,圖例控件將顯示在控件欄中。利用圖例控件在Form上畫圖例框架。1)利用legend1.setMapSource Map1使圖例與相應(yīng)的地圖控件關(guān)聯(lián)。2)當(dāng)增加圖層或刪除圖層時,利用legend1.LoadLegend True更新圖例。3)當(dāng)在圖例上設(shè)置圖層可見或不可見時,利用Map1.Refresh刷新地圖。Private

23、Sub Form_Load() legend1.setMapSource Map1End SubPrivate Sub Map1_AfterLayerDraw(ByVal index As Integer, ByVal canceled As Boolean, ByVal hDC As stdole.OLE_HANDLE) legend1.LoadLegend TrueEnd SubPrivate Sub legend1_AfterSetLayerVisible(Index As Integer, isVisible As Boolean) Map1.RefreshEnd Sub 程序運行后,

24、在圖例框架上將顯示各個圖層,通過拖動圖層可以改變圖層的顯示順序,點擊圖層的復(fù)選框可以設(shè)置圖層是否可見。刪除選中圖層Dim n As Integer n = legend1.getActiveLayer Map1.Layers.Remove (n)四、坐標(biāo)系1、控件坐標(biāo)和地圖坐標(biāo)地圖控件的坐標(biāo)系與VB窗體的坐標(biāo)系一樣,原點在左上角,從左到右,x坐標(biāo)逐漸增加;從上到下,y坐標(biāo)逐漸增加。坐標(biāo)的缺省單位為twip。當(dāng)我們定義了一個地圖控件,該控件的坐標(biāo)范圍將保持不變。地圖坐標(biāo)系是笛卡爾坐標(biāo)系,從左到右,x坐標(biāo)逐漸增加;從下到上,y坐標(biāo)逐漸增加。地圖控件的地圖坐標(biāo)范圍不是固定的,隨著地圖的放大、縮小和漫

25、游發(fā)生變化。根據(jù)地圖控件的坐標(biāo)范圍以及地圖的坐標(biāo)范圍,我們可以對控件坐標(biāo)和地圖坐標(biāo)進(jìn)行轉(zhuǎn)換??丶鴺?biāo)轉(zhuǎn)為地圖坐標(biāo),利用ToMapPoint方法。地圖坐標(biāo)轉(zhuǎn)為控件坐標(biāo),利用FromMapPoint方法。Dim mapx As SingleDim mapy As Single Text1.Text = x: & X & , & y: & Y mapx = Map1.ToMapPoint(X, Y).X mapy = Map1.ToMapPoint(X, Y).Y Text2.Text = mapx: & mapx & , & mapy: & mapy2、顯示矢量圖層的坐標(biāo)系信息矢量圖層的坐標(biāo)系信息

26、保存在prj文件中,它記錄坐標(biāo)系類型(地理坐標(biāo)或投影坐標(biāo))、Datum、單位等信息。利用MapLayer的CoordinateSystem屬性可得到GeoCoordSys對象或ProjCoordSys對象,可通過返回對象的IsProjected屬性來判斷是GeoCoordSys對象還是ProjCoordSys對象。如是GeoCoordSys對象,通過該對象的Datum屬性得到Datum對象,進(jìn)一步可得到Datum的詳細(xì)信息;同樣可以得到Unit等其它屬性的詳細(xì)信息。如是ProjCoordSys對象,通過該對象的GeoCoordSys屬性得到投影前的地理坐標(biāo)系信息;利用Projection屬性得

27、到有關(guān)的投影信息,同樣可以得到其它屬性的詳細(xì)信息。下面的代碼是在文本框中顯示圖層的相關(guān)坐標(biāo)系信息。Dim ly As MapObjects2.MapLayerDim gcs As New MapObjects2.GeoCoordSysDim pcs As New MapObjects2.ProjCoordSys Set ly = Map1.Layers(0) If ly.CoordinateSystem.IsProjected Then Set pcs = ly.CoordinateSystem Text1.Text = 投影坐標(biāo)系 Text2.Text = pcs.GeoCoordSys.D

28、atum.Name Text3.Text = pcs.Unit.Name Text4.Text = pcs.Projection.Name Else Set gcs = ly.CoordinateSystem Text1.Text = 地理坐標(biāo)系 Text2.Text = gcs.Datum.Name Text3.Text = gcs.Unit.Name Text4.Text = End If3、改變Map控件的坐標(biāo)系改變Map控件的坐標(biāo)系將使控件中的地圖以新的坐標(biāo)系來顯示。改變Map控件坐標(biāo)系的方法是先定義一個坐標(biāo)系對象(GeoCoordSys對象或ProjCoordSys對象),然后賦與M

29、ap控件的CoordinateSystem屬性。下面的代碼是把Map控件的坐標(biāo)系改變成地理坐標(biāo)系(圖41)。Dim gcs As New MapObjects2.GeoCoordSys gcs.Type = moGeoCS_WGS1984 Map1.CoordinateSystem = gcs Text1.Text = 地理坐標(biāo)系 Text2.Text = gcs.Datum.Name Text3.Text = gcs.Unit.Name Text4.Text = 下面的代碼是把Map控件的坐標(biāo)系改變成投影坐標(biāo)系(圖42)。Dim pcs As New MapObjects2.ProjCoor

30、dSys pcs.Type = moProjCS_World_WinkelII Map1.CoordinateSystem = pcs Text1.Text = 投影坐標(biāo)系 Text2.Text = pcs.GeoCoordSys.Datum.Name Text3.Text = pcs.Unit.Name Text4.Text = pcs.Projection.Name圖41 Map控件的坐標(biāo)系改變成地理坐標(biāo)系圖42 Map控件的坐標(biāo)系改變成投影坐標(biāo)系五、地圖顯示范圍操作1、 地圖顯示范圍在Map控件上顯示的地圖范圍可以通過Map控件的Extent屬性來得到和設(shè)置。Map控件的“Extent”

31、屬性返回rectangle對象,反映在Map控件中顯示的地圖范圍,由Top(左上角y坐標(biāo))、Left(左上角x坐標(biāo))、Bottom(右下角y坐標(biāo))和Right(右下角x坐標(biāo))四個坐標(biāo)值組成。通過“Extent”設(shè)置地圖的顯示范圍,有如下幾種方法:1) 通過坐標(biāo)賦值設(shè)置地圖范圍With Map1.Extent .Left = 20000 .Bottom = 45000 .Right = 32000 .Top = 57000End With2)設(shè)置為所有圖層的最大范圍 Set Map1.Extent = Map1.FullExtent 3)對目前的范圍乘以一個比例因子,改變范圍的大小 Set Ma

32、p1.Extent = Map1.Extent.ScaleRectangle(.5)4)通過地圖交互改變顯示范圍的位置(地圖漫游) Set Map1.Extent = Map1.Pan5)使地圖的中心點定位在某一位置 Set Map1.Extent = Map1.CenterAt(55000,65000)改變顯示范圍的大小實際上改變地圖的顯示比例尺。地圖比例尺是Map控件的屏幕范圍(長度或高度)與實際范圍(長度或高度)的比值。在VB中,窗體的缺省單位是twips,是1英寸的1/1440。通過Map控件的Width和height屬性可得到Map控件的寬度和高度(屏幕范圍,單位是twips),通過

33、換算并與地圖實際的寬度或高度比較即可得到地圖比例尺(利用寬度或高度結(jié)果一致)。2、地圖的放大、縮小和全圖顯示(按鈕方式)地圖的放大、縮小和全圖顯示實際上是改變地圖的顯示范圍。在同一Map控件中,顯示范圍越大,則比例尺越小;反之,比例尺越大。即:地圖放大是通過縮小地圖范圍;地圖縮小是通過擴(kuò)大地圖范圍。定義地圖范圍的Rectangle對象可以利用ScaleRectangle (ScaleFactor)方法來改變,如比例因子為2,則Rectangle的高度和寬度都乘以2,地圖縮小1倍。如地圖放大1倍,則比例因子為0.5。 在Form上增加三個按鈕(command1、command2和command3

34、),功能分別為放大、縮小和全圖。針對按鈕的點擊事件執(zhí)行如下相應(yīng)的程序。 Private Sub command1_Click() Set Rect = Map1.Extent Rect.ScaleRectangle (0.25) Map1.Extent = Rect End Sub Private Sub command2_Click() Set Rect = Map1.Extent Rect.ScaleRectangle (1.25) Map1.Extent = RectEnd Sub Private Sub command2_Click() Map1.Extent = Map1.FullE

35、xtentEnd Sub3、 地圖的放大、縮小、漫游(工具方式)利用工具方式進(jìn)行地圖操作包括兩個事件,第一個事件是工具欄上的按鈕點擊事件;第二個事件是Map控件上的操作事件(MouseDown事件)。對第一個事件的響應(yīng)通常是改變鼠標(biāo)指針的形狀(表41),同時記錄按鈕的功能。Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) Select Case Button.Index Case 1 Map1.MousePointer = moZoomIn bfunction = zoomin Case 2 Map1.Mo

36、usePointer = moZoomOut bfunction = zoomout Case 3 Map1.MousePointer = moPan bfunction = pan End SelectEnd Sub表41 鼠標(biāo)指針常數(shù)值描述MoDefault0Default cursor.MoArrow1ArrowMoCross2Cross hair.MoIbeam3I beam.moIconPointer4Icon. (Available on Windows NT only)MoSizePointer5SizeMoSizeNESW6Size NE, SWMoSizeNS7Size N,

37、 S.MoSizeNWSE8Size NW, SEMoSizeWE9Size W, EMoUpArrow10Up arrow.MoHourglass11HourglassMoNoDrop12No drop.moArrowHourglass13Arrow and hourglassmoArrowQuestion14Arrow and question markMoSizeAll15Size in all directionsMoZoom50ZoomMoZoomIn51Zoom inMoZoomOut52Zoom outMoPan53PanMoPanning54PanningMoIdentify5

38、5IdentifyMoLabel56LabelMoHotLink57Hot LinkMoPencil58Pencil對第二個事件的響應(yīng)是根據(jù)點擊按鈕的功能(為了獲得點擊按鈕的功能,需要在聲明段中定義一個模塊級變量),分別執(zhí)行相應(yīng)的代碼。如是放大事件,則利用Map控件的TrackRectangle返回用戶在地圖上定義的Rectangle,并作為放大后地圖的范圍;如是縮小事件,則根據(jù)定義的Rectangle大小確定比例,即地圖控件高度(或?qū)挾龋┡c用戶定義的Rectangle高度(或?qū)挾龋┲?,Rectangle越小,縮小的比例越大;如是漫游功能,則利用Map控件的Pan方法。Private Sub

39、 Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Select Case bfunction Case zoomin Set r = Map1.TrackRectangle Map1.Extent = r Case zoomout Set r = Map1.TrackRectangle r.ScaleRectangle (Map1.Extent.Width / r.Width) Map1.Extent = r Case pan Map1.Pan End SelectEnd Sub當(dāng)r.W

40、idth = 0(即鼠標(biāo)點擊時),程序?qū)⒊鲥e。為了避免出錯,對r.Width是否為0進(jìn)行判斷,如不為0, 把r.Width賦給一個變量rw,如r.Width為0,則把目前地圖寬度Map1.Extent.Width賦給變量rw,即鼠標(biāo)點擊后,圖層不發(fā)生變化。六、幾何圖形對象在MO中,定義了7個圖形對象:Point,Points,Line,Polygon,Rectangle,Ellipse和Parts。Point對象表示一個點,通過X、Y、Z屬性可以獲得點的坐標(biāo),也可以產(chǎn)生一個點; Point對象還提供了計算到點、線、多邊形和矩陣之間距離的方法DistanceTo,計算與其他地理對象的交點的方法G

41、etCrossings。Points對象是點對象的集合,通過Add方法可以把一個新的點增加到Points對象中。Line對象至少有兩個點,一個線對象可以一條線,也可以是多條線,利用Parts屬性可以獲得線的集合。Polygon,Rectangle,Ellipse都是廣義上的多邊形對象,一個多邊形對象可以由多個多邊形對象組成,利用Parts屬性可以獲得多邊形的集合。Parts對象是Points對象的集合,每一個Points對象表示了組成一條線或一個多邊形的頂點。圖形對象只能增加到TrackingLayer中,利用AddEvent方法可以把圖形對象增加到TrackingLayer中。 Map1.T

42、rackingLayer.AddEvent(shape, SymbolIndex)1、 在程序中產(chǎn)生圖形1.1產(chǎn)生點Dim pt As New MapObjects2.Pointpt.X = 0.5pt.Y = 0.51.2 產(chǎn)生線Dim pt As New MapObjects2.PointDim pts As New MapObjects2.PointsDim ln As New MapObjects2.Linept.X = 0.2pt.Y = 0.7pts.Add ptpt.X = 0.6pt.Y = 0.5pts.Add ptln.Parts.Add pts1.3產(chǎn)生多邊形(多Part

43、)Dim pt As New MapObjects2.PointDim pts1 As New MapObjects2.Points Dim pts2 As New MapObjects2.Points Dim poly As New MapObjects2.Polygon pt.X = 0.7: pt.Y = 0.15: pts1.Add pt pt.X = 0.4: pt.Y = 0.55: pts1.Add pt pt.X = 0.3: pt.Y = 0.3: pts1.Add pt poly.Parts.Add pts1 pt.X = 0.7: pt.Y = 0.15: pts2.Ad

44、d pt pt.X = 0.1: pt.Y = 0.55: pts2.Add pt pt.X = 0.05: pt.Y = 0.3: pts2.Add pt poly.Parts.Add pts2 Map1.TrackingLayer.AddEvent poly, 01.4 產(chǎn)生矩形矩形有Bottom、Top、Left、Right、Height、Width、Depth、Center等屬性。利用Bottom、Top、Left、Right值可以構(gòu)建一個矩形。Dim rect as New MapObjects2.Rectanglerect.Bottom = 0.1: rect.Left = 0.1

45、rect.Top = 0.6: rect.Right = 0.6Map1.TrackingLayer.AddEvent rect, 01.5產(chǎn)生橢圓橢圓同樣有Bottom、Top、Left、Right、Height、Width、Center等屬性。利用Bottom、Top、Left、Right值可以構(gòu)建一個橢圓。Dim ellipse As New MapObjects2.ellipseellipse.Bottom = 0.1: ellipse.Left = 0.1ellipse.Top = 0.6: ellipse.Right = 0.9Map1.TrackingLayer.AddEvent

46、 ellipse, 02、 利用鼠標(biāo)在地圖控件上產(chǎn)生圖形可以利用鼠標(biāo)在地圖控件上產(chǎn)生點、線、圓、多邊形和矩形。語法如下:Set shape = Map1.ToMapPoint(x, y)Set shape = Map1.TrackLineSet shape = Map1.TrackCircleSet shape = Map1.TrackPolygonSet shape = Map1.TrackRectangle執(zhí)行語句時,用戶可以在地圖控件上數(shù)字化點(或線、圓、多邊形、矩形),同時返回一個圖形對象(數(shù)字化結(jié)果)。Select Case bfunctioncase drawpointDim pt

47、 As New MapObjects2.PointSet pt = Map1.ToMapPoint(X, Y)Map1.TrackingLayer.AddEvent pt, 0case drawlineDim line As New MapObjects2.lineSet line = Map1.TrackLineMap1.TrackingLayer.AddEvent line, 0case drawpolygonDim poly As New MapObjects2.PolygonSet poly = Map1.TrackPolygonMap1.TrackingLayer.AddEvent

48、poly,0End Select3、圖形對象操作圖形操作包括圖形的交、并、差、異或以及緩沖等操作,這些操作的語法如下:1) 交操作 Set resultShape = object.Intersect(secondShape ,extent)2) 并操作 Set resultShape = object.Union(secondShape ,extent)3) 差操作 Set resultShape = object.Difference(secondShape ,extent)4) 異或操作Set resultShape = object.Xor(secondShape ,extent)5)

49、 緩沖操作 Set resultShape = object.Buffer(bufferDistance ,extent)其中,extent是一個可選參數(shù),表示一個矩陣范圍。以下的例子是對動態(tài)圖層上的兩個多邊形進(jìn)行交操作,并顯示交操作得到的圖形(圖61)。Set poly1 = Map1.TrackingLayer.Event(0).Shape Set poly2 = Map1.TrackingLayer.Event(1).Shape Set resultshape = poly1.Intersect(poly2) Map1.TrackingLayer.ClearEvents Set ge =

50、 Map1.TrackingLayer.AddEvent(resultshape, 0) 圖61 交操作七 地圖表示 當(dāng)我們在地圖控件上增加一個圖層時,該圖層的所有要素以一種缺省的符號進(jìn)行顯示。一方面,我們可以改變顯示的符號,另一方面我們可以對圖層中的不同要素以不同的符號進(jìn)行顯示(專題制圖)。1、 顯示符號在MO中,Symbol是一個符號對象,它有SymbolType(符號類型)、Style(樣式)、Color(顏色)、Size(尺寸)等屬性。符號類型包括點(Point)、線(Line)和多邊形(Fill),不同類型的符號可以設(shè)置的屬性是不一樣的,如輪廓線顏色只能對多邊形符號進(jìn)行設(shè)置。 Sty

51、le是指符號的樣式,點、線和多邊形三種類型符號分別有相應(yīng)的樣式集合(圖71,圖72,圖73)。 圖71點符號樣式集合圖72 線符號樣式集合圖73填充符號樣式集合利用符號對象的Custom特性可以產(chǎn)生定制的點、線和填充符號。每一符號可以用不同顏色顯示,顏色的定義有幾種方法:利用VB顏色常數(shù),如vbBlue,或利用MO顏色常數(shù),如moRed。MapObjects定義了如下23種顏色常量:MoBlack,MoRed,MoGreen,moBlue,moMagenta,moCyan,moWhite,moLightGray,moDarkGray,moGray,moPaleYellow,molightYel

52、low,moyellow,moLimeGreen,moTeal,moDarkGreen,moMaroon,moPurple,moOrange,moKhaki,moOlive,moBrown,moNavy。對點符號,還可以設(shè)置符號尺寸、旋轉(zhuǎn)等屬性。對線符號,還可以設(shè)置線的寬度等屬性。對填充符號,還可以設(shè)置多邊形輪廓線的寬度、顏色等屬性。利用符號對象的Custom特性可以產(chǎn)生定制的點、線和填充符號。 改變圖層的顯示符號,首先是得到圖層的符號對象,然后對符號對象的屬性進(jìn)行賦值,地圖刷新后,即以新的符號顯示。下面的代碼是改變MapLayer的符號為moRed。Dim ly As MapObjects2

53、.MapLayer Set ly = Map1.Layers(0)Ly.Symbol.Color = moRedMap1.Refresh如要改變符號的多個屬性,可利用With語句定義 With ly.Symbol .Style = 2 .Color = moRed .Size = 20 End With2、 利用圖例改變地圖顯示符號包括兩個過程,首先是點擊圖例中的一個圖層,打開符號編輯窗口;然后在符號編輯窗口中設(shè)置符號屬性,確認(rèn)后,該圖層以新的符號顯示。點、線、多邊形三種類型圖層分別用Point、Line和Fill三種符號表示。這三種符號可以設(shè)置的屬性是不一樣的,針對不同類型的圖層,在符號編輯窗口中顯示不同的界面(圖)。 對話框包括五個Label控件、一個PictureBox控件、三個組合框控件、一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論