MapX開發范例_第1頁
MapX開發范例_第2頁
MapX開發范例_第3頁
MapX開發范例_第4頁
MapX開發范例_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、MapX開發教程一、加載地圖數據 1、 TAB的數據分為兩種數據:地圖數據(Layers)、屬性數據(Datasets)。關系:不可分割的一個數據集的兩部分. 2、 數據加載:GST文件由GeosetManager40.exe程序生成。在程序使用gsT文件:Map1.Geoset=Filepath+FileName 3、 問題:GST文件加載后,只是默認將地圖數據加載,屬性數據另外需要使用單獨的命令 4、 另一種加載方式:使用LayerInfo 對象,這種方式下加載地圖數據源的地圖集和屬性集均可直接使用。示例: dim LayerInfo as MapXLib.LayerInfo dim Ly

2、r as Mpxlib.layer LayerInfo.Type = miLayerInfoTypeTab 加載表的類型 LayerInfo.AddParameter "FileSpec", FilePath + LayerName + ".TAB" 加載表的全路徑名 LayerInfo.AddParameter "NAME", LayerName 地圖集的別名 LayerInfo.AddParameter "AutoCreateDataset", 1 是否加載屬性數據集 LayerInfo.AddParamete

3、r "datasetname", LayerName 屬性數據集別名 加載到指定的MapX對象中,立即可直接使用 5、 第三種加載數據方式:GST文件+ LayerInfo方式。示例: 使用兩個MapX對象:MainMap、TempMap TempMap.Geoset=GST文件 MainMap.geoset=” TempMap.Refresh 直接引用LayerInfo方式加載地圖數據到MainMap Next 二、創建地圖對象 必要:創建地圖對象,必須使用FeatureFactory對象 1、 創建一個點對象 點對象有一個坐標點(X,Y),點對象變量是Point類型,點

4、對象的樣式(Style)是符號樣式。 Dim Pnt AS MapXLib.Point Dim FeaFac AS MapXLib.FeatureFactory Dim Lyr AS MapXLib.Layer Dim Ftr AS MapXLib.Feature Dim NewStyle AS MapXLib.Style 綁定 SET FeaFac=mainmap.featurefactory 設置點對象樣式 With NewStyle .SymbolType = miSymbolTypeBitmap .SymbolBitmapSize = 24 .SymbolBitmapTranspare

5、nt = False .SymbolBitmapName = "YIEL2-32.BMP" End With Mainmap.AutoRedraw=False 禁止自動刷新 Lyr.Editable=True 置當前圖層為可寫狀態 創建點對象 pnt.set X1,Y1 添加進當前圖層 Set Ftr=FeaFac. CreateSymbol (Pnt,Newstyle) 創建符號 Set Ftr=FeaFac. CreateSymbol (Pnt,MainMap.DefaultStyle) 添加 Lyr.AddFeature Ftr Lyr.Refresh Mainmap

6、.AutoRedraw=True Lyr.Editable=False 釋放 SET Pnt = Nothing SET FeaFac = Nothing SET Lyr = Nothing SET Ftr = Nothing 以上代碼放在MapX的ToolUsed事件下 單獨修改某個圖元的樣式:SET Ftr.Style=NewStyle,再用Update 即可 2、 創建一個線矩形 Dim Pnts AS MapXLib.Points With NewStyle .LineColor=Rgb(0, 0,255) End With 第一個點 Pnt.Set X1,Y1 Pnts.add Pn

7、t 第二個點 Pnt.Set X2,Y1 Pnts.add Pnt 第三個點 Pnt.Set X2,Y2 Pnts.add Pnt 第四個點 Pnt.Set X1,Y2 Pnts.add Pnt 第五個點 Pnt.Set X1,Y1 Pnts.add Pnt 創建線矩形 SET Ftr=FeaFac.CreateLine(Pnts,NewStyle) Lyr.AddFeature Ftr Lyr.Refresh 3、 上面創建對象中存在的問題:并未對其數據數據進行賦值 創建對象的同時創建其數據集合 Dim Pnt AS MapXLib.Point Dim FeaFac AS MapXLib.F

8、eatureFactory Dim Lyr AS MapXLib.Layer Dim Ftr AS MapXLib.Feature Dim NewStyle AS MapXLib.Style Dim ds AS MapXLib.Dataset Dim Flds AS MapXLib.Fields 綁定 Set Flds=ds.Fields SET FeaFac=mainmap.featurefactory 設置點對象樣式 With NewStyle .SymbolType = miSymbolTypeBitmap .SymbolBitmapSize = 24 .SymbolBitmapTran

9、sparent = False .SymbolBitmapName = "YIEL2-32.BMP" End With Mainmap.AutoRedraw=False 禁止自動刷新 Lyr.Editable=True 置當前圖層為可寫狀態 創建點對象 pnt.set X1,Y1 創建圖形 Set Ftr=FeaFac. CreateSymbol (Pnt,Newstyle) 創建符號 Set Ftr=FeaFac. CreateSymbol (Pnt,MainMap.DefaultStyle) 設置屬性 For I=1 to Flds.Count Lyr.KeyField

10、s=Flds.Item(i).Name Ftr.KeyValue=ValueStr(I) 這里并沒有對字段類型進行判斷 Next 另外一種方法:使用RowValues和RowValue對象 添加 Lyr.AddFeature Ftr Lyr.Refresh Mainmap.AutoRedraw=True Lyr.Editable=False 釋放 SET Pnt = Nothing SET FeaFac = Nothing SET Lyr = Nothing SET Ftr = Nothing SET ds = Nothing SET Flds = Nothing 4、 創建表 (1) 臨時表

11、: me( Char 24)。程序運行過程中該表存放位置為系統臨時文件夾下 B、使用LayerInfo對象創建臨時表,可以指定字段。示例: Dim Lyr As MapXLib.Layer Dim LayerInfo As New MapXLib.LayerInfo Dim Flds As New MapXLib.Fields 字段定義 Flds.AddStringField "ID", 12 Flds.AddStringField "Name", 50 Flds.AddNumericField "Deptch", 12, 2 Fld

12、s.AddIntegerField "Length" ´ LayerInfo.Type = miLayerInfoTypeTemp LayerInfo.AddParameter "FileSpec", FileName LayerInfo.AddParameter "NAME", LayerName LayerInfo.AddParameter "Fields", Flds Set Lyr = Nothing Set LayerInfo = Nothing (2) 創建永久表 Dim Lyr A

13、s MapXLib.Layer Dim LayerInfo As New MapXLib.LayerInfo Dim Flds As New MapXLib.Fields Flds.AddStringField "ID", 12 Flds.AddStringField "Name", 50 Flds.AddNumericField "Deptch", 12, 2 Flds.AddIntegerField "Length" ´ LayerInfo.Type = miLayerInfoTypeNew

14、Table LayerInfo.AddParameter "FileSpec", FilePath + "" + FileName LayerInfo.AddParameter "NAME", LayerName LayerInfo.AddParameter "Fields", Flds Set Lyr = Nothing Set LayerInfo = Nothing 5、 創建工具句柄 系統已經定義工具句柄都以整數(包括16進制)常數存在,句柄號大于1000和小于12基本都為系統使用。 A. 定義常數:必須為全

15、局變量 Global Const CreateSymbolTool = 13 ´創建節點 Global Const CreateLineTool = 15 ´創建管線 Global Const InfoTipTool = 16 ´信息工具 Global Const MoveFeature = 17 ´移動地圖 Global Const ScaleDistanceTool = 18 ´測量兩點間的距離 B. 使用CreateCustomTool創建新的工具句柄: MainMap.CreateCus

16、tomTool CreateSymbolTool, miToolTypePoint, miSymbolCursor MainMap.CreateCustomTool CreateLineTool, miToolTypeLine, miCrossCursor MainMap.CreateCustomTool InfoTipTool, miToolTypePoint, miCrossCursor MainMap.CreateCustomTool MoveFeature, miToolTypeLine, miPanCursor MainMap.CreateCustomTool ScaleDistan

17、ceTool, miToolTypeLine, miPanCursor C. 如何使用? 在Map對象的ToolUsed事件的ToolNum參數為當前所激活的工具 使當 前操作指向某行為:MainMap.CurrentTool=工具句柄號,如放大:MainMap.CurrentTool=miZoomInTool,移動圖元:MainMap.CurrentTool=MoveFeature 操作具體的工具句柄時,執行該捕捉到的工具句柄的代碼: 在ToolUsed事件中: Select Case ToolNum Case MoveFeature 執行代碼 End Select 刪除圖元:Lyr.Del

18、eteFeature Ftr 三、查詢 1、 屬性查找。Find、Search方法:注意的是Find方法只支持TAB表文件,不支持空間數據表。 Find :與FoxPro中Locate定位命令想類似。 Search:支持SQL語句。寫法:僅指SQL語句的WHERE 部分,且From語句中只能有一個表僅對單表進行操作:Select * from LayerName WHERE ID LIKE “%北京%” 示例: A、查找 Dim Ftrs AS MapXlib.Features 圖元集合 SET Ftrs=Lyr.Search(“ID LIKE “%北京%”) For I=1 to Ftrs.

19、Count 執行語句 Next B、高亮顯示 將當前查詢所得的結果集全部高亮顯示(隱含執行:Lyr.ClearSelection語句)加入selection集合 閃爍:不能用Selection,否則會對整個屏幕進行整個刷新(抖動)。使用更新Style的方法進行選定圖元的閃爍。 記載圖元的老樣式:Set Oldsytle=Ftr.Style 將當前查詢所得的結果集添加到已有的結果集中,再全部高亮顯示 C、對查詢的結果集進行屬性修改 示例程序:完成的是Professional中信息工具功能 Dim ds AS MapXlib.Dataset Dim Flds AS MapXlib.Fields D

20、im Ftr AS MapXlib.Feature Set Flds=ds.Fields 查找 SET Ftrs=Lyr.Search(“ID LIKE “%北京%”) If Ftrs.count=0 then exit sub 讀取屬性值 For I=1 to Ftrs.Count Set Ftr=Ftrs.Item(I) For j=1 to Flds.count FldsName(J)=Flds.Item(J).Name 字段列表 Lyr.KeyField=FldsName(J) ValueStr(I,J)=Ftr.KeyValue 值列表 Next Next 修改屬性 MainMap.

21、AuyoRedraw=False Lyr.Editable=True For j=1 to Flds.count Lyr.KeyField= Flds.Item(J).Name Ftrs.Item(j).KeyValue =ValueStr(J) 更新值列表 Ftrs.Item(j).Update True Next Lyr.Refresh Lyr.Editable=False MainMap.AuyoRedraw=True 修改樣式 Dim NewStyle AS MapXlib.Style With NewStyle 設置樣式 End With MainMap.AuyoRedraw=Fal

22、se Lyr.Editable=True For i=1 to Ftrs.count Set Ftr =Ftrs.Item(I) SET Ftr.Style=NewStyle 更新樣式 Ftr.Update True Next Lyr.Refresh Lyr.Editable=False MainMap.AuyoRedraw=True 2、 空間查找 ² 點查找:SearchAtPoint,結果集為Features類型 Dim Pnt AS MapXlib.Point Pnt.Set X,Y Set Ftrs=Lyr.SearchAtPoint(Pnt,miSearchRes

23、ultAll) For I=1 to Ftrs.Count 執行語句 Next 注意:點查找時,一般情況下結果集在一個以上的圖層都存在。所以取值時應分別提取 ² 園查找:在臨時圖層上畫一個不保存的圓,然后查找被這個圓所包含的所有圖層的圖元對象。 Dim Pnt AS MapXlib.Point Dim TempCir AS MapXlib.Feature Dim FeaFac AS MapXLIB.featurefactory Pnt.Set X,Y Set tempcir=FeaFac.CreateCircularRegion(miCircleTypeMap ,Pnt,1,

24、 MainMap.MapUnit,) miSearchTypeCentroidWithin :中心點包含 miSearchTypePartiallyWithin :部分包含 miSearchTypeEntirelyWithin :全部包含 Set Ftrs=Lyr.SearchWithinFeature (TempCir, miSearchTypePartiallyWithin) For I=1 to Ftrs.Count 執行語句 Next SET Pnt =Nothing set TempCir =Nothing set FeaFac =Nothing 3、 相交 判斷兩個圖元是否有交點以

25、及交點坐標信息。 (1)判斷是否相交 IF Lyr.IntersectionTest( ftr1, ftr2, miIntersectFeature ) THEN 交點 END IF (2)獲取相交點坐標信息 交點 Dim Ftr AS MapXlib.Feature SET Ftr=MainMap.FeatureFactory. IntersectFeatures(Ftr1,Ftr2) 交點坐標信息 Next 4、 測距 使用Map對象的Distance方法。如何測量任意多邊形的周長? 使用累加的方法,還要使用圖元節點集合。 DistanceValue=0 第一個點 累加 DistanceV

26、alue = DistanceValue +MainMap.Distance(X1, Y1, X2, Y2) Next 多邊形周長 Msgbox DistanceValue+” ”+MainMap.MapUnit 四、對象編輯 (1)、對屬性的編輯 主要使用Fields對象。示例: Dim Flds AS MapXlIB.Fields 修改當前圖層的每一個字段 For J=1 to Flds.Count Lyr.KeyField= Flds.Item(j).Name 使當前圖層指向J字段 更新當前圖元的J字段值 Ftr.KeyValue=NewValueStr(J) Ftr.Update Tr

27、ue 并未寫入硬盤 Next Lyr.Refresh 保存修改到硬盤 (2)、移動地圖 首先創建一個移動工具句柄 MainMap.CreateCustomTool MoveFeature, miToolTypeLine, miPanCursor 在Map對象的ToolUsed事件的ToolNum參數為當前所激活的工具 捕捉MoveFeature工具句柄 傳過來的參數:X1,Y1,X2,Y2 Select case ToolNum . Case MoveFeature Dim Lyr AS MapXlib.Layer Dim Ftr AS MapXlib.Feature Dim Ftrs AS

28、MapXlib.Features Dim Xe,Ye AS Double 坐標偏移量 Xe=X2-X1 Ye=Y2-Y1 將當前圖層中選定的集合復制到Ftrs變量中 MainMap.AutoRedraw=False Lyr.Editable=True For J=1 to Ftrs.Count Set Ftr=Ftrs.Item(J) Ftr.Offset Xe,Ye Ftr.Update True Next Lyr.Refresh Lyr.Editable=False MainMap.AutoRedraw=True SET lyr=Nothing SET Ftr=Nothing End Se

29、lect (3)、樣式更新 Dim NewStyle AS MapXLib.Style 初始賦值 Set Ftrs=Lyr.AllFeatures Set NewStyle=Ftrs.Item(1).Style 設置樣式 With NewStyle .SymbolType = miSymbolTypeBitmap .SymbolBitmapSize = 24 .SymbolBitmapTransparent = False .SymbolBitmapName = "YIEL2-32.BMP" End With 更新 MainMap.AutoRedraw=False Lyr.

30、Editable=True SET Ftr.Style=NewStyle Ftr.Update True Lyr.Refresh Lyr.Editable=False MainMap.AutoRedraw=True五、輸出 1、屬性的輸出 輸出到EXCEL表: For I=1 to Flds.Count Lyr.KeyFields=Flds.Item(i).Name Excel(1,I).Cell=Ftr.KeyValue Next 2、復制、粘貼 Global CopyFtrs AS MapXlib.Features 復制選中集合 復制 For I=1 to Ftrs.Count CopyF

31、trs.add Ftrs.Item(I) Next 粘貼(圖形) Mainmap.AutoRedraw=False Lyr_1.Editabled=True For J=1 to CopyFtrs.Count Lyr_1.AddFeature CopyFtrs.Item(J) Next Lyr_1.Refresh Mainmap.AutoRedraw=True Lyr_1.Editabled=False 3、地圖的打印 Dim iScaleMode As Integer On Error GoTo PrinterError Printer.Print " " Printer

32、.CurrentX = 0 Printer.CurrentY = 0 MainMap.PrintMap Printer.hDC, 0, 0, MainMap.Width * 100, MainMap.Height * 100 Printer.NewPage Printer.EndDoc Exit Sub PrinterError: If Err.Number = 482 Then On Error Resume Next CommonDialog1.Flags = &H40 CommonDialog1.ShowPrinter Else MsgBox " 打印機存在錯誤,請更正

33、后重試。錯誤號:" + (Str(Err.Number), , "失敗" End If 4、另存為圖片文件 MainMap.ExportMap(App.Path+”Images”, miFormatJPEG) 輸出當前地圖窗口 參數設置:MainMap.ExportSelection=True 將選中部分以不同于其他未選中地圖部分形式輸出六、專題圖 6種專題圖:除獨立值專題圖綁定的字段類型可以是字符的以外,都必須是數字類型。與其他數據源綁定時,使用ODBC 調用ThemeDlg對話框可以讓用戶自己定義專題圖。示例: For Each ftr In lyr.Sele

34、ction ' The children of the layer are the individual ' features & ftr.Name & Str$(ftr.FeatureID), ftr.Name) For Each fld In ds.Fields ' Each feature has data attached to it; add this data as a child of the feature lyr.KeyField = fld.Name & ": " & ftr.KeyValue Ne

35、xt Next 七、在MapX下緊縮表 在Professional里面,緊縮表用 Pack Table 語句完成。而在MapX中則需要使用臨時圖層,并用復制技術來完成。示例: 緊縮當前Map對象中的所有圖層 Dim LayerInfo As New MapXLib.LayerInfo Dim Lyr As MapXLib.Layer Dim LyrTemp As MapXLib.Layer Dim Flds As MapXLib.Fields Dim Ds As MapXLib.Dataset Dim I As Integer Dim LayerName, FilePath As String

36、 On Error Resume Next ´復制源表數據到臨時表 Set Flds = Ds.Fields LayerName = Lyr.Name LayerInfo.Type = miLayerInfoTypeTemp LayerInfo.AddParameter "FileSpec", LayerName LayerInfo.AddParameter "NAME", LayerName LayerInfo.AddParameter "Features", Lyr.AllFeatures復制所有有效圖元 La

37、yerInfo.AddParameter "Fields", Flds 復制字段列表 LayerInfo.AddParameter "AutoCreateDataset", 1 LayerInfo.AddParameter "datasetname", LayerName 復制到另外Map對象 ´刪除源表 Set Lyr = Nothing LayerName = Mid(FilePath, InStr(1, FilePath, "Maps") + 6, Len(FilePath) - InSt

38、r(1, FilePath, "Maps") FilePath = Mid(FilePath, 1, InStr(1, FilePath, "Maps") + 5) LayerName = Mid(LayerName, 1, Len(LayerName) - 4) MainMap.Refresh Kill FilePath + LayerName + ".TAB" ´復制臨時表數據到源表 LayerInfo.Type = miLayerInfoTypeNewTable LayerInfo.AddParameter

39、"FileSpec", FilePath + LayerName + ".TAB" LayerInfo.AddParameter "NAME", LayerName LayerInfo.AddParameter "Features", LyrTemp.AllFeatures LayerInfo.AddParameter "Fields", Flds LayerInfo.AddParameter "AutoCreateDataset", 1 LayerInfo.AddParam

40、eter "datasetname", LayerName ´刪除臨時表 MapTemp.Refresh Next Set Lyr = Nothing Set Ds = Nothing Set Flds = Nothing Set LayerInfo = Nothing 八、如何和大型數據庫關聯 系統是混合結構:對地圖的訪問使用的是文件訪問方式,對屬性數據的訪問使用的是大型數據庫形式使用ID關聯:在TAB表和數據庫中有ID字段,兩個字段作為唯一值關聯字段。(一對一的關系)。示例: Lyr.KeyField=”ID” Set Ftr=Ftrs.Item(J

41、) SQL語句查找對應的屬性信息 SampleAdo.RecordSource =”Select a.id as id, as name from Table1 a, Table2 b WHERE (a.id=b.id) AND ( a.id LIKE %“ +Ftr.KeyValue+“%)”九、空間數據庫 空間數據庫中的索引技術用的是R_Tree技術,而不是原來一般意義上的B_Tree索引技術。 空間數據在Spatial中以地理屬性信息形式存放。 在Oracle的版本中有如下需要注意事項: 單一,且為黑白的而非彩色,上載地圖數據時,數據丟失非常嚴重。存取數據時非常慢。在Spat

42、ial中自動創建prinx字段作為地圖索引主關鍵字段 (主要指點對象)。創建地圖數據時,地圖的坐標常發生偏移。屬性數據更新時,需要兩次刷新才能完整提交;地圖數據數據提交時,其坐標發生偏移:向原點偏移,需要認為地單獨將其移動到其初始創建位置。存取速度上還是比較慢,離實用尚有一定距離。在Spatial中自動創建mi_prinx字段作為地圖索引主關鍵字段 記錄)。在地圖數據存取不是很大的時候,速度上可以被用戶接受。 ² 如何將MapInfo 的TAB表內容上傳到Oracle 中? b) 如何上載?注意:上載之前對Tab表進行緊縮。 c) 在程序中如何使用空間數據庫中的地圖數據? d) 添加地圖時,必須指定字段mi_prinx的明確值,且該值不能為表中已存在的值。寫入地圖數據時,應將其全部NOT NULL 字段值賦給,否則保存失敗。 e) 示例:Tab表+空間數據表 的數據分布形式。 十、GIS應用的分發 1、 制作你自己的系統的安裝盤:可執行文件、必要系統文件、運行庫文件、其他數據文件。 2、 單獨的MapX安裝盤:MapInfo MapX Runtime安裝程序,實際上是MapX控件安裝程序(存在于MapX sdk包) 3、 注冊:安裝完成

溫馨提示

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

評論

0/150

提交評論