空間信息處理方法與技術-7_第1頁
空間信息處理方法與技術-7_第2頁
空間信息處理方法與技術-7_第3頁
空間信息處理方法與技術-7_第4頁
空間信息處理方法與技術-7_第5頁
已閱讀5頁,還剩102頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、空間信息處理方法與技術,交通運輸學院交通工程系,2007.9,王福田,MapX屬性數(shù)據(jù)及數(shù)據(jù)綁定 MapX引入外部數(shù)據(jù) MapX數(shù)據(jù)集對象 MapX字段集合對象 MapX綁定圖層 MapX與空間數(shù)據(jù)庫的連接,第7章 MapX的二次開發(fā)進階2,1 MapX 屬性數(shù)據(jù)及數(shù)據(jù)綁定,通過數(shù)據(jù)集集合對象,可以將地圖對象的屬性數(shù)據(jù)與空間數(shù)據(jù)連接起來。,數(shù)據(jù)綁定的概念,數(shù)據(jù)綁定是將外部數(shù)據(jù)引入 MapX 的過程。數(shù)據(jù)綁定的目的: 1. 在地圖中綁定屬性數(shù)據(jù); 2. 在地圖中將一個外部數(shù)據(jù)表作為一個新的圖層。 有許多不同類型的數(shù)據(jù)庫,為了使用它們,必須使用MapX的數(shù)據(jù)綁定功能。,怎樣綁定,有兩種方法進行數(shù)據(jù)

2、綁定: 1. 在設計期間可以通過 Map 對象的 DataSet 屬性來實現(xiàn)。 2. 在程序運行期間,通過使用數(shù)據(jù)集集合的Add( DataSets.Add) 方法來綁定數(shù)據(jù)。,第二種數(shù)據(jù)綁定過程會創(chuàng)建 DataSet 對象。這個添加到 DataSets 集合中的 DataSet 對象,包含了數(shù)據(jù)綁定到地圖圖層中的圖元的計算值。例如,如果數(shù)據(jù)已綁定到美國的州地圖上,那么每個州將會有新的數(shù)據(jù)值用來控制各州的繪制。如果在數(shù)據(jù)源中某個州有多條記錄,則這些值會被求和,求平均值或計數(shù)。,DataSet 的 Value 屬性可用來訪問地圖中每行(即圖元)的計算過的數(shù)值。對于大多數(shù)數(shù)據(jù)綁定類型,DataSo

3、urce(DataSets.Add 的第二個參數(shù))其實是一種 OLE 接口。MapX 通過這個接口直接從數(shù)據(jù)源中訪問數(shù)據(jù)。數(shù)據(jù)并沒有真正傳遞給 DataSets.Add。,MapX 的屬性數(shù)據(jù),MapInfo 屬性數(shù)據(jù)組織 GIS 包括兩大類型的數(shù)據(jù):空間數(shù)據(jù)和屬性數(shù)據(jù)。 空間數(shù)據(jù)是對應空間實體的地理編碼,能夠標識地物對象的空間位置,如城市位置、河流的走向等。它還隱式地包含了各空間實體的地理坐標。 屬性數(shù)據(jù)用于反映與空間實體對應的屬性,如城市名稱、人口、河流流量等。,在MapInfo中,地圖都是分層存放的,每一圖層的一組文件的文件名相同,只是后綴不同。其中該層中地物的空間數(shù)據(jù)主要存放在空間數(shù)據(jù)

4、文件.Map中,而每個地物對應的屬性數(shù)據(jù)則存放在同名的.Dat文件中,此外.Tab文件中存放了屬性數(shù)據(jù)的表結(jié)構(gòu)。通過索引文件.Id,MapInfo就可以把空間地物和它們各自的屬性值關聯(lián)起來。,MapX中屬性數(shù)據(jù)的查找,如果在建立MapInfo地圖文件的時侯,已創(chuàng)建了地物的屬性數(shù)據(jù),那么不必借助外部的數(shù)據(jù)庫支持,在Mapx中我們就可以對這些屬性數(shù)據(jù)進行帶條件的查詢。在一部分小型的應用中,MapX的這一功能使得開發(fā)者可以快速簡便地完成屬性查詢。在Map對象下有一個重要的對象Layer。它對應于地圖的圖層。利用Layer對象的Find方法可以搜索地圖對象中的圖層并定位該圖層中的特定圖元。,利用Fin

5、d對象可以定位地圖中的圖元。可以從屬性數(shù)據(jù)出發(fā),查找到它們對應的圖元或地物。要注意的是為了能使用Find方法,所搜索的圖層應包含索引字段。通過設置Find對象的屬性,如表所示,可以指定這些查找參數(shù),類似于SQL語句。,OBJECT.Search (Address,Boundary),要尋找的地物名稱或街道,搜索范圍,可選項,可以為地物或街道所在的一個地域范圍,而Find對象有如下兩個方法可供調(diào)用:,1) Search執(zhí)行搜索,使用方法:,Find.Search方法返回查找到圖元存儲在FindFeature對象中。 FindFeature對象把查找到的Feature對象的屬性作為自身的屬性。 F

6、indFeature包含F(xiàn)indRC屬性,該屬性為Find操作的結(jié)果代碼。FindRC屬性是表明查找到或未查找到圖元的原因的數(shù)字值。,查找結(jié)果的FindRC屬性的含義,Dim Findcityobject As MapXLib.FindFeature 設置查找的城市和州范圍 Set Findcityobject = Map1.Layers (US_Cities _ ).Find.Search(Albany,NY) 利用FindRC屬性判斷查找結(jié)果 If (FindcityObject.FindRC Mod 10=1)Then 重新定為地圖,以該地物為中心 Map1.ZoomTo 200,F(xiàn)in

7、dcityobject.CenterX,_ FindcityObject.CenterY Else 未找到匹配結(jié)果 MsgBox(”City not found”) End If,一旦結(jié)果代碼確定,就能對選中事例使用該結(jié)果。下例就是在US_Cities圖層,在NY州內(nèi)尋找Albany市。尋找的結(jié)果返回到FindFeature對象中。,應該指出,從上面的屬性可以看出Find對象比較適合用于在圖層中查找城市與街址,或者地圖中地物的名稱。返回結(jié)果為FindFeature類型對象。,2)SearchEx 該方法向搜索函數(shù)返回“精確匹配”來擴展Search搜索功能。通過設置參數(shù)可以匹配結(jié)果,如果不能精確

8、匹配,該方法可以返回最接近的匹配結(jié)果。 使用方法:FindResult=OBJECT.SearchEx(Address,Boundary) 參數(shù)與Search方法相同。 Find.SearchEx返回FindResult對象,該對象的屬性如表6.3所示。,FindResult對象的屬性,FindResult對象以上述屬性的方式提供了FindRC中包含的查找結(jié)果信息。FindResult對象中包含了查找結(jié)果圖元的集合,這些圖元或者是匹配的一個或多個圖元,或者是按優(yōu)先順序排列的多個相近匹配圖元。如果沒有精確的匹配結(jié)果,則MatchedFeature為空,其Matches為返回的所有近似匹配結(jié)果。如

9、果匹配到多個結(jié)果,則布爾值MultipleMatches為真。,Dim lyrCity As Layer Dim dsCity As Dataset Dim dsState As Dataset Dim objFindResult As FindResult 設置圖層 Set lyrCity=Map1.Layers(US Minor Cities) Set lyrState=Map1.Layers(USA) 加入數(shù)據(jù)集 Set dsCity=Map1.Datasets.Add(miDataSetLayer,lyrCity) Set dsState=Map1.Datasets.Add(miDat

10、aSetLayer,lyrState) 設置城市作為查找的數(shù)據(jù)集,查找的字段名是city Set lyrCity.Find.FindDataset=dsCity Set _ lyrCity.Find.FindField=dsCity.Fields(city) 設置州的圖層和數(shù)據(jù)集為搜索范圍,范圍的字段名是state Set lyrCity.Find.RefineLayer=lyrState Set lyrCity.Find.RefineDataset=dsState Set lyrCity.Find.RefineField=dsState.Fields( state ),在txtState州內(nèi)

11、查找txtCity市 Set objFindResult=lyrCity.Find.SearchEx(txtCity, txtState) If objFindResult.MultipleMatches=True Then 如果返回多個匹配 For Each objMatchcandidate In objFindResult.Matches firstcounter=firstcouncer+1 Listl.AddItem objMatchcandidate.Name 構(gòu)造表格放置結(jié)果 intNumRows=obj FindResult.Matches.Count 匹配的個數(shù),作為行數(shù) i

12、ntNumCols=dsCity.Fields.Count 字段的數(shù)目,作為列數(shù) CityGrid.Cols=intNumCols CityGrid.Rows=intNumRows For counter=l To intNumCols CityGrid.Row=firstcounter-1 CityGrid.Col=counter-1 CityGrid.Text=dsCity.Value(objMatchCandidate.FeatureID,counter) Next,Next Else 如果返回精確匹配 Listl.AddItem objFindResult.MatchedFeature

13、.Name 構(gòu)造1行的表格放置結(jié)果 intNumCols=dsCity.Fields.Count CityGrid.Cols=intNumCols For counter=1 To intNumColS CityGrid.Col=counter-1 CityGrid.Text=dsCity.Value(objFindResult.MatchedFeature. _ FeatureID,counter) Next End If,屬性數(shù)據(jù)的更新,一個空間對象在屬性數(shù)據(jù)庫表中對應一行。當Mapx應用程序中修改指定的地物元素的屬性時,就要更新屬性數(shù)據(jù)庫表中對應一行的數(shù)據(jù)值。 修改方法:MapX為當前圖

14、層提供了KeyField屬性用來指定該字段,再將已經(jīng)創(chuàng)建的空間實體的KeyValue屬性賦一個字段的值。,這樣就可以先給Layer.KeyField屬性指定字段名稱,再給Feature.KeyValue屬性賦予字段的值,然后調(diào)用Feature.Update進行更新就可以了。 例如我們修改Customer Layer圖層中的一個點圖元(指定坐標為XY)的名稱字段(CUSTNAME)屬性。,Private Sub ModifyByPoint(X As Double,Y As Double) Dim srcLayer as MapXLib.Layer Dim ftrsUnderPoint as Ma

15、pXLib.Features Dim pt As New MapXLib.Point 坐標點賦值 pt.Set X,Y 打開指定圖層 Set srcLayer=Map1.Layers.Item(Customer Layer) 找到該點 Set ftrsUnderPoint=srcLayer.SearchAtPoint(pt) 找到指定字段 srcLayer.KeyField=CUST NAME For Each ftr in ftrsUnderPoint ftr.KeyValue=”MapInfo Corp ftr.Update Next End Sub,2 MapX引入外部數(shù)據(jù),在GIS的實

16、際應用系統(tǒng)中,圖形矢量數(shù)據(jù)以MapInfo標準文件格式存儲在特定目錄下,圖形中每個地物均有其對應的惟一的標識(ID號),系統(tǒng)以此為索引建立該地物的圖形數(shù)據(jù)文件。而各個圖層的MapInfo內(nèi)置的屬性數(shù)據(jù)文件中并不實際存放重要的屬性數(shù)據(jù),而是通過標識號與外部數(shù)據(jù)關聯(lián)。,外部數(shù)據(jù)的優(yōu)勢,屬性數(shù)據(jù)與工程管理數(shù)據(jù)均采用外部數(shù)據(jù)的形式來存儲,一般采用關系數(shù)據(jù)庫或者對象一關系數(shù)據(jù)庫系統(tǒng)來管理。其中,各地物屬性記錄的關鍵字為圖形文件中該地物的ID號,由此便實現(xiàn)了圖形文件與屬性文件的一一對應關系。這樣,在數(shù)據(jù)庫管理系統(tǒng)中存放各種屬性數(shù)據(jù),可以充分地發(fā)揮大型數(shù)據(jù)庫系統(tǒng)的檢索和管理海量數(shù)據(jù)的優(yōu)勢。,MapX外部數(shù)據(jù)

17、綁定類型,數(shù)據(jù)綁定就是建立空間數(shù)據(jù)和屬性數(shù)據(jù)的關系,使地理對象和相關屬性有機結(jié)合,從而實現(xiàn)圖文互動。 MapX中的Map由一個或多個圖層組成,每個圖層由點、線、區(qū)域或文本等圖形對象組成,每個圖形對象代表特定的地物。圖形對象與地物的屬性數(shù)據(jù)通過數(shù)據(jù)綁定相關聯(lián)。這樣,單擊地圖上的某個地物,就可以瀏覽到與該地物相關的信息。,在MapX中有3種數(shù)據(jù)綁定方式:X-Y綁定、Normal綁定和Point Reference綁定。 1)X-Y綁定 如果要綁定的數(shù)據(jù)表中包含XY坐標信息的字段,并以這2個字段的數(shù)據(jù)為坐標創(chuàng)建點對象時,就采用該綁定方式。 該方式為靜態(tài)綁定。當數(shù)據(jù)表打開時,MapX將數(shù)據(jù)一次性讀入;

18、數(shù)據(jù)表打開后,即使修改表中的數(shù)據(jù),也不會改變圖層的顯示。,2)Normal綁定 把已有圖層的對象與其相關的屬性數(shù)據(jù)庫綁定。該方式為動態(tài)綁定。MapX將實時地訪問數(shù)據(jù)。 3)Point Reference綁定 如果要綁定的數(shù)據(jù)表中不含XY坐標信息的字段,單含有可作為參考信息的字段,可以用這種方式將數(shù)據(jù)在圖層中以點的形式表現(xiàn)出來。類似于MapInfo中的地理編碼。該方式也是靜態(tài)綁定。,在Mapx中可以引用多種類型的外部數(shù)據(jù): 1)地圖數(shù)據(jù) 如果已經(jīng)購買或是利用MapInfo創(chuàng)建了MapInfo地圖,可以直接將它們在應用中打開。 2)遠程空間數(shù)據(jù)庫 利用MapX可以訪問保存在Oracle8i及Map

19、Info SpatialWare中的地圖數(shù)據(jù)。 3)其他遠程數(shù)據(jù) MapX支持多種訪問接口,如ADO、DAO及RDO等,可以通過ODBC使用更廣范圍的數(shù)據(jù)。,3 MapX 數(shù)據(jù)集對象,DataSet 對象是在從數(shù)據(jù)源向 MapX 綁定數(shù)據(jù)的過程中生成的。 DataSet 包含了數(shù)據(jù)綁定的地圖圖層中圖元的計算過的值。數(shù)據(jù)源可能是 DAO 記錄集,ODBC 數(shù)據(jù)源等形式。 DataSets 集合是代表地圖中所有 DataSet 的對象。DataSets 集合的方法和屬性用來添加,刪除 Dataset 對象,或者在集合中使用現(xiàn)有的 DataSet 對象。,DataSet對象和DataSets集合簡介

20、,添加Add,創(chuàng)建特定數(shù)據(jù)集并將它添加到該集合中。,Set ds = Map 1.Datasets.Add (miDataSetDAO, rs),刪除Remove,從Datasets集合中刪除指定的 DataSet 對象。,Map1.Datasets.Re-move 2,DataSets.Add 方法,使用DataSets.Add方法,可向MapX綁定來自數(shù)據(jù)源的數(shù)據(jù)。使外部數(shù)據(jù)源和地圖建立聯(lián)系。語法如下: DataSets.Add Type, SourceData,Name, Geofield,SecondaryGeofield,BindLayer, Fields, Dynamic,Type

21、參數(shù):此參數(shù)用來說明所添加數(shù)據(jù)集的類型。它獲取DataSetTypeConstants的值。,下面列出的是 DataSet類型常量,SourceData 參數(shù):該參數(shù)用來引用數(shù)據(jù),隨Dataset類型的不同而不同。下面是每一種數(shù)據(jù)集類型的有效數(shù)據(jù)源:,Name 參數(shù):,該參數(shù)為唯一標識數(shù)據(jù)集的字符串。屬于可選參數(shù),如果不指定,則缺省名為 DataSetN,其中“N”為Datasets集合中的數(shù)字。,Geofield 參數(shù):,該參數(shù)是數(shù)據(jù)源中包含地理信息的列名稱或索引。如果該參數(shù)未指定,則 MapX 搜索所有字段,以決定數(shù)據(jù)源中哪一列包含了GeoDictionary 中指定的地理信息。此字段不必

22、是地理數(shù)據(jù)字段,因為它可能是諸如郵政編碼之類的唯一關鍵列。但是,如果已經(jīng)知道數(shù)據(jù)源中的哪一列包含了地理信息,則應當指定它。,如果打算在地圖上查看圖元數(shù)據(jù),那么數(shù)據(jù)源中的 GeoField 列必須是唯一的。GeoField 列用來為新點層的圖元命名。若值不唯一,則將導致在新點層中添加的只是單個點,該點是在多個重復關鍵值中首次遇到的,并且將會聚合重復行中的數(shù)據(jù)值。 如果指定了 Fields 集合,Geofield 參數(shù)引用 Fields 集合的列,而不是數(shù)據(jù)源的列。請參閱下面的 Fields 參數(shù)。,Secondary Geofield 參數(shù),此參數(shù)只有當綁定數(shù)據(jù)集的圖層存在不唯一關鍵列時才需要。

23、例如,使用 MapInfo 表 “United States Counties” 綁定數(shù)據(jù)就需要依靠 Secondary geofield 參數(shù),因為縣名是不唯一的??赡艽嬖诒碇械亩鄠€州都有縣名為 “Warren” 或 “Washington” 的情況。這樣,在數(shù)據(jù)綁定過程中,就需要更多的信息以解決可能存在的模棱兩可的情況。什么時候綁定數(shù)據(jù)到New York的 Warren,又是什么時候綁定到New Jersey的 Warren 呢?,通過指定 “County” 列作為 Geofield 以及 “State” 列作為 Secondary Geofield, MapX 經(jīng)過對各州中的縣名的精確數(shù)

24、據(jù)綁定處理,就能夠辨別出綁定到New York的 Warren數(shù)據(jù)和綁定到New Jersey的 Warren數(shù)據(jù)(這和創(chuàng)建 Find 對象的 Refining Boundary 概念相同。請參閱在地圖中查找圖元)。 如果指定了Fields 集合,SecondaryGeofield 參數(shù)會引用 Fields 集合中的列,而不是源數(shù)據(jù)中的列。,如果正在綁定屬性數(shù)據(jù),則此參數(shù)指定和數(shù)據(jù)連接的地圖圖層,或者,若引入的數(shù)據(jù)被地理引用到點引用文件中(如:郵政編碼)或包含經(jīng)/緯度值,則指定一個 BindLayerObject。這是可選參數(shù),如果沒有指定,則 MapX 會搜索 GeoDictionary 中

25、的圖層去連接。 如果已知要綁定的地圖圖層,基于性能的原因,應當指定它。匹配 BindLayer 時,Geofields 必須唯一。否則只匹配不唯一設置的數(shù)據(jù)中的第一項。其余的則被忽略。,BindLayer 參數(shù):,Fields 參數(shù)用來描述導入數(shù)據(jù)源的字段,以及當匹配特定地圖圖元的數(shù)據(jù)源記錄多于一個時,使用的聚合函數(shù)。這將建立要綁定到地圖的字段(列)集合。它是可選參數(shù),如果沒有指定,則導入所有列,并且如果每個圖元有多個記錄,對數(shù)據(jù)值求和。本章后面更詳細地討論了 Fields 集合。 如果指定了 Fields 集合,則 Geofield 和 SecondaryGeofield 參數(shù)會被指定為 F

26、ields 集合中的列,而不是源數(shù)據(jù)中的列。,Fields 參數(shù):,Dynamic 參數(shù):,該參數(shù)的值為布爾型,控制數(shù)據(jù)綁定是否是動態(tài)的。它是可選的,未指定時默認為False,即靜態(tài)綁定數(shù)據(jù)。(即,當數(shù)據(jù)庫打開時MapX復制所需數(shù)據(jù))。如果此參數(shù)指定為True,MapX 只在需要數(shù)據(jù)時實時訪問數(shù)據(jù)(例如,在標注時)。如果此參數(shù)指定為True但數(shù)據(jù)集不支持動態(tài)列,則會導致異常。,DataSets.Remove(index) DataSets.RemoveAll DataSets.Restore(Name,SourceData),當數(shù)據(jù)源有多個數(shù)據(jù)列時,如果MapX只綁定數(shù)據(jù)表中的某一列或某一字段

27、的數(shù)據(jù),可以用 DataSets.Add 方法的Fields參數(shù)來建立要綁定到地圖的字段(列)的 Fields 集合。Fields是字段集合對象,F(xiàn)ield是字段對象。 說明:聲明字段變量時使用“MapXLib.Fields”。這樣可防止與 DAO Fields 對象發(fā)生沖突。 Dim flds As New MapXLib.Fields 可以通過 Dataset.Fields 的屬性訪問數(shù)據(jù)集的 Fields 集合,4 MapX字段集合對象,Fields.Add方法 :,Fields.Add 方法將數(shù)據(jù)源中的一列數(shù)據(jù)作為字段添加到 Fields 集合中。Fields 集合使用 DataSet

28、s.Add 方法建立。Datasets.Add 的Fields 參數(shù)獲取 Fields 集合,并使用 Add 方法建立它。一旦數(shù)據(jù)集已經(jīng)創(chuàng)建,就不能再將 Add 方法用在數(shù)據(jù)集的 Fields 集合上。 Fields.Add 的語法規(guī)則如下所示: Fields.Add DataSourceCol, Name, AggregateFunction, Type,數(shù)據(jù)聚合:,Fields.Add 方法的 Aggregate Function 參數(shù)決定當多匹配情況出現(xiàn)時 MapX 怎樣計算 Field 的值。,Aggregation Function 常量:,例如:,5 綁定圖層,BindLayer是

29、一種特殊類型的數(shù)據(jù)綁定,它用來在由數(shù)據(jù)指定的位置處創(chuàng)建新的點圖層。通常在下面兩種情況下使用: 1. 數(shù)據(jù)包含 x 和 y 坐標時(如經(jīng)度和緯度)。在指定的位置創(chuàng)建點。 2. 數(shù)據(jù)包含參照信息時,例如 Zip Codes。,當綁定數(shù)據(jù)具有 X/Y 坐標或點信息(例如 Zip Codes)時,以及想要在新的或已存在的圖層上看到由數(shù)據(jù)指定位置的點時,就需要用到 Bindlayer 對象。使用 BindLayerObject 添加數(shù)據(jù)集時,這些點會自動顯示在地圖上。如果沒有用 BindLayerObject 添加數(shù)據(jù)集,則點是不會自動顯示的。只有 BindLayerObjects 才有這種行為。,Bi

30、ndLayer 對象屬性:,使用 BindLayer 對象的操作步驟如下: 1. 創(chuàng)建 BindLayer 對象。 2. 通過 Datasets.Add 方法中的 BindLayer 參數(shù)傳遞此對象來添加數(shù)據(jù)集。,在地圖上將 X/Y 數(shù)據(jù)作為點圖層顯示,如果數(shù)據(jù)包含 X/Y 坐標,就可以通過數(shù)據(jù)綁定創(chuàng)建并顯示點圖元圖層。使用 BindLayer 對象的方法: (1)設置LayerType 屬性為 miBindLayerTypeXY (2) 設置RefColumn1 屬性為包含 X 坐標值的列名或索引 (3) 設置RefColumn2 屬性為包含 Y 坐標值的列名或索引,Dim BindLaye

31、rObject As New MapXLib.BindLayer Dim flds As New MapXLib.Fields Dim db As Database Dim ds As MapXLib.Dataset Dim DBName As String DBName=GetSetting(App.Title,Settings,MapDatabasePath,C:ProgramFilesMapInfoMapX4.0DataMapstats.mdb) Set db = OpenDatabase(DBName )打開數(shù)據(jù)庫,代碼示例:,Set rs = db.OpenRecordset(US_

32、Cust) rs.MoveLast BindLayerObject.LayerName = US Customers BindLayerObject.RefColumn1 = “X”經(jīng)度 BindLayerObject.RefColumn2 = “Y” 緯度 BindLayerObject.LayerType = miBindLayerTypeXY Set ds = Map1.Datasets.Add(miDataSetDAO, rs, _ U.S. Customers , City, State, BindLayerObject),使 BindLayer 對象創(chuàng)建的新點圖層成為永久的 Map

33、Info 表是很容易的。使用 BindLayer.Filespec 屬性指定一個文件的文件名和路徑,就可以使 Datasets.Add 方法創(chuàng)建的是一永久圖層,而不是臨時圖層。,使新點圖層變?yōu)橛谰脠D層,MapX的綁定數(shù)據(jù)事件,一旦數(shù)據(jù)源的某列被定義為地理列,并且確定了綁定數(shù)據(jù)的地圖圖層,則綁定就開始進行。數(shù)據(jù)源的每一行都和一個圖元相匹配且數(shù)據(jù)將會帶入地圖。如果某包含地理列的行和圖元不匹配(或許是鍵入錯誤 “NA” 代替 “MA” 或僅是一個非地圖上的值 “Puerto Rico”),則 DataMismatch 事件被激活來通知容器。,可以忽略 DataMismatch 事件,這種情況下 Ma

34、pX 將簡單地忽略此行。 在自動數(shù)據(jù)綁定期間,如果數(shù)據(jù)有模棱兩可的情況,MapX 就會調(diào)用 ResolveDataBind 事件。 在使用“非綁定”類型數(shù)據(jù)的數(shù)據(jù)綁定期間,使用 RequestData 事件建立循環(huán),使得容器一次一個單元地向 MapX 提供數(shù)據(jù)。,刷新數(shù)據(jù)集:,因為數(shù)據(jù)源中的數(shù)據(jù)被聚合后儲存在 MapX 中,所以當數(shù)據(jù)源中的數(shù)據(jù)發(fā)生變化時,MapX 并不反映這種變化。DataSet.Refresh 方法使得 MapX 重讀數(shù)據(jù)源并重新聚合,然后再次儲存它。但是,這樣會消耗很長時間。DataSet.Refresh 對創(chuàng)建新點圖層的 DataSets 無效。 說明:當數(shù)據(jù)源中有新添

35、加的行時,此方法并不在圖層中添加新圖元。,DAO方式 DAO是Data Access Object的簡稱,意為數(shù)據(jù)訪問對象。它包括了用于訪問數(shù)據(jù)的集合、對象、方法和屬性,采用面向?qū)ο蟮臋C制,利用對象集合來處理數(shù)據(jù)庫、表和索引等。 在Visual Basic中,DAO模型是Jet數(shù)據(jù)庫引擎的面向?qū)ο蟮慕涌冢苑謱拥慕Y(jié)構(gòu)來組織數(shù)據(jù)訪問對象類,使用這些類就可以定義數(shù)據(jù)訪問對象。,常用的外部數(shù)據(jù)綁定方法,ADO方式 ActiveX Data Object(ADO)是微軟新的數(shù)據(jù)訪問技術。它用于同數(shù)據(jù)訪問層OLE DB Provider一同工作,提供通用的數(shù)據(jù)訪問。ADO易于使用,速度快,占用內(nèi)存少,并

36、且針對CS模式和Web應用進行了優(yōu)化。同DAO等不同,ADO可以獨立創(chuàng)建,并且不是DAO的層次模型,而是平面模型,即對象之間是平級的。,ADO的3個對象是Connection、Recordset和Command。每個Connection屬性定義了與數(shù)據(jù)源的連接,Recordset對象接收來自數(shù)據(jù)源的數(shù)據(jù)。Connection和Recordset可以一起使用,先建立連接,然后獲取數(shù)據(jù)。當然Recordset也可以單獨創(chuàng)建,它的Connection參數(shù)可以通過Open屬性來定義。,ODBC方式 ODBC是Open Database Connectivity的縮寫,意為開放式數(shù)據(jù)庫互聯(lián),是微軟推出的

37、一種開放的工業(yè)標準,它獨立于數(shù)據(jù)庫廠商,可以跨平臺訪問各種系統(tǒng),目前絕大多數(shù)的數(shù)據(jù)庫廠商、大多數(shù)的應用軟件和工具廠商都為自己的產(chǎn)品提供了ODBC接口和支持,包括Access、SQL Server、Oracle、Informix等。 MapX可以通過ODBC從任意的ODBC數(shù)據(jù)源讀取數(shù)據(jù)進行綁定。這使得MapX的數(shù)據(jù)綁定功能十分通用和強大。,MapInfo表方式 如前所述,在MapInfo表中除了空間數(shù)據(jù)外,還有屬性信息,存放在與.Tab表同名的.Dat文件中,因此,可以通過綁定MapInfo表來向數(shù)據(jù)集添加新的數(shù)據(jù)。這一方法很簡單,步驟為:先向地圖對象添加新的圖層對象,該圖層就是要添加的數(shù)據(jù)所

38、在的圖層。然后將該圖層添加到數(shù)據(jù)集中即可。,RDO方式 RDO是遠程數(shù)據(jù)對象(Remote Data Object),是基于ODBC API的對象模型,它短小、快捷和強健,可以通過它訪問任何32位的ODBC數(shù)據(jù)源,如SQL Server和Oracle等,是訪問遠程數(shù)據(jù)的高級工具。,6 MapX與空間數(shù)據(jù)庫的連接,目前,各大GIS廠商和數(shù)據(jù)庫公司發(fā)展了最新的空間數(shù)據(jù)和屬性數(shù)據(jù)的全關系型數(shù)據(jù)庫管理方式,利用關系型數(shù)據(jù)庫來存儲和處理空間數(shù)據(jù),實現(xiàn)了空間數(shù)據(jù)和屬性數(shù)據(jù)的無縫集成和一體化存儲管理。,Oracle空間數(shù)據(jù)庫模型,Oracle Spatial是針對存儲在Oralce8i以上版本中的空間元素集

39、合提供的一種SQL的模式來完成存儲、輸出、修改和查詢的功能。Oracle Spatial有以下組件構(gòu)成: 1)用來規(guī)定Oracle支持空間數(shù)據(jù)類型的存儲、語法的模式,稱為MDSYS。 2)空間索引機制。 3)用來處理空間區(qū)域的交叉、合并和連接的操作和函數(shù)集。 4)管理工具。,Oracle空間數(shù)據(jù)庫模型,Oralce支持兩種表現(xiàn)空間元素的機制或模型: 1)關系式模型 用多行記錄和字段類型為Number的一張表來表示一個空間實體。 2)對象關系式模型(ObjectRelationalModel) 這種模型使用數(shù)據(jù)庫表,表中有一個類型為MDSYS.SDO_GEOMETRY的字段,用一行記錄來存儲一個

40、空間數(shù)據(jù)實體。,Oracle Spatial中SDO_GEOMETRY是一個對象類型的字段,由5個對象屬性組成,它們是SDO_GTYPE、SDO_SRID、SDO_POINT、SDO_ELEM_INFO、SEO_ORDINATES。即一個空間實體的所有空間信息全部存儲在5個屬性中。,這5種屬性的含義如表所示:,其中,用來定義所存對象的類型的SDO_GTYPE取值見表所示:,此外,SDO_ELEM_INFO中每3個數(shù)來共同表示一種空間幾何的性質(zhì)。這3個數(shù)的意義分別是:Ordinate offset表示第一個元素的縱坐標:element type 和interpretation共同表示數(shù)據(jù)性質(zhì),空

41、間查詢,在Oracle Spatial中,對地理空間數(shù)據(jù)的查詢分為兩步: (1)根據(jù)條件檢索出要查詢內(nèi)容的范圍,在服務器端完成。 (2)在第一步所查詢的范圍中進一步檢索,找出所要查詢的空間幾何數(shù)據(jù),在服務器端或客戶端進行。,空間視圖,視圖包括:表名、列名、空間數(shù)據(jù)信息和ID。其中空間數(shù)據(jù)包括SDO_DIMNAME(維數(shù)名)、SDO_LB(數(shù)據(jù)下限)、SDO_UP(數(shù)據(jù)上限)、SDO_TOLERANCE(允許誤差)。,利用坐標數(shù)據(jù)繪制地圖,在MapX中可以訪問不同的DBMS服務器,來獲取地圖圖層數(shù)據(jù),進行顯示??梢允褂肔ayers.Add方法用來自DBMS的數(shù)據(jù)來添加圖層。有以下兩種方法: (1

42、) 當需要在運行狀態(tài)下動態(tài)計算查詢時,可以采用隨LayerInfo對象一起使用Layers.Add方法。這適合于有新數(shù)據(jù)輸入的情況。 (2) 當查詢在設計階段已知時,和.tab文件一起使用Layers.Add方法。直接將.tab文件放到geoset中。,LayerInfo對象,圖層對象集合Layers有Add方法,可以添加圖層到集合并在地圖上顯示。具體調(diào)用方法為: Layer=Layers.Add(LayerInfo,Position) 參數(shù)LayerInfo是一個變量,可以是MapInfo的Tab文件的完整路徑,也可以是一個LayerInfo對象。而Position是該添加的圖層在地圖中的疊

43、加順序。,LayerInfo對象作為添加圖層方法的第一個參數(shù),它描述了新圖層的定義,該對象只有一個屬性Type來描述圖層。Type屬性是一個讀寫參數(shù),取值為LayerTypeContants常量,含義如圖:,表中每一種Type的取值都對應不同得到圖層類型,因此應向LayerInfo傳遞不同的參數(shù)。然后利用LayerInfo.AddParameter方法添加到LayerInfo對象中。 LayerInfo.AddParameter (name,value) 其中,參數(shù)name 和 value都是要傳遞的參數(shù)。這些參數(shù)要一個一個地添加。,miLayerInfoTypeServer類型的所需參數(shù):,

44、利用坐標數(shù)據(jù)庫添加圖層,通過上面的分析,在MapX中利用LayerInfo對象的AddParameter方法,添加必要的描述數(shù)據(jù)庫的參數(shù),然后調(diào)用圖層的添加Layers.Add方法添加該圖層,就可以添加數(shù)據(jù)庫中的數(shù)據(jù)進入新的圖層并顯示,只要該數(shù)據(jù)庫中包含X/Y坐標數(shù)據(jù)列。這樣就實現(xiàn)了利用坐標數(shù)據(jù)繪制地圖的目的。,通過Tab文件訪問數(shù)據(jù)庫,除了通過LayerInfo的方式,MapX還可以通過另外一種方式訪問外部數(shù)據(jù)庫的數(shù)據(jù),那就是借助于MapInfo的Tab文件。MapX打開的Tab可以是一種數(shù)據(jù)的鏈接表,而不是具體的圖層數(shù)據(jù)。用這種方式MapX可以實現(xiàn)對數(shù)據(jù)庫的訪問。,生成包含鏈接表的Tab文

45、件,有兩種方式: (1) 使用MapInfo Professional產(chǎn)生Tab文件 在MapInfo Professional中,選擇“文件打開”就可以打開DBMS表,然后另存為Tab文件。 (2) 直接書寫Tab文件 可以使用任何文本編輯器創(chuàng)建Tab文件。,MapInfo Map Catalog,使用MapX應用程序訪問遠程空間數(shù)據(jù)庫繪制新的圖層,這對空間數(shù)據(jù)庫有一個要求,即空間數(shù)據(jù)庫中必須存在一種特殊的表MapInfo Map catalog。 每個數(shù)據(jù)庫都必須創(chuàng)建一個Map Catalog,才能真正實現(xiàn)數(shù)據(jù)庫中表在MapX中顯示為地圖圖層。該MapInfo Map Catalog 包含

46、了MapX要訪問的數(shù)據(jù)庫中每一個可在地圖中顯示的空間列的信息。 如果服務器上沒有Map Catalog ,這需要開發(fā)者在設計階段創(chuàng)建。,創(chuàng)建MapInfo Map Catalog的方式有兩種: 1) 利用MapInfo Professional創(chuàng)建 利用MapInfo公司的桌面GIS系統(tǒng)MapInfo Professional,創(chuàng)建并管理Map Catalog。 2) 手工創(chuàng)建 每個服務器/數(shù)據(jù)庫只要創(chuàng)建Map Catalog一次。步驟如下: (1) 在放有可在地圖上表示的表的指定數(shù)據(jù)庫中,創(chuàng)建用戶MAPINFO。 (2) 在數(shù)據(jù)庫中創(chuàng)建MAPINFO_MAPCATALOG表。 (3) 創(chuàng)建關

47、于TABLENAME和OWNERNAME的唯一索引,使得對于每個所有者只有一張表可被地圖化。 (4) 允許適當?shù)挠脩粼贛APINFO_MAPCATALOG中有選擇、更新以及插入的權限。這樣用戶才可以把表地圖化。,在應用中要注意每一張MapX訪問的空間數(shù)據(jù)庫的表,都要分別在MAPINFO_MAPCATALOG表對應一行說明。這一行中的每一列的語法和意義如下圖所示:,至此,MapX應用程序就能夠使用Map Catalog了,而且一旦創(chuàng)建了Map Catalog,之后的應用階段就不需要再創(chuàng)建,MapX直接從Map Catalog中讀取數(shù)據(jù)即可。,使用Oracle Spatial 的方法,Oracle

48、公司向Mapinfo提供了一種比ODBC更底層的數(shù)據(jù)庫接口OCI。通過此接口可以直接向Oracle數(shù)據(jù)庫中存取MapInfo空間地圖。MapX通過OCI支持和Oracle建立同步連接,而通過ODBC和其他數(shù)據(jù)庫建立連接。 配合MapX的Oracle數(shù)據(jù)庫應具備以下要求: (1) Oracle的版本至少為8.1.5 因為從Oracle8.1.5開始,才向MapInfo提供OCI底層接口,并通過OCI接口來實現(xiàn)與MapInfo之間的空間數(shù)據(jù)存儲。 (2) 必須安裝Oracle8i的客戶端。 (3) 用戶通過Easyloader來實現(xiàn)Mapinfo地圖數(shù)據(jù)向Oracle數(shù)據(jù)庫中的上載。Easyloa

49、der的版本需要和Oracle相匹配。,在程序中連接Oracle Spatial,在MapX應用程序中連接Oracle空間數(shù)據(jù)庫時,不再需要使用ODBC連接所必需的數(shù)據(jù)源DSN,但是必須有完整的連接字符串,否則不能顯示連接對話框,即使設置“DLG=”選項也無效。Oracle連接字符串定義如下: “SRVR=;UID=PWK=” 其中的各項用分號隔開,每一項用Key=Value的方式表達。,各項的含義為: (1) SRVR= 在Oracle8i Net8 EasyConfig中定義的數(shù)據(jù)庫服務器的名稱。 (2)UID= 對應于指定數(shù)據(jù)庫的用戶名稱。 (3)PWD= 對應用戶的口令,如果有的話。

50、例如,指定名為Ontario的數(shù)據(jù)庫,用戶名為geo的連接字符串為: UID=geo;PWD=password;SRVR=ontario,空間表創(chuàng)建與數(shù)據(jù)查詢,在Oracle Spatial中,MapInfo的屬性數(shù)據(jù)和地圖數(shù)據(jù)存儲在同一張表中。Oracle中,一個空間對象的存儲對應一行。 在Oracle Spatial 中創(chuàng)建一個空間表的步驟如下: 1) 創(chuàng)建一個新表 2) 將新表增加到SDO_GEOM_METADATA表中 3) 將新表增加到MAPINFO_MAPCATALOG表中 4) 創(chuàng)建空間索引 5) 向表中增加包含空間對象的新記錄,MapInfo與Oracle空間對象的轉(zhuǎn)換關系,在

51、MapInfo中定義的抽象對象包括點、線、面,而Oracle Spatial中與其對應的對象類型稍有不同。這將影響到二者之間的空間數(shù)據(jù)轉(zhuǎn)換的結(jié)果。 1) 從MapInfo到Oralce導出數(shù)據(jù)時,對應的轉(zhuǎn)換關系如圖??梢钥吹讲皇撬械腗apInfo空間對象類型在Oracle中都有對應,只有一些基本的類型才能找到的對應,其他的無法轉(zhuǎn)化。,而從Oracle到Mapinfo的類型轉(zhuǎn)換則有所不同,如圖:,此外,對于Oracle中的對象在MapInfo中無法轉(zhuǎn)換,MapX直接就對應了點對象,該點對象默認采用黑色的星點,位置是Oracle中SDO_Spatial對象的坐標位置或SDO_Spatial對象集合中第一個對象的坐標位置。,MapX從Oracle 讀取空間對象,MapX通過Oracle的OCI接口來訪問Oracle Spatial。因此在MapX開發(fā)中必須遵循OCI的訪問方式,不能向通過ODBC打開其他普通數(shù)據(jù)庫讀取數(shù)據(jù),而是要通過LayerInfo對象的引入來完成。

溫馨提示

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

評論

0/150

提交評論