MAPX中的数据绑定问题

1.问题描述

使用MAPX在地图上显示几个点,其中点的坐标(经度和纬度)存放在ACCESS数据库中,点的属性信息也存放在ACCESS数据中。实现“点图层”和属性数据的绑定。注意,在图层和外部数据库绑定之前,图层中必须要有图元(这里就是各个点)。如果图层中是空的,是没有办法和外部数据进行绑定的,而且图层中图元的数量和数据库中的记录数量应该保持一致。(在一开始进行数据绑定实验时,由于图层中图元是空的,因此绑定失败。而且有一次图层中图元的数量和数据库中的记录数不同,也绑定失败)

2.ACCESS数据库

这里新建一个pos.mdb ACCESS数据库,其中有两个表,一个是pointbiao,另一个是posbiao。在pointbiao中有三个字段,ID(点的标识,字符类型),corX(点的经度,数值类型),corY(点的纬度,数值类型),pointbiao中记录了点的空间信息(经纬度),等会要用这个表来生成点图层。posbiao中有两个字段,其中一个是ID(点的标识),另一个字段是position(点的地址,字符类型)。如图1为两个数据库的内容

在这里插入图片描述

图1

这里以六个城市中的某个坐标点为例。

3.点图层的生成

用VB编程,gst地图采用mapx自带的china.gst地图。由于china.gst地图中不包含点图层,因此要用pos.mdb中的pointbiao中的数据生成点图层。方法如下:
1.使用mapinfo新建一个图层(保存为point.tab),其中的字段有三个:ID,corX,corY,和pointbiao表中的字段保持一致,如图2所示

在这里插入图片描述

图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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值