2014-04-07 9 views
7

Próbuję uzyskać kody pocztowe (długiej) listy współrzędnych długości geograficznej za pomocą funkcji kodu obłędu w bibliotece ggmap.Stosowanie regeocode do listy współrzędnych długości i szerokości geograficznej

Moje pytanie & dane są takie same jak tutaj: Using revgeocode function in a FOR loop. Help required, ale zaakceptowana odpowiedź nie działa dla mnie.

moje dane (.csv):

ID,  Longitude,  Latitude 
311175, 41.298437,  -72.929179 
292058, 41.936943,  -87.669838 
12979, 37.580956,  -77.471439 

śledzę te same czynności:

data <- read.csv(file.choose()) 
dset <- as.data.frame(data[,2:3]) 
location = dset 
locaddr <- lapply(seq(nrow(location)), function(i){ 
       revgeocode(location[i,], 
       output = c("address"), 
       messaging = FALSE, 
       sensor = FALSE, 
       override_limit = FALSE) 
       }) 

... i pojawia się komunikat o błędzie: „Błąd: is.numeric (lokalizacja) & & długość (lokalizacja) == 2 nie jest prawdą " W szczególności is.numeric (lokalizacja) to FALSE, co wydaje się dziwne, ponieważ mogę pomnożyć przez 2 i uzyskać oczekiwaną odpowiedź.

Każda pomoc zostanie doceniona.

+0

Jeśli odpowiedź nie działa dlaczego go przyjąć? Powinieneś opublikować to jako komentarz do odpowiedzi. – jlhoward

+0

Nie przyjąłem tego. op doszedł. – Rutger

+0

Przepraszam, ja też byłam tam OP. – jlhoward

Odpowiedz

9

Jest tu wiele rzeczy nie w porządku.

Po pierwsze, zmieniono szerokość i długość geograficzną. Wszystkie lokalizacje w zestawie danych, zgodnie z określeniem, znajdują się na Antarktyce.

Po drugie, revgeocode(...) oczekuje wektora numerycznego o długości 2 zawierającego długość i szerokość geograficzną w tej kolejności. Przechodzisz przez obiekt data.frame (jest to przyczyna błędu) i jak na (1) jest w niewłaściwej kolejności.

Po trzecie, revgeocode(...) używa api mapy google, która ogranicza Cię do 2500 zapytań dziennie. Więc jeśli naprawdę masz duży zbiór danych, powodzenia z tym.

Ten kod działa z próbką:

data <- read.csv(text="ID,  Longitude,  Latitude 
311175, 41.298437,  -72.929179 
292058, 41.936943,  -87.669838 
12979, 37.580956,  -77.471439") 

library(ggmap) 
result <- do.call(rbind, 
        lapply(1:nrow(data), 
         function(i)revgeocode(as.numeric(data[i,3:2])))) 
data <- cbind(data,result) 
data 
#  ID Longitude Latitude           result 
# 1 311175 41.29844 -72.92918 16 Church Street South, New Haven, CT 06519, USA 
# 2 292058 41.93694 -87.66984 1632 West Nelson Street, Chicago, IL 60657, USA 
# 3 12979 37.58096 -77.47144 2077-2199 Seddon Way, Richmond, VA 23230, USA 

ten wydobywa zipcodes:

library(stringr) 
data$zipcode <- substr(str_extract(data$result," [0-9]{5}, .+"),2,6) 
data[,-4] 
#  ID Longitude Latitude zipcode 
# 1 311175 41.29844 -72.92918 06519 
# 2 292058 41.93694 -87.66984 60657 
# 3 12979 37.58096 -77.47144 23230 
+0

Dziękuję bardzo za poświęcenie czasu na pomoc. Widziałem, że to działa i zauważyłem twoje komentarze. – Rutger

-1

aby wyodrębnić kod pocztowy tylko zanotować:

>data$postal_code 
2

Pisałem pakiet googleway, aby uzyskać dostęp do google maps API z poprawnym kluczem API. Więc jeśli dane jest większa niż 2500 elementów, które można zapłacić za klucz API, a następnie użyj googleway::google_reverse_geocode()

Na przykład

data <- read.csv(text="ID,  Longitude,  Latitude 
311175, 41.298437,  -72.929179 
292058, 41.936943,  -87.669838 
12979, 37.580956,  -77.471439") 

library(googleway) 

key <- "your_api_key" 

res <- apply(data, 1, function(x){ 
    google_reverse_geocode(location = c(x["Latitude"], x["Longitude"]), 
         key = key) 
}) 

## Everything contained in 'res' is all the data returnd from Google Maps API 
## for example, the geometry section of the first lat/lon coordiantes 

res[[1]]$results$geometry 
bounds.northeast.lat bounds.northeast.lng bounds.southwest.lat bounds.southwest.lng location.lat location.lng 
1   -61.04904     180     -90     -180 -75.25097 -0.071389 
location_type viewport.northeast.lat viewport.northeast.lng viewport.southwest.lat viewport.southwest.lng 
1 APPROXIMATE    -61.04904     180     -90     -180 
+0

Prawie skopiowałem to, ale dostałem następujący błąd: "Błąd w match.fun (FUN): brak argumentu" FUN ", bez domyślnego" –

+0

@ AgustínIndaco - Właśnie skopiowałem i wkleiłem ten dokładny kod i nie otrzymałem błąd. Czy zmieniłeś coś jeszcze w kodzie? – SymbolixAU

Powiązane problemy