MapObjects 培訓(xùn)教程

上傳人:xins****2008 文檔編號(hào):115323713 上傳時(shí)間:2022-07-01 格式:DOC 頁數(shù):117 大?。?28.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
MapObjects 培訓(xùn)教程_第1頁
第1頁 / 共117頁
MapObjects 培訓(xùn)教程_第2頁
第2頁 / 共117頁
MapObjects 培訓(xùn)教程_第3頁
第3頁 / 共117頁

下載文檔到電腦,查找使用更方便

40 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《MapObjects 培訓(xùn)教程》由會(huì)員分享,可在線閱讀,更多相關(guān)《MapObjects 培訓(xùn)教程(117頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、MapObjects 培訓(xùn)教程 第一章 背景簡介 隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,計(jì)算速度越來越快。也使得地理信息系統(tǒng)(GIS)技術(shù)應(yīng)用領(lǐng)域越來越廣泛,如測(cè)繪、規(guī)劃、電信線路管理、煤氣管道管理、城市供排水管道管理、電力輸/配電線路管理、車輛調(diào)度定位管理、防汛及河流管理等等。 現(xiàn)在GIS技術(shù)能滿足各種不同的應(yīng)用需求,從簡單的顯示與制圖到地理數(shù)據(jù)的復(fù)雜模擬與分析,如網(wǎng)絡(luò)的追蹤分析、數(shù)據(jù)的三維處理、最佳路徑分析、最優(yōu)化資源分配等等。 現(xiàn)在在市場(chǎng)上有許多關(guān)于GIS方面的軟件出現(xiàn),有國外的,也有國內(nèi)自己開發(fā)的軟件,如MapInfo, Intergraphic, BlueMarble等等。

2、美國的環(huán)境系統(tǒng)研究所(ESRI)較早從事這方面的開發(fā),他們?cè)?0年代就推出了ARC/INFO軟件,以后又陸續(xù)推出了其多種GIS軟件產(chǎn)品來滿足不同的需求,如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)用軟件來定制或擴(kuò)展已有的應(yīng)用。一方面,開發(fā)人員希望建立的應(yīng)

3、用能與通用的桌面軟件產(chǎn)品(如文字處理器、數(shù)據(jù)庫等)一起使用;另一方面,希望保留以前的開發(fā)成果,對(duì)于開發(fā)工具,則希望基于一個(gè)標(biāo)準(zhǔn)的開發(fā)環(huán)境,這樣可以不必再學(xué)習(xí)新的編程語言。MapObjects正是為了滿足這種需要而開發(fā)出來的。 第二章 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. 通過點(diǎn)擊識(shí)別圖上特征。 6. 選擇沿線的特征和在矩形、區(qū)域、多邊形和圓內(nèi)的特征。 7. 選擇在已知特征附近規(guī)定距離內(nèi)的特征。 8. 使用SQL語句選擇特征。 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ì)象具有特征和方法,可以通過對(duì)它們的編程來控制對(duì)象的外觀、行為以及相互作用。 MapObjects是一個(gè)提供制圖與GIS功能的ActiveX控件,它包含35個(gè)可編程的ActiveX對(duì)象。MapObjects地圖控件可以直接插入到許多標(biāo)準(zhǔn)開發(fā)環(huán)境的工具集中。你可以通過屬性頁操縱地圖。這些屬性頁是在諸如Visual Basic之類的開發(fā)環(huán)境中建

7、立的,或者通過其它程序化相關(guān)對(duì)象來控制地圖。 這些對(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ù)庫引擎)圖層(Layer)以及大量柵格圖象格式,如BMP、TIFF等等。 (3) 支持通過微軟ODBC標(biāo)準(zhǔn)進(jìn)行的外部數(shù)據(jù)庫訪問。 (4) 把數(shù)據(jù)作為多個(gè)圖層在一張圖中進(jìn)行顯示,當(dāng)然可進(jìn)行圖幅的變化。 (5) 特征表示使用數(shù)理方法如數(shù)值地圖、分類、個(gè)體符號(hào)以及點(diǎn)值圖等。 (6) 文字注記和放置。 (7) 用一個(gè)事件跟蹤層來動(dòng)態(tài)顯示實(shí)時(shí)數(shù)據(jù)。 (8) 用標(biāo)準(zhǔn)SQL表達(dá)式進(jìn)行特征選擇和查詢。 (9) 通過大量搜索與框架操作符進(jìn)行空間選擇。 (10) 地址匹配(地理編碼)。 (11) 強(qiáng)大而出色的對(duì)象模型。 2.4 MapObjects可以滿足哪些用戶要求

9、 任何應(yīng)用開發(fā)人員都能利用MapObjects在應(yīng)用中加入地圖,一些從MapObjects中獲益的開發(fā)者將成為ESRI公司軟件的用戶。許多人可能只有很簡單的要求,比如在應(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語句。 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è)置,這些屬性頁在Visual Basic的整個(gè)設(shè)計(jì)過程中都

14、存在。可以預(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)注“增加圖層”的按鈕。雙擊該按鈕將可以編程,語句如下: 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)境語言。如Visual Basic, Visual C++, Delphi等。使用MapObjects可以實(shí)現(xiàn):顯示具有多個(gè)地圖層的地圖, 放大、縮小和漫游整個(gè)地圖,顯示圖形特征,顯示標(biāo)注字符,通過點(diǎn)擊識(shí)別圖上特征,選擇沿線的特征和在矩形、區(qū)域、多邊形和圓內(nèi)的特征,選擇在已知特征附近規(guī)定距離內(nèi)的特征,使用SQL語句選擇特征,對(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è)圖層在概念上來說,它是一個(gè)數(shù)據(jù)庫,但它不是普通形式的數(shù)據(jù)庫,它包括地理信息和屬性信息。具體形式為:在Shape文件有三個(gè)文件組成,.shp包含地理信息,.dbf包含屬性信息,.shx包含兩文件的索

20、引關(guān)系,詳見附錄。而Coverage也有多個(gè)文件和Info庫組成。 每一個(gè)圖層對(duì)應(yīng)一個(gè)DataSet和RecordSet, 即一個(gè)數(shù)據(jù)庫和一個(gè)記錄集對(duì)象。而不同的圖層可以來自不同的數(shù)據(jù)類型。MapObjects的向量圖層可以來自三種數(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ū)域,如國家、城市、陸地范圍和土地區(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字段,它影射# 欄。注意基于ARC/INFO Coverage的GeoDataset對(duì)象是只讀的。 為了增加Coverage到Map控件,你產(chǎn)生DataConnection對(duì)象,然后設(shè)定Database屬性的字符串。這字符串必須在ARC/INFO的Workspace前加前綴 "[arc]" ,例如: Dim dc As New MapObjects.DataConnection Dim lyr As New MapObjects.MapLay

25、er dc.Database = "[arc]c:\samples\atlanta" 注意在前綴"[arc]"和路徑之間沒有空格。 一旦你設(shè)定了Database屬性,就可以將特征處理作GeoDataset對(duì)象。你可以用.的方案命名每一個(gè)GeoDataset。注意對(duì)區(qū)域、路線和帶子類的注釋 必須是三個(gè)字符的子類名。 特征類型 后綴 例子 Polygon pat landuse.pat Arc aat rivers.aat Point pat wells.pat Node nat streets.nat Regions

26、 pat admin.patcity Routes rat transit.ratbus Annotation text txt roads.txt Annotation subclass tat tracts.tatlevel1 為了增加名叫"landuse"多邊形Coverage圖層,代碼為: If dc.Connect Then Set lyr.GeoDataset = dc.FindGeoDataset("landuse.pat") Map1.Layers.Add lyr El

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語言語句: 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語句: 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 這些語句執(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)系??梢酝ㄟ^改變此符號(hào)性質(zhì)來影響整個(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)的著色,它通過畫點(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)顯示圖形特征。通過設(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特征也可以通過標(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語句的條件從句查詢: 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) 變量說明: variable: 指向圖層子集Recordset的指針變量; object: 指向圖層MapLayer的指針變量; shape: 圖形特征,如點(diǎn),線,多邊形或矩形; tolerance: 距離值; expression: 條件表達(dá)式,句法滿足ANSI SQL語句的“Where“從句的語法。 例子(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ù)庫中字段的值查詢圖形特征,而查詢表達(dá)式的語法等于Ansi SQL語句的”Where”從句。返回值為圖層的選集。 調(diào)用句法: variable = object.SearchExpression( expression) 變量說明: 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: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!