Create markers with graphics
Stay organized with collections
Save and categorize content based on your preferences.
See the complete example source code
JavaScript
asyncfunctioninit(){ const{Map3DElement,Marker3DElement}=awaitgoogle.maps.importLibrary('maps3d'); const{PinElement}=awaitgoogle.maps.importLibrary('marker'); const{Place}=awaitgoogle.maps.importLibrary('places'); constmap=newMap3DElement({ center:{lat:37.426,lng:-122.082,altitude:18}, tilt:67.5, range:4000, mode:'SATELLITE', gestureHandling:'COOPERATIVE', }); // A marker with a with a URL pointing to a PNG. constbeachFlagImg=document.createElement('img'); beachFlagImg.src=newURL('images/beachflag.png',import.meta.url); constbeachFlagMarker=newMarker3DElement({ position:{lat:37.434,lng:-122.082}, }); consttemplateForImg=document.createElement('template'); templateForImg.content.append(beachFlagImg); beachFlagMarker.append(templateForImg); map.append(beachFlagMarker); // A marker with a custom SVG glyph and white background. constglyphImgUrl=newURL('images/192px.svg',import.meta.url); constglyphSvgPinElement=newPinElement({ background:'white', glyphSrc:newURL(glyphImgUrl), }); constglyphSvgMarker=newMarker3DElement({ position:{lat:37.425,lng:-122.07,altitude:100}, extruded:true, altitudeMode:'ABSOLUTE', }); glyphSvgMarker.append(glyphSvgPinElement); try{ map.append(glyphSvgMarker); } catch(error){ console.error(error); } // A marker customized using a place icon and color, name, and geometry. constplace=newPlace({ id:'ChIJN5Nz71W3j4ARhx5bwpTQEGg', }); // Call fetchFields, passing the desired data fields. awaitplace.fetchFields({ fields:[ 'location', 'displayName', 'svgIconMaskURI', 'iconBackgroundColor', ], }); constpinElement=newPinElement({ background:place.iconBackgroundColor, glyphSrc:newURL(String(place.svgIconMaskURI)), }); constplaceIconMarker=newMarker3DElement({ position:place.location, }); placeIconMarker.append(pinElement); map.append(placeIconMarker); // Used to parse the SVG string. constparser=newDOMParser(); // A marker with a custom inline SVG. constpinSvgString='<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect width="56" height="56" rx="28" fill="#7837FF"></rect><path d="M46.0675 22.1319L44.0601 22.7843" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.9402 33.2201L9.93262 33.8723" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M27.9999 47.0046V44.8933" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M27.9999 9V11.1113" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M39.1583 43.3597L37.9186 41.6532" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M16.8419 12.6442L18.0816 14.3506" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.93262 22.1319L11.9402 22.7843" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M46.0676 33.8724L44.0601 33.2201" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M39.1583 12.6442L37.9186 14.3506" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M16.8419 43.3597L18.0816 41.6532" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M28 39L26.8725 37.9904C24.9292 36.226 23.325 34.7026 22.06 33.4202C20.795 32.1378 19.7867 30.9918 19.035 29.9823C18.2833 28.9727 17.7562 28.0587 17.4537 27.2401C17.1512 26.4216 17 25.5939 17 24.7572C17 23.1201 17.5546 21.7513 18.6638 20.6508C19.7729 19.5502 21.1433 19 22.775 19C23.82 19 24.7871 19.2456 25.6762 19.7367C26.5654 20.2278 27.34 20.9372 28 21.8649C28.77 20.8827 29.5858 20.1596 30.4475 19.6958C31.3092 19.2319 32.235 19 33.225 19C34.8567 19 36.2271 19.5502 37.3362 20.6508C38.4454 21.7513 39 23.1201 39 24.7572C39 25.5939 38.8488 26.4216 38.5463 27.2401C38.2438 28.0587 37.7167 28.9727 36.965 29.9823C36.2133 30.9918 35.205 32.1378 33.94 33.4202C32.675 34.7026 31.0708 36.226 29.1275 37.9904L28 39Z" fill="#FF7878"></path></svg>'; // Read the svg string. constpinSvg=parser.parseFromString(pinSvgString,'image/svg+xml').documentElement; constmarkerWithCustomSvg=newMarker3DElement({ position:{lat:37.425,lng:-122.094}, }); consttemplateForSvg=document.createElement('template'); templateForSvg.content.append(pinSvg); markerWithCustomSvg.append(templateForSvg); map.append(markerWithCustomSvg); document.body.append(map); } init(); export{};
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ html, map{ height:100%; } body{ height:100%; margin:0; padding:0; }
HTML
<html>
<head>
<title>Map</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="map"></div>
<!-- prettier-ignore -->
<script>(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})
({key: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "weekly",});</script>
</body>
</html>Try Sample
The Markers API for 3D Maps supports replacing the default marker icon with a custom graphic image. You can also replace the glyph with an image file. This page shows you how to:
- Use a custom graphic file
- Use a custom image file
- Use an inline SVG
- Use a place icon image as the glyph
The markers API supports all common image file types, including PNG, JPEG, GIF, SVG, and TIFF.
In order to add markers to a map, you must first load the marker
library, which provides the
Marker3DElement and PinElement classes.
Use a custom graphic file
Create a marker using a custom image by passing an img element referencing a
graphic file resource (for example, an SVG), to the Marker3DElement.content
option:
constglyphImgUrl='https://www.gstatic.com/images/branding/productlogos/maps/v7/192px.svg';
constglyphSvgPinElement=newPinElement({
background:'white',
glyphSrc:newURL(glyphImgUrl),
});
constglyphSvgMarker=newMarker3DElement({
position:{lat:37.425,lng:-122.07},
});
glyphSvgMarker.append(glyphSvgPinElement);
Use an image file
Create a marker with a custom image using a PNG:
constbeachFlagImg=document.createElement('img');
beachFlagImg.src='https://maps-docs-team.web.app/assets/beachflag.png';
constbeachFlagMarker=newMarker3DElement({
position:{lat:37.434,lng:-122.082},
});
consttemplateForImg=document.createElement('template');
templateForImg.content.append(beachFlagImg);
beachFlagMarker.append(templateForImg);
map.append(beachFlagMarker);
Use an inline SVG
Some scenarios may call for the use of an inline SVG. Create a marker using an
inline SVG image by passing an SVG XML element to the Marker3DElement.content
option:
constpinSvgString='<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect width="56" height="56" rx="28" fill="#7837FF"></rect><path d="M46.0675 22.1319L44.0601 22.7843" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.9402 33.2201L9.93262 33.8723" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M27.9999 47.0046V44.8933" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M27.9999 9V11.1113" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M39.1583 43.3597L37.9186 41.6532" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M16.8419 12.6442L18.0816 14.3506" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.93262 22.1319L11.9402 22.7843" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M46.0676 33.8724L44.0601 33.2201" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M39.1583 12.6442L37.9186 14.3506" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M16.8419 43.3597L18.0816 41.6532" stroke="white" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="M28 39L26.8725 37.9904C24.9292 36.226 23.325 34.7026 22.06 33.4202C20.795 32.1378 19.7867 30.9918 19.035 29.9823C18.2833 28.9727 17.7562 28.0587 17.4537 27.2401C17.1512 26.4216 17 25.5939 17 24.7572C17 23.1201 17.5546 21.7513 18.6638 20.6508C19.7729 19.5502 21.1433 19 22.775 19C23.82 19 24.7871 19.2456 25.6762 19.7367C26.5654 20.2278 27.34 20.9372 28 21.8649C28.77 20.8827 29.5858 20.1596 30.4475 19.6958C31.3092 19.2319 32.235 19 33.225 19C34.8567 19 36.2271 19.5502 37.3362 20.6508C38.4454 21.7513 39 23.1201 39 24.7572C39 25.5939 38.8488 26.4216 38.5463 27.2401C38.2438 28.0587 37.7167 28.9727 36.965 29.9823C36.2133 30.9918 35.205 32.1378 33.94 33.4202C32.675 34.7026 31.0708 36.226 29.1275 37.9904L28 39Z" fill="#FF7878"></path></svg>';
constpinSvg=
parser.parseFromString(pinSvgString,'image/svg+xml').documentElement;
constmarkerWithCustomSvg=newMarker3DElement({
position:{lat:37.425,lng:-122.094},
});
consttemplateForSvg=document.createElement('template');
templateForSvg.content.append(pinSvg);
markerWithCustomSvg.append(templateForSvg);
Use a place icon image as the glyph
You can customize markers by replacing the glyph with a place icon, as demonstrated below.
// A marker customized using a place icon and color, name, and geometry.
constplace=newPlace({
id:'ChIJN5Nz71W3j4ARhx5bwpTQEGg',
});
// Call fetchFields, passing the chosen data fields.
awaitplace.fetchFields({fields:['location','displayName','svgIconMaskURI','iconBackgroundColor']});
constpinElement=newPinElement({
background:place.iconBackgroundColor,
glyphSrc:newURL(String(place.svgIconMaskURI)),
});
constplaceIconMarker=newMarker3DElement({
position:place.location,
});
placeIconMarker.append(pinElement);
```