2016-05-15 8 views
1

Ich versuche, Geocode einen Datensatz mit dem Google API-Schlüssel umzukehren. Ich schaffte es, den Code auszuführen und die gewünschten Ergebnisse für eine kleine Probe von 10, aber es gibt einen FehlerSubskripte außerhalb der Grenzen für umgekehrte Geokodierungsschleife in R

Error in rgc$results[[1]] : subscript out of bounds 

ich mit dem folgenden Code, um die api Schlüssel zur Integration verwaltet:

` revgx <- mapply(function(latlng, api_key){ 


url= paste("https://maps.googleapis.com/maps/api/geocode/json?","latlng=",latlng,"&key=",sep="") 

rgc <- fromJSON(paste(readLines(url), collapse = '')) 

rgc <- rgc$results[[1]] 


with(rgc,{rgcdf <<- data.frame(
address = formatted_address 
)}) 
for(k in seq_along(rgc$address_components)){ 
rgcdf <- cbind(rgcdf, rgc$address_components[[k]]$long_name) 
} 
names(rgcdf) <- c('address', sapply(rgc$address_components, function(l)  l$types[1])) 

# return 'more' output 
rgcdf 
}, 
y1$latlng)` 

Ich habe versucht, das gleiche mit der Einbeziehung von XML zu verwenden, aber ohne Erfolg. Bitte geben Sie an, ob Änderungen am Code erforderlich sind.

Antwort

2

Ich habe Ihren Code getestet und es funktioniert für mich. Aber Sie testen nicht den Status. Wenn latlng falsch ist, gibt es "ZERO RESULTS" als Status zurück (und keine rgc $ -Ergebnisse existieren). Hier ist der Code, den ich getestet habe.

rev <- function(latlng, api_key) { 

url= url(paste("https://maps.googleapis.com/maps/api/geocode/json?","latlng=",latlng,"&key=",sep="")) 
rgc <- fromJSON(paste(readLines(url), collapse = '')) 
close(url) 

if (rgc["status"] == "OK") { 
    rgc <- rgc$results[[1]] 
    with(rgc, { 
     rgcdf <<- data.frame(address = formatted_address) 
    }) 
    for (k in seq_along(rgc$address_components)) { 
     rgcdf <- cbind(rgcdf, rgc$address_components[[k]]$long_name) 
    } 
    names(rgcdf) <- c("address", sapply(rgc$address_components, function(l) l$types[1])) 
    rgcdf["valid_latlong"] <- TRUE 
    rgcdf 
} else { 
    rgcdf <- c(valid_latlong=FALSE) 
} 
} 

Getestet habe ich diese mit:

rev("12.9756300,77.6066230") 

Gibst du in diesem Format latlng? Oder c (9756300,77.6066230). Dann brauchen Sie

latlng <- gsub(' ','%20', paste(latlng, collapse=",")) 

auch zu tun, haben Sie nicht integriert api Schlüssel im Code-Snippet, das Ihnen geteilt. Übergeben Sie api_key, um param abzufragen.

+0

Vielen Dank @ khmr !! Ich habe den Code ausgeführt und es funktionierte ziemlich genau. Wenn ich jedoch 60 Abfragen durchlasse, gibt es mir eine Liste von 60, mit der ich anfangen soll. Dann verwende ich den Code 'df1 <- rbindlist (df, fill = TRUE)' um diese Liste zu binden. Dies löschte 5 Ergebnisse aus der Liste von 60 und daher konnte ich nicht mit dem ursprünglichen Datensatz "cbind", um eine Datenbank von lat, lng und den Adressfeldern zu erhalten. Ich bekomme den Fehler 'Fehler in dat.frame (..., check.names = FALSE): Argumente implizieren unterschiedliche Anzahl von Zeilen: 60, 55' –

+0

Ich habe valid_latlong hinzugefügt. Jetzt sollten Sie in der Lage sein, cbind zu verwenden. Wenn dies hilft, zu akzeptieren und upvote. – khrm

+0

Danke @ khrm. Die erhaltene Liste kann in folgender Weise gebunden werden: list = rbindlist (lapply (dflist, as.data.table), fill = TRUE) 'und kann mit dem Datenrahmen von lat-lng durch' df1 <- cbind (df (Liste) ' –

Verwandte Themen