MarkerImage has been deprecated in Maps v3.

In any case, check out Symbols from the Developers Guide, and then this example:

Based on that example, try this:

var marker = new google.maps.Marker({
    position: new google.maps.LatLng(38.4269929, -81.7921109),
    icon: {
        path: $('#svg_elem').attr('d'),
        //style elements: fillColor, strokeWeight, etc
        // ...
    map: map

I'm not sure if you can get everything you'd like in one SVG path (text, etc) but that should get you most of the way there. There are other methods in the Google Maps API that may be able to get the text on top without too much hassle.


After running into the above snafu with google maps, I just decided to start using Leaflet, CSS3, and L.divIcon, see my solution below.

.markerIcon {
    width: 30px;
    height: 32px;
    box-shadow: 0 0 1px white;

.markerIcon .arrow {
    width: 0;
    height: 0;
    border-left: 7px solid transparent;
    border-right: 7px solid transparent;
    margin: 0 auto;
    border-top: 8px solid #446cff;

.markerIcon .top {
    color: white;
    font-size: 11px;
    text-align: center;
    width: 30px;
    height: 32px;
    background-color: #446cff;
    line-height: 1.3em;
    padding-top: 2px;

<div class="markerHolder" style="display: none">
    <div class="markerIcon">
        <div class="top">HEADER<br><span id="value">888</span></div>
        <div class="arrow"></div>

var $marker = $('#value').text('99');
var marker = new ftzMarker(L.latLng(lat, lng), {
    icon: L.divIcon({
        html: $('.markerHolder').html()


The only workaround I can think of, is having to create two markers, one with the image and another with the text and add the text marker at the same anchor as the image marker, but a layer above it. This will require some functions for binding the two markers if you want the marker to be draggable(an event listener that listens to one marker, gets it's coords, and assigns the coords to the second marker so it is moved as well. Tricky, but possible.


There is a solution which might be helpful in this case.

You can use an alternative 'URL' with base64 encoded svg:

var svg = '<svg width="400" height="110"><rect width="300" height="100" /></svg>';
icon.url = 'data:image/svg+xml;charset=UTF-8;base64,' + btoa(svg);

JavaScript (Firefox) btoa() is used to get the base64 encoding from the SVG text. Your may also use to generate base data URLs.

Here is a full example jsfiddle:

<!DOCTYPE html>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <script src="" type="text/javascript"></script>
        <div id="map" style="width: 500px; height: 400px;"></div>
        <script type="text/javascript">
            var map = new google.maps.Map(document.getElementById('map'), {
                zoom: 10,
                center: new google.maps.LatLng(-33.92, 151.25),
                mapTypeId: google.maps.MapTypeId.ROADMAP

            var template = [
                '<?xml version="1.0"?>',
                    '<svg width="26px" height="26px" viewBox="0 0 100 100" version="1.1" xmlns="">',
                        '<circle stroke="#222" fill="{{ color }}" cx="50" cy="50" r="35"/>',
            var svg = template.replace('{{ color }}', '#800');

            var docMarker = new google.maps.Marker({
                position: new google.maps.LatLng(-33.92, 151.25),
                map: map,
                title: 'Dynamic SVG Marker',
                icon: { url: 'data:image/svg+xml;charset=UTF-8;base64,' + btoa(svg) }

Additional Information and an other solution using InfoBox can be found here.

Although this answer might be too late for you, it might help others looking for a solution to the same problem.

Related Query

More Query from same tag