Komponenty Delphi pomoc
Start › Komponenty Delphi › T3DTerrain

T3DTerrain

Teren 3D (DEM) dla T3DMapVCL/FMX: rzeźba terenu całego świata z planet.pmtiles, „Pokaż wysokości” i etykiety m n.p.m.

VCLFMXniewidoczny
▶ Zobacz na żywo – demo HTML

Opis

Komponent niewidoczny na palecie „Maps”. Upuść go na formę z T3DMapVCL lub T3DMapFMX – AutoLinkComponents łączy właściwości Map (i opcjonalnie EditMap), a teren włącza się sam. Mapa 3D wznosi się według numerycznego modelu terenu (DEM, MapLibre raster-dem + setTerrain), a „Pokaż wysokości” (ShowElevation) pokazuje wysokość n.p.m. pod kursorem, zgłasza ją po kliknięciu w OnElevation i pozwala opisać szczyty etykietami (ShowElevationSpots). Dane: Mapterhorn planet.pmtiles (cały świat, zoom 0–12, kodowanie Terrarium) z serwera https://mapa.imetroll.com/terrain/planet.pmtiles. Ustawienia trafiają do zagnieżdżonej właściwości Map.Terrain, która działa też bez komponentu.

Moduł: MapCommon.Terrain · Klasa bazowa: TComponent · Platformy: VCL + FMX

T3DTerrain – podgląd poglądowy
Tatry: T3DTerrain powiązany z T3DMapVCL (styl m3sSatelliteHybrid, mm3D, Pitch 76°), Exaggeration = 2,0, ShowElevation = True, SourceURL = pmtiles://https://mapa.imetroll.com/terrain/planet.pmtiles – etykiety ShowElevationSpots (Rysy, Kasprowy Wierch, Giewont) z wysokościami odczytanymi z planet.pmtiles. Podgląd poglądowy (nie zrzut z Delphi) – prawdziwa strona mapy komponentu w ramce imitującej formę.

Demo na żywo

Interaktywna strona mapy komponentu: teren z planet.pmtiles, przełączniki Exaggeration / etykiety / poziomnice / hillshade / wysokości obiektów / „Pokaż wysokości”, przeloty Tatry–Alpy–Himalaje, klik = OnElevation / OnObjectElevation.

▶ Otwórz demo HTML

Funkcje

Źródło planet.pmtiles. Archiwum jest zweryfikowane (MD5 zgodne) i udostępnione z CORS oraz zapytaniami Range pod adresem https://mapa.imetroll.com/terrain/planet.pmtiles. W SourceURL podaje się je z protokołem pmtiles, bez /{z}/{x}/{y}: pmtiles://https://mapa.imetroll.com/terrain/planet.pmtiles (to wartość domyślna).
Szczegółowość. planet.pmtiles ma kafle do zoomu 12 (WebP 512 px); przy większym powiększeniu MapLibre rozciąga kafle z12, więc odczyt jest przybliżony (np. Rysy ok. 2490 m zamiast 2499 m). Ścieżki i stoki w pełnej rozdzielczości wymagają regionalnych archiwów Mapterhorn 6-x-y.pmtiles.
TileBuffer wstępnie pobiera pierścień kafli dla źródeł http(s) XYZ; dla pmtiles:// ustaw 0 – MapLibre i tak pobiera potrzebne fragmenty archiwum.
Kafle są w formacie WebP – obsługują go WebView2 (VCL, FMX na Windows), Android WebView oraz WKWebView (iOS 14+, macOS 11+).

Właściwości

WłaściwośćOpis
MapMapa 3D (T3DMapVCL/FMX lub T3DTerrainVCL/FMX); łączona automatycznie.
EditMapOpcjonalny TEditMap z tej samej formy; łączony automatycznie.
AutoLinkComponentsTrue (domyślnie) = uzupełnia puste Map / EditMap komponentami z formy.
EnabledTeren na powiązanej mapie; ustawiane na True przy powiązaniu z mapą.
ExaggerationSkala pionowa (domyślnie 1,3; 1 = rzeczywista wysokość).
SourceURLŹródło DEM; domyślnie pmtiles://https://mapa.imetroll.com/terrain/planet.pmtiles.
EncodingmteTerrarium (planet.pmtiles) / mteMapbox.
ShowElevation„Pokaż wysokości” – odczyt m n.p.m. pod kursorem i po kliknięciu (domyślnie True).
ShowElevationLabelsEtykiety „▲ N m n.p.m.” na mapie (niezależnie od poziomnic).
ShowContourLinesPoziomnice / linie wysokości (niezależnie od etykiet).
ShowHillshadeCieniowanie stoków (wyróżnienie wzgórz).
ShowObjectElevationBudynek/POI: teren + wysokość obiektu + dach m n.p.m.
ContourIntervalM, ContourColor, ContourWidthGęstość i wygląd poziomnic.
TileBufferWstępne pobieranie kafli wokół widoku (źródła XYZ); dla pmtiles:// – 0.

Zdarzenia

ZdarzenieOpis
OnElevationKlik przy ShowElevation: Lat, Lon, metry n.p.m., Valid.
OnObjectElevationKlik przy ShowObjectElevation: Lat, Lon, GroundMeters, ObjectHeight, TopMeters, ObjectKind, ObjectName, Valid.

Metody

MetodaOpis
ApplyToMap, ClearFromMapPrzekazanie ustawień do Map.Terrain / wyłączenie terenu na mapie.
ShowElevationSpots, ClearElevationSpotsEtykiety wysokości w punktach (Lats, Lons, Names) / usunięcie etykiet.
QueryElevationWysokość w punkcie z kodu (callback, JSON {"meters": …}).
DetectLinkedComponentsPonowne wyszukanie mapy 3D i TEditMap na formie.

Przykłady

T3DTerrain na formie

// T3DTerrain1 upuszczony na formę z T3DMapVCL / T3DMapFMX:
// AutoLinkComponents łączy Map (i EditMap), teren włącza się sam.
procedure TForm1.FormCreate(Sender: TObject);
begin
  Terrain1.Map := Map3D;                 // albo zostaw puste - auto-link z formy
  Terrain1.Exaggeration := 1.5;          // 1 = rzeczywista wysokość
  Terrain1.ShowElevation := True;        // „Pokaż wysokości”
  Terrain1.TileBuffer := 0;              // pmtiles:// - bez wstępnego pobierania kafli
  Terrain1.OnElevation := Terrain1Elevation;
  // SourceURL domyślnie = MAP_DEM_DEFAULT_URL:
  //   pmtiles://https://mapa.imetroll.com/terrain/planet.pmtiles
  Map3D.Mode := mm3D;
  Map3D.Pitch3D := 70;
end;

Wysokość po kliknięciu (OnElevation)

procedure TForm1.Terrain1Elevation(Sender: TObject; const Lat, Lon, Meters: Double; Valid: Boolean);
begin
  if Valid then
    Label1.Caption := Format('%.5f, %.5f: %.0f m n.p.m.', [Lat, Lon, Meters])
  else
    Label1.Caption := 'Brak danych DEM w tym miejscu (kafel jeszcze się wczytuje)';
end;

Etykiety szczytów i odczyt z kodu

// etykiety szczytów z wysokością odczytaną z DEM
Terrain1.ShowElevationSpots([49.1795, 49.2319, 49.2510], [20.0881, 19.9817, 19.9338],
  ['Rysy', 'Kasprowy Wierch', 'Giewont']);
// wysokość z kodu - odpowiedź JSON {"meters": ...}
Terrain1.QueryElevation(49.2319, 19.9817,
  procedure(Ok: Boolean; const DataJSON, ErrorText: string)
  begin
    if Ok then Memo1.Lines.Add('Kasprowy Wierch: ' + DataJSON);
  end);
Terrain1.ClearElevationSpots;

Bez komponentu: Map3D.Terrain

// bez komponentu: zagnieżdżona właściwość mapy (TMapTerrainSettings)
Map3D.Terrain.SourceURL := MAP_DEM_DEFAULT_URL;   // pmtiles://.../planet.pmtiles, bez /{z}/{x}/{y}
Map3D.Terrain.Encoding := mteTerrarium;
Map3D.Terrain.Exaggeration := 1.5;
Map3D.Terrain.TileBuffer := 0;
Map3D.Terrain.ShowElevation := True;
Map3D.Terrain.Enabled := True;

Pełna lista API

Generowana z deklaracji w kodzie (Source/*.pas): wszystkie opublikowane właściwości i zdarzenia T3DTerrain (także dziedziczone), właściwości publiczne i metody publiczne.

Właściwości opublikowane (17)

WłaściwośćTypDomyślnieOpis
MapTComponent
Edit3DTEditMap
EditMapTEditMapPowiązany TEditMap (kolory, przezroczystość, grubość warstw)
AutoLinkComponentsBooleanTrueAutomatycznie łącz pierwszy dostawcę wyszukiwania / TMapAreas / TEditMap z formy
EnabledBooleanTrueStandardowa właściwość kontrolki VCL
ExaggerationDouble
SourceURLstring
EncodingTMapTerrainEncodingmteTerrarium
ShowElevationBooleanTrue
ShowElevationLabelsBoolean index 1True
ShowContourLinesBoolean index 2True
ShowHillshadeBoolean index 3True
ShowObjectElevationBoolean index 4True
ContourIntervalMDouble
ContourColorstring
ContourWidthDouble
TileBufferInteger1

Zdarzenia (2)

ZdarzenieTypOpis
OnElevationTMapElevationEventKlik przy Terrain.ShowElevation lub wynik QueryElevation: Lat, Lon, metry n.p.m. (NaN = brak danych)
OnObjectElevationTMapObjectElevationEvent

Właściwości publiczne – tylko w kodzie (1)

WłaściwośćTypOpis
SettingsTMapTerrainSettings

Metody publiczne (7)

MetodaOpis
procedure DetectLinkedComponentsWyszukuje na formie i łączy dostawcę / TMapAreas / TEditMap
function MapCore: TMapCoreIMapCoreProvider – rdzeń dla TEditMapRaster
procedure ApplyToMap
procedure ClearFromMap
procedure ShowElevationSpots(const Lats, Lons: array of Double; const Names: array of string)Etykiety wysokości n.p.m. w punktach (Lats, Lons, Names)
procedure ClearElevationSpotsUsuwa etykiety wysokości
procedure QueryElevation(const Lat, Lon: Double; const Callback: TMapResultProc)Wysokość n.p.m. w punkcie (callback JSON {"meters":…})

Pełny opis wszystkich właściwości: dokumentacja komponentów map.

Zobacz też