2016-05-09 12 views
8

Sto cercando di invertire geocodificare un set di dati di grandi dimensioni (circa 100k). Ho usato la funzione revgeocode dal pacchetto ggmap. Ho ottenuto il risultato per 1 ingressoLoop per geocoding inverso in R

48 Grand View Terrace, San Francisco, 
CA 94114, USA    
48 Grand View Terrace Eureka Valley San Francisco   
San Francisco County     California United States 
postal_code postal_code_suffix 

, ma ho bisogno di automatizzare il processo e utilizzarlo per l'intero set di dati.

ho cercato

r <- lapply(revgeocode(location = (c(z$lon),c(z$lat)), 
      output = "more", 
      messaging = FALSE, sensor = FALSE, override_limit = FALSE, 
      client = "", signature = "")) 

e ottenuto gli errori per imprevisti '' in ogni passo.

ho cercato di scrivere il seguente ciclo troppo

r <- for(i in 1:10){ 
    revgeocode(location = ("z$lon", "z$lat"),output = "more", messaging =  FALSE, sensor = FALSE, override_limit = FALSE,client = "", signature = "")} 

e ottenuto errori simili

Si prega di fornire qualche materiale o link utili che mi aiuterà a scrivere il ciclo per la geocodifica inversa. Come verificare l'autenticità dei dati?

+0

google maps api limita a 2500 query al giorno.Quindi potresti voler fare qualcosa per tenerne conto. –

+0

@RickArko Sì, sono consapevole di questo fatto! C'è un modo per chiamare l'API usando questo codice ** ggmap **? Penso che ci sia un pagamento di 0,5 USD ogni 1000 richieste. –

risposta

4

Sulla base di questo answer, è possibile creare nuove variabili nel vostro data.frame

Usiamo mapply() per elaborare le coordinate e restituire i risultati in un elenco res.

res <- mapply(FUN = function(lon, lat) { 
    revgeocode(c(lon, lat), output = "more") 
    }, 
    df$lon, df$lat 
) 

Poi, usiamo rbindlist() da data.table per convertire l'elenco in un data.frame (con fill = TRUE dal momento che non tutti gli elementi del res hanno le stesse lunghezze cioè alcuni risultati non restituiscono un street_number e un postal_code) e cbind() a i dati originali

cbind(df, data.table::rbindlist(res, fill = TRUE)) 

Aggiornamento

In seguito al tuo commento, se desideri elaborare more than 2500 queries, puoi iscriverti al piano premium delle API di Google Maps per sbloccare quote più elevate. Quindi è possibile passare le credenziali a revgeocode() utilizzando il parametro signature e client.

Come per menzionate nelle documentation:

Upon purchasing your Google Maps APIs Premium Plan license, you will receive a welcome email from Google that contains your client ID and your private cryptographic key.

Your client ID is used to access the special features of Google Maps APIs Premium Plan. All client IDs begin with a gme- prefix. Pass your client ID as the value of the client parameter. A unique digital signature is generated using your private cryptographic key. Pass this signature as the value of the signature parameter.

Si può vedere come funziona sotto il cofano esaminando il revgeocode()source e vedere come l'URL è costruito:

sensor4url <- paste("&sensor=", sensor, sep = "") 
client4url <- paste("&client=", client, sep = "") 
signature4url <- paste("&signature=", signature, sep = "") 
url_string <- paste("http://maps.googleapis.com/maps/api/geocode/json?latlng=", 
     loc4url, sensor4url, sep = "") 
    if (userType == "business") { 
     url_string <- paste(url_string, client4url, signature4url, 
      sep = "") 
    } 

dati

df <- structure(list(lat = c(32.31, 32.19, 34.75, 35.09, 35.35, 34.74), lon = 
c(119.827, 119.637, 119.381, 119.364, 119.534, 119.421)), .Names = 
c("lat", "lon"), row.names = c(21L, 32L, 37L, 48L, 50L, 89L), class = "data.frame") 
+0

L'ho provato per l'esempio che hai fornito e funziona perfettamente !! Grazie per l'aiuto! Tuttavia, come posso ottenere il set grande nel formato come da te prescritto? Sto ricevendo l'errore 'Errore: is.numeric (posizione) && lunghezza (posizione) == 2 non è TRUE' Ho provato a creare la lista con lst <-list (ll4 $ lontat) 'dove ll4 è il nome del mio data set e lonlat corrisponde a una colonna contenente (119.08,39.24) voci come queste. Grazie!! –

+0

@ AmitR.Pathak Fornire la struttura 'dput (testa (ll4)' –

+0

(lista (lat = c (32.31, 32.19, 34.75, 35.09, 35.35, 34.74 ), lon = c (119.827, 119.637, 119.381, 119.364 , 119.534, 119.421 )), .Names = c ("lat", "lon"), row.names = c (21L, 32L, 37L, 48L, 50L, 89L), class = "data.frame") –

0

Ho avuto un problema similar per l'integrazione della chiave API. Fondamentalmente si tratta di integrare la chiave API nell'UR che chiama R. Se this non ti aiuta, devi cambiare il codice principale (cercalo su GitHub) per consentire un argomento che chiama una chiave.

+0

'getGeoData <- function (latlng, api_key) { geo_data <- getURL (incolla (" https://maps.googleapis.com/maps/api/geocode/json? "," Latlng = ", latlng," & key = ", sep =" ")) geo_data <- fromJSON (geo_data) return (geo_data $ results [[1]])}' Come suggerito nel post, ho scritto una funzione per il geocoding inverso. Ho anche provato ad applicare il seguente ciclo in modo che possano essere elaborate molte query 'for (i in 1:10) { geo_data [i] = getGeoData (unique (y1 [i, 4]))} . Ricevo un errore 'Il numero di articoli da sostituire non è un multiplo della lunghezza di sostituzione 'Qualche suggerimento per risolvere questo? –

+0

Sono abbastanza un principiante R ma non dovresti scrivere 'geo_data [[i]]' insead? Al momento sono molto impegnato al lavoro, ma potrei dare un'occhiata presto – pdx