Do mapy możesz dodawać różne kształty. Kształt to obiekt na mapie powiązany z LatLng układem współrzędnych. Mapy 3D w interfejsie Maps JavaScript API obsługują dodawanie linii i wielokątów do mapy.
Linie łamane
Aby narysować linię na mapie, użyj linii łamanej. Klasa
Polyline3DElement
definiuje liniową nakładkę połączonych odcinków na mapie. Obiekt Polyline3DElement składa się z tablicy lokalizacji LatLng i tworzy serię odcinków łączących te lokalizacje w uporządkowanej sekwencji.
Dodawanie linii łamanej
Konstruktor Polyline3DElement przyjmuje zestaw Polyline3DElementOptions, który określa LatLng współrzędne linii, oraz zestaw stylów do dostosowania wizualnego zachowania polilinii.
Obiekty linii łamanych są rysowane na mapie jako seria prostych odcinków. Możesz określić spersonalizowane kolory, szerokości, przezroczystości, wysokości i opcje stylu geometrycznego kreski w Polyline3DElementOptions podczas tworzenia linii lub zmienić te właściwości po jej utworzeniu. Linia łamana obsługuje te style linii:
outerColor: szesnastkowy kolor HTML w formacie"#FFFFFF".outerWidth: wartość liczbowa z zakresu od0.0do1.0, która jest interpretowana jako procent wartościstrokeWidth.strokeColor: szesnastkowy kolor HTML w formacie"#FFFFFF".strokeWidth: szerokość linii w pikselach.geodesic: czy krawędzie wielokąta mają być zakrzywione zgodnie z krzywizną Ziemi, czy mają być rysowane jako linie proste.altitudeMode: sposób interpretacji składników wysokości we współrzędnych.drawsOccludedSegments: wartość logiczna wskazująca, czy części wielokąta zasłonięte przez obiekty (np. budynki) mają być rysowane.extruded: wartość logiczna wskazująca, czy linia łamana ma być połączona z podłożem.
let map; async function init() { const { Map3DElement, Polyline3DElement } = await google.maps.importLibrary('maps3d'); map = new Map3DElement({ center: { lat: 37.7927, lng: -122.402, altitude: 65.93 }, range: 3362.87, tilt: 64.01, heading: 25.0, mode: 'SATELLITE', gestureHandling: 'COOPERATIVE', }); document.body.append(map); const polyline = new Polyline3DElement({ path: [ { lat: 37.80515638571346, lng: -122.4032569467164 }, { lat: 37.80337073509504, lng: -122.4012878349353 }, { lat: 37.79925208843463, lng: -122.3976697250461 }, { lat: 37.7989102378512, lng: -122.3983408725656 }, { lat: 37.79887832784348, lng: -122.3987094864192 }, { lat: 37.79786443410338, lng: -122.4066878788802 }, { lat: 37.79549248916587, lng: -122.4032992702785 }, { lat: 37.78861484290265, lng: -122.4019489189814 }, { lat: 37.78618687561075, lng: -122.398969592545 }, { lat: 37.7892310309145, lng: -122.3951458683092 }, { lat: 37.7916358762409, lng: -122.3981969390652 }, ], strokeColor: 'blue', outerColor: 'white', strokeWidth: 10, outerWidth: 0.4, altitudeMode: 'RELATIVE_TO_GROUND', // Place it on the ground (as it has no altitude it will just be at ground height). drawsOccludedSegments: true, // Show the line through the buildings or anything else that might get in the way. }); map.append(polyline); } void init();
Interaktywne linie łamane
W tym przykładzie po zarejestrowaniu zdarzenia kliknięcia przełączana jest właściwość drawsOccludedSegments polilinii.
let map; async function init() { const { Map3DElement, Polyline3DInteractiveElement } = await google.maps.importLibrary('maps3d'); map = new Map3DElement({ center: { lat: 37.7927, lng: -122.402, altitude: 65.93 }, range: 3362.87, tilt: 64.01, heading: 25.0, mode: 'SATELLITE', gestureHandling: 'COOPERATIVE', }); document.body.append(map); const polyline = new Polyline3DInteractiveElement({ coordinates: [ { lat: 37.80515638571346, lng: -122.4032569467164 }, { lat: 37.80337073509504, lng: -122.4012878349353 }, { lat: 37.79925208843463, lng: -122.3976697250461 }, { lat: 37.7989102378512, lng: -122.3983408725656 }, { lat: 37.79887832784348, lng: -122.3987094864192 }, { lat: 37.79786443410338, lng: -122.4066878788802 }, { lat: 37.79549248916587, lng: -122.4032992702785 }, { lat: 37.78861484290265, lng: -122.4019489189814 }, { lat: 37.78618687561075, lng: -122.398969592545 }, { lat: 37.7892310309145, lng: -122.3951458683092 }, { lat: 37.7916358762409, lng: -122.3981969390652 }, ], strokeColor: 'blue', outerColor: 'white', strokeWidth: 10, outerWidth: 0.4, altitudeMode: 'RELATIVE_TO_GROUND', // Place it on the ground (as it has no altitude it will just be at ground height). drawsOccludedSegments: true, // Show the line through the buildings or anything else that might get in the way. }); polyline.addEventListener('gmp-click', function () { // Toggle whether the line draws occluded segments. this.drawsOccludedSegments = !this.drawsOccludedSegments; }); map.append(polyline); } void init();
Wielokąty
Wielokąt reprezentuje obszar ograniczony zamkniętą ścieżką (lub pętlą) zdefiniowaną przez serię współrzędnych.
Obiekty Polygon3DElement są podobne do obiektów Polyline3DElement, ponieważ składają się z ciągu uporządkowanych współrzędnych. Wielokąty są rysowane z obrysem i wypełnieniem. Możesz zdefiniować spersonalizowane kolory i szerokości boków wielokąta (kreski) oraz spersonalizowane kolory i nieprzezroczystość objętego nim obszaru (wypełnienie).
Kolory powinny być podane w szesnastkowym formacie HTML. Nazwy kolorów nie są obsługiwane.
Obiekty Polygon3DElement mogą opisywać złożone kształty, w tym:
- Wiele nieprzylegających do siebie obszarów zdefiniowanych przez jeden wielokąt.
- obszary z otworami,
- Przecięcia co najmniej 1 obszaru.
Aby zdefiniować złożony kształt, użyj wielokąta z wieloma ścieżkami.
Dodaj wielokąt
Obszar wielokątny może obejmować kilka oddzielnych ścieżek, dlatego właściwość paths obiektu Polygon3DElement określa tablicę tablic. Każda tablica definiuje oddzielną sekwencję uporządkowanych współrzędnych LatLng.
W przypadku podstawowych wielokątów składających się tylko z jednej ścieżki możesz utworzyć Polygon3DElement za pomocą pojedynczej tablicy LatLng współrzędnych. Interfejs 3D Maps w Maps JavaScript API przekształci tablicę w tablicę tablic podczas tworzenia, gdy będzie ją przechowywać we właściwości path.
async function init() { const { Map3DElement, Polygon3DElement } = await google.maps.importLibrary('maps3d'); const map3DElement = new Map3DElement({ center: { lat: 40.6842, lng: -74.0019, altitude: 1000 }, heading: 340, tilt: 70, mode: 'HYBRID', gestureHandling: 'COOPERATIVE', }); const polygonOptions = { strokeColor: '#0000ff80', strokeWidth: 8, fillColor: '#ff000080', drawsOccludedSegments: false, }; const examplePolygon = new Polygon3DElement(polygonOptions); examplePolygon.path = [ { lat: 40.7144, lng: -74.0208 }, { lat: 40.6993, lng: -74.019 }, { lat: 40.7035, lng: -74.0004 }, ]; map3DElement.append(examplePolygon); document.body.append(map3DElement); } void init();
Interaktywne wielokąty
W poniższym przykładzie po zarejestrowaniu zdarzenia kliknięcia zmieniamy kolor wewnętrzny i zewnętrzny wielokąta.
async function init() { const { Map3DElement, Polygon3DInteractiveElement } = await google.maps.importLibrary('maps3d'); const map = new Map3DElement({ center: { lat: 40.6842, lng: -74.0019, altitude: 1000 }, heading: 340, tilt: 70, mode: 'HYBRID', gestureHandling: 'COOPERATIVE', }); document.body.append(map); const polygonOptions = { strokeColor: '#0000ff80', strokeWidth: 8, fillColor: '#ff000080', drawsOccludedSegments: false, }; const examplePolygon = new Polygon3DInteractiveElement(polygonOptions); examplePolygon.path = [ { lat: 40.7144, lng: -74.0208 }, { lat: 40.6993, lng: -74.019 }, { lat: 40.7035, lng: -74.0004 }, { lat: 40.7144, lng: -74.0208 }, ]; examplePolygon.addEventListener('gmp-click', function (event) { // change the color of the polygon stroke and fill colors to a random alternatives! this.fillColor = randomizeHexColor(this.fillColor); this.strokeColor = randomizeHexColor(this.strokeColor); console.log(event); }); map.append(examplePolygon); } function randomizeHexColor(originalHexColor) { console.log(originalHexColor); const alpha = originalHexColor.substring(7); // Generate random values for Red, Green, Blue (0-255) const r = Math.floor(Math.random() * 256); const g = Math.floor(Math.random() * 256); const b = Math.floor(Math.random() * 256); console.log(r + ' ' + g + ' ' + b); // Convert decimal to 2-digit hex, padding with '0' if needed const rHex = ('0' + r.toString(16)).slice(-2); const gHex = ('0' + g.toString(16)).slice(-2); const bHex = ('0' + b.toString(16)).slice(-2); // Combine parts: '#' + random RGB + original Alpha (if any) return `#${rHex}${gHex}${bHex}${alpha}`; } void init();