google-mapsgoogle-maps-api-3google-maps-markersmarkerclusterer

Why do Google Maps markers using MarkerClusterer not show up on the map if I rename the map variable?


I want to use the Google Maps API on my webpage. Also, I want to cluster markers using MarkerClusterer, following this tutorial.

Before renaming

The following code works as expected:

Note: I removed the API key.

<html>
    <head>
        <title>Marker Clustering</title>
        <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>

        <style>
            #googleMapsDesktop {
                height: 100%;
            }

            html,
            body {
                height: 100%;
                margin: 0;
                padding: 0;
            }
        </style>
    </head>
    <body>
        <div id="googleMapsDesktop"></div>

        <script type="module">
            import { MarkerClusterer } from "https://cdn.skypack.dev/@googlemaps/markerclusterer@2.0.3";

            function initMap() {
                const map = new google.maps.Map(document.getElementById("googleMapsDesktop"), {
                    zoom: 3,
                    center: { lat: -28.024, lng: 140.887 },
                });

                const infoWindow = new google.maps.InfoWindow({
                    content: "",
                    disableAutoPan: true,
                });

                const labels = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

                const markers = locations.map((position, i) => {
                    const label = labels[i % labels.length];
                    const marker = new google.maps.Marker({
                        position,
                        label,
                    });

                    marker.addListener("click", () => {
                        infoWindow.setContent(label);
                        infoWindow.open(map, marker);
                    });
                    return marker;
                });

                new MarkerClusterer({ markers, map });
            }

            const locations = [
                { lat: -31.56391, lng: 147.154312 },
                { lat: -33.718234, lng: 150.363181 },
                { lat: -33.727111, lng: 150.371124 },
                { lat: -33.848588, lng: 151.209834 },
                { lat: -33.851702, lng: 151.216968 },
                { lat: -34.671264, lng: 150.863657 },
                { lat: -35.304724, lng: 148.662905 },
                { lat: -36.817685, lng: 175.699196 },
                { lat: -36.828611, lng: 175.790222 },
                { lat: -37.75, lng: 145.116667 },
                { lat: -37.759859, lng: 145.128708 },
                { lat: -37.765015, lng: 145.133858 },
                { lat: -37.770104, lng: 145.143299 },
                { lat: -37.7737, lng: 145.145187 },
                { lat: -37.774785, lng: 145.137978 },
                { lat: -37.819616, lng: 144.968119 },
                { lat: -38.330766, lng: 144.695692 },
                { lat: -39.927193, lng: 175.053218 },
                { lat: -41.330162, lng: 174.865694 },
                { lat: -42.734358, lng: 147.439506 },
                { lat: -42.734358, lng: 147.501315 },
                { lat: -42.735258, lng: 147.438 },
                { lat: -43.999792, lng: 170.463352 },
            ];

            window.initMap = initMap;
        </script>

        <script src="https://maps.googleapis.com/maps/api/js?key=xxxxxxxxxxxxxxxxxxxx&callback=initMap" defer></script>
    </body>
</html>

This is the output:

Screenshot 1


After renaming

Now, if I just rename the map variable from this...

const map = new google.maps.Map(document.getElementById("googleMapsDesktop"), {...});

...to this...

const mapDesktop = new google.maps.Map(document.getElementById("googleMapsDesktop"), {...});

...and update the code, the markers don't show on the map.

The following code doesn't work (i.e., the markers don't show on the map):

Note: I removed the API key.

<html>
    <head>
        <title>Marker Clustering</title>
        <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>

        <style>
            #googleMapsDesktop {
                height: 100%;
            }

            html,
            body {
                height: 100%;
                margin: 0;
                padding: 0;
            }
        </style>
    </head>
    <body>
        <div id="googleMapsDesktop"></div>

        <script type="module">
            import { MarkerClusterer } from "https://cdn.skypack.dev/@googlemaps/markerclusterer@2.0.3";

            function initMap() {
                const mapDesktop = new google.maps.Map(document.getElementById("googleMapsDesktop"), {
                    zoom: 3,
                    center: { lat: -28.024, lng: 140.887 },
                });

                const infoWindow = new google.maps.InfoWindow({
                    content: "",
                    disableAutoPan: true,
                });

                const labels = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

                const markers = locations.map((position, i) => {
                    const label = labels[i % labels.length];
                    const marker = new google.maps.Marker({
                        position,
                        label,
                    });

                    marker.addListener("click", () => {
                        infoWindow.setContent(label);
                        infoWindow.open(mapDesktop, marker);
                    });
                    return marker;
                });

                new MarkerClusterer({ markers, mapDesktop });
            }

            const locations = [
                { lat: -31.56391, lng: 147.154312 },
                { lat: -33.718234, lng: 150.363181 },
                { lat: -33.727111, lng: 150.371124 },
                { lat: -33.848588, lng: 151.209834 },
                { lat: -33.851702, lng: 151.216968 },
                { lat: -34.671264, lng: 150.863657 },
                { lat: -35.304724, lng: 148.662905 },
                { lat: -36.817685, lng: 175.699196 },
                { lat: -36.828611, lng: 175.790222 },
                { lat: -37.75, lng: 145.116667 },
                { lat: -37.759859, lng: 145.128708 },
                { lat: -37.765015, lng: 145.133858 },
                { lat: -37.770104, lng: 145.143299 },
                { lat: -37.7737, lng: 145.145187 },
                { lat: -37.774785, lng: 145.137978 },
                { lat: -37.819616, lng: 144.968119 },
                { lat: -38.330766, lng: 144.695692 },
                { lat: -39.927193, lng: 175.053218 },
                { lat: -41.330162, lng: 174.865694 },
                { lat: -42.734358, lng: 147.439506 },
                { lat: -42.734358, lng: 147.501315 },
                { lat: -42.735258, lng: 147.438 },
                { lat: -43.999792, lng: 170.463352 },
            ];

            window.initMap = initMap;
        </script>

        <script src="https://maps.googleapis.com/maps/api/js?key=xxxxxxxxxxxxxxxxxxxx&callback=initMap" defer></script>
    </body>
</html>

This is the output:

Screenshot 2

Also, the console doesn't show any errors related to the Google Maps API or MarkerClusterer.

What am I missing?


Solution

  • OK I found the issue, with the help of this closed issue which is somehow related.

    When creating the cluster with new MarkerClusterer({ markers, mapX }); it will fail, but using new MarkerClusterer({ markers, map: mapX }); will work fine.

    If you want to be on the safe side, maybe the best option is to use:

    new MarkerClusterer({ markers: markers, map: mapX });

    Working code snippet below.

    <html>
        <head>
            <title>Marker Clustering</title>
            <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
    
            <style>
                #googleMapsDesktop {
                    height: 100%;
                }
    
                html,
                body {
                    height: 100%;
                    margin: 0;
                    padding: 0;
                }
            </style>
        </head>
        <body>
            <div id="googleMapsDesktop"></div>
    
            <script type="module">
                import { MarkerClusterer } from "https://cdn.skypack.dev/@googlemaps/markerclusterer@2.0.3";
    
                function initMap() {
                    const mapX = new google.maps.Map(document.getElementById("googleMapsDesktop"), {
                        zoom: 3,
                        center: { lat: -28.024, lng: 140.887 },
                    });
    
                    const infoWindow = new google.maps.InfoWindow({
                        content: "",
                        disableAutoPan: true,
                    });
    
                    const labels = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
                    const markers = locations.map((position, i) => {
                        const label = labels[i % labels.length];
                        const marker = new google.maps.Marker({
                            position,
                            label,
                        });
    
                        marker.addListener("click", () => {
                            infoWindow.setContent(label);
                            infoWindow.open(mapX, marker);
                        });
                        return marker;
                    });
    
                    new MarkerClusterer({ markers: markers, map: mapX });
                }
    
                const locations = [
                    { lat: -31.56391, lng: 147.154312 },
                    { lat: -33.718234, lng: 150.363181 },
                    { lat: -33.727111, lng: 150.371124 },
                    { lat: -33.848588, lng: 151.209834 },
                    { lat: -33.851702, lng: 151.216968 },
                    { lat: -34.671264, lng: 150.863657 },
                    { lat: -35.304724, lng: 148.662905 },
                    { lat: -36.817685, lng: 175.699196 },
                    { lat: -36.828611, lng: 175.790222 },
                    { lat: -37.75, lng: 145.116667 },
                    { lat: -37.759859, lng: 145.128708 },
                    { lat: -37.765015, lng: 145.133858 },
                    { lat: -37.770104, lng: 145.143299 },
                    { lat: -37.7737, lng: 145.145187 },
                    { lat: -37.774785, lng: 145.137978 },
                    { lat: -37.819616, lng: 144.968119 },
                    { lat: -38.330766, lng: 144.695692 },
                    { lat: -39.927193, lng: 175.053218 },
                    { lat: -41.330162, lng: 174.865694 },
                    { lat: -42.734358, lng: 147.439506 },
                    { lat: -42.734358, lng: 147.501315 },
                    { lat: -42.735258, lng: 147.438 },
                    { lat: -43.999792, lng: 170.463352 },
                ];
    
                window.initMap = initMap;
            </script>
    
            <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap" defer></script>
        </body>
    </html>