Google지도 지오 코드 제한을 피 하시겠습니까?


32

cms를 통해 125 개의 마커가 그려진 맞춤 Google지도 를 만들고 있습니다. 지도를로드 할 때이 메시지가 나타납니다.

다음과 같은 이유로 지오 코드에 실패했습니다 : OVER_QUERY_LIMIT

마커를 지오 코딩 한 방식이라고 확신합니다.

이러한 경고를 피하고 결과를 지오 코딩하는 더 효율적인 방법이 있습니까?

업데이트 : 이것은 Casey의 대답에 대한 나의 시도입니다. 현재 빈 페이지가 나타납니다.

<script type="text/javascript"> 
(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 10, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
<?php
$pages = get_pages(array('child_of' => $post->ID, 'sort_column' => 'menu_order'));
$popup_content = array();
foreach($pages as $post)
    {
    setup_postdata($post);
    $fields = get_fields(); 
    $popup_content[] = '<p>'.$fields->company_name.'</p><img src="'.$fields->company_logo.'" /><br /><br /><a href="'.get_page_link($post->ID).'">View profile</a>';
    $comma = ", ";
    $full_address = "{$fields->address_line_1}{$comma}{$fields->address_line_2}{$comma}{$fields->address_line_3}{$comma}{$fields->post_code}";
    $address[] = $full_address;
    }
wp_reset_query();
echo 'var popup_content = ' . json_encode($popup_content) . ';';
echo 'var address = ' . json_encode($address) . ';';
?>

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city  
for (var i = 0; i < address.length; i++) { 
    (function(i) { 
        geocoder.geocode( {'address': address[i]}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                // Adding the markers 
                var marker = new google.maps.Marker({position: places[i], map: map});
                markers.push(marker);
                mc.addMarker(marker);

                // Creating the event listener. It now has access to the values of i and marker as they were during its creation
                google.maps.event.addListener(marker, 'click', function() {
                    // Check to see if we already have an InfoWindow
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with each LatLng 
                bounds.extend(places[i]); 

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds) 
            } else { 
            alert("Geocode was not successful for the following reason: " + status); 
            }

        });

    })(i);

} 
var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 
</script> 

마커가 즉시로드되고 이용 약관을 위반하지 않는 한 솔루션이 무엇인지는 중요하지 않습니다.


이러한 조회를 왜 또는 얼마나 자주하고 있는지 말하지 않습니다. 페이지를 렌더링 할 때마다 동일한 지점을 지오 코딩하려고하지 않습니까? 이 경우 위치를 데이터베이스에 처음 추가 할 때 api를 사용하여 이러한 검색 서버 측을 한 번만 수행해야합니다.
피터

@Peter의 조언을 시도하려면 여기 에 Google 스프레드 시트의 포인트를 지오 코딩 하는 간단한 도구가 있습니다 . 이렇게하면 도시의 위도 / 경도를 CMS에 쓸 수 있으므로 런타임에 지오 코더를 사용할 필요가 없습니다.
Stephen Lead

@Peter 실제로 그것은 좋은 생각처럼 들립니다. 그것이 cm의 유용성을 감소시킬 것이기 때문에 조금 찢어졌습니다. 고객이 주소를 입력하는 대신 회사 당 위도 / 경도를 찾아야하는 경우 사용자에게 친숙하지 않습니다. 내가 올바르게 이해하고 있습니까?
Rob

PHP 함수에 대한 내 새로운 답변을 아래에서 참조하십시오.
Peter

2
@rob FWIW Ragi가 올바른 접근법을 가지고 있다고 생각합니다. Casey의 답변에 따르면지도를 그릴 때마다 정적 데이터 세트에 필요하지 않은 것처럼 보일 때마다 모든 지점을 지오 코딩해야합니다.
Stephen Lead

답변:


57

다른 사람들과 마찬가지로 코드로 답을 줄 수는 있지만 누군가가 당신에게 근본적으로 잘못된 일을하고 있다고 설명하지는 않습니다 .

왜이 오류가 발생합니까? 누군가가 페이지를 볼 때마다 지오 코드를 호출하고 DB의 어느 곳에서나 결과를 캐싱하지 않기 때문에!

제한이 존재하는 이유는 Google 리소스 (의지 여부에 상관없이)의 남용을 방지하기위한 것입니다.

구글의 지오 코드는 빠르지 만 모두가 이런 식으로 사용한다면 서버가 다운 될 것이다. Google Fusion Tables가 존재하는 이유는 많은 서버 쪽 리프팅을 수행하기 위해서입니다. 지오 코딩 및 타일 캐싱은 서버에서 수행됩니다. 이를 사용하지 않으려면 서버에 캐시해야합니다.

여전히 하루 2,500 건의 요청이 너무 적 으면 1 년에 약 10 만 건의 일당 100,000 건의 지오 코딩 요청을 제공하는 Google Maps Premier (유료) 라이센스를 살펴 봐야합니다. 대규모 사이트이거나 데이터 처리량이 많은 경우를 제외하고는이 제한에 도달하지 마십시오 . 서버 측 캐싱없이 현재 접근 방식을 사용하지 않으면 하루에 800 페이지 만 볼 수 있습니다!

지오 코딩 당 다른 제공 업체가 청구한다는 사실을 알게되면 결과를 db에 캐시해야한다는 것을 알게됩니다. 이 방법을 사용하면 페이지 뷰당 약 10 US 센트의 비용이 듭니다!

귀하의 질문은 Google이 제공하는 스로틀 한계를 극복 할 수 있습니까? 확실한. 다른 IP 주소에서 요청하십시오. 도대체, 당신은 아마존 탄력있는 IP를 통해 통화를 프록시 할 수 있으며 항상 새로운 2500 할당 된 통화를 가질 것입니다. 물론 불법 인 것 (Google Maps 서비스 약관에 따라 제한을 효과적으로 회피하고 있음) 외에도 시스템의 고유 한 디자인 결함을 다루기 위해 해킹을하고 있습니다.

그렇다면 해당 사용 사례에 적합한 방법은 무엇입니까? Google 지오 코드 API를 호출하기 전에 서버로 보내고 캐시에 있는지 쿼리하십시오. 그렇지 않은 경우 지오 코드를 호출하여 캐시에 저장 한 후 결과를 반환하십시오.

다른 접근 방법이 있지만 올바른 방향으로 시작해야합니다.

업데이트 : 아래 의견에서 PHP를 사용하고 있다고 말 했으므로 여기에 올바르게 수행하는 방법에 대한 코드 샘플이 있습니다 (Google 팀 자체의 권장 사항) https://developers.google.com/maps/articles/phpsqlsearch_v3


서버 등으로 보낼 수있는 예를 얻었습니까?
Rob

백엔드 CMS 란 무엇입니까? (변경 방법을 알 수 있고 선택한 언어로 수행하는 방법을 보여주는 간단한 예를 원한다고 가정합니다. 클라이언트 측 js의 예가 필요하지 않습니까? 아니면 js를 사용하고 있습니까? JQuery와 같은 프레임 워크?
라기 Yaser Burhum

또한 마커 데이터가 시스템에 처음으로 들어오는 방식에 대한 더 많은 컨텍스트를 제공해야합니다.
Ragi Yaser Burhum

1
승인. 그렇다면 Php. 구글 문서에서이 비트는 MySQL과 PHP는 부분이 포함되어야 code.google.com/apis/maps/articles/phpsqlgeocode.html
라기 Yaser Burhum

1
어떤 종류의 캐싱이 허용되는지에 대한 자세한 내용은 10.1.3 (b)를 참조하십시오. developers.google.com/maps/terms#section_10_12
Paul Ramsey

14

나는 사사 모두 옳다고 생각합니다.

모든 주소를 한 번에 보내는 관점에서 한 가지 옵션은 요청을 간격을두고 보내는 것입니다. 과거에는 JavaScript를 사용할 때을 사용하여 요청을 0.25 초 (작동하는 것으로 간주 됨)만큼 지연하도록 선택했습니다.

setTimeout( [FUNCTION CALL] , 250 )

방법.

.NET에서는 다음을 선택했습니다.

System.Threading.Thread.Sleep(250);

작동하는 것 같습니다.

편집 : 정말 테스트 할 수 있지만 이것이 작동해야 할 수도 있습니다!

자바 스크립트 예제 addressArray는 주소 인 문자열을 보유합니다 ...

for (var i = 0; i < addressArray.length; i++0 
{

setTimeout('googleGeocodingFunction(' + addressArray[i] + ')' , 250);

}

편집하다:

for (var i = 0; i < address.length; i++) {
    function(i) {
        setTimeout(geocoder.geocode({ 'address': address[i] }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                var marker = new google.maps.Marker({ position: places[i], map: map });
                markers.push(marker);
                mc.addMarker(marker);
                google.maps.event.addListener(marker, 'click', function() {
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with all coordinates 
                bounds.extend(places[i]);

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds)
            } else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        }), 250);// End of setTimeOut Function - 250 being a quarter of a second. 
    } 
}

답장을 보내 주셔서 감사합니다. 어떻게 내 코드에 넣을 수 있습니까? 이것은 모두 약간 새로운 것이므로 손을 잡고 있어야합니다. 내 소스 코드를 볼 수 있어야합니다.
Rob

어느 비트? 어떤 언어를 사용하고 있습니까?
CatchingMonkey

자바 스크립트를 사용하고 있는데 간격을 어떻게 설정할 수 있습니까?
Rob

내 답변을 수정했습니다.
CatchingMonkey

또한 나는 setTimeout ()을 의미한다는 것을 알았습니다 ... 감사합니다.
CatchingMonkey

9

Google이 부과 한 동시 요청 한도에 도달 한 것 같습니다 (실제 한도에 대한 참조를 찾을 수는 없지만). 한 번에 125 개의 요청을 보내지 않도록 요청을 간격을 두어야합니다. 일일 2500 개의 지오 코드 요청 제한도 있습니다.

자세한 내용은 Google 지오 코딩 전략 문서를 참조하십시오.

업데이트 : Mapperz의 게시물 덕분에 추가 솔루션으로 새로운 Google Fusion Table 생성, 주소 및 관련 데이터를 테이블에 저장 및 웹 인터페이스를 통해 테이블을 지오 코딩 할 수 있습니다. 퓨전 테이블에서 수행 할 지오 코드 요청 수에는 제한이 있지만 제한이 상당히 큽니다. 한도에 도달하면 지오 코드 요청을 다시 제출해야하며 Fusion Tables가 중단 된 지점을 선택합니다. 현재 솔루션을 사용하면 모든로드에 대해 지오 코딩하고 일일 한도에 빠르게 도달해야하는 ONCE 만 지오 코딩하면되므로이 방법의 이점은 속도가 크게 향상됩니다.


나는 한계에 도달 할 것이라고 짐작했습니다. 이에 익숙하지 않아 도움이되는 코드 예제가 필요하다고 생각합니다.
Rob

Google Fusion Tables를 살펴본 결과 몇 가지 문제가 있습니다. 1. 표에서 주소를 수동으로 지오 코딩해야합니다 (파일-> 지오 코드를 통해). 자동으로 수행 할 수 있습니까? 2. 일부 마커는 특정 확대 / 축소 수준에서만 표시되고 다른 마커는 확대 / 축소 수준을 표시합니다. 이 예는 mediwales.com/mapping/example입니다. 결국 내가하고 싶은 것은 Wordpress 데이터 (예 : 모든 회사 주소)를 퓨전 테이블로 내보내고 자동으로 지오 코딩 한 다음 지오 코딩 된 모든 주소를 가져 와서 즉시지도를 그리는 것입니다.
Rob

7

지오 코딩 요청을 자바 스크립트로 조절하는 방법은 다음과 같습니다. 주소는 지오 코딩 할 각 주소를 포함하는 배열입니다.

for (i=0;i<=addresses.length;i++) {
    setTimeout( function () {
            geocoder.geocode( { 'address': addresses[i]}, function(results, status) {

                if (status == google.maps.GeocoderStatus.OK) { 

                    //create and add marker to map based off geocode result
                    var marker = new google.maps.Marker({  
                        map: map,
                        title: results[0].formatted_address,
                        position: results[0].geometry.location
                    });

                 } //EDIT, was missing the closing bracket here
            });

    }, i * 1500);
}

이것은 본질적으로 각 지오 코딩 요청 사이에 두 번째와 절반을 추가합니다.


답변 해주셔서 감사합니다. 코드에 통합하려고 할 때 빈 페이지가 계속 나타납니다 -mediwales / mapping
Rob

오류를 지적 할 수있는 디버깅 도구를 사용하고 있습니까? 그렇지 않은 경우 FireFox 플러그인 파이어 버그를 사용해보십시오. 이런 상황에서는 꽤 편리 할 수 ​​있습니다.
케이시

난 아니에요 코드를 올바른 위치에 넣었다는 확신이 들지 않습니다. 내 시도로 내 질문을 업데이트하겠습니다.
Rob

코드 샘플에 닫는 괄호가 없습니다. 답변을 편집하고 주석과 함께 추가했습니다. 그러나 샘플 코드에서는 이것이 문제가되지 않은 것 같습니다. 빈 페이지 또는 빈 맵이 있습니까? 빈 페이지는 자바 스크립트 코드에 구문 오류가 있음을 나타냅니다. 빈지도 (마커 없음)는 지오 코딩 코드에 문제가 있음을 나타냅니다.
케이시

1
안녕. 나는 당신의 대답에 다른 것을 가졌습니다. 지연이 현재 작동하지만 마커를 그릴 수 없습니다. 내 코드에서 이것들은 마커를 그리는 중요한 비트입니다.-(function (i) {and}) (i); 그것들이 없으면 지연을 추가하지 않아도 플롯되지 않습니다.
Rob

5

지금 페이지를 시도하고 그것은 작동하는 것 같군 지금 .

현재 사용중인 타이머 접근 방식이 정확하고 서버 측 지원이 필요없는 유일한 방법을 알고있는 한 다음과 같은 변경 사항을 제안해야합니다 (지오 코딩 기능을 자유롭게 작성할 수 있음) localStorage 를 활용 합니다.

LocalStorage 는 웹 페이지가 클라이언트에 데이터를 저장할 수 있도록 대부분의 브라우저에 내장 된 비교적 새로운 기술입니다. 쿠키와 다소 유사하지만 훨씬 강력하며 쿠키와 달리 항상 서버에 다시 전송되는 것은 아닙니다.

내 목표는 사용자가 페이지를 새로 고치면 Google의 지오 코더 기능을 다시 호출 할 필요가 없도록 지오 코딩 된 주소를 클라이언트에 저장하는 것입니다. 아래의 구현은 조잡합니다 (부실한 레코드를 확인하기 위해 코드를 추가해야하며 아마도 인덱스보다 더 나은 캐싱 키가 필요할 것입니다). 그러나 시작하기에 충분해야합니다. 도움이 되길 바랍니다.

(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 0, maxZoom: 0, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
var popup_content = [..redacted..];

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city 
function geocodeAddress(i) {
     // check if localStorage is available (it is now available on most modern browsers)
     // http://html5tutorial.net/tutorials/working-with-html5-localstorage.html
     // NB: this *must* be improved to handle quota limits, age/freshness, etc
     if(localStorage && localStorage['address_'+i]) {
        places[i]=JSON.parse(localStorage['address_'+i]);
        addPlace(i);
     } else {
      geocoder.geocode( {'address': address[i]}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            places[i] = results[0].geometry.location;
            if(localStorage) {
               // cache result locally on the browser, this will help reducing the number of requests
               // to the google geocoder in case the user refreshes the page
               // remember: the more he will refresh, the more he's likely to hit the limit
               // (this is one case where refreshing or closing the browser does not work)
               localStorage['address_'+i]=JSON.stringify(results[0].geometry.location);
            }

            addPlace(i);
        } else { 
            console.log("Geocoding of address "+address[i]+" failed");
        }
    })
}

function addPlace(i) {
    // Adding the markers 
    var marker = new google.maps.Marker({position: places[i], map: map});
    markers.push(marker);
    mc.addMarker(marker);

    // Creating the event listener. It now has access to the values of i and marker as they were during its creation
    google.maps.event.addListener(marker, 'click', function() {
        // Check to see if we already have an InfoWindow
        if (!infowindow) {
            infowindow = new google.maps.InfoWindow();
        }

        // Setting the content of the InfoWindow
        infowindow.setContent(popup_content[i]);

        // Tying the InfoWindow to the marker 
        infowindow.open(map, marker);
    });

    // Extending the bounds object with each LatLng 
    bounds.extend(places[i]); 

    // Adjusting the map to new bounding box 
    map.fitBounds(bounds);
}

function geocode() {
    if (geoIndex < address.length) {
        geocodeAddress(geoIndex);
        ++geoIndex;
    }
    else {
        clearInterval(geoTimer);
    }
}
var geoIndex = 0;
var geoTimer = setInterval(geocode, 600);  // 200 milliseconds (to try out)

var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 

정말 고마워, 뭔가 다른 것을 주지만 잠시 후에 이것을 시도 할 것입니다. 좋은 생각 인 것 같습니다.
Rob

방금 시도해 보았습니다 (이전으로 되돌아갔습니다). 처음 새로 고쳤을 때 빈 페이지가 표시되었습니다.
Rob

지금 시도하십시오, 오류가 발생했습니다. 또한 popup_content 변수는 간결하게 수정되었습니다.
unicoletti

3

지오 피오 지오 코더를 사용하여 장애없이 많은 수의 주소를 지오 코딩 할 수 있습니다 (포스터 설정이 확실하지 않거나 자신의 프로젝트에 파이썬 의존성을 포함시킬 수 있는지 여부)

여기 내 테스트가 있습니다 :

from geopy import geocoders

g = geocoders.GoogleV3()  #https://geopy.readthedocs.io/en/latest/#geopy.geocoders.GoogleV3

for x in xrange(1,10000):
    print x
    a = g.geocode("AV JOAO NAVES DE AVILA " + str(x) + " UBERLANDIA MG BRASIL")
    print a

결과 스 니펫

7595 (U'Av. Jo \ xe3o Naves de \ xc1vila, 7595-Segismundo Pereira, Uberl \ xe2ndia-Minas Gerais, 38408-288, Brazil ', (-18.9388154, -48.2220562))

7596 (U'Av. Jo \ xe3o Naves de \ xc1vila, 7596-Segismundo Pereira, Uberl \ xe2ndia-Minas Gerais, 38408-680, Brazil ', (-18.938814, -48.2217423))

7597 (U'Av. Jo \ xe3o Naves de \ xc1vila, 7597-Segismundo Pereira, Uberl \ xe2ndia-Minas Gerais, 38408-288, Brazil ', (-18.9388128, -48.2220381))

7598 (U'Av. Jo \ xe3o Naves de \ xc1vila, 7598-Segismundo Pereira, Uberl \ xe2ndia-Minas Gerais, 38408-680, Brazil ', (-18.9388114, -48.2217242))

7599 (U'Av. Jo \ xe3o Naves de \ xc1vila, 7599-Segismundo Pereira, Uberl \ xe2ndia-Minas Gerais, 38408-288, Brazil ', (-18.9388102, -48.2220201))

7600 (U'Av. Jo \ xe3o Naves de \ xc1vila, 7600-Segismundo Pereira, Uberl \ xe2ndia-Minas Gerais, 38408-680, Brazil ', (-18.9388088, -48.2217062))

이것은 여전히 ​​실행 중이며 7k 결과입니다.

편집 : 잠시 후 나는 거리의 끝을 쳤고 Google은 나에게 같은 포인트를 주려고 시작했지만 여전히 요청하고 정확한 답변을주는 것처럼 보입니다.


Geopy는 마술이 아니며 사용 제한이 여전히 적용됩니다.
alphabetasoup

1

이 PHP 기능 (귀하가 사용하는 언어를 모르지만 확실하게 선택할 수 있습니다)은 Google geolocator api를 사용합니다. 주소가 주어지면 정규화 된 주소와 latlong을 반환합니다. HTH.

// GEOLOCATEBYADDRESS
// @arg (string)address
// @return (array) ((int)flag,(array)address,array(rawresponse))

function geolocatebyaddress($lookupaddress){

    $lookupaddress=trim("$lookupaddress New Zealand");
    $lookupaddress=urlencode($lookupaddress);

    //send off google api lookup request
    $apiurl="http://maps.google.com/maps/api/geocode/json";
    $apiurl.="?address=$lookupaddress";
    $apiurl.="&region=NZ";
    $apiurl.="&sensor=false";

    if (function_exists("curl_init")) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $apiurl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $json = curl_exec($ch);
        curl_close($ch);
    }
    else     $json= file_get_contents($apiurl);

    //process response
    $response= json_decode($json,true);
    $approxflag=0;
    if ($response['status']=='OK' and count($response['results'])) {

        $aa= array();
        foreach($response['results'] as $cc=>$result) {
            //set keys
            foreach(array('street_number','road','suburb','city','postcode','region','lat','long') as $t){
                $aa[$cc][$t]='';
            }
            if ($result['geometry']){
                $aa[$cc]['lat']= $result['geometry']['location']['lat'];
                $aa[$cc]['long']=$result['geometry']['location']['lng'];
         }

            if (count($result['address_components'])){
                foreach ($result['address_components'] as $acs){
                    if ($acs['types'][0]=='street_number')               $aa[$cc]['street_number']= $acs['long_name']; 
                    if ($acs['types'][0]=='route')                       $aa[$cc]['road']=      $acs['long_name']; 
                    if ($acs['types'][0]=='sublocality')                 $aa[$cc]['suburb']=   $acs['long_name']; 
                    if ($acs['types'][0]=='locality')                    $aa[$cc]['city']=    $acs['long_name']; 
                    if ($acs['types'][0]=='postal_code')                 $aa[$cc]['postcode']= $acs['long_name']; 
                    if ($acs['types'][0]=='administrative_area_level_1') $aa[$cc]['region']=   $acs['long_name']; 
                }    
            }
            //successful?
            if ($result['geometry']['location_type']=='APPROXIMATE') $approxflag++;
            if (isset($result['partial_match']))  $approxflag++;
            if (!$aa[$cc]['street_number'])         $approxflag++;
        }
        if ($approxflag) return (array(1,$aa,$response));
        else return (array(2,$aa,$response));
    }
    else return (array(0,array(),$response));
}    

답장을 보내 주셔서 감사합니다. 이것을 코드에 어떻게 통합합니까?
Rob

죄송합니다. 사이트를 코딩한다고 가정했습니다. 이 기능은 서버 측 스크립팅의 일부로 사용됩니다. 예를 들어 사용자 입력 주소를 사용하고 Google 지오 코더 API를 사용하여 좌표를 가져옵니다. 그런 다음 해당 좌표를 DB에 배치하고지도를 생성해야하는 경우 좌표를 쿼리하고 마커가있는지도를 생성하면됩니다. 그렇게하면 모든 페이지 렌더링에 대해 지오 코더를 남용하지 않습니다. (당신은 내 의견을 내려 놓았습니까? 나는 도와 주려고 노력하고 있으며, 나를 처벌하는 것도 나에게 전혀 장려하지 않습니다). 또한 API를 gmap과 함께 사용해야한다고 언급하는 것을 잊었습니다.
Peter

1

방금 쿼리를 보았습니다. 다음 코드를 시도해 볼 수 있습니다. 지오 코드 상태 점검 else 부분에서 손실 된 주소에 대한 시간 간격을두고 동일한 함수를 재귀 적으로 호출하십시오.

function spotPosition(address) {
        geocoder.geocode({ 'address': address }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var lat = results[0].geometry.location.lat();
                var lang = results[0].geometry.location.lng();
                setMarker(lat, lang);
            }
            else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                setTimeout(function () {
                    //Recursively calling spotPosition method for lost addresses
                    spotPosition(address);
                }, 1000);
            }
        });
    }

0

내 해결책은 다음과 같습니다.

종속성 : Gmaps.js, jQuery

var Maps = function($) {
   var lost_addresses = [],
       geocode_count  = 0;

   var addMarker = function() { console.log('Marker Added!') };

   return {
     getGecodeFor: function(addresses) {
        var latlng;
        lost_addresses = [];
        for(i=0;i<addresses.length;i++) {
          GMaps.geocode({
            address: addresses[i],
            callback: function(response, status) {
              if(status == google.maps.GeocoderStatus.OK) {
                addMarker();
              } else if(status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                lost_addresses.push(addresses[i]);
              }

               geocode_count++;
               // notify listeners when the geocode is done
               if(geocode_count == addresses.length) {
                 $.event.trigger({ type: 'done:geocoder' });
               }
            }
          });
        }
     },
     processLostAddresses: function() {
       if(lost_addresses.length > 0) {
         this.getGeocodeFor(lost_addresses);
       }
     }
   };
}(jQuery);

Maps.getGeocodeFor(address);

// listen to done:geocode event and process the lost addresses after 1.5s
$(document).on('done:geocode', function() {
  setTimeout(function() {
    Maps.processLostAddresses();
  }, 1500);
});

0

구글지도 지오 코드 제한을 피할 수 없습니다 : LatLng을 얻어 저장해야합니다 . 정보를 .

여러 도시가 있고 LatLng를 수동으로 얻지 않으려면 시간 초과를 사용하여 geocoder.geocode를 진행하여 Javascript 객체 내부에 정보를 저장 한 다음 console.log(JSON.stringify(object, null, 4));콘솔에서 꽤 인쇄 된 객체를 얻는 데 사용할 수 있습니다. 예

            var locationsPosition = {
                    "Johannesburg - ZA": {
                        "lat": -26.2041028,
                        "lng": 28.047305100000017
                    },
                    "Chennai - IN": {
                        "lat": 13.0826802,
                        "lng": 80.27071840000008
                    }
             }

이제 locationsPosition["Johannesburg - ZA"].latand를 사용하여 마커를 추가 할 수 있습니다..lng


-1

다음 두 가지 중 하나를 수행해야 할 것 같습니다.

  1. 매일 고유 한 수의 많은 것을 얻지 못하면 결과를 캐시하도록 프로세스를 변경하십시오. 또는
  2. 하루에 더 많은 것을 처리 할 수있는 서비스로 업그레이드

사람들이 여러 번 언급했지만 개인적으로 경험이 없기 때문에 하루 100k에 대한 Google 라이센스는 연간 약 $ 10k USD 인 것으로 보입니다.

동일한 수준의 정확성을 원하거나 그 가격을 지불하지 않아도되는 경우 서비스를 사용해보십시오. Google보다 훨씬 적은 비용 (거의 10 분의 1) 인 경우 2500 한도보다 훨씬 더 높을 수 있습니다 (최저 한도는 25k / 일).

물론 유료 지오 코딩 API를 사용하는 것은 비즈니스에 동의하는 것이 좋지 않더라도 100 % 정직하게 권장하는 솔루션이 아닙니다. 대신 옵션 1을 사용하여 캐시하도록 서비스를 최적화하십시오. 하루에 2500 개 이상의 고유 한 지오 코드가 필요하지 않은 경우.

면책 조항 : Geocode Farm (권장하는 서비스)에서 일합니다.


왜 투표가 중단 되었습니까? 여기의 어떤 부분이 부정확하거나 부 정확한지 모르겠습니다.
Geocode.Farm 직원
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.