Ziel: Mit R, Breiten- und Längendaten für einen Vektor von Adressen durch open.mapquestapiGeocode Batch-Adressen in R mit offenen mapquestapi
Abfahrtpunkt erhalten: Seit geocode
vom ggmap
Paket beschränkt zu 2500 Abfragen pro Tag, musste ich einen anderen Weg finden (Mein data.frame besteht aus 9M Einträgen). Das Data-Science-Toolkit ist keine Option, da die meisten meiner Adressen außerhalb des Vereinigten Königreichs/der USA liegen. Ich fand dieses exzellente Snippet unter http://rpubs.com/jvoorheis/Micro_Group_Rpres mit open.mapquestapi.
geocode_attempt <- function(address) {
URL2 = paste("http://open.mapquestapi.com/geocoding/v1/address?key=", "Fmjtd%7Cluub2huanl%2C20%3Do5-9uzwdz",
"&location=", address, "&outFormat='json'", "boundingBox=24,-85,50,-125",
sep = "")
# print(URL2)
URL2 <- gsub(" ", "+", URL2)
x = getURL(URL2)
x1 <- fromJSON(x)
if (length(x1$results[[1]]$locations) == 0) {
return(NA)
} else {
return(c(x1$results[[1]]$locations[[1]]$displayLatLng$lat, x1$results[[1]]$locations[[1]]$displayLatLng$lng))
}
}
geocode_attempt("1241 Kincaid St, Eugene,OR")
Wir brauchen diese Bibliotheken:
library(RCurl)
library(rjson)
library(dplyr)
Lasst uns ein Mock-up data.frame mit 5 Adressen erstellen.
id <- c(seq(1:5))
street <- c("Alexanderplatz 10", "Friedrichstr 102", "Hauptstr 42", "Bruesseler Platz 2", "Aachener Str 324")
postcode <- c("10178","10117", "31737", "50672", "50931")
city <- c(rep("Berlin", 2), "Rinteln", rep("Koeln",2))
country <- c(rep("DE", 5))
df <- data.frame(id, street, postcode, city, country
Für ein Hinzufügen einer Breite und Länge lat
lon
Variable auf den data.frame wir mit einem for
-Loop arbeiten konnte. Ich werde den Code präsentieren, nur um zu zeigen, dass die Funktion im Prinzip funktioniert.
for(i in 1:5){
df$lat[i] <- geocode_attempt(paste(df$street[i], df$postcode[i], df$city[i], df$country[i], sep=","))[1]
df$lon[i] <- geocode_attempt(paste(df$street[i], df$postcode[i], df$city[i], df$country[i], sep=","))[2]
}
Vom Leistungsstandpunkt ist dieser Code ziemlich schlecht. Selbst für diesen kleinen data.frame benötigte mein Computer etwa 9 Sekunden, wahrscheinlich aufgrund der Webservice-Abfrage, aber egal. Also könnte ich diesen Code in meinen 9 Millionen Zeilen laufen lassen, aber die Zeit wäre enorm.
Mein Versuch war die mutate
Funktion aus dem dplyr
Paket zu verwenden. Hier ist, was ich versucht:
df %>%
mutate(lat = geocode_attempt(paste(street, postcode, city, country, sep=","))[1],
lon = geocode_attempt(paste(street, postcode, city, country, sep=","))[2])
system.time
Anschläge in nur 2,3 Sekunden. Nicht so schlecht. Aber hier ist das Problem:
id street postcode city country lat lon
1 1 Alexanderplatz 10 10178 Berlin DE 52.52194 13.41348
2 2 Friedrichstr 102 10117 Berlin DE 52.52194 13.41348
3 3 Hauptstr 42 31737 Rinteln DE 52.52194 13.41348
4 4 Bruesseler Platz 2 50672 Koeln DE 52.52194 13.41348
5 5 Aachener Str 324 50931 Koeln DE 52.52194 13.41348
lat
und lon
sind genau die gleichen für alle Einträge. In meinem Verständnis funktioniert die mutate
Funktion reihenweise. Aber hier sind lat und lon aus der ersten Reihe berechnet. Dementsprechend ist die erste Zeile korrekt. Hat jemand eine Idee warum? Der von mir bereitgestellte Code ist vollständig. Nichts extra geladen. Irgendwelche Ideen? Wenn Sie einen performanten alternativen Weg anstelle einer Optimierung meines Codes haben, wäre ich auch dankbar.
Wie funktioniert die von @NicE bereitgestellte Abfrage für Ihre 9M Zeilen? Konnten Sie alle Instanzen in relativ kurzer Zeit geocodieren oder haben Sie mit MapQuest eine Einschränkung erreicht? – bshelt141