ChinaCock高德地图コンポーネントのマルチマーカー表示方法

前回の説明では、地図上でマーカーを設定して緯度経度を収集する方法を紹介しました。今回からは、収集した複数のエンティティの位置情報に対して、一度にマーカーを表示する方法について説明します。

具体的には以下の2点を説明します:

  1. 複数のマーカーを地図上に表示する方法
  2. マーカーに詳細情報を表示するタグの実装方法

以下に示すprocedureは、データセットから取得したデータを元に地図上にマーカーを配置します。

procedure TMarkerMapFrame.DisplayAllMarkers;
var
  mrk: TCCuniGUIAMap.TMarker;
begin
  with UniMainModule do
  begin
    query.Close;
    query.SQL.Text := 'SELECT * FROM your_table';
    query.Open;

    query.First;
    while not query.EOF do
    begin
      mrk := AddMarker(query.FieldByName('LATITUDE').AsFloat, 
                      query.FieldByName('LONGITUDE').AsFloat, 
                      query.FieldByName('ENTITY_NAME').AsString);

      if (query.FieldByName('LATITUDE').AsString <> '') and 
         (query.FieldByName('LONGITUDE').AsString <> '') then
      begin
        mrk.CustomParams.Values['entity'] := query.FieldByName('ENTITY_NAME').AsString;
      end;
      query.Next;
    end;
  end;

  // 地図のビューを調整し、全マーカーが最適なエリアに表示されるようにします
  CCuniGUIAMap1.AdjustMapView(True);
end;

このprocedureは、データソースからエンティティの位置データを取得し、AddMarkerメソッドを呼び出して地図上に配置します。最後にAdjustMapViewを呼び出すことで、全マーカーを一括で最適なビュー位置に調整します。

次に、マーカーに詳細情報を表示するタグの実装方法を説明します。

1. Panelを用いた実装方法

この方法では、UniPanelコンポーネントを用いて詳細情報を表示します。UniPanelのメリットは、可视化デザイナーで自由にレイアウトを設計できることです。

Panelの位置を計算する際のアルゴリズムは以下のようになります:

procedure SetPanelPosition(const AMarker: TCCuniGUIAMap.TMarker);
begin
  CCuniGUIAMap1.LngLatToContainer(AMarker.Position,
    procedure(AResult: TPixel)
    begin
      var panel := DetailPanel;
      panel.Top := Round(AResult.Y) - panel.Height - 40;
      panel.Left := Round(AResult.X) - Round(panel.Width / 2) + 10;
      panel.Visible := True;
    end);
end;

このアルゴリズムは、マーカーの位置を基準にPanelの表示位置を計算します。

2. Textを用いた実装方法

この方法では、地図のTextプロパティを用いて詳細情報を表示します。Textオブジェクトのメリットは、地図と完全に統合できることです。

Textオブジェクトを作成する際のCSSスタイルは以下のようになります:

procedure InitializeDetailText;
var
  txt: TText;
begin
  txt := CCuniGUIAMap1.Texts.Add;
  with txt.Options do
  begin
    Anchor := 'center';
    Cursor := 'pointer';
    Offset.Y := -105;

    if CCuniGUIAMap1.ApiVersion = '2.0' then
      Offset.Y := -38;

    ExtData := 'DETAIL';
    Style := '{'
      + '"padding":"15px 25px"'
      + ',"border-radius":".35rem"'
      + ',"background-color":"rgba(30,159,255,0.8)"'
      + ',"border-width":0'
      + ',"box-shadow":"0 2px 6px 0 rgba(0,0,0,.5)"'
      + ',"text-align":"left"'
      + ',"font-size":"10px"'
      + ',"color":"white"'
      + ',"line-height":"20px"' + '}';
  end;
end;

この設定は、マーカー上に詳細情報を表示するタグの外観を定義します。タグの表示や非表示は以下のイベントハンドラーで制御します:

procedure TMarkerMapFrame.OnMarkerClick(const sender: TObject; 
                                      const marker: TCCuniGUIAMap.TMarker; 
                                      const lngLat: TLngLat; 
                                      const params: TUniStrings);
var
  detail: string;
begin
  // 名称タグを隠す
  CCuniGUIAMap1.Texts.Items[0].Hide;

  // 詳細情報の作成
  detail := marker.CustomParams.Values['NAME'] + '</br>' +
            marker.CustomParams.Values['DETAIL1'] + '</br>' +
            marker.CustomParams.Values['DETAIL2'] + '</br>' +
            marker.CustomParams.Values['DETAIL3'] + '</br>' +
            marker.CustomParams.Values['DETAIL4'];

  // 詳細情報の表示
  var detailText := CCuniGUIAMap1.Texts.Items[1];
  detailText.Show;
  detailText.SetPosition(marker.Position);
  detailText.SetText(detail);
end;

procedure TMarkerMapFrame.OnMarkerMouseOut(const sender: TObject; 
                                        const marker: TCCuniGUIAMap.TMarker; 
                                        const lngLat: TLngLat; 
                                        const params: TUniStrings);
begin
  // 詳細タグを隠す
  CCuniGUIAMap1.Texts.Items[1].Hide;
end;

この実装方法は、500個以下のマーカー表示に最適です。大量のマーカーを表示する場合には、TLabelMarkerを使用することをおすすめします。

タグ: ChinaCock 高德地图 マルチマーカー表示 詳細情報タグ UniPanel

5月23日 03:57 投稿