2016-12-08 4 views
2

können Sie mir beim Extrahieren von Informationen aus Google API helfen, wenn ich Adresse Variable: 560066, 560065 (Pincodes von Bengaluru Stadt), die Adresse Komponenten hat unterschiedliche Längen (4 und 5 in diesem Fall)Google API gibt falsche Werte zurück

Dies könnte falsche Daten zurückgeben. Lassen Sie sagen, dass ich Land Info, folgende zurückkehren würde INDIA für ehemalige und wollte ‚Fehler: außerhalb der Grenzen‘ für letztere

Gibt es eine universelle Art und Weise, so dass es Land Wert für beide Fall

library(rjson) # load rjson package 

getCoordinates <- function(address) { 
url <- paste("http://maps.googleapis.com/maps/api/geocode/json?address=",address,"&sensor=false",sep="") 
map_data <- fromJSON(paste(readLines(url),collapse="")) 
coord <- c(map_data$results[[1]]$geometry$location$lat,map_data$results[[1]]$geometry$location$lng, toupper(map_data$results[[1]]$address_components[[5]]$long_name)) 
return(coord) 
} 

g <- getCoordinates(560066) 

Antwort

2

mit den Renditen Google API garantiert nicht immer die gleiche Anzahl von Ergebnissen für jede Abfrage. Dies ist das Problem, das Sie beschreiben.

Was Sie extrahieren müssen, ist das types : country Feld, aber um dies zu tun, müssen Sie wissen, auf welcher 'Ebene' in der Liste das Länderfeld existiert (wenn es das tut).

Für dieses Beispiel werde ich mein googleway Paket wird mit der Geokodierung zu tun, wie es die Konstruktion der API-Abfrage übernimmt für Sie

library(googleway) 

## you need a valid Google API key to use their API 
api_key <- "your_api_key" 

query1 <- google_geocode(address = "560065", key = api_key) 
query2 <- google_geocode(address = "560066", key = api_key) 

## the 'country' is in the 'address_components : types' field 
# query1$results$address_components 

## use an 'lapply' to find the depth of the country field 
l <- lapply(query2$results$address_components[[1]]$types, function(x){ 
    'country' %in% x 
    }) 

## so now we know how far into the list we have to go 
which(l == T) 
# [1] 4 

query2$results$address_components[[1]]$long_name[[which(l == T)]] 
# [1] "India" 

So dies in einer Funktion Verpackung:

getCountry <- function(g){ 

    l <- lapply(g[['results']][['address_components']][[1]][['types']], function(x){ 
     'country' %in% x 
    }) 

    return(g[['results']][['address_components']][[1]][['long_name']][[which(l == T)]]) 
} 

getCountry(query1) 
# [1] "India" 
getCountry(query2) 
# [1] "India" 

Um dies in Ihre Funktion übernehmen Sie tun können

getCoordinates <- function(address) { 
    url <- paste("http://maps.googleapis.com/maps/api/geocode/json?address=",address,"&sensor=false",sep="") 
    map_data <- fromJSON(paste(readLines(url),collapse="")) 

    l <- lapply(map_data$results[[1]]$address_components, function(x){ 
     'country' %in% x[['types']] 
    }) 

    coord <- c(map_data$results[[1]]$geometry$location$lat,map_data$results[[1]]$geometry$location$lng, 
      toupper(map_data$results[[1]]$address_components[[which(l == T)]]$long_name)) 
    return(coord) 
} 

getCoordinates(560065) 
[1] "12.9698066" "77.7499632" "INDIA" 

getCoordinates(560066) 
[1] "13.0935798" "77.5778529" "INDIA" 
+0

Danke, aber gibt es eine Grenze für die Verwendung, Nachdem ich dies behoben habe, lief ich es auf einer Liste von mehr als 300 Städtenamen, und es stoppte immer bei 20 und warf einen Fehler, und jetzt sogar 'g <- getCoordinates ('AMSTERDAM') 'wird nicht funktionieren. Irgendeine Idee? @SymbolixAU –

+1

@NemishKanwar Es gibt ein Limit von 2500 Anfragen pro Tag. Was deinen Fehler betrifft, kann ich nicht helfen, ohne es zu sehen - vielleicht ist es spezifisch für deinen 20. Eintrag? Wie auch immer, wenn Sie eine separate Frage haben, sollten Sie eine neue Frage öffnen, anstatt eine bereits beantwortete zu aktualisieren. – SymbolixAU

Verwandte Themen