Избегайте ограничения геокодирования на пользовательской карте Google с несколькими маркерами - PullRequest
4 голосов
/ 04 октября 2011

Я создал пользовательскую карту с примерно 150 маркерами. Это только около 20 или около того, прежде чем оно достигнет предела геокодирования.

Что я могу включить в свой код, чтобы избежать превышения лимита?

UPDATE: Как я могу добавить задержку для каждого запроса, скажем, 0,25 секунды (или что-то меньшее, что я могу избежать)?

Я попробовал несколько разных предложений, но я не могу заставить их работать с моим кодом, поэтому, пожалуйста, не могли бы примеры использовать мой код.

Ответы [ 2 ]

19 голосов
/ 04 октября 2011

Таким образом, вместо того, чтобы отправлять все запросы почти мгновенно в цикле for, я подумал, что было бы лучше, если бы геокод возвращал результат, чтобы отправить следующий. Если возвращаемый результат равен OVER_QUERY_LIMIT, повторно отправьте запрос с увеличением задержки. Я не нашел тайм-аут приятного места, который производит наименьшее количество OVER_QUERY_LIMIT, но по крайней мере он создаст все маркеры (для действительных адресов). Это займет около 45 секунд или около того, чтобы закончить на моей машине.

<!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>
1 голос
/ 11 февраля 2013

Я, конечно, не мастер кода, но вместо того, чтобы использовать тайм-аут, я просто продолжаю вызывать функцию изнутри функции (я уверен, что это ресурс). если я успешен, я перебираю счетчик, в противном случае я вызываю свою функцию с текущим значением счетчика, если не удалось. с такой скоростью я могу зацикливаться 1000 раз для своих 37 полилиний (или маркеров, если это то, что нарисовано на вашем рисунке), но я верю, что это закончится в ближайшее время. вот пример - я сначала вызываю свою функцию plot 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)
...
}
...