图文解说ChinaCock高德地图组件-使用LabelMarker显示海量标注(五)
前文介绍了使用TMarker对象在地图上画多个标注,这只适用于小量标注的情况,如果标注量大于500,请按本文内容实现,才不会卡顿。
接下来是TLabelMarker对象出场!
function TFrame1.AddLabelMarker(ALabelsLayer:TCCuniGUIAMap.TLabelsLayer; ALng, ALat: Double; AName: string): TCCuniGUIAMap.TLabelMarker; begin // 添加LabelMarker result:= ALabelsLayer.LabelMarkers.Add; with result do begin Options.Icon.Image:='/images/ai_32x32.png' // 图标所用图片大小,根据所设置的大小拉伸或压缩图片,等同于CSS中的background-size属性。可用于实现高清屏的高清效果 with Options.Icon.Size do begin width := 32; height := 28; end; Options.Name := AName; CustomParams.Values['name'] := AName; with Options.Position do begin Lng := ALng; Lat := ALat; end; end; end;
先实现一个方法,根据给定的经纬度,在指定的LabelsLayer对象上画标注,注意,LabelsLayer是一个新的对象,表示地图上的一个图层,我们先在这个图层上画LabelMarker。
接下来,我们要建立这个LabelsLayer图层:
procedure TFrame1.CCuniGUIAMap1MapReady(Sender: TObject); begin //complete是地图切片都下载好了 没必要等地图切片下载好 onmapready就是地图对象已经存在 至于里面的切片等它慢慢渲染 //在mapready里面 程序响应更快 加marker 地图下载它的切片(网络慢时不影响你等它下完在加marker) //填加LabelsLayer图层 with self.CCuniGUIAMap1.LabelsLayers.Add do begin with Options do begin with Zooms do begin Min := 3; Max := 20; end; ZIndex := 2; collision := false; allowCollision := false; end; //将图层添加到地图 AddToMap; end; end;
看上面的代码,原来CCuniGUIAMap用LabelsLayers来管理标签图层,你可以加N多个图层,并且在对应的图层上建立标注,然后你就可以控制每个图层的显示与隐藏!
注意:我们是在地图的OnMapReady事件中建立的图层,这样可以提高效率。
准备好了图层,接一下,我们就可以循环调用AddLabelMarker,建立批量标注。
procedure TWhhChartFrame.DrawLabelMarkers; var LabelsLayer: TCCuniGUIAMap.TLabelsLayer; LabelMarker: TCCuniGUIAMap.TLabelMarker; begin LabelsLayer := Self.CCuniGUIAMap1.LabelsLayers[0]; LabelsLayer.Clear;//清空图层的所有标注 with q do begin First; while not eof do begin LabelMarker := AddLabelMarker(LabelsLayer, FieldByName('FJD').AsFloat, FieldByName('FWD').AsFloat, FieldByName('fname').AsString); next; end; end; LabelsLayer.AddLabelMarkersToLayer;//把标注加到图层,必须调用 CCuniGUIAMap1.SetFitView();//正好按地图显示 LabelsLayer.Show;//显示图层 end;
代码我都注释了,没有什么好解释的,相信你一看也会明白。
无图无真相是不行的,来张实际生产中的图,过万的标注,不到一秒生成,爽的不行不行的。
如果你也需要,可以去他的QQ群 223717588 找作者。