Gdy określasz wysokość elementów na mapie 3D, takich jak linie, wielokąty, modele czy markery, na ich umiejscowienie może wpływać kilka czynników, zarówno w scenie, jak i w sposób, w jaki renderowanie sceny wchodzi w interakcję z tym elementem. Ten dokument opisuje użycie elementu „AltitudeMode” na mapie 3D i sposób zarządzania wysokością obiektów.
Oto jak możesz używać AltitudeMode w przypadku różnych typów funkcji:
Markery: Marker3DElement, Marker3DInteractiveElement
Określ wysokość lokalizacji, a także wyciągnięcie.
Modele: Model3DElement, Model3DInteractiveElement
Określ wysokość punktu zakotwiczenia modelu, która powinna być używana z jego orientacją w celu prawidłowego pozycjonowania w scenie.
Linie łamane: Polyline3DElement, Polyline3DInteractiveElement
Określ, w jaki sposób wysokość jest stosowana do punktów pozycji wzdłuż linii łamanej.
Wielokąty: Polygon3DElement, Polygon3DInteractiveElement
Określ, jak wysokość jest stosowana do punktów pozycji wzdłuż wielokąta.
Jak wysokość jest wykorzystywana w środowiskach 3D
Podczas umieszczania punktów w scenie 3D na ich ostateczną pozycję wpływa obecność zarejestrowanych budynków lub obiektów 3D, takich jak drzewa. Kluczowe jest zrozumienie 2 pojęć:
- Cyfrowy model terenu (DTM): przedstawia wysokość „gołej ziemi”. Pomyśl o tym jak o naturalnym kształcie terenu bez budynków, drzew ani innych konstrukcji. Wszystkie obszary są oparte na modelu DTM, który stanowi podstawę wysokości nad poziomem morza (obliczonej za pomocą EGM96).
- Cyfrowy model powierzchni (DSM): przedstawia wysokość „górnej powierzchni”, w tym budynków, drzew i innych konstrukcji. Na obszarach, na których zostały zarejestrowane obiekty (zwłaszcza w środowiskach miejskich, gdzie dominują budynki), widoczna powierzchnia będzie wyższa niż teren bazowy.
Rozróżnienie między DTM a DSM jest kluczowe dla zrozumienia, jak różne tryby wysokości oddziałują na te cyfrowe modele terenu (DEM), ponieważ umiejscowienie obiektów może być zasłonięte lub pod wpływem modelu powierzchni. Różnice możesz zobaczyć na poniższym diagramie:

Gdy funkcje nie mają danych o wysokości
Jeśli masz dane, w których brakuje pomiaru wysokości, lub korzystasz z danych z innej usługi Google, np. z usługi Trasy lub Miejsca, w zwróconej geometrii często nie będzie podana wysokość. W takich przypadkach umieszczenie funkcji w scenie wymaga starannego wyboru AltitudeMode:
- Przytwierdź do podłoża: najprostsze podejście, w którym funkcja automatycznie dopasowuje się do terenu. Ten tryb korzysta z modelu DTM.
- Nadaj mu dowolną wysokość + tryb względny: możesz przypisać wybraną wysokość, a następnie użyć trybu RELATIVE_TO_GROUND (który umieszcza obiekty względem modelu DTM) lub RELATIVE_TO_MESH (który umieszcza je nad modelem DSM).
- Użyj innej usługi, aby uzyskać wysokość: aby uzyskać dokładną wysokość DTM w lokalizacji obiektu, możesz użyć usługi takiej jak Elevation API Google Maps Platform. Jeśli jest to linia lub wielokąt, musisz to zrobić dla każdego punktu, który tworzy linię lub wielokąt.
Co oznaczają opcje AltitudeMode i kiedy ich używać?
Podczas definiowania funkcji możesz określić 4 opcje AltitudeMode:
ABSOLUTE
Wyobraź sobie samolot lecący na określonej wysokości nad poziomem morza, np. 10 000 stóp. Jego wysokość jest stała, bez względu na to, czy leci nad górą czy doliną.
Jak z niej korzystać: wysokość obiektu jest wyrażana względem średniego poziomu morza (obliczanego na podstawie modelu EGM96). Współrzędna wysokości obiektu jest interpretowana jako dokładna wysokość nad poziomem morza.
Kiedy używać: w przypadku obiektów o znanej, precyzyjnej wysokości, takich jak trasy lotów, obiekty podwodne o dokładnej głębokości czy instrumenty naukowe w stałych punktach.
CLAMP_TO_GROUND
Wyobraź sobie rozłożenie koca piknikowego bezpośrednio na zboczu wzgórza. Niezależnie od tego, czy wzgórze jest strome czy płaskie, koc zawsze leży płasko na widocznej powierzchni.
Sposób użycia: wysokość obiektu jest wyrażana jako umieszczona bezpośrednio na ziemi. Pozostaną na poziomie gruntu, dostosowując się do terenu, bez względu na podaną wartość wysokości. Współrzędna wysokości elementu jest ignorowana. Jest on rzutowany bezpośrednio na powierzchnię terenu (DTM).
Kiedy stosować: W przypadku obiektów, które zawsze powinny być dostosowane do terenu, takich jak drogi, ogrodzenia, szlaki, granice nieruchomości lub podstawy budynków.
RELATIVE_TO_GROUND
Wyobraź sobie balon na gorące powietrze, który utrzymuje się 100 metrów nad naturalną wysokością terenu (DTM). Jeśli teren się wznosi, balon wznosi się wraz z nim, utrzymując 100-metrową odległość od „gołej ziemi”.
Jak z niej korzystać: wysokość obiektu jest wyrażana względem powierzchni ziemi (DTM). Współrzędna wysokości obiektu jest interpretowana jako przesunięcie względem wysokości terenu w jego położeniu poziomym.
Kiedy używać: w przypadku obiektów, które muszą zachować stałą wysokość nad naturalnym terenem, np. wież telekomunikacyjnych lub linii napowietrznych na obszarach wiejskich.
RELATIVE_TO_MESH
Dron leci na stałej wysokości nad dowolnym obiektem, nad którym przelatuje, niezależnie od tego, czy jest to goła ziemia, dach budynku czy wierzchołek drzewa. Dostosowuje się do najwyższej widocznej powierzchni (DSM).
Sposób użycia: wysokość obiektu jest wyrażana względem najwyższej powierzchni gruntu, budynku lub wody (DSM). Współrzędna wysokości funkcji jest interpretowana jako przesunięcie względem wysokości DSM.
Kiedy używać: w przypadku obiektów, które muszą unosić się na określonej wysokości nad tym, co znajduje się fizycznie w danym miejscu (DTM, budynki, woda). Przydatne w przypadku znaczników na dachach lub elementów, które dynamicznie dostosowują się do widocznej sceny.
Więcej informacji znajdziesz w dokumentacji stałych AltitudeMode.
Przykłady wizualne i zastosowania praktyczne
W tych przykładach wykorzystano konkretną lokalizację, Stonehenge, aby zilustrować, w jaki sposób różne opcje AltitudeMode wpływają na rozmieszczenie obiektów. W poniższych przykładach najpierw omówiono pozycjonowanie znaczników, następnie linii i obszarów, co wiąże się z kilkoma różnymi zagadnieniami.
Znaczniki pozycji
Rozważ znacznik umieszczony w następujący sposób:
const markerLocation = { lat: 51.1789, lng: -1.8262, altitude: 102.23 };
Jest to biała pinezka widoczna na poniższej scenie:

Teraz spójrz na obraz poniżej, na którym widać pinezki w różnych kolorach umieszczone w różnych trybach wysokości.

Przyjrzyjmy się, jak różne AltitudeModewpływają na pozycjonowanie znacznika w kolejności rosnącej wysokości.
CLAMP_TO_GROUND (fioletowa pinezka)
Ten pin ignoruje wartość wysokości i przyczepia się do najbliższego punktu na ziemi. Znajduje się ona tuż pod białym pinezką, „przyczepiając” się do terenu.
Technicznie rzecz biorąc, tryb ten ignoruje rzeczywistą wysokość i zaciska pinezkę na najbliższej wysokości DTM.
ABSOLUTE (biała pinezka)
Ten pin używa dokładnej wartości wysokości (102,23 m), aby umieścić znacznik na tej wysokości nad poziomem morza (EGM96), na jednym z kamieni Stonehenge, zgodnie z podaną wysokością.
Technicznie ten tryb wykorzystuje rzeczywistą podaną wartość wysokości, aby umieścić pinezkę na określonej wysokości nad poziomem morza, która w tym przykładzie jest lokalizacją Stonehenge, ale na szczycie jednego z kamieni.
RELATIVE_TO_GROUND (pomarańczowy pin)
Ten pinezka jest umieszczona na podstawie terenu (DTM) i znajduje się 102,23 m nad poziomem gruntu, co sprawia, że wydaje się unosić nad naturalnym podłożem, które znajduje się pod kamieniem w henge.
Technicznie ten tryb ustawia podstawę na poziomie rzeczywistego modelu DTM na ziemi, a następnie umieszcza pinezkę 102,23 m nad nim.
RELATIVE_TO_MESH (niebieski pinezek)
Ten pin korzysta z widocznej powierzchni (DSM) jako podstawy i jest umieszczony 102,23 m nad tą powierzchnią. W tym trybie wysokość kamienia jest uwzględniana w pomiarze, co powoduje, że jest on nieco wyżej niż pomarańczowy znacznik.
Technicznie ten tryb wykorzystuje siatkę (DSM) jako podstawę i umieszcza lokalizację na podanej wysokości nad nią. Ponieważ DSM znajduje się na szczycie kamienia, ten pin uwzględnia tę dodatkową wysokość w swoim pomiarze podczas określania wysokości względnej, co sprawia, że jest on nieco wyżej niż pin RELATIVE_TO_GROUND.
Pozycjonowanie linii i obszarów
W przypadku linii i obszarów kluczowe znaczenie ma wysokość punktów w obrębie obiektu (niezależnie od tego, czy została określona, czy nie), a także używany AltitudeMode. Przyjrzyjmy się linii wzdłuż Stonehenge o tych wysokościach:
const lineCoords = [
{ lat: 51.1786, lng : -1.8266, altitude: 101.36 },
{ lat: 51.1787, lng : -1.8264, altitude: 101.18 },
{ lat: 51.178778, lng : -1.826354, altitude: 104.89 },
{ lat: 51.178815, lng : -1.826275, altitude: 107.55 },
{ lat: 51.178923, lng : -1.825980, altitude: 105.53 },
{ lat: 51.1791, lng : -1.8258, altitude: 100.29 },
{ lat: 51.1792, lng : -1.8257, altitude: 100.29 }
];
Linię tę można zobaczyć na poniższym obrazku w kolorze białym, przy użyciu pozycjonowania absolutnego.

Na poniższym obrazku ponownie widać linie wykorzystujące różne tryby wysokości. Omówmy je po kolei, od najniższego do najwyższego.

CLAMP_TO_GROUND (linia fioletowa)
Ta linia ignoruje określoną wysokość każdego punktu i zamiast tego „przeciąga” linię bezpośrednio nad podłożem (DTM). Podąża za ukształtowaniem terenu, ignorując wszelkie elementy, takie jak budynki czy kamienie, które znajdują się nad nim.
Technicznie ten tryb ignoruje rzeczywiste wartości wysokości i nakłada linię na DTM, dopasowując ją do ukształtowania terenu i ignorując siatkę obiektów nad nią.
ABSOLUTE (White Line)
Ta linia wykorzystuje dokładną wysokość dla każdego punktu, przez co przebiega nad niektórymi kamieniami. Jest ona połączona prostymi liniami między poszczególnymi punktami, co czasami może sprawiać wrażenie, że przechodzi przez obiekty, jeśli punkty nie są wystarczająco gęsto rozmieszczone.
Technicznie ten tryb śledzi określoną wysokość dla każdego punktu, łącząc je liniami prostymi, co oznacza, że może przechodzić przez siatkę (np. kamienie), jeśli tak wskazują wartości wysokości. Ten scenariusz omówimy w dalszej części.
RELATIVE_TO_GROUND (Orange Line)
Ta linia wykorzystuje naturalne ukształtowanie terenu (DTM) jako podstawę i umieszcza każdy punkt na określonej wysokości nad poziomem gruntu.
Technicznie ten tryb wykorzystuje DTM jako podstawę i umieszcza lokalizacje linii na podanej wysokości względem niej.
RELATIVE_TO_MESH (niebieska linia)
Ta linia wykorzystuje widoczną powierzchnię, która obejmuje budynki i kamienie. Następnie umieszcza każdy punkt na określonej wysokości nad tą siatką, skutecznie odtwarzając kształt linii w odniesieniu do widocznego krajobrazu.
Technicznie rzecz biorąc, tryb ten wykorzystuje siatkę (DSM) jako bazę i umieszcza lokalizacje na określonej wysokości powyżej niej. W zależności od siatki linia może się zmieniać ze względu na różne ukształtowanie terenu.
Gdy wysokość nie jest określona w przypadku linii
Rozważmy teraz te same współrzędne linii, ale bez podanej wysokości:
const lineCoords = [
{ lat: 51.1786, lng : -1.8266 },
{ lat: 51.1787, lng : -1.8264 },
{ lat: 51.178778, lng : -1.826354 },
{ lat: 51.178815, lng : -1.826275 },
{ lat: 51.178923, lng : -1.825980 },
{ lat: 51.1791, lng : -1.8258 },
{ lat: 51.1792, lng : -1.8257 }
];
W takim przypadku, gdy nie podano wysokości, linie często pojawiają się w podobnych miejscach. Linie biała, pomarańczowa i fioletowa mogą się połączyć w jedną linię (pomarańczową, ponieważ zwykle jest rysowana jako ostatnia), ponieważ wszystkie domyślnie mają podobne położenie na poziomie gruntu. Możesz to zobaczyć poniżej:

Niebieska linia (RELATIVE_TO_MESH) ponownie wykorzystuje siatkę (DSM) jako podstawę. Ponieważ nie określono wysokości, punkty są nakładane bezpośrednio na siatkę. Pamiętaj, że nie rysuje linii na siatce, ale łączy wybrane punkty na siatce prostymi liniami. W niektórych przypadkach może to wyglądać dobrze, ale gdy element jest zasłonięty przez inne funkcje, może to powodować problemy z widocznością. Ten problem omawiamy w następnej sekcji.
Interakcja siatek i linii. Teraz możemy przyjrzeć się kolejnej linii. Ten obraz znajduje się w tym samym obszarze, ale obejmuje większy obszar (lub zawiera więcej szczegółów na temat DSM nałożonego na DTM).
const lineCoords = [
{ lat: 51.188404, lng: -1.779059, altitude: 70.69 },
{ lat: 51.187955, lng: -1.780143, altitude: 77.25 },
{ lat: 51.187658, lng: -1.781552, altitude: 68.97 },
{ lat: 51.187376, lng: -1.782447, altitude: 99.02 },
{ lat: 51.186912, lng: -1.783692, altitude: 104.35 },
{ lat: 51.185855, lng: -1.788368, altitude: 86.91 },
];
Gdy zobaczymy reprezentację z użyciem tych samych metod (i kolorów) co wcześniej, uzyskamy taki widok:

Fioletowy to CLAMP_TO_GROUND, który widać na ziemi. Biel jest BEZWZGLĘDNA, co widać po tym, że proste linie łączą punkty, które są umieszczone bezwzględnie w przestrzeni. Kolory pomarańczowy i niebieski są względnymi wersjami powierzchni (DTM) lub siatki (DSM). Zwróć uwagę, że niebieska linia ma nieco inny kształt ze względu na wysokość elementów poniżej.
Ponownie możemy zauważyć, że charakter tworzenia linii oznacza, że przechodzi ona przez siatkę, ponieważ punkty są połączone liniami prostymi. W takiej sytuacji linie mogą być niewidoczne, dlatego możesz ustawić wartość drawsOccludedSegments na true, aby linia była widoczna przez drzewa. Szczegółowo ilustruje to poniższy obraz, na którym widać linie przechodzące przez siatkę.

Ze względu na sposób pozycjonowania w przestrzeni punkty mogą znajdować się w siatce, a linie łączące punkty również mogą się w niej znajdować, co może powodować artefakty wizualne. W sekcji poniżej zobaczymy, jak w miarę możliwości można ulepszyć takie artefakty.
Rozwiązywanie problemów z interakcją między liniami a terenem
W tym samym obszarze możemy też zobaczyć inne artefakty, o których musimy pamiętać, gdy używamy określonych trybów wysokości.
Mamy tu stosunkowo płaski obszar, który znajduje się głównie na poziomie DTM, z ograniczoną liczbą dodatkowych szczegółów powyżej w siatce. Taka sytuacja wystąpiłaby również na obszarze, który nie ma pokrycia 3D powyżej modelu terenu. Przyjrzyjmy się tej lokalizacji:
const lineCoords = [
{ lat: 51.194642, lng: -1.782636, altitude: 99.10 },
{ lat: 51.193974, lng: -1.783952, altitude: 99.86 },
{ lat: 51.192203, lng: -1.787175, altitude: 96.14 },
{ lat: 51.190024, lng: -1.790250, altitude: 105.92 },
{ lat: 51.187491, lng: -1.793580, altitude: 102.60 },
{ lat: 51.183690, lng: -1.798745, altitude: 95.69 },
];
Jak widać na obrazie, linie mają te same kolory co wcześniej: biały – ABSOLUTE, niebieski – RELATIVE_TO_MESH, fioletowy – CLAMP_TO_GROUND, pomarańczowy – RELATIVE_TO_GROUND.

Widzimy tu kilka artefaktów. Pierwszy z nich polega na tym, że z powodu braku pokrycia powierzchni linie pomarańczowa (RELATIVE_TO_GROUND) i niebieska (RELATIVE_TO_MESH) znajdują się (w większości) w tym samym miejscu (przy czym linia niebieska jest widoczna, ponieważ jest rysowana jako ostatnia).
Widzimy też, że fioletowa linia (CLAMP_TO_GROUND) przebiega wzdłuż ziemi i jest widoczna na wzgórzu, a biała linia (ABSOLUTE) znika we wzgórzu, ponieważ połączone są tylko punkty, a proste linie przechodzą przez ziemię.
Możesz to zobaczyć na tym obrazie, gdy fioletowa linia jest ukryta.

Może to prowadzić do dziwnych artefaktów wizualnych, w których linia znika pod ziemią (lub nawet przez siatkę), ponieważ linia między punktami po prostu podąża prostą ścieżką. Możesz poprawić wygląd takiej linii, dodając więcej punktów między liniami za pomocą metody interpolacji. Wpływ na wygląd będzie zależeć od użytej metody:
- W przypadku pomiarów względnych (RELATIVE_TO_GROUND lub RELATIVE_TO_MESH): jeśli używasz względnych wartości wysokości, utworzenie większej liczby punktów wzdłuż linii lub wielokąta umożliwi umieszczenie obiektu na odpowiedniejszym poziomie, lepiej dopasowanym do profilu wysokości. Jeśli w Twoich danych nie ma tych punktów pośrednich, możesz je dodać za pomocą funkcji interpolacji, np. funkcji Interpolate w bibliotece Geometry w Google Maps Platform. Nowym punktom można przypisać wartości względne, które zostaną umieszczone nad odpowiednim profilem wysokościowym. Długość dowolnej linii łączącej punkty zostanie ograniczona, a reprezentacja wizualna ulepszona.
- W przypadku funkcji bezwzględnych (ABSOLUTE): w przypadku funkcji bezwzględnych więcej punktów musi mieć rzeczywiste wartości wysokości. Interpolacja między istniejącymi wartościami bezwzględnymi nie da punktu, który dokładnie odzwierciedlałby jakąkolwiek wartość powyżej siatki, ponieważ byłby to tylko średnia między punktem A a punktem B.
Podsumowanie
Mamy nadzieję, że ten dokument zawiera wyczerpujące omówienie AltitudeModeopcji w fotorealistycznych mapach 3D, a także szczegółowe informacje o tym, jak wartości ABSOLUTE, CLAMP_TO_GROUND, RELATIVE_TO_GROUND i RELATIVE_TO_MESH wpływają na umieszczanie i renderowanie różnych elementów, takich jak markery, linie i wielokąty.
Zrozumienie, jak te tryby działają w połączeniu z cyfrowym modelem terenu (DTM) i cyfrowym modelem powierzchni (DSM), ma kluczowe znaczenie dla tworzenia dokładnych i atrakcyjnych wizualnie reprezentacji map 3D z minimalną liczbą artefaktów wizualnych.
Zachęcamy do eksperymentowania z tymi trybami wysokości w swoich projektach, aby w pełni wykorzystać potencjał mapowania 3D i zapewnić użytkownikom angażujące, realistyczne wrażenia.
Współtwórcy
Matt Toon | Inżynier ds. rozwiązań, Geo Developer