MAPX地图数据与属性数据的关联

 
开发过程中涉及的数据主要包括两个来源:一部分是Geoset中包含的地图数据文件,即Djqh.tab、Djs.tab和Gq.tab;其它所有的非几何数据即属性数据均由MS SQL Server管理。因此,要实现图文互动,必须建立几何数据和属性数据之间的关系。
MapX支持的外部数据
在MapX中可以引用多种类型的外部数据。
(1)、        地图数据:如果用户已经购买了或是利用MapInfo创建了MapInfo地图,可以直接将它们在应用中打开。
(2)、        远程空间数据库:利用MapX可以访问保存在Oracle8i及MapInfo SpatialWare中的地图数据。其中,对Oracle8i的支持是MapX 4.0的新特性。通过Oracle8 Call Interface(OCI),MapX可以将存储在Oracle8i数据库服务器中的MapInfo空间数据和属性数据同时下载到本地。
(3)、        其它远程数据:MapX支持多种对外远程数据的访问方式,如ADO、DAO、及RDO等,更可以通过ODBC使用更广范围内的数据。
数据库设计原则
GIS系统中涉及的数据包括图形矢量数据、空间属性数据和工程管理数据。为了增强整个系统数据处理的灵活性,采用分开存储的方法。图形矢量数据以MapInfo标准文件格式存储在特定目录下,图形中每个地物均有其对应的唯一的标识(ID号),系统以此为索引建立该地物的图形数据文件。空间属性数据与工程管理数据均采用MS SQL Server来存储,各地物属性记录的关键字为图形文件中该地物的ID号,由此便实现了图形文件与属性文件的一一对应关系。

图3.1  图形数据与属性数据的关联关系
关联属性数据的方法
在MapX中,属性数据与几何数据的关联是通过数据绑定实现的。
(1)、        什么叫数据绑定
数据绑定是将外部数据引入MapX的过程。
可以绑定的数据源包括以下类型:
类型        描述
ADO        使用ADO(Active data objects)
DAO        DAO对象,可以是VB中的data control、Access表格等,也可自己创建
Delphi        使用Borland BDE数据源
Global Handle        lets you pass in a block of tab-delimited data
Layer        创建一个Dataset,使用MapInfo表字段
Notes View/NotesQuery        专门用于Lotus Notes
ODBC        可以使用ODBC从任何ODBC数据源中获取数据
OLE Data        用于containers,如PowerBuilder
RDO        MS Remote Data Objects和RDO结果集对象
safeArra        COM数据集,与safearray中的数据进行静态绑定
Unbound        兼容其它
(2)、        数据绑定的强大作用
数据绑定主要有两个作用。
?        以地图中的图形对象来显示数据
通过数据绑定,可以将BindLayer对象作为一个参数,使用Datasets.Add方法将自己的表转变为一个DataSet。这将在地图中创建一个新的图层,并且将表中的数据以点等图形对象表示。一旦将数据引入地图,就可以很容易地使用MapX创建应用程序,并实现多种地图功能。
?        将属性数据绑定到地图中,并创建专题图
如果地图对象中包含相应的属性信息,也可以使用Datasets.Add方法将某个属性字段添加到地图中,进而就可以按照需要创建相关的专题图。
(3)、        数据绑定的实现方法
使用Datasets.Add可以将用户数据绑定到地图中。
在MapX中,每张地图对应多个图层(Layers),每一个图层(Layer)都有一个Datasets,其中包含DataSet对象。Datasets拥有一些属性和方法,用来在集合中添加和删除Dataset 对象,主要方法包括Add和Remove。
使用Datasets.Add绑定的最终结果是Dataset对象的创建。这个Dataset对象被加入到Datasets集合中,包含了被绑定图层的对象的计算结果。比如说,如果数据被绑定到US_States地图,每一个州将对应一个新的数据值,这个数据值被用来控制地图的绘制。如果数据源中含有某个州的多个记录,则这些记录的值可以进行累加、平均值等计算。使用Dataset的Value方法可以取得地图中每一个对象的计算结果。
DataSets.Add方法详解
Datasets.Add方法的使用主要需确定所绑定数据源的类型、绑定到地图的哪一层以及与地图之间关联的字段。语法如下:
Datasets.Add  Type, SourceData, [Name], [Geofield], [SecondaryGeofield], [BindLayer], [Fields], [Dynamic]
[]中的参数是可选的,程序中可以省略或传递EmptyParam。EmptyParam在Delphi中已定义的OleVariant类型参数,表示未用参数。
?        Type
Type的取值范围为DatasetType常量,对应于可绑定的数据类型, DatasetType的定义如下:
DatasetType=[miDatasetADO,miDatasetDelphi,……,miDatasetLayer,miDatasetODBC,miDatasetUnbound]       
其中miDatasetLayer表示绑定的是MapInfo表(.TAB),miDatasetODBC表示绑定的是ODBC 数据源中的表。
?        SourceData
根据DatasetType的不同,SourceData有不同的取值,如miDatasetLayer对应MapInfo表,miDatasetODBC对应ODBCQueryInfo对象等等。因此,在引如ODBC数据时,需要首先创建ODBCQueryInfo对象,并为其参数ConnectString、Datasource和SqlQuery赋值。
?        Name
String类型,唯一标识Dataset,默认名称为Dataset1、Dataset2……。
?        Geofield
指定数据源中包含地理信息的字段名称或索引。如果不指定,则MapX会自动在GeoDictionary中搜索,看哪个字段包含地理信息。比如在“世行项目”中,表T_DJQH的xzqybh字段其实就是用来标识地图中地级行政区划的,因此在调用Datasets.Add时Geofield参数即传递xzqybh。
如果要将数据表示为地图上的图形对象,数据源中GeoField所表示的字段必须唯一,并且被用来命名新的图层中的对象。非唯一值将在新的图层中以一点代替,重复记录对应的数据值将被求和。
如果定义了Fields,则Geofield参数将表示Fields中的字段,而不是sourcedata。
可以看到,Geofield在几何数据与属性数据关联中起了绝对关键的作用。
?        Secondary Geofield
只有当被绑定的数据集有非唯一主键时才定义该参数。
?        BindLayer  
指明外部数据应该绑定到地图中的哪一层。.该参数可选,未指定时MapX自动在GeoDictionary中查找相匹配的图层。但是从性能考虑,在肯定的情况下应当明确指定。
?        Fields  
描述外接数据源中的哪些字段被引用,以及当数据源中有多条记录对应一个地图对象时使用哪些集合函数,默认的集合函数是SUM(求和)。
如果该参数有定义,则Geofield和SecondaryGeofield参数均将其作为参照。
?        Dynamic
布耳类型参数,用于控制数据绑定是否动态,默认为False,表示静态绑定,即当数据库被打开时MapX将拷贝所需数据;如果设定为True,MapX会以实时的方式访问数据。<-- viewthread_post_sig -->

你可能感兴趣的:(dataset,图形,sql,server,powerbuilder,delphi,oracle)