2012-03-21 13 views
18

Sto utilizzando l'API di geocoding sul lato server per tradurre gli indirizzi in latlng. Ho affrontato uno stato OVER_QUERY_LIMIT anche se: - il server non ha superato la limitazione 2500 (solo alcune richieste in questo giorno) - non ha fatto molte richieste contemporaneamente (solo una singola richiesta alla volta)Geocoding api oltre limite di query

come è possibile? il giorno successivo la geocodifica funzionava bene, ma temo che la mia applicazione funzioni correttamente a lungo termine.

Grazie in anticipo.

+2

Abbiamo ottenuto lo stesso errore OVER_QUERY_LIMIT per le persone in 3G, mentre quando stavano usando WiFi stava funzionando correttamente. Il problema con 3G è che da quello che ho letto, la maggior parte delle volte viene utilizzato NAT, quindi tutti gli utenti di uno stesso provider potrebbero avere lo stesso indirizzo pubblico e quindi questo indirizzo IP supererebbe facilmente la limitazione. – user276648

risposta

4

Abbiamo avuto questo problema e la soluzione è stata quella di abbandonare l'API di google. Se tutto ciò di cui hai bisogno è geocodifica, ci sono numerose alternative ugualmente efficaci senza i limiti. Abbiamo scelto l'API mapquest. È stato più veloce e più affidabile senza limiti di chiamate di geocodifica e mi piace molto la loro API per raggruppare insieme le richieste di geocodifica in una singola chiamata.

Se sono necessarie altre funzionalità, è necessario tenerne conto, ma nel caso di una singola funzione, l'utilizzo della più grande API sul blocco non è necessariamente la scelta migliore.

developer.mapquest.com

+0

La mia prima inclinazione è quella di sbarazzarsi di Google Maps per Mapquest dopo aver letto questo. Ma quanto a lungo finché Mapquest implementa anche un limitatore di velocità? I costi di commutazione sono significativi. – steampowered

+0

In realtà, triste a dirsi, mapquest ha già implementato un limite tariffario. Raddoppia quella di Google, ma è lì. Un aggiornamento alla mia risposta è di forgiare il mio codice (anche se in modo molto incapsulato) in modo tale che su iOS 5 utilizzo l'API di geocodifica di Apple e per tutte le versioni iOS precedenti utilizzo mapquest. Questo è stato molto efficace dal momento che la percentuale di dispositivi che utilizzano versioni iOS obsolete sta cadendo ogni giorno raramente raggiungendo il limite giornaliero di Mapquests (anche se ciò accade in modo da avere un comodo fallback). Ovviamente questo aiuta solo per iOS. Altre piattaforme ancora bisogno di una soluzione :( – NSProgrammer

33

Ecco come ho gestito questo problema in passato. Controllo lo stato dei risultati e, se ottengo e oltre l'errore del limite, lo provo di nuovo dopo un leggero ritardo.

function Geocode(address) { 
    geocoder.geocode({ 
     'address': address 
    }, function(results, status) { 
     if (status === google.maps.GeocoderStatus.OK) { 
      var result = results[0].geometry.location; 
      var marker = new google.maps.Marker({ 
       position: result, 
       map: map 
      }); 
     } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {  
      setTimeout(function() { 
       Geocode(address); 
      }, 200); 
     } else { 
      alert("Geocode was not successful for the following reason:" 
        + status); 
     } 
    }); 
} 

Aggiornamento: whoops, ha accidentalmente nascosto la parte del lato server. Ecco una versione C#:

public XElement GetGeocodingSearchResults(string address) 
{ 
    var url = String.Format(
     "https://maps.google.com/maps/api/geocode/xml?address={0}&sensor=false", 
      Uri.EscapeDataString(address)); 

    var results = XElement.Load(url); 

    // Check the status 
    var status = results.Element("status").Value; 

    if(status == "OVER_QUERY_LIMIT") 
    { 
     Thread.Sleep(200); 
     GetGeocodingSearchResults(address); 
    }else if(status != "OK" && status != "ZERO_RESULTS") 
    { 
     // Whoops, something else was wrong with the request...  
    } 

    return results; 
} 
+1

Grazie per il codice js. Impostazione del ritardo con un nuovo tentativo funziona alla grande. – steampowered

+0

Qualcosa circa la soluzione C# guarda fuori a me. Restituisce un XElement al chiamante. Tuttavia, se 'GetGeocodingSearchResults() 'viene chiamato una seconda volta, il risultato viene ignorato e se è stata modificata la linea di leggere' tornare GetGeocodingSearchResults (indirizzo);. 'si potrebbe overflow dello stack una soluzione alternativa potrebbe essere quella di eseguire questo codice in un ciclo fino successo o un predeterminato. numero di fallimenti. va inoltre notato che, mentre questo sarà strozzare il tasso di richiesta, è comunque necessario preoccuparsi del limite giornaliero. – dana

+0

funziona benissimo! – UmbySlipKnot

2

È anche possibile eseguire il geocoding sul lato client. Ecco an article confrontando l'approccio di fare qualcosa lato client e qualche sito server.

0

Google, Bing, MapQuest e Yahoo! Maps (questa API è ancora in circolazione?) Sono strumenti estremamente potenti. Hanno un sacco di potenza che mettono dietro di interpretare l'indirizzo che fornisci e fanno tutto il possibile per trasformarlo in un indirizzo correttamente formattato per la geocodifica. In una certa misura sono gratuiti. Hanno limiti di volume e Termini di servizio piuttosto severi (TOS) che potrebbero essere un fattore se si inizia a utilizzare il loro servizio in modo commerciale e soprattutto se lo si integra in un altro prodotto.

Ricordare che tutti fanno "l'approssimazione dell'indirizzo" NON la verifica dell'indirizzo. Saranno in grado di dirti approssimativamente dove si trova un indirizzo su una determinata strada SE l'indirizzo esiste. Non possono dirti che l'indirizzo che stai cercando esiste. Un modo per verificare ciò è guardare il tuo indirizzo in Google Maps. Ingrandisci fino in fondo alla strada e vedrai che indicano "l'indirizzo è approssimativo" anche se possono avere esattamente la posizione esatta. Semplicemente non hanno la lista principale degli indirizzi da confrontare e sanno quali indirizzi sono reali. Per questo, avrai bisogno di una sorta di verifica dell'indirizzo.

La verifica dell'indirizzo standardizza e pulisce un dato indirizzo più o meno allo stesso modo dei servizi di mappatura gratuiti, ma confronta anche gli indirizzi con il database USPS di indirizzi consegnabili per confermare se l'indirizzo esiste realmente. L'indirizzo confermato può quindi essere geocodificato con maggiore precisione.

Ci sono molti buoni servizi di verifica degli indirizzi. Nell'interesse della completa divulgazione, sono il fondatore di uno - SmartyStreets.

1

Google restituisce anche questa stessa risposta se sono stati trovati nessun indirizzo corrisponde a. Non significa necessariamente che hai superato la quota. In ogni caso starai meglio a cogliere l'eccezione e ad attuare un salvataggio attorno ad esso.

+0

Questo non è vero per V3. Ottieni una risposta valida con zero risultati. Nessun voto negativo dal momento che potresti commentare la V2 e non so quale sia stato il risultato. –

1

stesso problema, come user276648 qui. Risolto aggiungendo la chiave API e cambiando http in https.