1.问题描述
使用MAPX在地图上显示几个点,其中点的坐标(经度和纬度)存放在ACCESS数据库中,点的属性信息也存放在ACCESS数据中。实现“点图层”和属性数据的绑定。注意,在图层和外部数据库绑定之前,图层中必须要有图元(这里就是各个点)。如果图层中是空的,是没有办法和外部数据进行绑定的,而且图层中图元的数量和数据库中的记录数量应该保持一致。(在一开始进行数据绑定实验时,由于图层中图元是空的,因此绑定失败。而且有一次图层中图元的数量和数据库中的记录数不同,也绑定失败)
2.ACCESS数据库
这里新建一个pos.mdb ACCESS数据库,其中有两个表,一个是pointbiao,另一个是posbiao。在pointbiao中有三个字段,ID(点的标识,字符类型),corX(点的经度,数值类型),corY(点的纬度,数值类型),pointbiao中记录了点的空间信息(经纬度),等会要用这个表来生成点图层。posbiao中有两个字段,其中一个是ID(点的标识),另一个字段是position(点的地址,字符类型)。如图1为两个数据库的内容
这里以六个城市中的某个坐标点为例。
3.点图层的生成
用VB编程,gst地图采用mapx自带的china.gst地图。由于china.gst地图中不包含点图层,因此要用pos.mdb中的pointbiao中的数据生成点图层。方法如下:
1.使用mapinfo新建一个图层(保存为point.tab),其中的字段有三个:ID,corX,corY,和pointbiao表中的字段保持一致,如图2所示
2.使用geoset manager工具把point图层插入到china.gst中,并保存
3.使用pointbiao中的坐标数据,在point图层中增加并显示这六个点。在VB工程中添加一个mapx对象,名字为map1,VB代码如下:
在这Private Sub Form_Load()
Map1.GeoSet = "C:\myproj\proj07162\china.gst"
Map1.CenterX = 118.506309
Map1.CenterY = 36.341393
Map1.Zoom = 900
End Sub
Private Sub Command1_Click()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim str As String
'使用ADO方式连接数据库
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\pos.mdb"
If conn.State <> adStateOpen Then
MsgBox "数据库打开错误"
End If
str = "select * from pointbiao"
With rs
.ActiveConnection = conn
.CursorLocation = adUseClient
.LockType = adLockBatchOptimistic
.Open str
End With
Dim ptdatas As New MapXLib.Dataset
Dim rvsdata As New MapXLib.RowValues
Dim lyr As New MapXLib.Layer
Dim ftrefact As New MapXLib.FeatureFactory
Dim fiedmdb As ADODB.Field
Dim i%
Dim apoint As New MapXLib.Point
Dim aptftre As New MapXLib.Feature
Set lyr = Map1.Layers(1) '这里lyr为MAP1的第一个图层,也就是point图层
Set ptdatas = Map1.DataSets.Add(miDataSetLayer, lyr) '把point图层和其属性数据绑定(数据绑定的mapinfo表方式)
Set rvsdata = ptdatas.RowValues(0)
rs.MoveFirst
Set ftrefact = Map1.FeatureFactory
Dim checkftre As New MapXLib.Features
Do Until rs.EOF
i = 0
'查看图层中是否有ID为rs.Fields(i).Value的图元
Set checkftre = lyr.Search("ID=" & """" & rs.Fields(i).Value & """")
If checkftre.Count = 0 Then '如果图层中没有该图元,则添加
For Each fiedmdb In rs.Fields
'把pointbiao中的数据(ID,corX,corY)复制到point图层绑定的数据集中
rvsdata.Item(fiedmdb.Name).Value = rs.Fields(i).Value
i = i + 1
Next fiedmdb
'在point图层中增加一个点图元
apoint.Set rs.Fields("corX"), rs.Fields("corY")
Set aptftre = ftrefact.CreateSymbol(apoint)
Debug.Print apoint.X, apoint.Y
Set aptftre = lyr.AddFeature(aptftre, rvsdata)
End If
rs.MoveNext
Loop
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Set ftrefact = Nothing
End Sub里插入代码片
执行该段代码之后,就会把pointbiao中的六个点在地图中显示出来。这样point图层中就已经有了6个点,接下来就可以实现图层和属性数据的绑定了。
4.图层和数据的绑定
接下来我们把point图层中的六个点和pos.mdb数据库中的posbiao表中的六个数据进行绑定(posbiao中的数据为这六个点的属性数据),绑定时,使用ADO方式,索引字段为“ID”,以下为VB代码
Private Sub Command3_Click()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim str As String
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\pos.mdb"
If conn.State <> adStateOpen Then
MsgBox "数据库打开错误"
End If
str = "select * from posbiao"
With rs
.ActiveConnection = conn
.CursorLocation = adUseClient
.LockType = adLockBatchOptimistic
.Open str
End With
Dim ds As New MapXLib.Dataset
Dim lyr As New MapXLib.Layer
Set lyr = Map1.Layers(1) 'point图层
Dim fs As New MapXLib.Features
Dim i As Integer
'把point图层和posbiao中的数据绑定,索引字段为ID
Set ds = Map1.DataSets.Add(miDataSetADO, rs, "mydataset", "ID", , lyr)
'读取数据集中的内容
If Map1.DataSets.Count > 0 Then
For i = 1 To ds.RowCount
'输出数据集ds中第i行的第2个字段的值
'ds.RowValues(1)为posbiao中的第1行;
'ds.RowValues(1).Item(2)为posbiao中第1行的第2列
'ds.RowValues(i).Item(2).Value为posbiao中第1行第2列的值(青岛)
Debug.Print ds.RowValues(i).Item(2).Value
Next i
End If
End Sub
5.总结
1.先把采集的坐标数据存放在ACCESS数据库中,然后使用这些数据库中的坐标数据生成mapx中的图层;
2.图层中要先有图元,才能和属性数据库绑定;
3.图层中的图元数量和属性数据库中的记录数保持一致才行,否则就算进行数据绑定,也不会得到正确的结果。
本博客最早发表在CHINAUNIX
2018-07-17 18:17:12
http://blog.chinaunix.net/uid-11829250-id-5787609.html