一、加載地圖數(shù)據(jù)
1、 TAB的數(shù)據(jù)分為兩種數(shù)據(jù):地圖數(shù)據(jù)(Layers)、屬性數(shù)據(jù)(Datasets)。關(guān)系:不可分割的一個(gè)數(shù)據(jù)集的兩部分.
2、 數(shù)據(jù)加載:GST文件由GeosetManager40.exe程序生成。在程序使用gsT文件:Map1.Geoset=Filepath+FileName
3、 問(wèn)題:GST文件加載后,只是默認(rèn)將地圖數(shù)據(jù)加載,屬性數(shù)據(jù)另外需要使用單獨(dú)的命令進(jìn)行加載,否則對(duì)屬性數(shù)據(jù)的操作全部非法。加載:Map1.Datasets.ADD 屬性數(shù)據(jù)集名稱
4、 另一種加載方式:使用LayerInfo 對(duì)象,這種方式下加載地圖數(shù)據(jù)源的地圖集和屬性集均可直接使用。示例:
dim LayerInfo as MapXLib.LayerInfo
dim Lyr as Mpxlib.layer
LayerInfo.Type = miLayerInfoTypeTab ‘加載表的類型
LayerInfo.AddParameter "FileSpec", FilePath + LayerName + ".TAB" ‘加載表
的全路徑名
LayerInfo.AddParameter "NAME", LayerName ‘地圖集的別名
LayerInfo.AddParameter "AutoCreateDataset", 1 ‘是否加載屬性數(shù)據(jù)集
LayerInfo.AddParameter "datasetname", LayerName ‘屬性數(shù)據(jù)集別名
MainMap.Layers.Add LayerInfo ‘加載到指定的MapX對(duì)象中,立即可直接使用
5、 第三種加載數(shù)據(jù)方式:GST文件+ LayerInfo方式。示例:
使用兩個(gè)MapX對(duì)象:MainMap、TempMap
TempMap.Geoset=GST文件
MainMap.geoset=””
TempMap.Refresh
For I=1 to TempMap.Layers.Count
FileName=TempMap.Layers.Item(I).Filespec
‘直接引用LayerInfo方式加載地圖數(shù)據(jù)到MainMap
Next
二、創(chuàng)建地圖對(duì)象
必要:創(chuàng)建地圖對(duì)象,必須使用FeatureFactory對(duì)象
1、 創(chuàng)建一個(gè)點(diǎn)對(duì)象
點(diǎn)對(duì)象有一個(gè)坐標(biāo)點(diǎn)(X,Y),點(diǎn)對(duì)象變量是Point類型,點(diǎn)對(duì)象的樣式(Style)是符號(hào)
樣式。
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 Lyr=MainMap.Layers.Item(LayerName)
SET FeaFac=mainmap.featurefactory
‘設(shè)置點(diǎn)對(duì)象樣式
With NewStyle
.SymbolType = miSymbolTypeBitmap
.SymbolBitmapSize = 24
.SymbolBitmapTransparent = False
.SymbolBitmapName = "YIEL2-32.BMP"
End With
Mainmap.AutoRedraw=False ‘禁止自動(dòng)刷新
Lyr.Editable=True ‘置當(dāng)前圖層為可寫狀態(tài)
‘創(chuàng)建點(diǎn)對(duì)象
pnt.set X1,Y1
‘添加進(jìn)當(dāng)前圖層
Set Ftr=FeaFac. CreateSymbol (Pnt,Newstyle) ‘創(chuàng)建符號(hào)
‘Set Ftr=FeaFac. CreateSymbol (Pnt,MainMap.DefaultStyle)
‘添加
Lyr.AddFeature Ftr
Lyr.Refresh
Mainmap.AutoRedraw=True
Lyr.Editable=False
‘釋放
SET Pnt = Nothing
SET FeaFac = Nothing
SET Lyr = Nothing
SET Ftr = Nothing
‘以上代碼放在MapX的ToolUsed事件下
單獨(dú)修改某個(gè)圖元的樣式:SET Ftr.Style=NewStyle,再用Update 即可
2、 創(chuàng)建一個(gè)線矩形
Dim Pnts AS MapXLib.Points
With NewStyle
.LineColor=#0000ff
End With
‘第一個(gè)點(diǎn)
Pnt.Set X1,Y1
Pnts.add Pnt
‘第二個(gè)點(diǎn)
Pnt.Set X2,Y1
Pnts.add Pnt
‘第三個(gè)點(diǎn)
Pnt.Set X2,Y2
Pnts.add Pnt
‘第四個(gè)點(diǎn)
Pnt.Set X1,Y2
Pnts.add Pnt
‘第五個(gè)點(diǎn)
Pnt.Set X1,Y1
Pnts.add Pnt
‘創(chuàng)建線矩形
SET Ftr=FeaFac.CreateLine(Pnts,NewStyle)
Lyr.AddFeature Ftr
Lyr.Refresh
3、 上面創(chuàng)建對(duì)象中存在的問(wèn)題:并未對(duì)其數(shù)據(jù)數(shù)據(jù)進(jìn)行賦值
創(chuàng)建對(duì)象的同時(shí)創(chuàng)建其數(shù)據(jù)集合
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
Dim ds AS MapXLib.Dataset
Dim Flds AS MapXLib.Fields
‘綁定
SET Lyr=MainMap.Layers.Item(LayerName)
SET ds=Lyr.Datasets.Item(1)
Set Flds=ds.Fields
SET FeaFac=mainmap.featurefactory
‘設(shè)置點(diǎn)對(duì)象樣式
With NewStyle
.SymbolType = miSymbolTypeBitmap
.SymbolBitmapSize = 24
.SymbolBitmapTransparent = False
.SymbolBitmapName = "YIEL2-32.BMP"
End With
Mainmap.AutoRedraw=False ‘禁止自動(dòng)刷新
Lyr.Editable=True ‘置當(dāng)前圖層為可寫狀態(tài)
‘創(chuàng)建點(diǎn)對(duì)象
pnt.set X1,Y1
‘創(chuàng)建圖形
Set Ftr=FeaFac. CreateSymbol (Pnt,Newstyle) ‘創(chuàng)建符號(hào)
‘Set Ftr=FeaFac. CreateSymbol (Pnt,MainMap.DefaultStyle)
‘設(shè)置屬性
For I=1 to Flds.Count
Lyr.KeyFields=Flds.Item(i).Name
Ftr.KeyValue=ValueStr(I) ‘這里并沒(méi)有對(duì)字段類型進(jìn)行判斷
Next
‘另外一種方法:使用RowValues和RowValue對(duì)象
‘添加
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、 創(chuàng)建表
(1) 臨時(shí)表:
A、用MainMap.Layers.CreateLayer方法創(chuàng)建臨時(shí)表。但這個(gè)臨時(shí)表只有一個(gè)字段:GeoNa
me( Char 24)。程序運(yùn)行過(guò)程中該表存放位置為系統(tǒng)臨時(shí)文件夾下
B、使用LayerInfo對(duì)象創(chuàng)建臨時(shí)表,可以指定字段。示例:
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
Flds.AddIntegerField "Length"
´
LayerInfo.Type = miLayerInfoTypeTemp
LayerInfo.AddParameter "FileSpec", FileName
LayerInfo.AddParameter "NAME", LayerName
LayerInfo.AddParameter "Fields", Flds
Set Lyr = MainMap.Layers.Add(LayerInfo, 1)
Set Lyr = Nothing
Set LayerInfo = Nothing
(2) 創(chuàng)建永久表
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
Flds.AddIntegerField "Length"
´
LayerInfo.Type = miLayerInfoTypeNewTable
LayerInfo.AddParameter "FileSpec", FilePath + "" + FileName
LayerInfo.AddParameter "NAME", LayerName
LayerInfo.AddParameter "Fields", Flds
Set Lyr = MainMap.Layers.Add(LayerInfo, 1)
Set Lyr = Nothing
Set LayerInfo = Nothing
5、 創(chuàng)建工具句柄
系統(tǒng)已經(jīng)定義工具句柄都以整數(shù)(包括16進(jìn)制)常數(shù)存在,句柄號(hào)大于1000和小于12基本都為系統(tǒng)使用。
A. 定義常數(shù):必須為全局變量
Global Const CreateSymbolTool = 13 ´創(chuàng)建節(jié)點(diǎn)
Global Const CreateLineTool = 15 ´創(chuàng)建管線
Global Const InfoTipTool = 16 ´信息工具
Global Const MoveFeature = 17 ´移動(dòng)地圖
Global Const ScaleDistanceTool = 18 ´測(cè)量?jī)牲c(diǎn)間的距離
B. 使用CreateCustomTool創(chuàng)建新的工具句柄:
MainMap.CreateCustomTool CreateSymbolTool, miToolTypePoint, miSymbolCursor
MainMap.CreateCustomTool CreateLineTool, miToolTypeLine, miCrossCursor
MainMap.CreateCustomTool InfoTipTool, miToolTypePoint, miCrossCursor
MainMap.CreateCustomTool MoveFeature, miToolTypeLine, miPanCursor
MainMap.CreateCustomTool ScaleDistanceTool, miToolTypeLine, miPanCursor
C. 如何使用?
在Map對(duì)象的ToolUsed事件的ToolNum參數(shù)為當(dāng)前所激活的工具使當(dāng)前操作指向某行為:MainMap.CurrentTool=工具句柄號(hào),如放大:MainMap.CurrentTool=miZoomInTool,移動(dòng)圖元:MainMap.CurrentTool=MoveFeature
操作具體的工具句柄時(shí),執(zhí)行該捕捉到的工具句柄的代碼:
在ToolUsed事件中:
Select Case ToolNum
Case MoveFeature
‘執(zhí)行代碼
End Select
刪除圖元:Lyr.DeleteFeature Ftr
三、查詢
1、 屬性查找。Find、Search方法:注意的是Find方法只支持TAB表文件,不支持空間數(shù)據(jù)表。
Find :與FoxPro中Locate定位命令想類似。
Search:支持SQL語(yǔ)句。寫法:僅指SQL語(yǔ)句的WHERE 部分,且From語(yǔ)句中只能有一個(gè)表——僅對(duì)單表進(jìn)行操作:
Select * from LayerName WHERE ID LIKE “%北京%”
示例:
A、查找
Dim Ftrs AS MapXlib.Features ‘圖元集合
SET Ftrs=Lyr.Search(“ID LIKE ““%北京%”””)
For I=1 to Ftrs.Count
‘執(zhí)行語(yǔ)句
Next
B、高亮顯示
Lyr.Selection.ReplaceFtrs ‘將當(dāng)前查詢所得的結(jié)果集全部高亮顯示(隱含執(zhí)行:Lyr.ClearSelection語(yǔ)句)——加入selection集合閃爍:不能用Selection,否則會(huì)對(duì)整個(gè)屏幕進(jìn)行整個(gè)刷新(抖動(dòng))。使用更新Style的方法進(jìn)行選定圖元的閃爍。
記載圖元的老樣式:Set Oldsytle=Ftr.Style
Lyr.Selection.Add Ftrs ‘將當(dāng)前查詢所得的結(jié)果集添加到已有的結(jié)果集中,再全部高亮顯示
C、對(duì)查詢的結(jié)果集進(jìn)行屬性修改
示例程序:完成的是Professional中信息工具功能
Dim ds AS MapXlib.Dataset
Dim Flds AS MapXlib.Fields
Dim Ftr AS MapXlib.Feature
Set Lyr=MainMap.Layers.Item(LayerName)
Set ds=Lyr.Datasets.item(1)
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.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
‘設(shè)置樣式
End With
MainMap.AuyoRedraw=False
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、 空間查找
² 點(diǎn)查找:SearchAtPoint,結(jié)果集為Features類型
Dim Pnt AS MapXlib.Point
Pnt.Set X,Y
Set Ftrs=Lyr.SearchAtPoint(Pnt,miSearchResultAll)
For I=1 to Ftrs.Count
‘執(zhí)行語(yǔ)句
Next
注意:點(diǎn)查找時(shí),一般情況下結(jié)果集在一個(gè)以上的圖層都存在。所以取值時(shí)應(yīng)分別提取
² 園查找:在臨時(shí)圖層上畫一個(gè)不保存的圓,然后查找被這個(gè)圓所包含的所有圖層的圖元對(duì)象。
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, MainMap.MapUni
t,,)
‘miSearchTypeCentroidWithin :中心點(diǎn)包含
‘miSearchTypePartiallyWithin :部分包含
‘miSearchTypeEntirelyWithin :全部包含
Set Ftrs=Lyr.SearchWithinFeature (TempCir, miSearchTypePartiallyWithin)
For I=1 to Ftrs.Count
‘執(zhí)行語(yǔ)句
Next
SET Pnt =Nothing
set TempCir =Nothing
set FeaFac =Nothing
3、 相交
判斷兩個(gè)圖元是否有交點(diǎn)以及交點(diǎn)坐標(biāo)信息。
(1)判斷是否相交
IF Lyr.IntersectionTest( ftr1, ftr2, miIntersectFeature ) THEN
‘交點(diǎn)
END IF
(2)獲取相交點(diǎn)坐標(biāo)信息
‘交點(diǎn)
Dim Ftr AS MapXlib.Feature
SET Ftr=MainMap.FeatureFactory. IntersectFeatures(Ftr1,Ftr2)
‘交點(diǎn)坐標(biāo)信息
For J=1 to Ftr.parts.item(1).count
X1= Ftr.parts.item(1).Item(J).X
Y1= Ftr.parts.item(1).Item(J).Y
Next
4、 測(cè)距
使用Map對(duì)象的Distance方法。如何測(cè)量任意多邊形的周長(zhǎng)?
使用累加的方法,還要使用圖元節(jié)點(diǎn)集合。
DistanceValue=0
‘第一個(gè)點(diǎn)
Pnt.Set Ftr.Parts.Item(1).Item(1).X, Ftr.Parts.Item(1).Item(1).Y
For j=2 TO Ftr.Parts.Item(1).Count
‘累加
X1= Ftr.Parts.Item(1).Item(j-1).X
Y1= Ftr.Parts.Item(1).Item(j-1).Y
X2= Ftr.Parts.Item(1).Item(j).X
Y2= Ftr.Parts.Item(1).Item(j).Y
DistanceValue = DistanceValue +MainMap.Distance(X1, Y1, X2, Y2)
Next
‘多邊形周長(zhǎng)
Msgbox DistanceValue+” ”+MainMap.MapUnit
四、對(duì)象編輯
(1)、對(duì)屬性的編輯
主要使用Fields對(duì)象。示例:
Dim Flds AS MapXlIB.Fields
‘修改當(dāng)前圖層的每一個(gè)字段
For J=1 to Flds.Count
Lyr.KeyField= Flds.Item(j).Name ‘使當(dāng)前圖層指向J字段
‘更新當(dāng)前圖元的J字段值
Ftr.KeyValue=NewValueStr(J)
Ftr.Update True ‘并未寫入硬盤
Next
Lyr.Refresh ‘保存修改到硬盤
(2)、移動(dòng)地圖
首先創(chuàng)建一個(gè)移動(dòng)工具句柄
MainMap.CreateCustomTool MoveFeature, miToolTypeLine, miPanCursor
在Map對(duì)象的ToolUsed事件的ToolNum參數(shù)為當(dāng)前所激活的工具捕捉MoveFeature工具句柄‘傳過(guò)來(lái)的參數(shù):X1,Y1,X2,Y2
Select case ToolNum
……..
Case MoveFeature
Dim Lyr AS MapXlib.Layer
Dim Ftr AS MapXlib.Feature
Dim Ftrs AS MapXlib.Features
Dim Xe,Ye AS Double ‘坐標(biāo)偏移量
Xe=X2-X1
Ye=Y2-Y1
Set Lyr=Mainmap.Layers.Item(LayerName)
Set Ftrs=Lyr.Selection.Clone ‘將當(dāng)前圖層中選定的集合復(fù)制到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 Select
(3)、樣式更新
Dim NewStyle AS MapXLib.Style
‘初始賦值
Set Lyr=MainMap.Layers.Item(LayerName)
Set Ftrs=Lyr.AllFeatures
Set NewStyle=Ftrs.Item(1).Style
‘設(shè)置樣式
With NewStyle
.SymbolType = miSymbolTypeBitmap
.SymbolBitmapSize = 24
.SymbolBitmapTransparent = False
.SymbolBitmapName = "YIEL2-32.BMP"
End With
‘更新
MainMap.AutoRedraw=False
Lyr.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、復(fù)制、粘貼
Global CopyFtrs AS MapXlib.Features
Set lyr=mainmap.Layers.item(LayerName)
Set Ftrs=Lyr.Selection.Clone ‘復(fù)制選中集合
‘復(fù)制
For I=1 to Ftrs.Count
CopyFtrs.add Ftrs.Item(I)
Next
‘粘貼(圖形)
Set lyr_1=mainmap.Layers.item(LayerName_1)
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
iScaleMode = MainMap.Container.ScaleMode
MainMap.Container.ScaleMode = 6
On Error GoTo PrinterError
Printer.Print " "
Printer.CurrentX = 0
Printer.CurrentY = 0
MainMap.PrintMap Printer.hDC, 0, 0, MainMap.Width * 100, MainMap.Height * 10
0
Printer.NewPage
Printer.EndDoc
MainMap.Container.ScaleMode = iScaleMode
Exit Sub
PrinterError:
If Err.Number = 482 Then
On Error Resume Next
CommonDialog1.Flags = &H40
CommonDialog1.ShowPrinter
Else
MsgBox " 打印機(jī)存在錯(cuò)誤,請(qǐng)更正后重試。錯(cuò)誤號(hào):" + (Str(Err.Number)),
, "失敗"
End If
4、另存為圖片文件
MainMap.ExportMap(App.Path+”Images”, miFormatJPEG) ‘輸出當(dāng)前地圖窗口
參數(shù)設(shè)置:MainMap.ExportSelection=True ‘將選中部分以不同于其他未選中地圖部分
形式輸出
六、專題圖
6種專題圖:除獨(dú)立值專題圖綁定的字段類型可以是字符的以外,都必須是數(shù)字類型。與其
他數(shù)據(jù)源綁定時(shí),使用ODBC
調(diào)用ThemeDlg對(duì)話框可以讓用戶自己定義專題圖。示例:
For Each ftr In lyr.Selection
' The children of the layer are the individual
' features
Set ftrNode = QueryTree.Nodes.Add(lyrNode, tvwChild,lyr.Name _
& 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
QueryTree.Nodes.Add ftrNode, tvwChild, , lyr.KeyField _
& ": " & ftr.KeyValue
Next
Next
七、在MapX下緊縮表
在Professional里面,緊縮表用 Pack Table 語(yǔ)句完成。而在MapX中則需要使用臨時(shí)圖層
,并用復(fù)制技術(shù)來(lái)完成。示例:
‘緊縮當(dāng)前Map對(duì)象中的所有圖層
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
On Error Resume Next
For I = MainMap.Layers.Count To 1 Step -1
´復(fù)制源表數(shù)據(jù)到臨時(shí)表
Set Lyr = MainMap.Layers.Item(I)
Set Ds = Lyr.Datasets.Item(1)
Set Flds = Ds.Fields
LayerName = Lyr.Name
LayerInfo.Type = miLayerInfoTypeTemp
LayerInfo.AddParameter "FileSpec", LayerName
LayerInfo.AddParameter "NAME", LayerName
LayerInfo.AddParameter "Features", Lyr.AllFeatures‘復(fù)制所有有效圖元
LayerInfo.AddParameter "Fields", Flds ’復(fù)制字段列表
LayerInfo.AddParameter "AutoCreateDataset", 1
LayerInfo.AddParameter "datasetname", LayerName
Set LyrTemp = MapTemp.Layers.Add(LayerInfo, 1) ‘復(fù)制到另外Map對(duì)象
´刪除源表
Set Lyr = Nothing
FilePath = MainMap.Layers.Item(I).Filespec
LayerName = Mid(FilePath, InStr(1, FilePath, "Maps") + 6, Len(FilePath)
- InStr(1, FilePath, "Maps"))
FilePath = Mid(FilePath, 1, InStr(1, FilePath, "Maps") + 5)
LayerName = Mid(LayerName, 1, Len(LayerName) - 4)
MainMap.Layers.Remove (I)
MainMap.Refresh
Kill FilePath + LayerName + ".TAB"
´復(fù)制臨時(shí)表數(shù)據(jù)到源表
Set LyrTemp = MapTemp.Layers.Item(LayerName)
LayerInfo.Type = miLayerInfoTypeNewTable
LayerInfo.AddParameter "FileSpec", FilePath + LayerName + ".TAB"
LayerInfo.AddParameter "NAME", LayerName
LayerInfo.AddParameter "Features", LyrTemp.AllFeatures
LayerInfo.AddParameter "Fields", Flds
LayerInfo.AddParameter "AutoCreateDataset", 1
LayerInfo.AddParameter "datasetname", LayerName
Set Lyr = MainMap.Layers.Add(LayerInfo, 1)
´刪除臨時(shí)表
MapTemp.Layers.Remove (MapTemp.Layers.Count)
MapTemp.Refresh
Next
Set Lyr = Nothing
Set Ds = Nothing
Set Flds = Nothing
Set LayerInfo = Nothing
八、如何和大型數(shù)據(jù)庫(kù)關(guān)聯(lián)
系統(tǒng)是混合結(jié)構(gòu):對(duì)地圖的訪問(wèn)使用的是文件訪問(wèn)方式,對(duì)屬性數(shù)據(jù)的訪問(wèn)使用的是大型數(shù)據(jù)庫(kù)形式使用ID關(guān)聯(lián):在TAB表和數(shù)據(jù)庫(kù)中有ID字段,兩個(gè)字段作為唯一值關(guān)聯(lián)字段。(一對(duì)一的關(guān)系)。示例:
Lyr.KeyField=”ID”
Set Ftr=Ftrs.Item(J)
‘SQL語(yǔ)句查找對(duì)應(yīng)的屬性信息
SampleAdo.RecordSource =”Select a.id as id,b.name as name from Table1 a, Tabl
e2 b WHERE (a.id=b.id) AND ( a.id LIKE ‘%“ +Ftr.KeyValue+“%’)”
九、空間數(shù)據(jù)庫(kù)
’空間數(shù)據(jù)庫(kù)中的索引技術(shù)用的是R_Tree技術(shù),而不是原來(lái)一般意義上的B_Tree索引技術(shù)。
’空間數(shù)據(jù)在Spatial中以地理屬性信息形式存放。
’在Oracle的版本中有如下需要注意事項(xiàng):
a) Oracle 8.1.5這個(gè)版本中,首次引入Spatial組件。使用上非常不好:圖形的樣式非常單一,且為黑白的而非彩色,上載地圖數(shù)據(jù)時(shí),數(shù)據(jù)丟失非常嚴(yán)重。存取數(shù)據(jù)時(shí)非常慢。在Spatial中自動(dòng)創(chuàng)建prinx字段作為地圖索引主關(guān)鍵字段
b)Oracle8.1.6版本:圖形為彩色的,增加了樣式的支持,但不支持同一圖層下的多樣式(主要指點(diǎn)對(duì)象)。創(chuàng)建地圖數(shù)據(jù)時(shí),地圖的坐標(biāo)常發(fā)生偏移。屬性數(shù)據(jù)更新時(shí),需要兩次刷新才能完整提交;地圖數(shù)據(jù)數(shù)據(jù)提交時(shí),其坐標(biāo)發(fā)生偏移:向原點(diǎn)偏移,需要認(rèn)為地單獨(dú)將其移動(dòng)到其初始創(chuàng)建位置。存取速度上還是比較慢,離實(shí)用尚有一定距離。在Spatial中自動(dòng)創(chuàng)建mi_prinx字段作為地圖索引主關(guān)鍵字段
² Oracle 8.1.7版本:支持多樣式,數(shù)據(jù)上載丟失非常?。ㄖ挥形谋緦?duì)象存在丟失的記錄)。在地圖數(shù)據(jù)存取不是很大的時(shí)候,速度上可以被用戶接受。
² 如何將MapInfo 的TAB表內(nèi)容上傳到Oracle 中?
a) 免費(fèi)工具:easyloader6.7(Oracle 8.1.7),下載地址:www.mapinfo.com.cn
b) 如何上載?注意:上載之前對(duì)Tab表進(jìn)行緊縮。
c) 在程序中如何使用空間數(shù)據(jù)庫(kù)中的地圖數(shù)據(jù)?
d) 添加地圖時(shí),必須指定字段mi_prinx的明確值,且該值不能為表中已存在的值。寫入地圖數(shù)據(jù)時(shí),應(yīng)將其全部NOT NULL 字段值賦給,否則保存失敗。
e) 示例:Tab表+空間數(shù)據(jù)表 的數(shù)據(jù)分布形式。
十、GIS應(yīng)用的分發(fā)
1、 制作你自己的系統(tǒng)的安裝盤:可執(zhí)行文件、必要系統(tǒng)文件、運(yùn)行庫(kù)文件、其他數(shù)據(jù)文件。
2、 單獨(dú)的MapX安裝盤:MapInfo MapX Runtime安裝程序,實(shí)際上是MapX控件安裝程序(存在于MapX sdk包)
3、注冊(cè):安裝完成以后,運(yùn)行GeosetManager40.exe程序獲得硬件ID號(hào),然后通過(guò)EMAIL的形式將該ID號(hào)發(fā)送到MapX產(chǎn)品供應(yīng)商申請(qǐng)正式的許可文件(mapx40.lic)。獲得后覆蓋原mapx40.lic文件即可。注意:硬盤格式化后該ID號(hào)失效。
十一、構(gòu)造一個(gè)GIS應(yīng)用系統(tǒng)
需求:鷹眼功能、拓?fù)潢P(guān)系、不同圖形不同顏色表現(xiàn)、數(shù)據(jù)綁定、系統(tǒng)性能。
結(jié)構(gòu)分析:做基于TAB文件的GIS系統(tǒng)
1、 鷹眼功能
(1) 建立兩個(gè)Form對(duì)象,將兩個(gè)Map對(duì)象分別放在這兩個(gè)窗口對(duì)象中。
(2) 一個(gè)小窗口作為鷹眼窗口,大 窗口作為主地圖窗口。鷹眼窗口中的Map對(duì)象的視野應(yīng)很大,而主地圖窗口的視野根據(jù)需要設(shè)置。
(3) 兩個(gè)窗口中加載不同的GST文件。需要的是主地圖窗口的顯示范圍應(yīng)為鷹眼窗口中某個(gè)矩形所包含的地圖對(duì)象范圍。
(4) A、在鷹眼窗口中畫一個(gè)矩形(Rect為矩形對(duì)象),B、主地圖窗口執(zhí)行 Set MainMap.Bounds = Rect
(5) 需要注意的是:鷹眼窗口與主地圖窗口兩者間的坐標(biāo)投影系統(tǒng)應(yīng)完全一致。
2、 拓?fù)潢P(guān)系
實(shí)際上就是圖元與圖元的空間關(guān)系。說(shuō)歷史:原來(lái)建立拓?fù)潢P(guān)系使用的是屬性關(guān)聯(lián)。
點(diǎn)查詢、圓查詢、矩形查詢、多邊形查詢等這些是屬于簡(jiǎn)單空間關(guān)系的對(duì)比。而對(duì)拓?fù)潢P(guān)系的查詢多數(shù)情況下使用Parts對(duì)象來(lái)解決。
Ftr1與另一個(gè)Ftr2的空間關(guān)聯(lián):先找到Ftr1的其止節(jié)點(diǎn),然后以這個(gè)節(jié)點(diǎn)為中心畫一個(gè)非常小的圓,在這個(gè)圓范圍內(nèi)的某個(gè)設(shè)備可認(rèn)為與該Ftr1相連。
判斷某個(gè)圖元在指定圖層上的相交對(duì)象集合:
Set Ftrs=Lyr.SearchWithinFeature (SearchFtr, miSearchTypePartiallyWithin)
3、 不同圖形不同顏色表現(xiàn)
(1)更新樣式 再結(jié)合臨時(shí)圖層就可以很好解決(使用圖層刷新)。而且刷新時(shí)不會(huì)引起整個(gè)Map對(duì)象的刷新(屏幕抖動(dòng))
(2)專題圖 存在更新屬性值后不能實(shí)時(shí)刷新專題圖的問(wèn)題。
4、 數(shù)據(jù)綁定
對(duì)未綁定的屬性集合使用 MainMap.Datasets.ADD
地圖集合和屬性集合為一個(gè)數(shù)據(jù)集合的不可分割的兩個(gè)部分
5、 系統(tǒng)性能
速度是否為用戶所接受、系統(tǒng)是否穩(wěn)定(界面要求)、修改數(shù)據(jù)數(shù)據(jù)的時(shí)候是否存在數(shù)據(jù)一致性維護(hù)問(wèn)題、造價(jià)是否合理。
(1)速度:使用數(shù)據(jù)分布可以較好地解決:地圖數(shù)據(jù):地形圖數(shù)據(jù)以文件形式存放,業(yè)務(wù)地圖數(shù)據(jù)存放在空間數(shù)據(jù)庫(kù)中;屬性數(shù)據(jù):全部存放在大型數(shù)據(jù)庫(kù)中。
(2)系統(tǒng)是否穩(wěn)定(界面要求):A、字段全部用英文,B、地圖拓?fù)潢P(guān)系在進(jìn)入系統(tǒng)以前進(jìn)行必要的驗(yàn)證,C、文件地圖數(shù)據(jù)中字段數(shù)減少到最小,可使訪問(wèn)屬性頻率大大減少,可有效保證其他用戶訪問(wèn)時(shí)不會(huì)大量出現(xiàn)訪問(wèn)拒絕的現(xiàn)象;D、數(shù)據(jù)提交時(shí)盡可能采用事務(wù)機(jī)制:事務(wù)開始: Lyr.BeginAccess,事務(wù)結(jié)束:Lyr.EndAccess;E、數(shù)據(jù)修改提交時(shí)盡可能采用批量提交。至于界面要求,應(yīng)主要滿足從地圖對(duì)象獲取相關(guān)的要求。
(3)數(shù)據(jù)一致維護(hù):遵循圖元優(yōu)先的原則。圖形對(duì)象必須首先存在,其他相關(guān)信息在此基礎(chǔ)上建立。注意:
² 修改時(shí)應(yīng)先修改地圖對(duì)象,后提交屬性信息
² 刪除時(shí)應(yīng)先刪除其他信息,最后刪除圖形信息
(4)造價(jià) 這里主要指平臺(tái)費(fèi)用。A、現(xiàn)有數(shù)據(jù)格式,B、功能要求:空間分析是否復(fù)雜、地圖圖層是否分散、系統(tǒng)中地圖輸出的質(zhì)量要求、系統(tǒng)中統(tǒng)計(jì)分析復(fù)雜程度是否較繁瑣、直接的平臺(tái)使用用戶數(shù)(并發(fā)數(shù))。
聯(lián)系客服