MapObjects 培訓(xùn)教程
《MapObjects 培訓(xùn)教程》由會(huì)員分享,可在線閱讀,更多相關(guān)《MapObjects 培訓(xùn)教程(117頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、MapObjects 培訓(xùn)教程 第一章 背景簡(jiǎn)介 隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,計(jì)算速度越來(lái)越快。也使得地理信息系統(tǒng)(GIS)技術(shù)應(yīng)用領(lǐng)域越來(lái)越廣泛,如測(cè)繪、規(guī)劃、電信線路管理、煤氣管道管理、城市供排水管道管理、電力輸/配電線路管理、車輛調(diào)度定位管理、防汛及河流管理等等。 現(xiàn)在GIS技術(shù)能滿足各種不同的應(yīng)用需求,從簡(jiǎn)單的顯示與制圖到地理數(shù)據(jù)的復(fù)雜模擬與分析,如網(wǎng)絡(luò)的追蹤分析、數(shù)據(jù)的三維處理、最佳路徑分析、最優(yōu)化資源分配等等。 現(xiàn)在在市場(chǎng)上有許多關(guān)于GIS方面的軟件出現(xiàn),有國(guó)外的,也有國(guó)內(nèi)自己開發(fā)的軟件,如MapInfo, Intergraphic, BlueMarble等等。
2、美國(guó)的環(huán)境系統(tǒng)研究所(ESRI)較早從事這方面的開發(fā),他們?cè)?0年代就推出了ARC/INFO軟件,以后又陸續(xù)推出了其多種GIS軟件產(chǎn)品來(lái)滿足不同的需求,如ARC/INFO、PC ARC/INFO, SDE, ArcView GIS、ArcCAD以及其他ESRI公司的產(chǎn)品,這些產(chǎn)品已經(jīng)建立起制圖與GIS的工業(yè)標(biāo)準(zhǔn)。 在實(shí)際工作中,有些應(yīng)用圍繞地圖展開,而在其他一些應(yīng)用中,地圖只是其中的一部分, 如車輛定位調(diào)度系統(tǒng),他采用全球定位系統(tǒng)(GPS)確定車輛的位置,在地圖上顯示。此時(shí),應(yīng)用開發(fā)人員迫切需要一種制圖與GIS功能組件,而不是最終的應(yīng)用軟件來(lái)定制或擴(kuò)展已有的應(yīng)用。一方面,開發(fā)人員希望建立的應(yīng)
3、用能與通用的桌面軟件產(chǎn)品(如文字處理器、數(shù)據(jù)庫(kù)等)一起使用;另一方面,希望保留以前的開發(fā)成果,對(duì)于開發(fā)工具,則希望基于一個(gè)標(biāo)準(zhǔn)的開發(fā)環(huán)境,這樣可以不必再學(xué)習(xí)新的編程語(yǔ)言。MapObjects正是為了滿足這種需要而開發(fā)出來(lái)的。 第二章 MapObjects的概念 MapObjects是一組供應(yīng)用開發(fā)人員使用的制圖與GIS功能組件。它有一個(gè)叫Map控件的ActiveX控件和一系列可編程的ActiveX對(duì)象組成,它們可以標(biāo)準(zhǔn)的Windows編程環(huán)境下使用。利用MapObjects,開發(fā)人員可以在應(yīng)用程序中添加制圖和GIS功能。它不是為最終用戶而是專門為開發(fā)人員提供的。 開發(fā)人員可在
4、熟悉和喜歡的開發(fā)環(huán)境中利用MapObjects開發(fā)出系統(tǒng)開銷小的制圖應(yīng)用,或在現(xiàn)有的應(yīng)用中添加制圖功能。 2.1 MapObjects的功能 使用MapObjects,你可以完成以下這些功能: 1. 顯示具有多個(gè)地圖層的地圖,如道路、河流和邊界線等。 2. 放大、縮小和漫游整個(gè)地圖。 3. 顯示圖形特征(Feature),如點(diǎn)、線、圓和多邊形。 4. 顯示標(biāo)注字符。 5. 通過(guò)點(diǎn)擊識(shí)別圖上特征。 6. 選擇沿線的特征和在矩形、區(qū)域、多邊形和圓內(nèi)的特征。 7. 選擇在已知特征附近規(guī)定距離內(nèi)的特征。 8. 使用SQL語(yǔ)句選擇特征。 9. 對(duì)選擇的特征進(jìn)行基本的統(tǒng)計(jì).。
5、10. 查詢和更新選擇特征的屬性數(shù)據(jù)(Shape格式)。 11. 用特定的方法對(duì)特征進(jìn)行著色處理,如ValueMapRenderer, ClassBreakRenderer, DotDensityRenderer。 12. 用字段值的字符標(biāo)注特征。 13. 顯示多種格式的柵格圖象文件。 14. 動(dòng)態(tài)顯示實(shí)時(shí)或時(shí)間系列的數(shù)據(jù)。 15. 輸出地理匹配的地理位置。 2.2 MapObjects的結(jié)構(gòu) MapObjects是建立在微軟的對(duì)象連接和嵌入(ActiveX)基礎(chǔ)之上的。ActiveX是當(dāng)今得到廣泛支持的面向目標(biāo)的軟件集成技術(shù)。用戶象用磚塊蓋房子一樣利用ActiveX組件開發(fā)
6、和集成Windows應(yīng)用程序。 一個(gè)ActiveX控件是一個(gè)可重復(fù)使用的軟件組件。ActiveX控件可以將許多其他ActiveX對(duì)象包裝在一個(gè)包中。這個(gè)包可以反映某些特定的功能,如統(tǒng)計(jì)圖和多媒體等,并可以直接嵌入支持ActiveX的應(yīng)用中。ActiveX對(duì)象具有特征和方法,可以通過(guò)對(duì)它們的編程來(lái)控制對(duì)象的外觀、行為以及相互作用。 MapObjects是一個(gè)提供制圖與GIS功能的ActiveX控件,它包含35個(gè)可編程的ActiveX對(duì)象。MapObjects地圖控件可以直接插入到許多標(biāo)準(zhǔn)開發(fā)環(huán)境的工具集中。你可以通過(guò)屬性頁(yè)操縱地圖。這些屬性頁(yè)是在諸如Visual Basic之類的開發(fā)環(huán)境中建
7、立的,或者通過(guò)其它程序化相關(guān)對(duì)象來(lái)控制地圖。 這些對(duì)象為應(yīng)用開發(fā)人員提供了有力的制圖與GIS功能支持。因?yàn)镸apObjects是一個(gè)ActiveX控件,它又是可以用于大量開發(fā)框架中,包括流行的象Visual Basic、Delphi、Visual C++、Microsoft Access、Visual Forpro、PowerBuild等之類的程序設(shè)計(jì)環(huán)境。 2.3 MapObjects的特點(diǎn) MapObjects允許定制利用制圖和GIS組件的應(yīng)用程序,MapObjects的特點(diǎn)包括: (1) 支持ARC/INFO層(Coverage) (2) 支持ESRI 的Shape文件格
8、式,SDE(空間數(shù)據(jù)庫(kù)引擎)圖層(Layer)以及大量柵格圖象格式,如BMP、TIFF等等。 (3) 支持通過(guò)微軟ODBC標(biāo)準(zhǔn)進(jìn)行的外部數(shù)據(jù)庫(kù)訪問(wèn)。 (4) 把數(shù)據(jù)作為多個(gè)圖層在一張圖中進(jìn)行顯示,當(dāng)然可進(jìn)行圖幅的變化。 (5) 特征表示使用數(shù)理方法如數(shù)值地圖、分類、個(gè)體符號(hào)以及點(diǎn)值圖等。 (6) 文字注記和放置。 (7) 用一個(gè)事件跟蹤層來(lái)動(dòng)態(tài)顯示實(shí)時(shí)數(shù)據(jù)。 (8) 用標(biāo)準(zhǔn)SQL表達(dá)式進(jìn)行特征選擇和查詢。 (9) 通過(guò)大量搜索與框架操作符進(jìn)行空間選擇。 (10) 地址匹配(地理編碼)。 (11) 強(qiáng)大而出色的對(duì)象模型。 2.4 MapObjects可以滿足哪些用戶要求
9、 任何應(yīng)用開發(fā)人員都能利用MapObjects在應(yīng)用中加入地圖,一些從MapObjects中獲益的開發(fā)者將成為ESRI公司軟件的用戶。許多人可能只有很簡(jiǎn)單的要求,比如在應(yīng)用中加入生動(dòng)的地圖。另有一些人則可能把MapObjects與其它技術(shù)一起使用建立更加復(fù)雜的系統(tǒng)。使用MapObjects建立應(yīng)用程序的開發(fā)人員包括: 2 數(shù)據(jù)出版商 2 軟件產(chǎn)品開發(fā)商 2 縱向市場(chǎng)應(yīng)用開發(fā)商 2 咨詢業(yè)者 2 SDE開發(fā)者 2 公司客戶 2.5 系統(tǒng)配置 MapObjects及其開發(fā)而成的應(yīng)用程序是針對(duì)Windows 95/98, Windows NT 3.5.1/4.0操作系統(tǒng)建立的
10、,用MapObjects開發(fā)的應(yīng)用程序不能在Windows 3.x 及更早的版本上運(yùn)行。 第三章 在Visual Basic 下使用MapObjects 安裝MapObjects之后,打開Visual Basic的程序開發(fā)環(huán)境,在左邊的控件點(diǎn)擊右鍵將彈出控件選擇框。如圖1所示。 <圖1> 按“確定”鍵后,控件中將增加一個(gè)名叫Map的控件,如圖2所示。 <圖2> 現(xiàn)在可以進(jìn)行MapObjects編程了,步驟如下: (1) 增加控件 在Form上加一個(gè)按鈕,并在按鍵上標(biāo)注“全圖”。如果在應(yīng)用程序中加入地圖,則在控件欄中選擇Map控件,然后把
11、光標(biāo)移入Form中,拖放該圖框,地圖控件將成為一塊空白色區(qū)域。 (2) 增加圖層 在Form上有一個(gè)Map控件后,我們必須在上面顯示地圖特征,如道路、河流和邊界線等。在Form上增加一個(gè)標(biāo)注“增加圖層”的按鈕,并增加Visual Basic的CommonDialog控件以便確定Shape文件的路徑和文件名。雙擊“增加圖層”按鈕就可以編程了。增加以下的Visual Basic語(yǔ)句。 Private Sub Command1_Click() Dim dc As New DataConnection Dim gs As GeoDataset Dim name As S
12、tring Dim layer As MapObjects.MapLayer CommonDialog1.Filter = "ESRI Shapefiles (*.shp)|*.shp" CommonDialog1.ShowOpen If Len(CommonDialog1.filename) = 0 Then Exit Sub dc.Database = CurDir If Not dc.Connect Then Exit Sub name = Left(CommonDialog1.FileTitle, Len(CommonDialog1.FileT
13、itle) - 4) Set gs = dc.FindGeoDataset(name) If gs Is Nothing Then Exit Sub Set layer = New MapLayer layer.GeoDataset = gs Map1.Layers.Add layer End Sub 執(zhí)行程序,點(diǎn)擊增加圖層按鈕,并選擇所要顯示的Shape文件名,則顯示效果如圖3所示。 <圖3> 可以改變Map控件的屬性,如Map的大小、滾動(dòng)條的設(shè)置、圖層及基本圖層表示、背景顏色的設(shè)置,這些屬性頁(yè)在Visual Basic的整個(gè)設(shè)計(jì)過(guò)程中都
14、存在??梢灶A(yù)置所有圖層以及它們的顯示屬性,或者可以建立一個(gè)界面,讓最終用戶可以指定要?jiǎng)h除或插入的圖層以及它們的代表符號(hào)。 第四章 在Delphi下使用MapObjects 在安裝MapObjects后,第一次打開Delphi時(shí)必須先安裝叫Map的ActiveX控件。步驟如下: (1) 打開“Component”的“Import ActiveX Control”,出現(xiàn)如圖4所示的畫面。 (2) 選擇“Esri MapObjects”后,按“Install”按鈕,將出現(xiàn)如圖5所示的畫面,表明Map控件已經(jīng)安裝完成,在控件ActiveX欄將出現(xiàn)Map控件。
15、 <圖4> <圖5> 現(xiàn)在可以進(jìn)行編程了,步驟如下: (1) 按“File”菜單中的“New Application”選擇項(xiàng),產(chǎn)生一個(gè)新的Form。 (2) 則在ActiveX控件欄中選擇Map控件,然后把光標(biāo)移入Form中,拖放該圖框,在Form上將出現(xiàn)一塊空白色區(qū)域表示Map控件。 (3) 增加圖層:在Form上有一個(gè)Map控件后,我們必須在上面顯示地圖特征,如道路、河流和邊界線等。在Form上增加一個(gè)標(biāo)注“增加圖層”的按鈕。雙擊該按鈕將可以編程,語(yǔ)句如下: procedure TForm1.SpeedButton1
16、Click(Sender: TObject); var dc, layer :variant; lyrs : variant; sym : variant; begin dc := CreateOleObject('MapObjects.DataConnection'); dc.database :=Sample.ReturnDataPath('usa'); if not dc.Connect then exit; layer :=CreateOleObject('MapObjects.MapLayer'); layer.GeoDatas
17、et :=dc.FindGeoDataSet('States'); sym := layer.symbol; sym.Color(moCyan); Map1.Layers.Add(Layer); layer :=CreateOleObject('MapObjects.MapLayer'); layer.GeoDataset :=dc.FindGeoDataSet('counties'); sym := layer.symbol; sym.Color(16384); lyrs := map1.layers; lyrs.Add(Layer)
18、; end; 界面如圖6所示。 <圖6> 第五章 用MapObjects進(jìn)行編程 當(dāng)用MapObjects進(jìn)行編程時(shí),可以使用熟悉的開發(fā)環(huán)境語(yǔ)言。如Visual Basic, Visual C++, Delphi等。使用MapObjects可以實(shí)現(xiàn):顯示具有多個(gè)地圖層的地圖, 放大、縮小和漫游整個(gè)地圖,顯示圖形特征,顯示標(biāo)注字符,通過(guò)點(diǎn)擊識(shí)別圖上特征,選擇沿線的特征和在矩形、區(qū)域、多邊形和圓內(nèi)的特征,選擇在已知特征附近規(guī)定距離內(nèi)的特征,使用SQL語(yǔ)句選擇特征,對(duì)選擇的特征進(jìn)行基本的統(tǒng)計(jì),查詢和更新選擇特征的屬性數(shù)據(jù)(Shape格式),用特定的方法對(duì)特征進(jìn)行著色處理,
19、用字段值的字符標(biāo)注特征,顯示多種格式的柵格圖象文件,動(dòng)態(tài)顯示實(shí)時(shí)或時(shí)間系列的數(shù)據(jù),輸出地理匹配的地理位置。 5.1 顯示具有多個(gè)地圖層的地圖 在MapObjects中,與圖層(MapLayer)有關(guān)的對(duì)象和控件有:Map控件,Layers對(duì)象,DataConnection對(duì)象,DataSets對(duì)象,DataSet對(duì)象和RecordSet對(duì)象。要理解它們之間,必須從圖層的概念上開始。 每一個(gè)圖層在概念上來(lái)說(shuō),它是一個(gè)數(shù)據(jù)庫(kù),但它不是普通形式的數(shù)據(jù)庫(kù),它包括地理信息和屬性信息。具體形式為:在Shape文件有三個(gè)文件組成,.shp包含地理信息,.dbf包含屬性信息,.shx包含兩文件的索
20、引關(guān)系,詳見附錄。而Coverage也有多個(gè)文件和Info庫(kù)組成。 每一個(gè)圖層對(duì)應(yīng)一個(gè)DataSet和RecordSet, 即一個(gè)數(shù)據(jù)庫(kù)和一個(gè)記錄集對(duì)象。而不同的圖層可以來(lái)自不同的數(shù)據(jù)類型。MapObjects的向量圖層可以來(lái)自三種數(shù)據(jù)類型:Shape文件、Arc/Info的Coverage和SDE的Coverage。 在MapObjects 中利用Coverage和Arc/Info中的利用Coverage 有很大的不同。 在Arc/Info中,Coverage存儲(chǔ)地理特征的向量數(shù)據(jù),而以相應(yīng)的屬性表存儲(chǔ)屬性值。每一個(gè)Coverage存儲(chǔ)許多地理特征,但它們有自己的屬性表。在Covera
21、ge 中的每一特征屬性表中包含一個(gè)記錄。 在ARC/INFO 中Coverage可以包含一類或多類特征。 例如,一個(gè)Coverage 包含polygon特征,也包含label點(diǎn)。另外,一個(gè)Coverage包含區(qū)域多邊形,但也包含區(qū)域之間的邊界線特征信息。 在MapObjects中Map控件的每一層 表示一中特征。因此當(dāng)你增加一個(gè) ARC/INFO的Coverage 到Map控件時(shí),可以選擇想要使用的特征增加。 下面介紹 ARC/INFO的 Coverage中的特征: 特征類型: 點(diǎn) 點(diǎn)是描述離散位置的地理特征,如電線桿、井和山頂。 線 線描述線性的地理特征,如河流、街道和等高線。
22、 多邊形 多邊形描述被邊界封閉的區(qū)域,如國(guó)家、城市、陸地范圍和土地區(qū)域。在Coverage中多邊形的邊界顯示時(shí)可不考慮。 標(biāo)注點(diǎn) 標(biāo)注點(diǎn)是在多邊形內(nèi)點(diǎn),它和多邊形具有相同的屬性信息。利用標(biāo)注點(diǎn)的一種方法是按照它們的屬性值畫多邊形。 節(jié)點(diǎn) 節(jié)點(diǎn)是線和多邊形特征的端點(diǎn)。節(jié)點(diǎn)是線段端點(diǎn)處或多于兩條的線段的交匯處。 路線 路線是由一段或多段線段組成的線性特征。例高速公路由許多連接線組成。路線集的屬性值以子類存儲(chǔ)。因此一個(gè)Coverage可以包含幾個(gè)不同的路線系統(tǒng)。例如一個(gè)街道Coverage可以包含公交路線和貨運(yùn)路線。 區(qū)域 區(qū)域是由一個(gè)或多個(gè)多邊形組成的多邊形特征。例如,當(dāng)將夏威夷州作為區(qū)域
23、(Region),你可以將它作為單個(gè)特征,由幾個(gè)多邊形組成。在區(qū)域中的多邊形是可以重疊的。一個(gè)Coverage可以包含幾個(gè)不同子類的區(qū)域。 注釋 注釋是在Coverage里標(biāo)注特征的文本。注釋存儲(chǔ)字符串、字符特性和確定位置的位置點(diǎn)。Coverage可以包含幾個(gè)不同子類的注釋。MapObjects將注釋特征與線性特征相聯(lián)系。同時(shí)你可用LabelRenderer將"Text"字段的值沿線放置。你應(yīng)該將LabelRenderer 的DrawBackground屬性設(shè)為False,以避免顯示相關(guān)的線段。 利用ARC/INFO的Coverage與利用Shape文件類似。在Coverage中的每一
24、個(gè)特征表有一個(gè)”Shape”字段包含特征的地理數(shù)據(jù),同樣方法基于GeoDataset對(duì)象。每一個(gè)特征表也包含F(xiàn)eatureId字段,它影射
25、er
dc.Database = "[arc]c:\samples\atlanta"
注意在前綴"[arc]"和路徑之間沒有空格。
一旦你設(shè)定了Database屬性,就可以將特征處理作GeoDataset對(duì)象。你可以用
26、 pat
27、se MsgBox "Connection failed" End If 為了增加基于ARC/INFO名叫"subway"路線的圖層,代碼為: Set lyr.GeoDataset = dc.FindGeoDataset("transit.ratsubway") 5.2 地圖的放大、縮小和漫游 編制圖形的縮放及漫游的功能必須首先狀態(tài)控制按鈕,如圖6所示在頂部的按鈕。然后為Map控件的Mouse Down事件添加代碼。這些代碼在用戶在地圖上按下鼠標(biāo)鍵時(shí)被執(zhí)行。 Delphi語(yǔ)言語(yǔ)句: procedure TForm1.Map1MouseDown(Sende
28、r: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var r :rectangle; begin r := Map1.Extent; if speedbutton1.down =true then begin If shift = [ssShift, ssLeft] then begin r :=Map1.Extent; r.ScaleRectangle(variant(1.5)); // zoom out
29、 Map1.Extent :=r; end else begin Map1.Extent :=Map1.TrackRectangle; end end else begin Map1.Pan; end; end; Visual Basic語(yǔ)句: Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If Toolbar1.Buttons(1).Value
30、 = 1 Then DoZoom Shift Else Map1.Pan End If End Sub Sub DoZoom(Shift As Integer) If Shift Then ' zoom out Set r = Map1.Extent r.ScaleRectangle 1.5 Map1.Extent = r Else ' zoom in Set r = Map1.TrackRectangle If Not r Is Nothing Then Map1.
31、Extent = r End If End Sub 這些語(yǔ)句執(zhí)行結(jié)果為:當(dāng)用按下鼠標(biāo)左鍵,并拉出一個(gè)矩形框時(shí),將顯示此矩形框內(nèi)的圖形;而按下鼠標(biāo)右鍵,將縮小圖形(按1.5倍)。而按鈕狀態(tài)為漫游時(shí),則執(zhí)行圖形漫游(Map.Pan)。 5.3 顯示圖形特征 當(dāng)增加一個(gè)地圖層到Map控件后,有一個(gè)符號(hào)(Symbol)對(duì)象與地圖層相聯(lián)系??梢酝ㄟ^(guò)改變此符號(hào)性質(zhì)來(lái)影響整個(gè)圖層的顯示。 例子: Private Sub Command1_Click() Dim sym As MapObjects.Symbol Set sym = Map1.Layers(0).Symbol
32、 sym.Color = moCyan End Sub 如果想按屬性數(shù)據(jù)值顯示圖層的特征,可以用著色(Renderer)的方法。例如用點(diǎn)密度符號(hào)的方法:DotDensityRenderer;分級(jí)顯示的方法:ClassBreaksRenderer和按屬性的值顯示的方法。 (1) 點(diǎn)密度符號(hào)DotDensityRenderer 此著色方法主要準(zhǔn)對(duì)多邊形(Polygon)的著色,它通過(guò)畫點(diǎn)的數(shù)目表示圖形的特征。每一個(gè)點(diǎn)表示規(guī)定的屬性字段相同值,例如如果點(diǎn)值為4,則字段值為8,圖上將顯示兩點(diǎn)。 例子(Visual Basic): Private Sub Command1_Click()
33、 Screen.MousePointer = vbHourglass Map1.Layers("NeCenter").Visible = False ' hide NeCenter Set ly = Map1.Layers("Counties") Set ly.Renderer = New DotDensityRenderer ly.Renderer.Field = "HBEDS_1000" ' set a dot value Set stats = ly.Records.CalculateStatistics("HBEDS_
34、1000") ly.Renderer.DotValue = (stats.Min + (stats.Max - stats.Min) / 2) / 20 Map1.Refresh Screen.MousePointer = vbDefault End Sub 例子(Delphi): procedure TForm1.Button2Click(Sender: TObject); var stats :variant; r : variant; lyrs,lyr : variant; rc : variant; begin lyrs := m
35、ap1.layers; lyr := lyrs.item('neCenter'); lyr.visible :=False; //hide NeCenter r := CreateOleObject('MapObjects.DotDensityRenderer'); r.field := 'HBEDS_1000'; lyr := lyrs.item('counties'); lyr.renderer(r); // set dot value rc := lyr.records; stats := rc.calculateStatistics('HBED
36、S_1000'); r.DotValue :=(Stats.Min + (Stats.Max - stats.Min)/2)/20; map1.refresh; end; (2) 分級(jí)顯示:ClassBreaksRenderer 分級(jí)顯示是將根據(jù)規(guī)定字段值,將圖形特征分成不同的級(jí)別,而每一級(jí)別以不同的符號(hào)顯示圖形特征。通過(guò)設(shè)置BreakCount值和設(shè)置上限可以進(jìn)行分級(jí),例如如果設(shè)置BreakCount為2,則將它們分成三級(jí)。 Private Sub Command1_Click() Dim i As Integer Dim ly As MapObjects.M
37、apLayer Dim stats As MapObjects.Statistics Map1.Layers("Centers").Visible = True ' show Centers Map1.Layers("Counties").Symbol.Color = moPaleYellow Set ly = Map1.Layers("Centers") Dim r as New MapObjects.ClassBreaksRenderer ly.Renderer = r r.SymbolType = moPointSymbol
38、r.Field = "P_OTHER" Set stats = ly.Records.CalculateStatistics("P_OTHER") ' calculate breaks away from the mean in both directions, ' but only add those breaks that are within the range of values Dim breakVal As Double breakVal = stats.Mean - (stats.StdDev * 3) For i = 0
39、To 6 If breakVal >= stats.Min And breakVal <= stats.Max Then r.BreakCount = r.BreakCount + 1 r.Break(r.BreakCount - 1) = breakVal End If breakVal = breakVal + stats.StdDev Next i ' create graduated symbols of the same color r.SizeSymbols 3, 8 'size in pixels
40、 For i = 0 To r.BreakCount r.Symbol(i).Color = moRed Next i Map1.Refresh End Sub 例子(Delphi): procedure TForm1.Button5Click(Sender: TObject); var j,I,cnt: integer; count :real; nrecs,nClasses :integer; lyrs,ly,recs,ren,fld,flds : variant; s : string; begin lyrs := m
41、ap1.layers; ly := lyrs.item('NeCenter'); ly.visible :=false; //hide NeCenter ly := UnAssigned; ly := lyrs.item('Counties'); ren := CreateOleObject('MapObjects.ClassBreaksRenderer'); nClasses :=5; recs := ly.records; nRecs := recs.count; ren.BreakCount :=nClasses -1; ren.Field :=
42、'P_OTHER'; //query all the features and order the results recs := ly.SearchExpression('FeatureId > -1 order by P_OTHER'); //navigate the record set and set up the breaks flds := recs.fields; fld := flds.item('P_OTHER'); cnt := ren.BreakCount - 1; for i :=0 to cnt do begin count
43、 := nrecs/nclasses; for j := 1 to Round(nrecs/nclasses) do begin recs.MoveNext; end; s := fld.value; ren.Break(i, s); end; //create a color ramp ren.rampcolors(8454143,$FF0000); ly.renderer(ren); map1.refresh; end; (3) 按字段值顯示特征:ValueMapRenderer 該方法按屬性
44、字段的值每一個(gè)值顯示一種符號(hào),以Symbol(I)設(shè)定具體的符號(hào)特性,以SymbolType設(shè)定圖形特征的類型(點(diǎn)、線和多邊形),ValueCount設(shè)定字段多少值提供符號(hào),其它的值由UseDefault屬性設(shè)定是否利用缺省符號(hào),缺省符號(hào)由DefaultSymbol屬性設(shè)定。如果符號(hào)類型為點(diǎn)時(shí),可以設(shè)定符號(hào)的角度和比例,即利用RotationField和ScalingField屬性。 例子(Visual Basic): Private Sub Command3_Click() Screen.MousePointer = vbHourglass Map1.Layers("NeCe
45、nter").Visible = False ' hide NeCenter ' find unique values for STATE_NAME field Dim strings As New MapObjects.strings Set ly = Map1.Layers("Counties") Set recs = ly.Records Do While Not recs.EOF strings.Add recs("STATE_NAME").Value recs.MoveNext Loop Set ly.Renderer
46、= New ValueMapRenderer ly.Renderer.Field = "STATE_NAME" ' add the unique values to the renderer ly.Renderer.ValueCount = strings.Count For i = 0 To strings.Count - 1 ly.Renderer.Value(i) = strings(i) Next i Map1.Refresh Screen.MousePointer = vbDefault End Sub 例子(Delphi)
47、: procedure TForm1.Button3Click(Sender: TObject); var strings, ly,recs,s, lyr, lyrs: variant; i :integer; flds,fld, ren: variant; begin lyrs := map1.layers; lyr := lyrs.item('NeCenter'); lyr.visible := false; //hide Necenter // find unique values for STATE_NAME field strings := C
48、reateOleObject('MapObjects.Strings'); ly := lyrs.item('counties'); recs :=ly.records; while not recs.eof do begin flds := recs.fields; fld := flds.item('STATE_NAME'); s := fld.value; strings.add(s); recs.movenext; flds := UnAssigned; fld := UnAssigned; s := U
49、nAssigned; end; ren := CreateOleObject('MapObjects.ValueMapRenderer'); ren.Field :='STATE_NAME'; // add the unique values to the renderer ren.ValueCount :=strings.count; for i :=0 to Strings.Count-1 do ren.value(i,strings.item(i)); ly.renderer(ren); Map1.Refresh; end; 5.4 顯示
50、標(biāo)注字符 增加一個(gè)圖層到Map控件后,如果想在相應(yīng)的位置上顯示文字信息,即標(biāo)注,可以產(chǎn)生一個(gè)LabelRenderer對(duì)象,并將它賦給圖層的Renderer屬性即可。在Arc/Info中的Annotation特征也可以通過(guò)標(biāo)注方法實(shí)現(xiàn)顯示。 而LabelRenderer的Field屬性設(shè)置哪一個(gè)字段的值顯示在地圖上,屬性SymbolCount設(shè)置有幾種字體標(biāo)注,象著色類似,有Symbol數(shù)組定義各個(gè)符號(hào)的特性。具體的TextSymbol對(duì)象討論見下一章。 例子(Visual Basic): Private Sub List1_DblClick() Dim fldname As S
51、tring If List1.ListIndex <> -1 Then 'must have a field selected Dim fnt As New StdFont Dim recs As MapObjects.Recordset Dim r As New MapObjects.LabelRenderer 'use a TrueType Font fnt.Name = "Arial" 'set up the LabelRenderer Set Map1.Layers(0).Renderer = r
52、 With r .SymbolCount = 1 .AllowDuplicates = Check1.Value .DrawBackground = Check2.Value .SplinedText = Check3.Value .Symbol(0).Font = fnt .Symbol(0).Color = moBlack .Symbol(0).Height = Map1.Extent.Height * 0.08 'arbitrary height fldn
53、ame = List1.List(List1.ListIndex) .Field = fldname 'text values stored in this field End With Map1.Refresh 'redraw the map 'disassociate objects Set fnt = Nothing Set recs = Nothing Set r = Nothing End If End Sub 例子(Delphi): procedure TForm1.Button7
54、Click(Sender: TObject); var ly :variant; lblren : variant; lyrs : variant; ft : TFont; oleFt : variant; begin ft := TFont.Create; ft.name := 'Times New Roman'; ft.size := 35; oleFt := FontToOleFont(ft); font.name :='Times'; lyrs := map1.layers; ly := lyrs.item('NeCen
55、ter'); ly.visible := false; lblren := CreateOleObject('MapObjects.LabelRenderer'); lblren.symbol(0).height :=8000; lblren.field :='cnty_name'; lblren.symbol(0).font(oleFt); lblren.AllowDuplicates :=false; ly := lyrs.item('Counties'); ly.renderer(lblren); map1.refresh; f
56、t.Free; end; 5.5 選擇圖形特征 選擇圖形特征MapObjects提供了三種方法: (1) 按相對(duì)位置的范圍搜尋: SearchByDistance。 (2) 按邏輯查詢,即按SQL語(yǔ)句的條件從句查詢: SearchExpression。 (3) 根據(jù)某個(gè)或某些圖形特征查詢其它相聯(lián)系的圖形特征: SearchShape。 5.5.1 SearchByDistance查詢 SearchByDistance是圖層對(duì)象(MapLayer)的成員函數(shù),它產(chǎn)生一個(gè)圖層的子集,此子集中的所有圖形特征滿足兩個(gè)條件:1. 與已知圖形特征的距離小于規(guī)定的距離,并且2.某些
57、字段滿足要求規(guī)定的條件。 調(diào)用句法: variable = object.SearchByDistance( shape, tolerance, expression) 變量說(shuō)明: variable: 指向圖層子集Recordset的指針變量; object: 指向圖層MapLayer的指針變量; shape: 圖形特征,如點(diǎn),線,多邊形或矩形; tolerance: 距離值; expression: 條件表達(dá)式,句法滿足ANSI SQL語(yǔ)句的“Where“從句的語(yǔ)法。 例子(Visual Basic): Dim MyEllipse As El
58、lipse Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 1 Then Set MyEllipse = Map1.TrackCircle Map1.Refresh Else Map1.Extent = Map1.TrackRectangle End If End Sub Private Sub Map1_AfterLayerDraw(ByVal index As Integer,
59、ByVal canceled As Boolean, ByVal hDC As Stdole.OLE_HANDLE) Dim radius As Double If Not MyEllipse Is Nothing Then Dim recset As MapObjects.Recordset radius = MyEllipse.Width * 0.5 Set recset = Map1.Layers(0).SearchByDistance(MyEllipse.Center, radius, "") Dim sym As New MapOb
60、jects.Symbol sym.SymbolType = moFillSymbol sym.Style = moSolidFill sym.Color = moLightYellow If Not recset.EOF Then Map1.DrawShape recset, sym End If sym.Color = moRed sym.Style = moLightGrayFill Map1.DrawShape MyEllipse, sym End If End Sub 例子(
61、Delphi): procedure TLabellayer.Add(layer :variant; fld :string; pt :variant); var labelF :string; recs,dist :variant; begin // find labelfield labelF := FindField(layer,fld); if labelF='' then exit; // search for feature if layer.ShapeType =23 then recs :=layer.SearchShape
62、(pt,12,'') else begin dist :=Map.ToMapDistance(15); recs :=layer.SearchByDistance(pt,dist,''); end; if recs.eof then exit; // create new label m_labels[count] := TFeatureLabel.create; m_labels[count].Text :=recs.fields.item(labelF).value; m_labels[count].Hei
63、ght :=TextHeight; m_labels[count].ShapeType :=layer.ShapeType; if layer.ShapeType =23 then m_labels[count].Shape :=recs.fields.item('shape').value.centroid else m_labels[count].Shape :=recs.fields.item('shape').value; if layer.ShapeType=22 then m_labels[count].FixLine; inc
64、(count); // redraw the tracking layer Map.TrackingLayer.refresh(True); end; 5.5.2 SearchExpression查詢 這種查詢方式是按屬性數(shù)據(jù)庫(kù)中字段的值查詢圖形特征,而查詢表達(dá)式的語(yǔ)法等于Ansi SQL語(yǔ)句的”Where”從句。返回值為圖層的選集。 調(diào)用句法: variable = object.SearchExpression( expression) 變量說(shuō)明: variable: 指向圖形特征的選集; object: 圖層變量; expression: 條件表達(dá)式。
65、 例子(Visual Basic): Private Sub Map1_AfterLayerDraw(ByVal index As Integer, ByVal canceled As Boolean, ByVal hDC As Stdole.OLE_HANDLE) Dim sel As MapObjects.Recordset If Text1.Text <> "" Then Set sel = Map1.Layers(0).SearchExpression(Text1.Text) If Not sel.EOF Then Dim sym As
66、 New MapObjects.Symbol sym.SymbolType = moFillSymbol sym.Style = moSolidFill sym.Color = moYellow Map1.DrawShape sel, sym End If End If End Sub 例子(Delphi): procedure TForm1.Button5Click(Sender: TObject); var j,I, nrecs,nClasses, cnt: integer; count :real; lyrs, ly, recs, ren, fld,flds: variant; s : string; begin lyrs := map1.layers; ly := lyrs.item('NeCenter'); ly.visible :=false; //hide NeCenter ly := UnAssigned; ly := lyrs.item('Count
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中考語(yǔ)文語(yǔ)言知識(shí)積累及運(yùn)用課件
- 6.康復(fù)醫(yī)學(xué)的工作方法和流程
- 部編本人教版小學(xué)一年級(jí)語(yǔ)文下冊(cè)11-彩虹課件
- 活動(dòng)四單股銅芯導(dǎo)線的T型連接絕緣層的恢復(fù)單股銅芯導(dǎo)線的T型連接課件
- 機(jī)場(chǎng)運(yùn)營(yíng)與管理 課程講義
- 不得作為商標(biāo)的標(biāo)志的審查解讀
- MRSA共識(shí)解讀2012-1-17(1)
- 高中語(yǔ)文必修一《優(yōu)美的漢字》課件
- 安全生產(chǎn)管理培訓(xùn)課件
- 衛(wèi)生系統(tǒng)法律知識(shí)講座-法律責(zé)任與法律救濟(jì)
- 骨關(guān)節(jié)脫位課件
- 護(hù)士行為與護(hù)理安全 課件
- 公路工程技術(shù)標(biāo)準(zhǔn)宣貫-隧道部分課件
- 預(yù)防冬季傳染病主題班會(huì)
- 疾病預(yù)防與食品安全教育.ppt