문제

Google Maps API V3 Geocoder 서비스에 GeoCode 요청을 보내는 속도를 제한하는 좋은 방법을 찾으려고 노력하고 있습니다. 나는 JavaScript에 좋은 것이 없다는 것을 알고 있습니다 wait 또는 sleep 그 실행은 당분간 단일 스레드이기 때문입니다.

각 지오 코더 요청은 jQuery 내부에 전송됩니다 each 기능. 따라서 일반 코드 골격은 다음과 같습니다.

$(xml).find('foo').each(function(){
    // do stuff
    ...

    geocoder.geocode(request, function(results, status) {/* do other stuff */});

    // do more stuff
    ...
}

각 호출 사이에 대기 할 고정 간격을 어떻게 설정할 수 있습니까? geocode? JavaScript가 실행되는 것처럼 각 요청을 빠르게 보내면 신속하게 수신을 시작합니다. OVER_QUERY_LIMIT 응답 - 20 개의 요청 만 보내더라도. 이것은 예상되며, 저는 고객이 Google의 서비스를 훌륭하게 플레이하게 만들려고 노력하고 있습니다.


내가 추구하고자하는 대체 경로는 지오 코딩을 위해 JavaScript를 완전히 포기하고 모든 것을 Java로 작성하는 것입니다. Java와 함께있을 것입니다 진짜 요청 사이에서 잠을 자기 쉽습니다.

그러나 Java에서 Google의 지오 코딩 서비스 (특히 API 버전 3을 사용하여)를 사용할 수있는 방법을 찾을 수 없었습니다. Geogoogle 1 년이 넘지 않는 것으로 보이며 v2를 사용합니다.

Java에서 할 수 있습니다. 그렇다면 어떻게합니까?

도움이 되었습니까?

해결책

일종의 속도 제한 제출을 구현하는 가장 좋은 방법은 타이머 개체와 큐를 사용하는 것입니다. 타이머는 무기한으로 실행할 수있는 고정 속도로 예약되어 있습니다 (jQuery는 매우 멋진 타이머 구현이 있습니다). 해당 타이머의 본문에서는 대기열에서 무언가를 팝업하여 제출 한 다음 마무리합니다. 그러면 다른 코드는 필요에 따라 해당 대기열에 물건을 추가합니다.

다른 팁

Google은 Maps API의 V2 및 V3를 개별적으로 적극적으로 개발하고 있습니다. V3은 프로세싱 전력이 제한된 장치 또는 기본 매핑 작업이있는 장치에 적합한 훨씬 더 얇은 버전입니다 (작동하려면 API 키가 필요하지 않음).

두 경우 모두 Google의 HTTP Geocoding Service를 사용하는 것을 살펴 봐야 할 많은 것들을 지구 코딩하는 경우 (http://code.google.com/apis/maps/documentation/geocoding/index.html). 이것은 속도 제한 문제를 피할 것입니다.

FWIW : JavaScript는 setInterval () 및 settimeout ()를 사용하여 기본 수면/대기 작업을 수행 할 수 있습니다. 콜백 처리가 끝날 때 요청을 발사하고 타이머를 다시 재설정하십시오.

다음은 내 스크립트의 스 니펫입니다. 기본적으로 Google.maps.geocoderstatus.over_query_limit에 닿는 경우 다시 시도합니다.

function(results, status) {
    // If the limit is reached try again in a second
        if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {

            window.setTimeout(
                function() {self.resolveAddress(addr);},1000
            );
        } else if (status == google.maps.GeocoderStatus.OK) {
            // Do something clever
        } else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
            self.reduce(addr); // Try removing something from addr
        } else {
            atira.log('Something terrible happened');
        }
    });
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top