yelong10
路人甲
路人甲
  • 注册日期2005-01-04
  • 发帖数9
  • QQ
  • 铜币124枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1262回复:1

分享;转mapx的数据绑定的实现

楼主#
更多 发布于:2005-08-08 09:53
<img src="images/post/smile/dvbbs/em11.gif" />
喜欢0 评分0
yelong10
路人甲
路人甲
  • 注册日期2005-01-04
  • 发帖数9
  • QQ
  • 铜币124枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2005-08-08 09:54
<P>好象没上传成功  就发全文吧(转贴)</P>
<P break-all; LINE-HEIGHT: 12pt">                             第一部分  罗里罗嗦<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">GIS空间数据(包含属性数据)存储的方式主要有三种:<BR>1、地图文件+属性关系数据库表的混和方式,目前主流方式,如MapInfo一个图层,*.map<BR>文件存储空间地图数据,*.tab以关系数据库表的形式存储属性数据。<BR>2、关系数据库表中有一个特殊字段存储二进制的空间对象数据。这个我把它称为半关系型<BR>空间数据库。比如geomedia<BR>3、全关系型空间数据库。空间对象的坐标位置信息以一定的机制(不是单个二进制大对象<BR>)全部存入关系数据库。如Esri的Geodatabase<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">MapX的开发者肯定有很多是熟悉MapInfo的。在MapInfo里面打开一个地图,同时就可以打<BR>开一个浏览表浏览空间对象的属性。这是因为图层与数据库表进行了预先绑定。<BR>但是如果开发者用MapX打开一个个图层之后,他可能会发现这些图层的属性不知道去哪里<BR>去找了。这是因为MapX没有再为我们预先绑定空间数据和属性数据库了。在mapx下,一个<BR>图层的空间数据和属性数据分别用layer对象和dataset对象完全分开管理。这样的好处就<BR>在于为扩大了属性数据的来源。你可以为一个layer的空间对象绑定多个数据库表。而且用<BR>主流关系型数据库软件来管理属性数据可比一个单纯的*.tab好多啦!(其实mapinfo也为<BR>我们提供了许多绑定和操作外部数据库的工具,我们不常用而已)<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">那如何在mapx里用语句绑定外部的数据库呢?跟我来<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">首先我还得罗嗦两句MapX这个控件。MapX控件提供了几十个对象,这些对象又通过其属性<BR>方法实现了MapInfo大部分的GIS功能。在MapX提供的对象里面有几个我们要特别关注,因<BR>为我们要经常用到它们:<BR>Layer对象、Layers集合。用于管理图层。<BR>Dataset对象、datasets集合。用于管理属性数据集,可以看作一个数据库的记录集。不过<BR>dataset必须绑定于某一个layer对象上。<BR>Annotation对象、Annotations集合,管理注记。<BR>Feature对象,Features集合。用于管理空间对象。Feature可以是某一layer上的对象,也<BR>可以是不属于某一层的独立的(stand-alone)对象。<BR>FeatureFactory对象。用于对feature进行一些空间操作。比如buffer、创建对象、求对象<BR>相交等<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">                           第二部分  言归正传<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">言归正传,讲MapX里绑定数据库表的方法。<BR>其实说到底只需要一个方法就可以了——Map.Datasets.Add<BR>我以一个实例来讲解这个方法的用法。<BR>假设MapX已经打开一个图层,图层名为"a",手头还有一个Access数据库a.mdb,数据库里面<BR>有个表X想和a图层绑定。我们保证a层属性里面有一个字段ID1与表X的一个字段ID2是匹配<BR>的!!<BR>OK, let&acute;s begin。<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">第一步,数据库的连接<BR>各式各样的数据库要连进VB、VC,就需要二传手——DAO、ADO、RDO等等<BR>我们在VB里面用ADODC这个控件在设计时就可以把a.mdb连接进来,把表X作为一个records<BR>et。当然也可以用语句<BR>conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=a.mdb;Persist Security In<BR>fo=False"<BR>With Adodc1<BR>   .ConnectionString = conn<BR>   .RecordSource = "Select * From X"<BR>   .Refresh<BR>End With<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">其它关系数据库(Oracal、SQL Server)的表也完全可以通过ADODC连接进来。只是连接字<BR>符串里面的Provider不同罢了。<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">第二步,layer与数据库的绑定<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">Datasets.add 方法<BR>第一个参数 Type。他可以绑定多达13种的数据源,比如ADO、DAO、ODBC等等。这里我们当<BR>然用miDataSetADO<BR>第二个参数 SourceData。指定数据源。我们的数据源是表X。我们已经指定表X是Adodc1的<BR>当前记录源。该参数即为 adodc1.recordset<BR>第三个参数 Name。指定被绑定后的dataset的名称。可选<BR>第四个参数 GeoField。指定数据源中某个字段作为与layer匹配的字段。如果不选,MapX<BR>会自动帮你找一个的。这里我们是ID2<BR>第五个参数 SecondaryGeofield。指定数据源第二匹配字段。如果指定的第一匹配字段中<BR>两个值相等,就靠它来找到对应的对象了。一般不用<BR>第六个参数 BindLayer。指定绑定到哪一层。可以用层名,也可以用Layer对象。我们例子<BR>里面图层是a,将其作为参数。如果不指定,MapX也会自动帮你找一个的。(呵呵蛮智能的<BR>吧)<BR>第七个参数 Fields。 指定数据源中哪些字段参与绑定。<BR>第八个参数 Dynamic。指定是否是动态绑定。缺省为false。动态绑定就是要用这个datas<BR>et时MapX再临时绑定数据到对象上<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">讲解完了参数的用法,我们的语句也就出来了:<BR>dim MyDataset as Dataset<BR>set MyDataset=Map1.Datasets.Add(miDataSetADO, Adodc1.recordset, "MyDataset", "<BR>ID2", , "a")<BR>这一句里面,"ID2"和"a"如果不写也不会影响结果,因为MapX会自动去寻找最符合要求的<BR>字段和被绑定图层的。但是作为一种良好的编程风格,最好指定!<p></p></P>
<P break-all; LINE-HEIGHT: 12pt"><BR>第三步,尽情的用你的dataset吧<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">绑定了dataset,一个图层才具有了属性的数据。你才可以进行很多功能的实现。比如说取<BR>值赋值、专题制图等等<p></p></P>
<P break-all; LINE-HEIGHT: 12pt"><BR>                          第三部分   你问我答<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">问:dataset不是绑定到具体layer上吗?怎么不可以用Layer.datasets.add方法实现?<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">答:这是MapX的规定。它把被绑定layer作为参数,而不是作为绑定的出发点。实际上,L<BR>ayer.Datasets其实只是一个只读的集合,只能读取绑定到该层上的若干个dataset<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">问:我如果想绑定table文件自带的属性怎么做?<BR>答:最easy了。set Mydataset= datasets.add (miDataSetLayer, 某个layer对象)   OK<BR>,后面的参数都不需要!!<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">问:我绑了半天,还是出现这样的错误——InValid GeoField specified. Name not fou<BR>nd, or index out of range. 我快发疯了,为什么啊??<BR>答:先别发疯。检查一下几点:<BR>你确定你的layer图层有一个字段和数据源的某一个字段肯定匹配??<BR>图层中该字段是否是索引字段???这一点很重要!!检查方法,用mapinfo打开table,<BR>查看其表结构,如果该字段“索引”(indexed)没有打上勾,please勾上!<BR>应该ok了,恭喜你不用去疯人院了。<p></p></P>
<P break-all; LINE-HEIGHT: 12pt">问:我还是弄不明白怎么办??<BR>答:我也不知道怎么办了~~~:(<p></p></P>
<P break-all; LINE-HEIGHT: 12pt"><BR>ok,写了这么多,也不知道对大家有没有用。如果有任何问题,欢迎随时提出。<BR>睡觉先~~~~~~~~~~~~~~~~<BR line-break"><BR line-break"><p></p></P>
<P 0cm 0cm 0pt"><p><FONT face="Times New Roman"> </FONT></p></P>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部