图文解说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 找作者。