MapX动态创建点,点的标题是汉字就错误,怎么回事? (200分)

  • 主题发起人 主题发起人 zealothasu
  • 开始时间 开始时间
Z

zealothasu

Unregistered / Unconfirmed
GUEST, unregistred user!

一个表
place_id, place_name, longitude, latitude四个字段
其中place_id整型, place_name 字符串,都是汉字
记录着某个地点的名字和经纬度
要做到每次装载地图时都要动态装进去,在相应的经纬度显示一个点,点的标题是地点名称

adoquery1写select place_id, place_name, longitude, latitude from table1
代码写
ADOQuery1.Open;
mBinlayer := CoBindLayer.Create;
mBinlayer.LayerName := 'CarLayer';
mBinlayer.RefColumn1 := 'Longitude';
mBinlayer.RefColumn2 := 'Latitude';
mBinlayer.LayerType := miBindLayerTypeXY;
mDataset := Map1.DataSets.Add(miDataSetADO, ADOQuery1.Recordset, 'Name', 'PLACE_NAME', 'PLACE_ID', mBinlayer, EmptyParam, EmptyParam);
Map1.Layers[mBinlayer.LayerName].AutoLabel := True;

但是硬是有错误,改成 mDataset := Map1.DataSets.Add(miDataSetADO, ADOQuery1.Recordset, 'Name', 'PLACE_ID', 'PLACE_NAME', mBinlayer, EmptyParam, EmptyParam);就没事了


请问谁能够解决?

我一定要临时的图层
但是我创建的土层就是不显示汉字,一有汉字就出错
是不是汉字不行?
我的是mapx5英文版
是不是英文版不行?

 
我还在帮你考虑呢,你到底哪里出问题了,怎么解决的?
 
是不是支持字体的字体文件没有注册好
安装在“Windows/Fonts”
字体也必须在 Windows 中注册。如果创建安装程序时使用第三方软件包,则可能此软件包会注册字体。否则就要调用 Win32 的 AddFontResource 例程来手工注册字体。
ARIAL.TTF MAPIS___.TTF MAPSYM.TTF TTMIAR__.TTF
TTMICG__.TTF TTMIMI__.TTF TTMIOG__.TTF TTMIOS__.TTF
TTMIRE__.TTF TTMITC__.TTF TTMIWE__.TTF
 
我没有绑定数据了
我干脆就是生成几个Fields
然后把这些点手动生成
就可以了
 
不是字体的问题
我的可以显示汉字了
但是现在我不知道怎么绑定数据
 
var
mLayerInfo: LayerInfo;
mFields: Fields;
mStyle: Style;
Font: Variant;
begin
//增加Field
mFields:= CoFields.Create;
mFields.AddFloatField('Longitude', EmptyParam);
mFields.AddFloatField('Latitude', EmptyParam);
mFields.AddStringField('PLACE_NAME', 254, EmptyParam);
mFields.AddIntegerField('PLACE_ID', EmptyParam);

mLayerInfo := CoLayerInfo.Create;
mLayerInfo.Type_ := miLayerInfoTypeTemp;
mLayerInfo.AddParameter('FileSpec', GasStationLayerName);
mLayerInfo.AddParameter('Name', GasStationLayerName);
mLayerInfo.AddParameter('Fields', mFields);

GasStationLayer := Map.Layers.Add(mLayerInfo, 1);

with GasStationLayer do
begin
AutoLabel := True;
LabelProperties.Offset := DefaultLabelOffset;
KeyField := 'PLACE_NAME';
end;

with dmGPSManager.qryTemp do
begin
Close;
SQL.Clear;
SQL.Add('select place_id, place_name, longitude, latitude from ts_place');
Open;
while not Eof do
begin
mCreatePoint(Map, mStyle, GasStationLayer, FieldByName('longitude').AsFloat, FieldByName('latitude').AsFloat, 0, FieldByName('place_name').AsString);//自己写的加点procedure
Next;
end;
end;



能否绑定数据呢?
 
我给你一个例子,转载的,有时间的话可以试一试。
数据绑定主要有两个作用。
  Ø 以地图中的图形对象来显示数据
  通过数据绑定,可以将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.
 
多人接受答案了。
 
后退
顶部