MapX 中使用bitMap 的 symbol. 200分(200分)

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

Zero_Cool

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何能够在一个图层中添加进入一个ImageList中的图用来做
为一个symbol,并且在下方标注出图的name。请给出实例代码。谢谢!
 
MapX中的Symbol是字体TTF , 所以可以通过将图片转换到 TTF 字体
然后在MapX应用程序中使用如下方法
procedure DrawASymbol(Map: TMap;
LayerName: String;
const FontName: String;
Index: Integer);
var
fnt: TFont;
ASymbol: CMapXFeature;
AText: CMapXFeature;
Style: CMapXStyle;
begin

ASymbol := CoFeature.Create;
ASymbol := Map.FeatureFactory.CreateSymbol(ASymbol, Map.DefaultStyle);
Style := ASymbol.Style;
fnt := TFont.Create;
OleFontToFont(fnt, Style);
try
fnt.Name := FontName;
//指定使用的字体TTF的名字
Style.SymbolCharacter := Index;
//指定该TTF字体文件中的第几个字体
Map.Layers.Item(LayerName).AddFeature(ASymbol);
{再接着将字加上去}
AText := CoFeature.Create;
AText := Map.FeatureFactory.CreateText('Text..',...)

Map.Layers.Item(LayerName).AddFeature(AText);

finally
fnt.Free;
end;

end;


我有点忘记了具体的函数,参数,没有控件让我调试,肯定有错,思路大致如此,试试吧
不过你的文字如果要摆正位置(正好在SYmbol的下面),是比较繁的,你需要读取字体的
屏幕尺寸,并且装化出字体下方的地理坐标,然后将文本add上去,
而每次对地图放大缩小都会导致文本相对symbol的位置发生变化(TTF在屏幕上是大小不变的,而地图
坐标确在变)所以解决这个问题挺麻烦的。
应当有更好的办法
 
多谢riverfeng, 的答案,可是我认为用字体并不是最好的答案,
在MapX 的object 中不是有BitmapSymbol object 吗?
而且style 中也有SymbolBitmapName property 等属性,

不知哪一位能够提供详细的使用方法?多谢了。
 
是阿,我以前用惯了TTF,BitMap确实可以用,我这儿参考了一下MapX4.5的帮助
有了新的发现,抱歉我以前使用的是MapX3.5版本。

procedure TForm1.FormCreate(Sender: TObject);
var
Bitmaps: BitmapSymbols;
i: Integer;
begin

{ Fill the ListBox with all of the names of the bitmap symbols
then
, the application could respond to ado
uble click in the
listbox by changing the style of some object on the map }

Bitmaps := CoBitmapSymbols.Create;
For i := 1 to Bitmaps.Countdo

ListBox1.Items.Add(Bitmaps.Item(i).Name);
end;

它提供阿BitMapSymbols对象了,看来你的问题很好解决。
这可是一个图象列表了,肯定可以的,至于文字,就像我前面说的不好办,
你有好办法告诉我

 
建议自己看看帮助,试验一下,可以解决的
 
riverfeng,我看过帮助了, 所有有关于symbolbitmap的属性我都看了,可是我不理解
怎样才能将 Delphi 中的Tbitmap类型,赋给symbolbitmap,help 中也没有详细的例子。
 
》》不好意思,我误解了 SymbolBitMaps的作用了,正确的添加一张图片到地图上是使用
下面这个方法

1.)
procedure TForm1.Button1Click(Sender: TObject);
var
Symbol: CMapxFeature;
Style: CMapXStyle;
Pt: CMapXPoint;
begin

pt := CoPoint.Create;
pt.Set_(Map1.CenterX, Map1.CenterY);
Style := CoStyle.Create;
Style.SymbolType := 1;
//指定类型维SymbolBitMap
Style.SymbolBitmapName := 'AMBU1-32.BMP';
//指定图片的文件名
Symbol := Map1.FeatureFactory.CreateSymbol(Pt, Style);
// 创建Symbol
Map1.Layers.Item(1).AddFeature(Symbol, EmptyParam);
// 添加到地图上
end;

上面Style.SymbolBitMapName := 'AMBU1-32.BMP'
改局好像不需要写完全文件路径,因为它只认默认的图片存放路径
C:/Program Files/Common Files/MapInfo Shared/MapXCommon

2. MapX供用户使用的BitMap都放在默认的路径下,比如安装MapX时的
C:/Program Files/Common Files/MapInfo Shared/MapXCommon 下
也就是在改目录下的图片资源才可以通过
Style.SymbolBitmapName := '名字.Bmp'来读取图片。
关于怎么修改这个目录,它好像没有提供这个函数。

3. 关于SymbolBitmaps,其实是罗列Mapx系统默认路径下可供用户使用的所有的BitMap

Bitmaps := CoBitmapSymbols.Create;
For i := 1 to Bitmaps.Countdo

ListBox1.Items.Add(Bitmaps.Item(i).Name);
所以这个过程执行后,你将看到ListBox1中填入了
C:/Program Files/Common Files/MapInfo Shared/MapXCommon
下的所有的图片文件名
 
riverfeng, 谢谢你的帮助。我也进行了试验,可以成功的添加一个bitmapSymbol,
但是,怎样添加label 我还没有试成功, 开始我在bitmap symbol的下面添加了一个
Text Feature, 但是我发现text feature 会随着地图缩放,而bitmap symbol不会,
这不是我想要的结果。后来我又试着用autolabel来做,创建一个miDatasetUnbound的
dataset和field , 想利用自动标注来实现。可是运行到 coDataSet.Create时弹出异常
说类型未注册,我不知道为什么?你的MapX 会不会这样? 是不是因为Trail ver 的原因?
 
Symbol下添加文字确实很繁的,我上面已经提过。可以考虑使用label,不过
在mapx3.5的时候, 发现它的label属性是属于一个图层的,也就是一个图层上
的label标放的位置是一样的,要么都在地图对象的左面,要么都在右面,或者其他。
要么程序控制,在每次地图缩放时都进行一次位置调整,要计算Bitmapsymbol下
合适的屏幕点->地图坐标,然后将文字移动到该点,是不是有点吃力不讨好。
可以用label,就用label。
如果没有其他数据要求的话,你不必自己创建新的字段,在建立一个新的地图对象时
都有一个默认的GeoName的字段,对应空间对象数据,默认是空的,并且是KeyField
也就是你不必新建字段, 直接 Symbol.Keyvalue := 'your string';
然后设置Layer.Label的显示属性。
自己创建字段是不可以的,一个如果你新建的图层只有一个字段,默认的GeoName,keyfield
可以用mapinfo创建表Tab,字段可以是任意了,程序里可以指定将你的Label的内容加到
某个字段里,不一定非要Keyvalue,可以通过Datafield。dataset等访问到该对象对应的
字段里,并且写入内容。
所以这里没有必要创建DataField, 而且Delphi里有些Mapx的类型确实是只能引用而无法
创建,因为支持的不好。这没有办法了,只好避开。
 
多谢riverfeng, 我试一试你的办法。另外, 我见过别人写的mapx程序,

他就可以添加bitmapSymbol,而且并没有用到*.bmp文件,
我不知道他是怎么实现的。也就是说怎样在程序中将bitmap类型的数据付给
symbol对象。mapx的帮助中没有提到这方面的方法。
 
有这个东西吗,拿来看看就好了,
 
我已经解决问题了,多谢riverfeng的热心帮忙,给分了。

有什么问题欢迎与我讨论。:)
nickname@263.net
 
接受答案了.
 
Zero_Cool:
能给我你解决问题的代码看看吗?
关于“MapX 中使用bitMap 的 symbol”
十分感谢!
TangX.13@263.net
 
Zero_Cool:
能给我你解决问题的代码看看吗?
关于“MapX 中使用bitMap 的 symbol”
十分感谢!
icezhp@jlonline.com
 
谢谢riverfeng的帮助!
 
顶部