圖文解說ChinaCock高德地圖元件-使用LabelMarker顯示海量標註(五)
阿新 • • 發佈:2022-05-18
前文介紹了使用TMarker物件在地圖上畫多個標註,這隻適用於小量標註的情況,如果標註量大於500,請按本文內容實現,才不會卡頓。
接下來是TLabelMarker物件出場!
function TFrame1.AddLabelMarker(ALabelsLayer:TCCuniGUIAMap.TLabelsLayer; ALng, ALat: Double; AName: string): TCCuniGUIAMap.TLabelMarker; begin // 新增LabelMarker result:= ALabelsLayer.LabelMarkers.Add; with result dobegin 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 dobegin 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;
程式碼我都註釋了,沒有什麼好解釋的,相信你一看也會明白。