数据绑定.docx
- 文档编号:4033882
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:14
- 大小:22.90KB
数据绑定.docx
《数据绑定.docx》由会员分享,可在线阅读,更多相关《数据绑定.docx(14页珍藏版)》请在冰点文库上搜索。
数据绑定
第七章数据绑定
概述
数据集使您可以在地图绑定用户数据。
例如,如果现在有关于县市销售的MicrosoftAccess数据库以及反映推销人员位置的LotusNotes数据库,那么就可以把这些数据绑定到地图上,并且可以在两套数据集之间标注趋势或显示数据的相关性。
第一节数据绑定的概念
所谓数据绑定,就是将数据从数据源放入MapX的处理过程。
现今的商业中有许多不同类型的数据库,因此,MapX使您得以对几种不同类型的数据源进行绑定。
将自己的数据绑定到地图上有两个主要优点:
•能在地图上以图元浏览数据。
•可首先向地图绑定属性数据,然后基于这些数据创建专题渲染地图。
第二节怎样向地图添加数据
有两种方法进行数据绑定:
•如果有VisualBasic的绑定数据控件,就可以在设计时使用Map对象的DataSet属性。
•通过使用DataSets.Add方法编程来绑定数据。
此数据绑定过程会创建DataSet对象。
这个添加到DataSets集合中的DataSet对象,包含了数据绑定到地图图层中的图元的计算值。
例如,如果数据已绑定到美国的州地图上,那么每个州将会有新的数据值用来控制各州的绘制。
如果在数据源中某个州有多条记录,则这些值会被求和,求平均值或计数。
DataSet的Value属性可用来访问地图中每行(即图元)的计算过的数值。
对于大多数数据绑定类型,DataSource(DataSets.Add的第二个参数)其实是一种OLE接口。
MapX通过这个接口直接从数据源中访问数据。
数据并没有真正传递给DataSets.Add。
第三节DataSet对象和DataSets集合
DataSet对象是在从数据源向MapX绑定数据的过程中生成的。
DataSet包含了数据绑定的地图图层中图元的计算过的值。
数据源可能是DAO记录集,ODBC数据源等形式。
DataSets集合是代表地图中所有DataSets的对象。
DataSets集合的方法和属性用来添加,删除Dataset对象,或者在集合中使用现有的DataSet对象。
下表中列出了从指定的集合中添加或删除DataSet对象的方法:
方法
描述
代码示例
添加
创建特定数据集并将它添加到该集合中。
Setds=Map1.Datasets.Add_(miDataSetDAO,rs)
删除
从Datasets集合中删除指定的DataSet对象。
Map1.Datasets.Remove2
DataSets.Add方法
使用DataSets.Add方法,可向MapX绑定来自数据源的数据。
使外部数据源和地图建立联系。
语法如下:
DataSets.AddType,SourceData,[Name],[Geofield],[SecondaryGeofield],[BindLayer],[Fields],[Dynamic]
Type参数
此参数用来说明所添加数据集的类型。
它获取DataSetTypeConstants的值。
下面列出的是DataSet类型常量:
Type参数
描述
miDataSetADO
ADO
miDataSetDAO
DataAccessObject
miDataSetDelphi
DelphiNative
miDataSetDelphi4
Delphi4
miDataSetGlobalHandle
以Tab键分隔的数据
miDataSetLayer
MapInfo表
miDataSetNotesQuery
LotusNotesQuery
miDataSetNotesView
LotusNotesView
miDataSetODBC
ODBC数据库
miDataSetOEO
OracleexpressObjects
miDataSetOLEData
OLEdatasource
miDataSetRDO
RDO
miDataSetSafeArray
SafeArray
miDataSetUnbound
MapX从容器中请求数据
SourceData参数
该参数用来引用数据,随Dataset类型的不同而不同。
下面是每一种数据集类型的有效数据源:
Dataset类型
有效源数据
miDataSetADO
ADO表
miDataSetDAO
DAORecordset对象.
miDataSetDelphi
DelphiNative
miDataSetDelphi4
Delphi4记录集
miDataSetGlobalHandle
VT_I4类型的变量且lVal相当于全局内存句柄.
miDataSetLayer
MapInfo表
miDataSetNotesQuery
LotusNotesQuery
miDataSetNotesView
LotusNotesView
miDataSetODBC
ODBCQueryInfo对象
miDataSetOEO
Oracleexpress对象
miDataSetOLEData
被Datasets.Add忽略
miDataSetRDO
RDO表格
miDataSetSafeArray
SafeArray
miDataSetUnbound
无类型(对应地,使用RequestData事件访问只有程序员知道的数据格式)。
Name参数
该参数为唯一标识数据集的字符串。
属于可选参数,如果不指定,则缺省名为DataSetN,其中“N”为Datasets集合中的数字。
Geofield参数
该参数是数据源中包含地理信息的列名称或索引。
如果该参数未指定,则MapX搜索所有字段,以决定数据源中哪一列包含了GeoDictionary中指定的地理信息。
此字段不必是地理数据字段,因为它可能是诸如邮政编码之类的唯一关键列。
但是,如果已经知道数据源中的哪一列包含了地理信息,则应当指定它。
如果打算在地图上查看图元数据,那么数据源中的GeoField列必须是唯一的。
GeoField列用来为新点层的图元命名。
若值不唯一,则将导致在新点层中添加的只是单个点,该点是在多个重复关键值中首次遇到的,并且将会聚合重复行中的数据值。
如果指定了Fields集合,Geofield参数引用Fields集合的列,而不是数据源的列。
请参阅下面的Fields参数。
SecondaryGeofield参数
此参数只有当绑定数据集的图层存在不唯一关键列时才需要。
例如,使用MapInfo表“UnitedStatesCounties”绑定数据就需要依靠Secondarygeofield参数,因为一个州中的县名是不唯一的。
可能存在在表中的多个州都有县名为“Warren”或“Washington”的情况。
这样,在数据绑定过程中,就需要更多的信息以解决可能存在的模棱两可的情况。
什么时候绑定数据到NewYork的Warren,又是什么时候绑定到NewJersey的Warren呢?
通过指定“County”列作为Geofield以及“State”列作为SecondaryGeofield,MapX经过对各州中的县名的精确数据绑定处理,就能够辨别出绑定到NewYork的Warren数据和绑定到NewJersey的Warren数据(这和创建Find对象的RefiningBoundary概念相同。
请参阅在地图中查找图元)。
如果指定了Fields集合,SecondaryGeofield参数会引用Fields集合中的列,而不是源数据中的列。
BindLayer参数
如果正在绑定属性数据,则此参数指定和数据连接的地图图层,或者,若引入的数据被地理引用到到点引用文件中(如:
邮政编码)或包含经/纬度值,则指定一个BindLayerObject。
这是可选参数,如果没有指定,则MapX会搜索GeoDictionary中的图层去连接。
如果已知要绑定的地图图层,基于性能的原因,应当指定它。
匹配BindLayer时,Geofields必须唯一。
否则只匹配不唯一设置的数据中的第一项。
其余的则被忽略。
Fields参数
该参数是Field对象集合中的Fields对象。
Field对象用来描述导入数据源的字段,以及当匹配特定地图图元的数据源记录多于一个时,使用的聚合函数。
这将建立要绑定到地图的字段(列)集合。
它是可选参数,如果没有指定,则导入所有列,并且如果每个图元有多个记录,对数据值求和。
本章后面更详细地讨论了Fields集合。
如果指定了Fields集合,则Geofield和SecondaryGeofield参数会被指定为Fields集合中的列,而不是源数据中的列。
Dynamic参数
该参数的值为布尔型,控制数据绑定是否是动态的。
它是可选的,未指定时默认为False,即静态绑定数据。
(即,当数据库打开时MapX复制所需数据)。
如果此参数指定为True,MapX只在需要数据时实时访问数据(例如,在标注时)。
如果此参数指定为True但数据集不支持动态列,则会导致异常。
DataSets.Add的简单实例
下面的代码从MSAccess数据库“MapStats”中打开US_Cust表,该数据库在MapInfoMapX4.0目录下的DATA文件夹中。
DimdsAsDataset
DimdbAsDatabase
DimrsAsRecordset
'OpentheMapStats.MDBDatabasse
Setdb=DBEngine.Workspaces(0).OpenDatabase(_
"C:
\ProgramFiles\MapInfoMapX4.0\Data\Mapstats.mdb")
'rsisthesourceDatarecordsetwhichisanMSAccesstable
Setrs=db.OpenRecordset("US_Cust")
'Addthedatasettothemap
Setds=Map1.Datasets.Add(miDataSetDAO,rs)
第四节使用Fields集合
数据源有多个数据列。
MapX管理绑定的每一列数据,因此应当只绑定地图上所需的数据(例如,想要进行专题化地图或标注用的数据)。
用DataSets.Add(Fields)的最后一个参数来建立要绑定到地图的字段(列)的Fields集合。
说明:
声明字段变量时使用“MapXLib.Fields”。
这样可防止与DAO"Fields"对象发生冲突。
DimfldsAsNewMapXLib.Fields
可以通过Dataset.Fields的属性访问数据集的Fields集合。
方法
描述
代码示例
Add
向Fields集合中添加一个字段
flds.Add“Sales”,“Sum_of_Sales”_,miAggregationSum
Remove
从Fields集合中删除一个字段
flds.Remove3
RemoveAll
从该集合中删除所有Field对象
flds.RemoveAll
Fields.Add方法
Fields.Add方法使您得以将数据源中的一列数据作为字段添加到Fields集合中。
Fields集合使用DataSets.Add方法建立。
Datasets.Add的Fields参数获取Fields集合,并使用Add方法建立它。
一旦数据集已经创建,就不能再将Add方法用在数据集的Fields集合上。
Fields.Add的语法规则如下所示:
Fields.AddDataSourceCol,Name,[AggregateFunction],[Type]
部件
描述
DataSourceCol
数据源的列名或列索引。
Name
欲添加的字段名。
AggregateFunction
所使用的聚合函数。
此参数获取AggregationFunctionConstants值。
Type
列中的数据类型。
此参数获取FieldTypeConstants值。
此参数仅用于非绑定DataSets。
其它DataSet类型则忽略它。
数据聚合
Fields.Add方法的AggregateFunction参数决定当多匹配情况出现时MapX怎样计算Field的值。
下面是用于处理多匹配情况的聚合:
AggregationFunction常量
常量
描述
MiAggregationSum
数据求和。
MiAggregationAverage
求数据平均值。
MiAggregationIndividual
拖进每一个单独记录里。
MiAggregationCount
对记录计数。
下面的示例显示了怎样从DAO记录集数据源创建字段集合,以及随后如何用Fields集合向数据集添加数据。
PrivateSubcmdOK_Click()
DimdsAsMapXLib.Dataset
DimrsAsRecordset
Dimiasinteger
DimfldsAsNewMapXLib.Fields
'Opentherecordsetselectedfromalistbox
Setrs=db.OpenRecordset(DatasetsList.Text)
'UsetheAggregationFunctionconstantselectedfromacombobox
DimAggregateTypeNumAsInteger
SelectCaseAggregateType.ListIndex
Case0
AggregateTypeNum=miAggregationSum
Case1
AggregateTypeNum=miAggregationAverage
Case2
AggregateTypeNum=miAggregationCount
Case3
AggregateTypeNum=miAggregationIndividual
Case4
AggregateTypeNum=miAggregationAuto
EndSelect
'LoopthroughtheDAOfieldsoftheRecordse
'andaddthemtoaMapXFieldscollection.
Fori=0Tors.Fields.Count-1
flds.Addrs.Fields(i).Name,rs.Fields(i).Name,AggregateTypeNum
Next
'Addthedataset,usingthefieldscollection
Setds=Map1.Datasets.Add(miDataSetDAO,rs,"USStateData",,,,flds)
MsgBox"Dataset"&DatasetsList.Text&"Added"
UnloadMe
EndSub
第五节将数据显示为点图层(BindLayer)
BindLayer数据绑定是数据绑定的一种类型,它用来在由数据指定的位置处创建新的点图层。
通常在下面两种情况下使用:
•数据包含x和y坐标时(如经度和纬度)。
•在指定的位置创建点。
•数据包含参照信息时,例如ZipCodes。
当绑定数据具有X/Y坐标或点信息(例如ZipCodes)时,以及想要在新的或已存在的图层上看到由数据指定位置的点时,就需要用到Bindlayer对象。
使用BindLayerObject添加数据集时,这些点会自动显示在地图上。
如果没有用BindLayerObject添加数据集,则点是不会自动显示的。
只有BindLayerObjects才有这种行为。
BindLayer对象属性
属性
描述
值
LayerType
指定数据绑定图层的图层类型。
ABindLayerTypeConstant:
•MiBindLayerTypeNormal
•MiBindLayerTypeXY
•MiBindLayerTypePointRef
CoordSys
指定创建图层的坐标系统。
CoordSys对象
FileSpec
标识文件名及文件路径的文本字符串.
AStringValue
KeyLength
正数,代表结果图层中字符串列的期望大小。
(1-254)之间的正整数值。
LayerName
如果LayerType是miBindLayerTypeNormal,则指定要绑定数据的图层名称。
如果LayerType是miBindLayerTypeXY或miBindLayerTypePointRef,它则表示新创建图层的名称。
字符串值
RefColumn1
当LayerType是miBindLayerTypeXY时,该字段包含经度,当LayerType是miBindLayerTypePointRef时。
该字段包含的是参数值(例如ZIPCode)。
列的字符串或整型参数(one-based索引)。
RefColumn2
当LayerType是miBindLayerTypeXY时,指定该字段包含纬度。
列的字符串或整型参数(one-based索引).
ReferenceLayer
如BindLayer.LayerType是miBindLayerTypePointRef,则指定要使用的参照文件的名字。
字符串。
使用BindLayer对象的操作步骤如下:
1.创建BindLayer对象。
2.当通过datasets.Add方法中的BindLayer参数传递此对象来添加数据集时,使用它。
下面显示了如何创建BindLayer对象并显示X/Y或者点参数数据。
在地图上将X/Y数据作为点图层显示
如果数据包含X/Y坐标,就可以通过数据绑定创建并显示点图元图层。
使用BindLayer对象,并设置:
•LayerType属性为miBindLayerTypeXY。
•RefColumn1属性为包含X坐标值的列名或索引(one-based)。
•RefColumn2属性为包含Y坐标值的列名或索引(one-based)。
示例
DimBindLayerObjectAsNewMapXLib.BindLayer
DimfldsAsNewMapXLib.Fields
DimdbAsDatabase
DimdsAsMapXLib.Dataset
'Gettherecordsettomap
'MapStatsAccessdatabase
'HasLongitude,Latitudecolumns
Setdb=DBEngine.Workspaces(0).OpenDatabase(_
"C:
\ProgramFiles\MapInfoMapX4.0\Data\Mapstats.mdb")
Setrs=db.OpenRecordset("US_Cust")
rs.Movelast
Debug.Print"RecordSethas"&rs.RecordCount&"records."
'FillintheBindlayerobject
BindLayerObject.LayerName="USCustomers"'Nameofnewlayer
BindLayerObject.RefColumn1=“X”'"Longitude"
'UseColumnnumber(one'based!
)orColumnname
BindLayerObject.RefColumn2=“Y”'"Latitude"
BindLayerObject.LayerType=miBindLayerTypeXY
'TypeforX/Ybinding
Debug.Print"FinishedsettingupBindLayer"
Setds=Map1.Datasets.Add(miDataSetDAO,rs,"U.S.Customers"_
"City","State",BindLayerObject)
Debug.Print"Finishedaddingdataset"
使新点图层变为永久图层
使BindLayer对象创建的新点图层成为永久的MapInfo表是很容易的。
使用BindLayer.Filespec属性或者指定文件的名字和位置,使得Datasets.Add方法能够创建永久图层来替代临时图层。
如果不指定这个属性,则图层就是临时的。
第六节使用GeoDictionary进行数据绑定
MapX使用GeoDictionary文件(默认名是GEODICT.DCT)记录与数据绑定有关的信息。
使用DataSets.Add方法时,MapX能够分析数据,然后决定怎样绑定数据到地图上去。
此方法有以下自动行为:
•确定数据源中哪一列包含地理信息。
•确定绑定到哪个图层。
这两个操作都是可选的。
有参数使您得以明确地指定包含地理信息的是数据源中的哪一列,或者哪一个地图图层将用来绑定数据。
如果知道这些值中的任一个,就应当明确地指定它们以提高性能。
为使MapX能够绑定数据到地图图层上,下面的几个条件必须确保为真:
1.此地图的地理关键列需要被索引
2.此地图和它的关键列必须在GeoDictionary中指定
第七节数据绑定使用的MapX事件
一旦数据源的某列被定义为地理列,并且确定了绑定数据的地图图层,则绑定就开始进行。
数据源的每一行都和一个图元相匹配且数据将会带入地图。
如果某包含地理列的行和图元不匹配(或许是键入错误[“NA”代替“MA”]或仅是一个非地图上的值[“PuertoRico”]),则DataMismatch事件被激活来通知容器。
可以忽略DataMismatch事件,这种情况下MapX将简单地忽略此行。
在自动数据绑定期间,如果数据有模棱两可的情况,MapX就会调用ResolveDataBind事件。
在使用“非绑定”类型数据的数据绑定期间,使用RequestData事
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 绑定