我给你一个例子,转载的,有时间的话可以试一试。
数据绑定主要有两个作用。
Ø 以地图中的图形对象来显示数据
通过数据绑定,可以将BindLayer对象作为一个参数,使用Datasets.add方法将自己的表转变为一个DataSet。这将在地图中创建一个新的图层,并且将表中的数据以点等图形对象表示。一旦将数据引入地图,就可以很容易地使用MapX创建应用程序,并实现多种地图功能。
Ø 将属性数据绑定到地图中,并创建专题图
如果地图对象中包含相应的属性信息,也可以使用Datasets.add方法将某个属性字段添加到地图中,进而就可以按照需要创建相关的专题图。
********************数据绑定的实现方法************************
使用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会以实时的方式访问数
//.tab至少要有个字段是索引字段才能绑定
//给你个函数
{
功能说明:把ORACLE表绑定在该图层
参数说明:Layer要绑定数据的图层,TableName对应的ORACLE表,Query用的数据集
返回为绑定成功的数据集
}
function BindOracleDataSet(Map :TMap;Layer: CMapXLayer; TableName: string;
Query: TADOQuery;DoQuery: TADOQuery): CmapxDataset;
function BindOracleDataSet(Map :TMap;Layer: CMapXLayer; TableName: string;
Query: TADOQuery;DoQuery: TADOQuery): CmapxDataset;
var
Fields: CMapXFields;
COLUMN_NAMEStr,StrLayer :string;
param, ds: variant;
begin
TVarData(EmptyParam).vType := varError;
TVarData(EmptyParam).vError := longword(DISP_E_PARAMNOTFOUND);
Query.Close;
Query.SQL.Text :=‘select * from ‘+UPPERCASE(TableName);
try
Query.Open;
except
end;
//从Oracle得到TableName表的字段信息
DoQuery.sql.text :=
‘Select TABLE_NAME,COLUMN_NAME,DATA_TYPE FROM ‘
+‘ user_tab_columns where TABLE_NAME=‘+#39
+UPPERCASE(TableName)+#39;
try
DoQuery.open;
except
exit;
end;
DoQuery.First;
//加上字段
Fields := CoFields.Create;
while not DoQuery.Eof do
begin
//字段名称
COLUMN_NAMEStr :=UPPERCASE(DoQuery.fieldbyname(‘COLUMN_NAME‘).asstring);
begin
//字段类型
if UPPERCASE(DoQuery.fieldbyname(‘DATA_TYPE‘).asstring)=‘VARCHAR2‘ then
Fields.Add(COLUMN_NAMEStr,COLUMN_NAMEStr, miAggregationAuto,0);
if UPPERCASE(DoQuery.fieldbyname(‘DATA_TYPE‘).asstring)=‘NUMBER‘ then
Fields.Add(COLUMN_NAMEStr,COLUMN_NAMEStr, miAggregationAuto,3);
//日期也要加上
if UPPERCASE(DoQuery.fieldbyname(‘DATA_TYPE‘).asstring)=‘DATE‘ then
Fields.Add(COLUMN_NAMEStr,COLUMN_NAMEStr, miAggregationAuto,2);
end;
DoQuery.Next;
end;
try //Uppercase(TableName)+‘_ID‘
// Result :=Map.Datasets.Add(miDataSetADO,Query.Recordset,
//注意add带的第一个参数,不用midatasetado,而用midataado
Result :=Map.Datasets.Add(miDataADO,Query.Recordset,
Uppercase(Layer.Name),‘ID‘, EmptyParam,Layer, fields,EmptyParam);
except
exit;
end;
end;
//‘ID‘ 是在.tab的索引字段
-------------------本人调用如下:
//oracle中建一个表LINE跟b.tab表结构相同
// id ,name :字符串 ;X,Y :浮点数型
//先用adoconnection连接好数据库,adoquery1指定连接就行,用于查询表数据,不用作其它设置
// adoquery2 作查询表的字段用,也只用指定连接,不需作其它设置
//主要函数:function BindOracleDataSet(Map :TMap;Layer: CMapXLayer; TableName: string;
// Query: TADOQuery;DoQuery: TADOQuery): CmapxDataset;
// 下面有函数具体内容,作者:大富翁 的 zqs10597249
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, MapXLib_TLB, DB, ADODB, StdCtrls;
type
TForm1 = class(TForm)
Map1: TMap;
ADOQuery1: TADOQuery;
Button1: TButton;
ADOConnection1: TADOConnection;
ADOQuery2: TADOQuery;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
lyr :CMapXLayer ;
ds : CMapXDataSet ;
{ Public declarations }
end;
Function BindOracleDataSet(Map :TMap;Layer:CMapXLayer;
TableName :string;Query :TADOQuery;DoQuery: TADOQuery):CmapxDataset;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
//.tab至少要有个字段是索引字段才能绑定
//给你个函数
{
功能说明:把ORACLE表绑定在该图层
参数说明:Layer要绑定数据的图层,TableName对应的ORACLE表,Query用的数据集
返回为绑定成功的数据集
}
function BindOracleDataSet(Map :TMap;Layer: CMapXLayer; TableName: string;
Query: TADOQuery;DoQuery: TADOQuery): CmapxDataset;
var
Fields: CMapXFields;
COLUMN_NAMEStr,StrLayer :string;
param, ds: variant;
begin
TVarData(EmptyParam).vType := varError;
TVarData(EmptyParam).vError := longword(DISP_E_PARAMNOTFOUND);
Query.Close;
Query.SQL.Text :=‘select * from ‘+UPPERCASE(TableName);
try
Query.Open;
except
end;
//从Oracle得到TableName表的字段信息
DoQuery.sql.text :=
‘Select TABLE_NAME,COLUMN_NAME,DATA_TYPE FROM ‘
+‘ user_tab_columns where TABLE_NAME=‘+#39
+UPPERCASE(TableName)+#39;
try
DoQuery.open;
except
exit;
end;
DoQuery.First;
//加上字段
Fields := CoFields.Create;
while not DoQuery.Eof do
begin
//字段名称
COLUMN_NAMEStr :=UPPERCASE(DoQuery.fieldbyname(‘COLUMN_NAME‘).asstring);
begin
//字段类型
if UPPERCASE(DoQuery.fieldbyname(‘DATA_TYPE‘).asstring)=‘VARCHAR2‘ then
Fields.Add(COLUMN_NAMEStr,COLUMN_NAMEStr, miAggregationAuto,0);
if UPPERCASE(DoQuery.fieldbyname(‘DATA_TYPE‘).asstring)=‘NUMBER‘ then
Fields.Add(COLUMN_NAMEStr,COLUMN_NAMEStr, miAggregationAuto,3);
//日期也要加上
if UPPERCASE(DoQuery.fieldbyname(‘DATA_TYPE‘).asstring)=‘DATE‘ then
Fields.Add(COLUMN_NAMEStr,COLUMN_NAMEStr, miAggregationAuto,2);
end;
DoQuery.Next;
end;
try //Uppercase(TableName)+‘_ID‘
// Result :=Map.Datasets.Add(miDataSetADO,Query.Recordset,
//注意add带的第一个参数,不用midatasetado,而用midataado
Result :=Map.Datasets.Add(miDataADO,Query.Recordset,
Uppercase(Layer.Name),‘ID‘, EmptyParam,Layer, fields,EmptyParam);
except
exit;
end;
end;
//‘ID‘ 是在.tab的索引字段
procedure TForm1.Button1Click(Sender: TObject);
begin
lyr := Map1.Layers.Item(‘b‘) ;
ds := BindOracleDataSet(Map1 ,lyr , ‘LINE‘, ADOQuery1,ADOQuery2 ) ;
// showmessage(inttostr(ds.RowCount));
// ShowMessage(‘ok!‘) ;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
fts : CMapXFeatures ;
ft :CMapXFeature ;
rvs :CMapXRowvalues ;
i, j : integer ;
begin
fts := lyr.AllFeatures ;
for i:= 1 to fts.Count do
begin
ft := fts.Item(i) ;
rvs := ds.Rowvalues[ft] ;
ShowMessage(string(rvs.Item(‘NAME‘).value)) ;
end ;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
BindLayerObject : CMapXBindLayer ;
flds :CMapXFields ;
rs :_RecordSet ;
i :integer ;
begin
//得到数据源
with ADOQuery1 do
begin
ADOQuery1.Close ;
ADOQuery1.SQL.Clear ;
ADOQuery1.SQL.Add(‘select * from line‘);
ADOQuery1.Open ;
end ;
rs := ADOQuery1.Recordset ;
rs.MoveLast ;
// showmessage(inttostr(i)) ;
//创建数据列
flds := CoFields.Create ;
flds.Add(‘ID‘, ‘ID‘, miAggregationAuto, 0) ;
flds.Add(‘NAME‘, ‘NAME‘, miAggregationAuto, 0) ;
flds.Add(‘X‘, ‘X‘, miAggregationAuto, 3) ;
flds.Add(‘Y‘, ‘Y‘, miAggregationAuto, 3) ;
//创建BinLayer
BindLayerObject := CoBindLayer.Create ;
//BindLayerObject.
// BindLayerObject.LayerName := ‘b‘ ;
BindLayerObject.RefColumn1 := ‘X‘ ;
BindLayerObject.RefColumn2 := ‘Y ‘ ;
BindLayerObject.LayerType := miBindLayerTypeXY ;
ds := Map1.Datasets.Add(miDataADO, rs , ‘b‘, ‘X‘, ‘Y‘,
BindLayerObject, EmptyParam, false )
end;
end.