2015-01-30 10 views
8

Sto esplorando le API di Google, principalmente l'API di Places. Poiché il numero di richieste all'API di Google Places è limitato a 100.000, sto cercando modi per ridurre al minimo il numero di richieste inviate all'API. Stavo pensando di utilizzare un database per archiviare le risposte ricevute in precedenza, quindi in futuro potrei recuperarle senza fare richieste all'API e farò richiesta all'API solo in un caso se i dati necessari non fossero stati precedentemente memorizzati nel mio database .Quale Google posiziona i risultati delle query dell'API possono essere archiviati in un database?

Secondo Google termini API di utilizzo, in particolare la sezione 10.1.3 Restrictions against Copying or Data Export, non è consentito per memorizzare i dati a tempo indeterminato, ma è legale mettere in cache temporaneamente:

Non si deve pre-fetch, cache, o memorizzare qualsiasi Contenuto, eccetto che è possibile memorizzare: (i) quantità limitate di Contenuto allo scopo di migliorare le prestazioni della propria Implementazione dell'API di Maps se lo si fa temporaneamente (e in nessun caso per più di 30 giorni di calendario), in modo sicuro, e in un modo che non consente l'uso del Contenuto al di fuori del Servizio; e (ii) qualsiasi identificatore di contenuto o chiave che la documentazione delle API di Maps consente specificamente di memorizzare. Ad esempio, non è necessario utilizzare il Contenuto per creare un database indipendente di "luoghi" o altre informazioni di elenchi locali.

Trovo questa sezione non ben spiegata. Posso archiviare tutti i dati ricevuti dall'API nel mio database per 30 giorni o solo id di luoghi? Perché in alcuni altri contesti ho letto che è consentito solo memorizzare gli ID. L'ho capito in questo modo: posso memorizzare gli ID dei luoghi a tempo indeterminato, ma posso utilizzare l'intero dato solo per 30 giorni.

Poiché ho letto le API di Google solo per un paio di giorni, forse ho perso alcuni termini di utilizzo, quindi sarei davvero grato se potessi aiutarmi.

Qualsiasi suggerimento su come ridurre al minimo il numero di chiamate alle API o condividere alcune esperienze relative a progetti reali utilizzando tali API sarà molto apprezzato. Inoltre, se potessi suggerirmi alcune API alternative che potrebbero fornire funzionalità simili, sarebbe davvero utile.

Grazie in anticipo!

risposta

7

Dalla mia esperienza con l'API di Google Places, la tua comprensione è quasi corretta. Lasciatemi spiegare le due parole con le mie stesse parole:

i) Senza prefetching o ridistribuzione all'esterno dell'applicazione, è possibile memorizzare nella cache i risultati API per un massimo di 30 giorni.

ii) È possibile utilizzare un ID luogo o una chiave nei dati specifici dell'applicazione, ma nient'altro (ad esempio, se l'app consente di effettuare il check-in dell'utente, è possibile memorizzare un elenco di ID luogo in cui sono stati su un oggetto utente e cerca i luoghi secondo l'ID, ma non puoi memorizzare un elenco di tutti i luoghi con i nomi/i dettagli di Google).

Al fine di ridurre il numero di chiamate API e accelerare la mia app, ciò che faccio è memorizzare nella cache le chiamate locali vicine in una semplice cache valore-chiave, dove la chiave è la coppia lat-lng arrotondata a una certa precisione (in modo che le chiamate entro un certo raggio colpiscano la cache) e il valore sia l'intera stringa di risultati JSON.Ecco il mio codice, che è Java in esecuzione su App Engine di Google:

// Using 4 decimal places for rounding represents approximately 11 meters of precision 
// http://gis.stackexchange.com/questions/8650/how-to-measure-the-accuracy-of-latitude-and-longitude 
public static final int LAT_LONG_CACHE_PRECISION = 4; 

public static final int CACHE_DURATION_SEC = 24 * 60 * 60; // one day in seconds 

... 

String cacheKey = "lat,lng:" + round(latitude) + "," + round(longitude); 
asyncCache.put(cacheKey, dataJSON, Expiration.byDeltaSeconds(CACHE_DURATION_SEC), MemcacheService.SetPolicy.SET_ALWAYS); 

... 

private static double round(double value) { 
    BigDecimal bd = new BigDecimal(value); 
    bd = bd.setScale(LAT_LONG_CACHE_PRECISION, RoundingMode.HALF_UP); 
    return bd.doubleValue(); 
} 

Per quanto riguarda le API alternative, vorrei suggerire di guardare al seguente:

Yelp API - fornisce dati bar/ristorante che Google manca

Facebook API - facile da usare se si sta già utilizzando SDK di Facebook

Factual: Places Crosswalk - aggregati e normalizza luoghi dati da molte fonti, tra cui Facebook e Yelp, ma non Googl e

Attualmente sto utilizzando solo l'API di Google Places, ma sto pensando di aggiungere Yelp o Factual in un secondo momento per migliorare i risultati per l'utente finale.

+0

Mi sono imbattuto nella tua risposta. Devo mostrare un elenco di luoghi più vicini alla posizione di un utente e avrei bisogno di memorizzare le coordinate LAT/LNG. Di solito, userei l'API di Places per ottenere questi. Non sono autorizzato a memorizzarli in un database per l'ordinamento successivo o gli algoritmi di distanza. Ma, sono autorizzato a "rappresentare" i Geocod nella mia "griglia", quindi utilizzare il risultato una volta, calcolare il posizionamento sulla mia griglia e salvare QUESTI dati? –

+0

Non ho lavorato con l'API di Google Places da molto tempo, quindi prendi questo con un pizzico di sale, ma sembra che quello che vuoi fare non sia probabilmente permesso. Puoi memorizzare nella cache la risposta non elaborata per 30 giorni, quindi se il tuo utente si trova nello stesso punto, puoi colpire la cache per ottenere il risultato. Non dovresti assolutamente prefetch o creare il tuo database personale di posti. –

+0

@ Riël Sto avendo una situazione simile, puoi condividere quale metodo usi? http://stackoverflow.com/questions/42235025/how-to-get-latitude-and-longitude-for-a-place-in-an-isomorphic-application-on-se –

Problemi correlati