首先要绑定数据,然后再通过对应的主键来取值
你装了MapX没有帮助吗?
我的是4.5的
第七章 数据绑定
概述
数据集使您可以在地图绑定用户数据。例如,如果现在有关于县市销售的 Microsoft Access数据库以及反映推销人员位置的Lotus Notes数据库,那么就可以把这些数据绑定到地图上,并且可以在两套数据集之间标注趋势或显示数据的相关性。
第一节 数据绑定的概念
所谓数据绑定,就是将数据从数据源放入 MapX 的处理过程。
现今的商业中有许多不同类型的数据库,因此,MapX 使您得以对几种不同类型的数据源进行绑定。
将自己的数据绑定到地图上有两个主要优点:
? 能在地图上以图元浏览数据。
? 可首先向地图绑定属性数据,然后基于这些数据创建专题渲染地图。
第二节 怎样向地图添加数据
有两种方法进行数据绑定:
? 如果有 Visual Basic 的绑定数据控件,就可以在设计时使用 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 对象的方法:
方法 描述 代码示例
添加 创建特定数据集并将它添加到该集合中。 Set ds = Map1.Datasets.Add _(miDataSetDAO, rs)
删除 从Datasets集合中删除指定的 DataSet 对象。 Map1.Datasets.Remove 2
DataSets.Add 方法
使用DataSets.Add方法,可向MapX绑定来自数据源的数据。使外部数据源和地图建立联系。语法如下:
DataSets.Add Type, SourceData, [Name], [Geofield], [SecondaryGeofield], [BindLayer], [Fields], [Dynamic]
Type参数
此参数用来说明所添加数据集的类型。它获取DataSetTypeConstants的值。下面列出的是 DataSet类型常量:
Type参数 描述
miDataSetADO ADO
miDataSetDAO Data Access Object
miDataSetDelphi Delphi Native
miDataSetDelphi4 Delphi4
miDataSetGlobalHandle 以 Tab 键分隔的数据
miDataSetLayer MapInfo 表
miDataSetNotesQuery Lotus Notes Query
miDataSetNotesView Lotus Notes View
miDataSetODBC ODBC 数据库
miDataSetOEO Oracle express Objects
miDataSetOLEData OLE datasource
miDataSetRDO RDO
miDataSetSafeArray Safe Array
miDataSetUnbound MapX 从容器中请求数据
SourceData 参数
该参数用来引用数据,随Dataset类型的不同而不同。
下面是每一种数据集类型的有效数据源:
Dataset类型 有效源数据
miDataSetADO ADO 表
miDataSetDAO DAORecordset 对象.
miDataSetDelphi Delphi Native
miDataSetDelphi4 Delphi4 记录集
miDataSetGlobalHandle VT_I4 类型的变量且 lVal 相当于全局内存句柄.
miDataSetLayer MapInfo 表
miDataSetNotesQuery Lotus Notes Query
miDataSetNotesView Lotus Notes View
miDataSetODBC ODBCQueryInfo 对象
miDataSetOEO Oracle express 对象
miDataSetOLEData 被 Datasets.Add 忽略
miDataSetRDO RDO 表格
miDataSetSafeArray Safe Array
miDataSetUnbound 无类型(对应地,使用 RequestData 事件访问只有程序员知道的数据格式)。
Name 参数
该参数为唯一标识数据集的字符串。属于可选参数,如果不指定,则缺省名为 DataSetN,其中"N"为Datasets集合中的数字。
Geofield 参数
该参数是数据源中包含地理信息的列名称或索引。如果该参数未指定,则 MapX 搜索所有字段,以决定数据源中哪一列包含了GeoDictionary 中指定的地理信息。此字段不必是地理数据字段,因为它可能是诸如邮政编码之类的唯一关键列。但是,如果已经知道数据源中的哪一列包含了地理信息,则应当指定它。
如果打算在地图上查看图元数据,那么数据源中的 GeoField 列必须是唯一的。GeoField 列用来为新点层的图元命名。若值不唯一,则将导致在新点层中添加的只是单个点,该点是在多个重复关键值中首次遇到的,并且将会聚合重复行中的数据值。
如果指定了 Fields 集合,Geofield 参数引用 Fields 集合的列,而不是数据源的列。请参阅下面的 Fields 参数。
Secondary Geofield 参数
此参数只有当绑定数据集的图层存在不唯一关键列时才需要。例如,使用 MapInfo 表 "United States Counties" 绑定数据就需要依靠 Secondary geofield 参数,因为一个州中的县名是不唯一的。可能存在在表中的多个州都有县名为 "Warren" 或 "Washington" 的情况。这样,在数据绑定过程中,就需要更多的信息以解决可能存在的模棱两可的情况。什么时候绑定数据到New York的 Warren,又是什么时候绑定到New Jersey的 Warren 呢?通过指定 "County" 列作为 Geofield 以及 "State" 列作为 Secondary Geofield, MapX 经过对各州中的县名的精确数据绑定处理,就能够辨别出绑定到New York的 Warren数据和绑定到New Jersey的 Warren数据(这和创建 Find 对象的 Refining Boundary 概念相同。请参阅在地图中查找图元)。
如果指定了 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 表,该数据库在 MapInfo MapX 4.0 目录下的 DATA 文件夹中。
Dim ds As Dataset
Dim db As Database
Dim rs As Recordset
'Open the MapStats.MDB Databasse
Set db = DBEngine.Workspaces(0).OpenDatabase( _
"C:/Program Files/MapInfo MapX 4.0/Data/Mapstats.mdb")
'rs is the sourceData recordset which is an MS Access table
Set rs = db.OpenRecordset("US_Cust")
'Add the dataset to the map
Set ds = Map1.Datasets.Add(miDataSetDAO, rs)
第四节 使用 Fields 集合
数据源有多个数据列。MapX 管理绑定的每一列数据,因此应当只绑定地图上所需的数据(例如,想要进行专题化地图或标注用的数据)。用 DataSets.Add (Fields) 的最后一个参数来建立要绑定到地图的字段(列)的 Fields 集合。
说明:声明字段变量时使用"MapXLib.Fields"。这样可防止与 DAO "Fields" 对象发生冲突。
Dim flds As New MapXLib.Fields
可以通过 Dataset.Fields 的属性访问数据集的 Fields 集合。
方法 描述 代码示例
Add 向 Fields 集合中添加一个字段 flds.Add "Sales", "Sum_of_Sales" _, miAggregationSum
Remove 从 Fields 集合中删除一个字段 flds.Remove 3
RemoveAll 从该集合中删除所有 Field 对象 flds.RemoveAll
Fields.Add方法
Fields.Add 方法使您得以将数据源中的一列数据作为字段添加到 Fields 集合中。Fields 集合使用 DataSets.Add 方法建立。Datasets.Add 的Fields 参数获取 Fields 集合,并使用 Add 方法建立它。一旦数据集已经创建,就不能再将 Add 方法用在数据集的 Fields 集合上。
Fields.Add 的语法规则如下所示:
Fields.Add DataSourceCol, Name, [AggregateFunction], [Type]
部件 描述
DataSourceCol 数据源的列名或列索引。
Name 欲添加的字段名。
AggregateFunction 所使用的聚合函数。此参数获取AggregationFunctionConstants 值。
Type 列中的数据类型。此参数获取 FieldTypeConstants 值。此参数仅用于非绑定DataSets。其它 DataSet 类型则忽略它。
数据聚合
Fields.Add 方法的 Aggregate Function 参数决定当多匹配情况出现时 MapX 怎样计算 Field 的值。
下面是用于处理多匹配情况的聚合:
Aggregation Function 常量
常量 描述
MiAggregationSum 数据求和。
MiAggregationAverage 求数据平均值。
MiAggregationIndividual 拖进每一个单独记录里。
MiAggregationCount 对记录计数。
下面的示例显示了怎样从 DAO 记录集数据源创建字段集合,以及随后如何用 Fields 集合向数据集添加数据。
Private Sub cmdOK_Click()
Dim ds As MapXLib.Dataset
Dim rs As Recordset
Dim i as integer
Dim flds As New MapXLib.Fields
'Open the recordset selected from a list box
Set rs = db.OpenRecordset(DatasetsList.Text)
'Use the AggregationFunction constant selected from a combo box
Dim AggregateTypeNum As Integer
Select Case AggregateType.ListIndex
Case 0
AggregateTypeNum = miAggregationSum
Case 1
AggregateTypeNum = miAggregationAverage
Case 2
AggregateTypeNum = miAggregationCount
Case 3
AggregateTypeNum = miAggregationIndividual
Case 4
AggregateTypeNum = miAggregationAuto
End Select
'Loop through the DAO fields of the Recordse
' and add them to a MapX Fields collection.
For i = 0 To rs.Fields.Count - 1
flds.Add rs.Fields(i).Name, rs.Fields(i).Name, AggregateTypeNum
Next
'Add the dataset, using the fields collection
Set ds = Map1.Datasets.Add( miDataSetDAO, rs, "US State Data", , , , flds)
MsgBox "Dataset " &
DatasetsList.Text &
" Added"
Unload Me
End Sub
第五节 将数据显示为点图层(BindLayer)
BindLayer 数据绑定是数据绑定的一种类型,它用来在由数据指定的位置处创建新的点图层。通常在下面两种情况下使用:
? 数据包含 x 和 y 坐标时(如经度和纬度)。
? 在指定的位置创建点。
? 数据包含参照信息时,例如 Zip Codes。
当绑定数据具有 X/Y 坐标或点信息(例如 Zip Codes)时,以及想要在新的或已存在的图层上看到由数据指定位置的点时,就需要用到 Bindlayer 对象。
使用 BindLayerObject 添加数据集时,这些点会自动显示在地图上。如果没有用 BindLayerObject 添加数据集,则点是不会自动显示的。只有 BindLayerObjects 才有这种行为。
BindLayer 对象属性
属性 描述 值
LayerType 指定数据绑定图层的图层类型。 A BindLayerTypeConstant: ? MiBindLayerTypeNormal ? MiBindLayerTypeXY ? MiBindLayerTypePointRef
CoordSys 指定创建图层的坐标系统。 CoordSys 对象
FileSpec 标识文件名及文件路径的文本字符串. A Stringvalue
KeyLength 正数,代表结果图层中字符串列的期望大小。 (1-254)之间的正整数值。
LayerName 如果 LayerType 是 miBindLayerTypeNormal ,则指定要绑定数据的图层名称。如果 LayerType 是 miBindLayerTypeXY 或 miBindLayerTypePointRef ,它则表示新创建图层的名称。 字符串值
RefColumn1 当 LayerType 是 miBindLayerTypeXY 时,该字段包含经度,当 LayerType 是 miBindLayerTypePointRef 时。该字段包含的是参数值(例如 ZIP Code)。 列的字符串或整型参数(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)。
示例
Dim BindLayerObject As New MapXLib.BindLayer
Dim flds As New MapXLib.Fields
Dim db As Database
Dim ds As MapXLib.Dataset
' Get the recordset to map
' MapStats Access database
' Has Longitude, Latitude columns
Set db = DBEngine.Workspaces(0).OpenDatabase( _
"C:/Program Files/MapInfo MapX 4.0/Data/Mapstats.mdb")
Set rs = db.OpenRecordset("US_Cust")
rs.Movelast
Debug.Print "Record Set has " &
rs.RecordCount &
" records."
' Fill in the Bindlayer object
BindLayerObject.LayerName = "US Customers" 'Name of new layer
BindLayerObject.RefColumn1 = "X" ' "Longitude"
' Use Column number (one'based!) or Column name
BindLayerObject.RefColumn2 = "Y" ' "Latitude"
BindLayerObject.LayerType = miBindLayerTypeXY
'Type for X/Y binding
Debug.Print "Finished setting up Bind Layer"
Set ds = Map1.Datasets.Add(miDataSetDAO, rs, "U.S. Customers" _
, "City", "State", BindLayerObject)
Debug.Print "Finished adding dataset"
使新点图层变为永久图层
使 BindLayer 对象创建的新点图层成为永久的 MapInfo 表是很容易的。使用 BindLayer.Filespec 属性或者指定文件的名字和位置,使得 Datasets.Add 方法能够创建永久图层来替代临时图层。如果不指定这个属性,则图层就是临时的。
第六节 使用 GeoDictionary 进行数据绑定
MapX 使用 GeoDictionary 文件(默认名是 GEODICT.DCT )记录与数据绑定有关的信息。
使用 DataSets.Add 方法时,MapX 能够分析数据,然后决定怎样绑定数据到地图上去。此方法有以下自动行为:
? 确定数据源中哪一列包含地理信息。
? 确定绑定到哪个图层。
这两个操作都是可选的。有参数使您得以明确地指定包含地理信息的是数据源中的哪一列,或者哪一个地图图层将用来绑定数据。如果知道这些值中的任一个,就应当明确地指定它们以提高性能。
为使 MapX 能够绑定数据到地图图层上,下面的几个条件必须确保为真:
1. 此地图的地理关键列需要被索引
2. 此地图和它的关键列必须在 GeoDictionary 中指定
第七节 数据绑定使用的 MapX 事件
一旦数据源的某列被定义为地理列,并且确定了绑定数据的地图图层,则绑定就开始进行。数据源的每一行都和一个图元相匹配且数据将会带入地图。如果某包含地理列的行和图元不匹配(或许是键入错误 ["NA" 代替 "MA"] 或仅是一个非地图上的值 ["Puerto Rico"]),则 DataMismatch 事件被激活来通知容器。可以忽略 DataMismatch 事件,这种情况下 MapX 将简单地忽略此行。
在自动数据绑定期间,如果数据有模棱两可的情况,MapX 就会调用 ResolveDataBind 事件。
在使用"非绑定"类型数据的数据绑定期间,使用 RequestData 事件建立循环,使得容器一次一个单元地向 MapX 提供数据。
刷新数据集
因为数据源中的数据被聚合后储存在 MapX 中,所以当数据源中的数据发生变化时,MapX 并不反映这种变化。DataSet.Refresh 方法使得 MapX 重读数据源并重新聚合,然后再次储存它。但是,这样会消耗很长时间。DataSet.Refresh 对创建新点图层的 DataSets 无效。
说明:当数据源中有新添加的行时,此方法并不在图层中添加新图元。