Evitare il limite del geocode di Google Maps?


32

Sto creando una mappa google personalizzata con 125 marker tracciati tramite un cms. Durante il caricamento della mappa viene visualizzato questo messaggio:

Il codice geografico non ha avuto esito positivo per il seguente motivo: OVER_QUERY_LIMIT

Sono abbastanza sicuro che sia il modo in cui ho geocodificato i marker.

Come posso evitare questi avvisi e esiste un modo più efficiente per geocodificare i risultati?

AGGIORNAMENTO: Questo è il mio tentativo di risposta di Casey, sto solo ricevendo una pagina vuota al momento.

<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> 

Non importa quale sia la soluzione finché i marker si caricano all'istante e non infrangono alcun termine e condizione.


Non dici perché o con quale frequenza stai effettuando queste ricerche. Non stai provando a geocodificare gli stessi punti ogni rendering di pagina sei? In questo caso dovresti cercare di utilizzare l'API per eseguire queste ricerche lato server una sola volta, quando la posizione viene aggiunta per la prima volta al database.
Peter,

Se volete provare @ il consiglio di Pietro, c'è un semplice strumento qui che geocoding i punti in un foglio di calcolo di Google. Ciò ti consentirebbe di scrivere lat / long per le città nel CMS, quindi non dovrai utilizzare il geocoder in fase di esecuzione.
Stephen Lead,

@Peter In realtà sembra un'ottima idea. Sono un po 'lacerato in quanto diminuirà l'usabilità dei miei cms. Se il cliente deve scoprire lat / long per azienda piuttosto che inserire semplicemente l'indirizzo, non è molto facile da usare. Lo capisco correttamente?
Rob,

Vedi la mia nuova risposta in basso per una funzione php.
Peter,

2
@rob FWIW Penso che Ragi abbia l'approccio giusto. La risposta di Casey richiede comunque di geocodificare ogni punto, ogni volta che la mappa viene disegnata, il che non sembra essere necessario per il tuo set di dati statici
Stephen Lead,

Risposte:


57

Come tutti gli altri, potrei darti una risposta con il codice, ma non credo che qualcuno ti abbia spiegato che stai facendo qualcosa di fondamentalmente sbagliato .

Perché stai colpendo questo errore? Perché chiami geocode ogni volta che qualcuno visualizza la tua pagina e non memorizzi nella cache i risultati in nessun punto del database!

La ragione per cui esiste questo limite è prevenire l'abuso delle risorse di Google (che sia volontariamente o involontariamente) - che è esattamente quello che stai facendo :)

Sebbene il geocodice di google sia veloce, se tutti lo usassero in questo modo, eliminerebbe i loro server. Il motivo per cui esistono Google Fusion Tables è fare molto del pesante sollevamento del lato server per te. La geocodifica e la cache delle tessere vengono eseguite sui loro server. Se non si desidera utilizzarlo, è necessario memorizzarli nella cache sul server.

Se ancora, 2500 richieste al giorno sono troppo piccole, allora devi guardare la licenza (a pagamento) di Google Maps Premier che ti dà 100.000 richieste di geocodifica al giorno per qualcosa di circa 10k all'anno (che è molto - con la cache sul lato server dovresti non raggiungere questo limite a meno che tu non sia un sito enorme o stia eseguendo un'elaborazione pesante dei dati). Senza la memorizzazione nella cache lato server e utilizzando il tuo approccio attuale, sarai in grado di fare solo 800 visualizzazioni di pagina al giorno!

Una volta che ti rendi conto che gli altri fornitori fanno pagare per geocodice , capirai che dovresti memorizzare nella cache i risultati nel db. Con questo approccio ti costerebbe circa 10 centesimi di dollaro USA per visualizzazione di pagina!

La tua domanda è: puoi aggirare il limite dell'acceleratore che Google ti offre? Sicuro. Basta fare una richiesta da diversi indirizzi IP. Cavolo, potresti delegare le chiamate tramite Amazon Elastic IP e avresti sempre nuove 2500 chiamate assegnate. Ma ovviamente, oltre ad essere illegale (stai effettivamente aggirando la restrizione che ti viene data dai termini di servizio di Google Maps), faresti un hack per coprire il difetto intrinseco di progettazione che hai nel tuo sistema.

Quindi qual è il modo giusto per quel caso d'uso? Prima di chiamare l'API di geocodice di Google, inviarlo al server e interrogare se è nella cache. In caso contrario, chiamare il geocodice, memorizzarlo nella cache e restituire il risultato.

Ci sono altri approcci, ma questo dovrebbe farti iniziare nella giusta direzione.

Aggiornamento: dai tuoi commenti di seguito, si afferma che stai utilizzando PHP, quindi ecco un esempio di codice su come farlo correttamente (raccomandazione dello stesso team di Google) https://developers.google.com/maps/articles/phpsqlsearch_v3


Hai un esempio che potrei seguire per inviarlo al server ecc.?
Rob,

Qual è il tuo CMS back-end? (Suppongo che tu possa / sapere come cambiarlo e vuoi solo un semplice esempio che mostri come farlo nella tua lingua preferita. Non hai bisogno di un esempio di un lato client js o stai usando un js? quadro come jquery?
Ragi Yaser Burhum,

Inoltre, dovrai dare più contesto su come i dati dei marker entrano nel tuo sistema in primo luogo
Ragi Yaser Burhum,

1
OK. Php allora. Questo pezzo della documentazione di Google dovrebbe includere il
codice

1
Vedere 10.1.3 (b) per i dettagli su quali tipi di cache sono consentiti. developers.google.com/maps/terms#section_10_12
Paul Ramsey

14

Penso che Sasa abbia ragione, su entrambi i fronti.

In termini di invio di tutti i tuoi indirizzi contemporaneamente, un'opzione è quella di inviare le richieste a intervalli. In passato, usando JavaScript, ho optato per ritardare le richieste di 0,25 (sembra funzionare!) Secondi usando il

setTimeout( [FUNCTION CALL] , 250 )

metodo.

In .NET ho optato per:

System.Threading.Thread.Sleep(250);

Sembra funzionare.

EDIT: Non posso davvero provarlo, ma questo dovrebbe / potrebbe funzionare!

Esempio Javascript. AddressArray contiene stringhe che sono indirizzi ...

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

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

}

MODIFICARE:

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. 
    } 
}

Grazie per la risposta. Come posso inserirlo nel mio codice. È tutto un po 'nuovo, quindi ho bisogno di un po' di mano. Dovresti essere in grado di visualizzare il mio codice sorgente.
Rob,

Quale bit? Che lingua stai usando?
Cattura

Sto usando JavaScript, come posso impostare un intervallo?
Rob,

Modificato la mia risposta.
Cattura

Realizzato anche intendevo setTimeout () ... Grazie Casey.
CatchingMonkey il

9

Sembra che tu stia raggiungendo il limite di richieste simultanee imposte da Google (anche se non riesco a trovare un riferimento a quale sia effettivamente il limite). Dovrai spaziare le tue richieste in modo da non inviare 125 richieste contemporaneamente. Si noti che esiste anche un limite di 2500 richieste di codice geografico al giorno.

Consultare il documento Strategie di geocodifica di Google per ulteriori informazioni.

Aggiornamento: come soluzione aggiunta ispirata a un post di Mapperz, potresti pensare di creare una nuova Google Fusion Table , memorizzare il tuo indirizzo e tutti i dati correlati nella tabella e geocodificare la tabella attraverso la sua interfaccia web. Esiste un limite al numero di richieste di geocodice che una Fusion Table farà, tuttavia il limite è piuttosto elevato. Una volta raggiunto il limite, dovrai inviare nuovamente la richiesta di geocodice e Fusion Tables riprenderà da dove era stata interrotta. Il vantaggio di questo approccio è un enorme miglioramento della velocità, poiché dovrai solo geocodificare ONCE, dove con la tua attuale soluzione dovrai geocodificare su ogni carico, raggiungendo rapidamente i limiti giornalieri.


Immaginai che avrei raggiunto il limite, sono così nuovo che penso di aver bisogno di un esempio di codice per aiutare.
Rob,

Ho esaminato Google Fusion Tables e ho riscontrato alcuni problemi. 1. È necessario geocodificare manualmente gli indirizzi (tramite file-> geocode) nella tabella, è possibile farlo automaticamente? 2. Alcuni marcatori vengono visualizzati solo a determinati livelli di zoom, mentre altri mostrano qualunque sia il livello di zoom. Questo è l'esempio - mediwales.com/mapping/example. Quello che alla fine voglio fare è esportare i miei dati Wordpress (ovvero tutti gli indirizzi dell'azienda) nella tabella di fusione, geocodificarli automaticamente, quindi prendere tutti quegli indirizzi geocodificati e tracciare immediatamente la mappa.
Rob,

7

Ecco come limitare le mie richieste di geocode in javascript, essendo gli indirizzi un array contenente ogni indirizzo per geocode:

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);
}

Questo essenzialmente aggiunge un secondo e mezzo tra ogni richiesta di geocodifica.


Grazie per la risposta. Continuo a ottenere una pagina vuota quando provo
Rob,

Stai utilizzando strumenti di debug che potrebbero segnalare l'errore? In caso contrario, prova a utilizzare il firebug del plug-in FireFox. Può essere molto utile in situazioni come questa.
Casey,

Io no. Non sono sicuro di aver inserito il codice nel posto giusto, aggiornerò la mia domanda con il mio tentativo.
Rob,

Mi mancava una parentesi di chiusura nel mio esempio di codice. Ho modificato la mia risposta e l'ho aggiunta, con un commento. Tuttavia, sembra che questo non sia stato un problema nel codice di esempio. Stai ricevendo una pagina vuota o una mappa vuota? Una pagina vuota indicherebbe che c'è un errore di sintassi nel codice javascript. Una mappa vuota (nessun indicatore) indicherebbe che il codice di geocodifica ha un problema.
Casey,

1
Ciao. Ho avuto un altro tentativo per la tua risposta. Il ritardo ora funziona ma non è possibile tracciare i marker. Dal mio codice questi sono i bit importanti che tracciano i marker - (function (i) {and}) (i); senza quelli non verrà tracciato, anche senza aggiungere il ritardo.
Rob,

5

Ho provato la pagina ora e sembra funzionare proprio ora .

Mentre penso che l'approccio timer che stai attualmente usando sia corretto e per quanto ne sappia l'unico che funzionerà senza richiedere un supporto lato server, dovrei suggerire le seguenti modifiche (mi sono preso la libertà di riscrivere le tue funzioni di geocodifica) per sfruttare localStorage .

LocalStorage è una tecnologia relativamente nuova integrata nella maggior parte dei browser che consente alla pagina Web di memorizzare dati sul client. È in qualche modo simile ai cookie, ma è molto più potente e non è sempre reinviato al server (a differenza dei cookie).

Il mio obiettivo è salvare l'indirizzo geocodificato sul client in modo che se un utente aggiorna la pagina non è necessario richiamare nuovamente le funzioni di geocoder di Google su di esso. L'implementazione di seguito è grezza (dovremmo aggiungere codice per verificare la presenza di record non aggiornati e probabilmente occorre una chiave di memorizzazione nella cache migliore dell'indice) ma dovrebbe essere sufficiente per iniziare. Spero che sia d'aiuto.

(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); 
} 
})
(); 

Grazie mille, provando qualcos'altro ma lo proverò tra un minuto. Sembra una buona idea.
Rob,

Ho appena provato (sono tornati alla precedente), ha funzionato per la prima volta e quando l'ho aggiornato mostrava solo una pagina vuota.
Rob,

prova ora, si è verificato un errore, inoltre tieni presente che la variabile popup_content è stata redatta per brevità.
unicoletti,

3

usando i geocoders di geopy sono in grado di geocodificare un gran numero di indirizzi senza intoppi (non sono sicuro della configurazione dei poster, o se può includere una dipendenza pitone dal suo progetto)

ecco il mio test:

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

snippet di risultato

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))

Questo è ancora in esecuzione e sono con 7k risultati.

EDIT: Dopo un po 'ho colpito la fine della strada e google ha iniziato a darmi gli stessi punti, ma sembra che stia ancora facendo richieste e dandomi risposte precise.


Geopy non è magico, si applicano ancora i vincoli di utilizzo.
alphabetasoup,

1

Questa funzione php (non so in quale lingua stai lavorando, ma puoi sceglierla a parte, sono sicuro) usa google geolocator api. Dato un indirizzo, restituirà l'indirizzo normalizzato e 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));
}    

Grazie per la risposta, come dovrei incorporarlo nel mio codice?
Rob,

Mi dispiace, suppongo che stavi codificando il sito. Tale funzione viene utilizzata come parte dello scripting lato server che ad esempio accetta un indirizzo di input dell'utente, utilizza l'API di geocoder google per ottenere i coords. È quindi possibile inserire quei coords nel proprio db e quando è necessario produrre una mappa, è sufficiente interrogare i coords e produrre la mappa con marcatori. In questo modo non abuserai del geocoder per ogni rendering di pagina come discusso. (hai minimizzato il mio commento? Sto cercando di aiutare, e penalizzarmi non mi incoraggerà troppo). Inoltre, dimentico di menzionare che l'API richiede di usarlo con una gmap.
Peter,

1

Proprio ora ho visto la tua domanda. Puoi provare il seguente codice. Nella parte di controllo dello stato del geocodice, chiamare in modo ricorsivo la stessa funzione con un intervallo di tempo per gli indirizzi persi.

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

Ecco la mia soluzione:

dipendenze: 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

Non puoi evitare il limite del geocode di google map: devi ottenere e archiviare le informazioni di LatLng .

Se hai diverse città e non vuoi ottenere LatLng manualmente, puoi utilizzare un timeout per chiamare progressivamente geocoder.geocode e salvare informazioni all'interno di un oggetto javascript e quindi utilizzare console.log(JSON.stringify(object, null, 4));per ottenere nella console un oggetto piuttosto stampato, quindi, per esempio

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

quindi ora puoi aggiungere marker usando locationsPosition["Johannesburg - ZA"].late.lng


-1

Sembra che tu debba fare una delle due cose:

  1. cambia il tuo processo in cache se non ne ottieni così tanti unici al giorno; o
  2. passare a un servizio che ti consente di elaborare più al giorno

Come molte persone hanno menzionato molte volte, ma non ho esperienza personale, sembrerebbe che una licenza di Google per 100k al giorno sia di circa $ 10k USD all'anno.

Se desideri lo stesso livello di precisione o migliore (e non devi pagare quel prezzo), puoi provare il nostro servizio. Per molto meno di Google (quasi un decimo del costo), potresti ottenere un limite molto più alto di 2500 (il nostro limite più basso è 25k / giorno).

Ovviamente, utilizzare la nostra API di geocodifica a pagamento non è la soluzione che consiglierei di essere onesto al 100%, anche se è logico ammetterlo. Vorrei invece suggerire di andare con l'opzione 1, ottimizzare il servizio nella cache. A meno che tu non abbia bisogno di oltre 2500 geocodici UNICI al giorno.

Disclaimer : lavoro per Geocode Farm (il servizio che sto raccomandando).


Perché è stato votato in negativo? Non vedo dove qualcosa qui è impreciso o errato?
Geocode.Farm Staff
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.