Avoid geocode limit on custom google map with multiple markers

前端 未结 2 527
猫巷女王i
猫巷女王i 2020-12-08 12:42

I\'ve created a custom map with around 150 markers. It only plots around 20 or so before it hits the geocode limit.

What can I incorporate into my code to avoid hitt

相关标签:
2条回答
  • 2020-12-08 13:06

    i'm certainly no codemaster, but instead of using a timeout i just keep calling the function from within the function (resource hog i'm sure). i iterate through my counter if i'm successful, otherwise i call my function with the current counter value if unsuccessful. at this rate, i may loop 1000 times for my 37 polylines (or markers if that's what your drawing), but i believe it will finish at the earliest time possible. here's an example - i first call my plot function onclick as plot(0):

    function plot(k)
    {
    ...
    if (status == google.maps.GeocoderStatus.OK)
            {
                draw(r.routes[0]);
                if(k<origArray.length) plot(k++);
            }
    else plot(k)
    ...
    }
    
    0 讨论(0)
  • 2020-12-08 13:23

    So instead of sending all the requests almost instantly in a for-loop, I thought it might be better that when a geocode returns a result, to send the next one. If the result coming back is a OVER_QUERY_LIMIT, resend the request with an increase on the delay. I haven't found the sweet spot timeout that produces the fewest OVER_QUERY_LIMIT's, but at least it will create all the markers (for valid addresses). It takes about 45 seconds or so to finish on my machine.

    <!DOCTYPE html>
    <html>
    <head>
    <link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css"
    rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
    <script type="text/javascript">
    var geocoder;
    var map;
    var infowindow = new google.maps.InfoWindow();
    
    var places = [];
    var popup_content = [ /* all your popup_content */];
    var address = [/* all of your addresses */];
    var address_position = 0;
    
    var timeout = 600;
    
    function initialize() {
        geocoder = new google.maps.Geocoder();
        var latlng = new google.maps.LatLng(52.40, -3.61);
        var myOptions = {
          zoom: 8,
          center: latlng,
          mapTypeId: 'roadmap'
        }
        map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
        addMarker(address_position);
    }
    
    function addMarker(position)
    {
        geocoder.geocode({'address': address[position]}, function(results, status)
        {
            if (status == google.maps.GeocoderStatus.OK) {
                places[position] = results[0].geometry.location;
    
                var marker = new google.maps.Marker({
                    position: places[position],
                    map: map
                });
    
                google.maps.event.addListener(marker, 'click', function() {
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }
                    infowindow.setContent(popup_content[position]);
                    infowindow.open(map, marker);
                });
            }
            else
            {
                if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT)
                {
                    setTimeout(function() { addMarker(position); }, (timeout * 3));
                }
            }
            address_position++;
            if (address_position < address.length)
            {
                setTimeout(function() { addMarker(address_position); }, (timeout));
            }
        });
    }
    </script>
    </head>
    <body onload="initialize()">
    <div id="map_canvas" style="height: 80%; top:10px; border: 1px solid black;"></div>
    </body>
    </html>
    
    0 讨论(0)
提交回复
热议问题