以前做gis的时候,没怎么用到标记,今天终于接触到标记这方面的东西,做了个demo测试了一下:
首先写了个操作mapx的单元,其中有个函数:
function TMapModule.CreateTempAnimationLayer(var currentMap: TMap; layerName: string): CMapXLayer; var layerInfo:CMapXLayerInfo; flds : CMapXFields; ANewLayer : CMapXLayer; begin try flds := CoFields.Create; flds.AddIntegerField('ID',EmptyParam); flds.AddStringField('captiontoshow',254,EmptyParam); flds.AddStringField('name',254,EmptyParam); layerInfo := CoLayerInfo.Create; layerInfo.type_ := miLayerInfoTypeTemp; layerInfo.AddParameter('FileSpec',layerName); layerInfo.AddParameter('Name',layerName); layerInfo.AddParameter('Fields',flds); ANewLayer := currentMap.Layers.Add(layerInfo,1); currentMap.DataSets.Add( miDataSetLayer , ANewLayer , 'ds_'+layerName , EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); currentMap.Layers.AnimationLayer := ANewLayer; result := ANewLayer; except result := nil; end; end;
2.新窗体中拖一个tmapx控件,设置了加载的geoset,
窗体创建的时候,创建一个临时图层:
procedure TForm1.FormCreate(Sender: TObject); var AMapModule:TMapModule; ALayer:CMapXLayer; begin AMapModule := TMapModule.Create; ALayer := AMapModule.CreateTempAnimationLayer(MainMap,'temp_layer'); ALayer.AutoLabel := True; end;
3.窗体上拖一个按钮,onclick事件如下:
procedure TForm1.Button1Click(Sender: TObject); var APoint:CMapXPoint; ACreatePoint,ANewPoint:CMapXFeature; ALayer:CMapXLayer; AMapXDateset:CMapXDataset; ARowValue:CMapXRowValues; begin APoint := CoPoint.Create; APoint.Set_(114.337552895699,30.5367033707355); ALayer := MainMap.Layers['temp_layer']; ACreatePoint := MainMap.FeatureFactory.CreateSymbol(APoint,EmptyParam); ANewPoint := ALayer.AddFeature(ACreatePoint,EmptyParam); ALayer.KeyField := 'captiontoshow'; ANewPoint.KeyValue := 'this is caption' + #13#10 + 'hello! i am peirenlei'; ANewPoint.Update(EmptyParam,EmptyParam); ALayer.KeyField := 'name'; ANewPoint.KeyValue := 'this is name'; ANewPoint.Update(EmptyParam,EmptyParam); ALayer.KeyField := 'ID'; ANewPoint.KeyValue := IntToStr(1); ANewPoint.Update(EmptyParam,EmptyParam); ALayer.KeyField := 'name'; ShowMessage(ANewPoint.KeyValue); ANewPoint.Update(EmptyParam,EmptyParam); AMapXDateset := MainMap.DataSets.Item['ds_temp_layer'] ; ARowValue := AMapXDateset.RowValues[ANewPoint]; ShowMessage(ARowValue.Item['id'].Value); end;
经过上面的代码,得出一个结论,mapx的lable只能显示创建的字段中的第一个字符型的字段的值,而且必须手工指定,如: ALayer.KeyField := 'captiontoshow'; 如果指定为id,或者name,label 是不会显示的,这一点要切记。