免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 1950|回复: 1
收起左侧

MapX教程之数据库绑定篇教程

[复制链接]

1986

主题

10万

铜板

98

好友

技术员

Network change life, change t

积分
17879

斑竹勋章地信元老

QQ
发表于 2009-12-15 09:07 | 显示全部楼层 |阅读模式
第一部分 罗里罗嗦
GIS空间数据(包含属性数据)存储的方式主要有三种:
1、地图文件+属性关系数据库表的混和方式,目前主流方式,如MapInfo一个图层,*.map
文件存储空间地图数据,*.tab以关系数据库表的形式存储属性数据。
2、关系数据库表中有一个特殊字段存储二进制的空间对象数据。这个我把它称为半关系型
空间数据库。比如geomedia
3、全关系型空间数据库。空间对象的坐标位置信息以一定的机制(不是单个二进制大对象
)全部存入关系数据库。如Esri的Geodatabase
MapX的开发者肯定有很多是熟悉MapInfo的。在MapInfo里面打开一个地图,同时就可以打
开一个浏览表浏览空间对象的属性。这是因为图层与数据库表进行了预先绑定。
但是如果开发者用MapX打开一个个图层之后,他可能会发现这些图层的属性不知道去哪里
去找了。这是因为MapX没有再为我们预先绑定空间数据和属性数据库了。在mapx下,一个
图层的空间数据和属性数据分别用layer对象和dataset对象完全分开管理。这样的好处就
在于为扩大了属性数据的来源。你可以为一个layer的空间对象绑定多个数据库表。而且用
主流关系型数据库软件来管理属性数据可比一个单纯的*.tab好多啦!(其实mapinfo也为
我们提供了许多绑定和操作外部数据库的工具,我们不常用而已)
那如何在mapx里用语句绑定外部的数据库呢?跟我来
首先我还得罗嗦两句MapX这个控件。MapX控件提供了几十个对象,这些对象又通过其属性
方法实现了MapInfo大部分的GIS功能。在MapX提供的对象里面有几个我们要特别关注,因
为我们要经常用到它们:
Layer对象、Layers集合。用于管理图层。
Dataset对象、datasets集合。用于管理属性数据集,可以看作一个数据库的记录集。不过
dataset必须绑定于某一个layer对象上。
Annotation对象、Annotations集合,管理注记。
Feature对象,Features集合。用于管理空间对象。Feature可以是某一layer上的对象,也
可以是不属于某一层的独立的(stand-alone)对象。
FeatureFactory对象。用于对feature进行一些空间操作。比如buffer、创建对象、求对象
相交等
第二部分 言归正传
言归正传,讲MapX里绑定数据库表的方法。
其实说到底只需要一个方法就可以了——Map.Datasets.Add
我以一个实例来讲解这个方法的用法。
假设MapX已经打开一个图层,图层名为"a",手头还有一个Access数据库a.mdb,数据库里面
有个表X想和a图层绑定。我们保证a层属性里面有一个字段ID1与表X的一个字段ID2是匹配
的!!
OK, let′s begin。
第一步,数据库的连接
各式各样的数据库要连进VB、VC,就需要二传手——DAO、ADO、RDO等等
我们在VB里面用ADODC这个控件在设计时就可以把a.mdb连接进来,把表X作为一个records
et。当然也可以用语句
conn = &quotrovider=Microsoft.Jet.OLEDB.4.0;Data Source=a.mdb;Persist Security In
fo=False"
With Adodc1
.ConnectionString = conn
.RecordSource = "Select * From X"
.Refresh
End With
其它关系数据库(Oracal、SQL Server)的表也完全可以通过ADODC连接进来。只是连接字
符串里面的Provider不同罢了。
第二步,layer与数据库的绑定
Datasets.add 方法
第一个参数 Type。他可以绑定多达13种的数据源,比如ADO、DAO、ODBC等等。这里我们当
然用miDataSetADO
第二个参数 SourceData。指定数据源。我们的数据源是表X。我们已经指定表X是Adodc1的
当前记录源。该参数即为 adodc1.recordset
第三个参数 Name。指定被绑定后的dataset的名称。可选
第四个参数 GeoField。指定数据源中某个字段作为与layer匹配的字段。如果不选,MapX
会自动帮你找一个的。这里我们是ID2
第五个参数 SecondaryGeofield。指定数据源第二匹配字段。如果指定的第一匹配字段中
两个值相等,就靠它来找到对应的对象了。一般不用
第六个参数 BindLayer。指定绑定到哪一层。可以用层名,也可以用Layer对象。我们例子
里面图层是a,将其作为参数。如果不指定,MapX也会自动帮你找一个的。(呵呵蛮智能的
吧)
第七个参数 Fields。 指定数据源中哪些字段参与绑定。
第八个参数 Dynamic。指定是否是动态绑定。缺省为false。动态绑定就是要用这个datas
et时MapX再临时绑定数据到对象上
讲解完了参数的用法,我们的语句也就出来了:
dim MyDataset as Dataset
set MyDataset=Map1.Datasets.Add(miDataSetADO, Adodc1.recordset, "MyDataset", "
ID2", , "a")
这一句里面,"ID2"和"a"如果不写也不会影响结果,因为MapX会自动去寻找最符合要求的
字段和被绑定图层的。但是作为一种良好的编程风格,最好指定!

第三步,尽情的用你的dataset吧
绑定了dataset,一个图层才具有了属性的数据。你才可以进行很多功能的实现。比如说取
值赋值、专题制图等等

第三部分 你问我答
问:dataset不是绑定到具体layer上吗?怎么不可以用Layer.datasets.add方法实现?
答:这是MapX的规定。它把被绑定layer作为参数,而不是作为绑定的出发点。实际上,L
ayer.Datasets其实只是一个只读的集合,只能读取绑定到该层上的若干个dataset
问:我如果想绑定table文件自带的属性怎么做?
答:最easy了。set Mydataset= datasets.add (miDataSetLayer, 某个layer对象) OK
,后面的参数都不需要!!
问:我绑了半天,还是出现这样的错误——InValid GeoField specified. Name not fou
nd, or index out of range. 我快发疯了,为什么啊??
答:先别发疯。检查一下几点:
你确定你的layer图层有一个字段和数据源的某一个字段肯定匹配??
图层中该字段是否是索引字段???这一点很重要!!检查方法,用mapinfo打开table,
查看其表结构,如果该字段“索引”(indexed)没有打上勾,please勾上!
应该ok了,恭喜你不用去疯人院了。
问:我还是弄不明白怎么办??
答:我也不知道怎么办了~~~
轻轻的我来签到了,想带走一堆铜板...

1145

主题

10万

铜板

2

好友

传奇会员

Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30

积分
21818

灌水勋章活跃勋章冰雪节勋章

QQ
发表于 2013-11-10 20:14 | 显示全部楼层
进来看看 学习学习

评分

参与人数 1铜板 +1 收起 理由
admin + 1 亲,你好快哦~~~

查看全部评分

加强科技支撑和引领  实现地质找矿新突破 。     
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表