wake-up-neo.com

R beim Versuch, Breiten-/Längengraddaten für Städte in Europa zu finden und Geocodefehlermeldungen zu erhalten

Ich habe kürzlich eine Frage zum Plotten von Positionen in Städten in Europa als Punkte auf einer Karte gepostet. Siehe R, Längen Breitengraddaten für Städte abrufen und sie meinem Datenrahmen hinzufügen - /

xlsx-Datei für Städte enthält etwa 20000 Städte in Europa.

Ich habe eine Fehlermeldung erhalten, als ich versuchte, die geografischen Breiten-/Längengraddaten zu ermitteln. Ich habe einen Teil des Codes unten eingefügt:

cities <- read.xlsx("EU_city.xlsx",1)

# get frequencies
freq <- as.data.frame(table(cities))
library(plotrix)
freq$Freq <- rescale(freq$Freq, c(1,10)) # c(scale_min, scale_max)

# get cities latitude/longitude - kindly provided by google:
library(ggmap)
lonlat <- geocode(unique(cities)) 
cities <- cbind(freq, lonlat)

error message:

Error: is.character(location) is not TRUE

Ich denke, die Daten (Städte) in meinem Dataframe werden im Geocode-Aufruf nicht gefunden. Gibt es eine Möglichkeit, die Stadt im Dtaframe zu ignorieren, wenn sie im Geocode nicht übereinstimmt 

Update der Frage nach Vorschlag .......

ausprobierter Geocode (as.character (Städte))

Dann sieht mein Rahmen so aus:

> cities <- cbind(freq, lonlat)
> cities
                       cities  Freq lon lat
1                      ARNHEM  1.00  NA  NA
2                      ATHENS  3.25  NA  NA
3                        BAAR  1.00  NA  NA
4                BAD  VILBEL   1.00  NA  NA
5                   BILTHOVEN  1.00  NA  NA
6                      BOCHUM 10.00  NA  NA
7                       BREDA  3.25  NA  NA
8              CAMBRIDGESHIRE  3.25  NA  NA
9                   DORDRECHT  1.00  NA  NA
10                GAOETERSLOH  1.00  NA  NA
11              GELSENKIRCHEN  1.00  NA  NA
12                       GOES  1.00  NA  NA
13                  GRONINGEN  3.25  NA  NA
14  GUMMERSBACH-DIERINGHAUSEN  1.00  NA  NA
15                  HALSTEREN  1.00  NA  NA
16                   HANNOVER  1.00  NA  NA
17                 HARDERWIJK  1.00  NA  NA
18                    HEERLEN  3.25  NA  NA
19                  HILVERSUM  1.00  NA  NA

Ich habe überhaupt keine Long/Lat-Daten erhalten, nur NA

11
jonas

Sie müssen nur die cities-Spalte geocodieren (es ist etwas verwirrend, dass Sie einen Datenrahmen mit dem Namen cities und eine Spalte mit dem Namen cities) haben. Wenn Sie Zweifel haben, zerlegen Sie die Dinge in kleinere Brocken.

Versuchen Sie sie beispielsweise einzeln ...

cities <- c("ARNHEM","ATHENS","BAAR","CAMBRIDGESHIRE")
library(ggmap)
geocode(cities[1])
##       lon     lat
## 1 5.89873 51.9851
geocode(cities[2])
## just checking ...
geocode("ATHENS GEORGIA")
##         lon   lat
## 1 -83.38333 33.95

Versuchen Sie jetzt den Vektor auf einmal:

geocode(cities)
##          lon      lat
## 1  5.8987296 51.98510
## 2 23.7293097 37.98372
## 3  8.5286332 47.19585
## 4  0.0965375 52.27619

Versuchen Sie es jetzt mit einem Datenrahmen:

mydat <- read.csv(textConnection("
   cities,Freq,lon,lat
   ARNHEM,1.00,NA,NA
   ATHENS,3.25,NA,NA
   BAAR,1.00,NA,NA
   BAD VILBEL,1.00,NA,NA
   BILTHOVEN,1.00,NA,NA
   BOGUS_PLACE,2,NA,NA"))


geocodes <- geocode(as.character(mydat$cities))
mydat <- data.frame(mydat[,1:2],geocodes)

##               cities Freq        lon      lat
## 1             ARNHEM 1.00   5.898730 51.98510
## 2             ATHENS 3.25  23.729310 37.98372
## 3               BAAR 1.00   8.528633 47.19585
## 4         BAD VILBEL 1.00   8.739480 50.18234
## 5          BILTHOVEN 1.00   5.210381 52.13653
## 6        BOGUS_PLACE 2.00 -92.201158 44.49091

Ich weiß nicht was das Ergebnis für BOGUS_PLACE bedeutet ... !!

19
Ben Bolker

Ich habe gerade diese Fehlermeldung gefunden:

Fehler: is.character (location) ist nicht TRUE

kann daran liegen, dass die Adresse als Zahl und nicht als Zeichen codiert ist. Dies kann passieren, wenn Sie beispielsweise aus einem Datenrahmen auswählen, was in meinem Fall der Fall war.

Tun:

typeof(address)

wenn es sich als numerisch herausstellt, ändern Sie es in char

a2 <- as.character(address)
geocode(a2)

Hier ist eine alternative Möglichkeit, wie Sie damit umgehen könnten. 

# METHOD 1: Using geocode() from {ggmap}
library(ggmap)
adr <- adr <- "Agra, New Delhi"  # define address
geocode(adr)  # get the latitude and longitude

# Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=Agra,+New+Delhi&sensor=false
#     lon      lat
1 77.3126 28.54637

# METHOD 2: CODE TO GET THE LATITUDE AND LONGITUDE OF A STREET ADDRESS WITH GOOGLE API
addr <- '6th Main Rd, New Thippasandra, Bengaluru, Karnataka'  # set your address here
url = paste('http://maps.google.com/maps/api/geocode/xml?address=', addr,'&sensor=false',sep='')  # construct the URL
doc = xmlTreeParse(url) 
root = xmlRoot(doc) 
lat = xmlValue(root[['result']][['geometry']][['location']][['lat']]) 
long = xmlValue(root[['result']][['geometry']][['location']][['lng']]) 
lat
[1] "12.9725020"
long
[1] "77.6510688"
1
Selva

Mit dem folgenden Code können Sie Informationen aus der Bing Map API extrahieren

for(i in 1:length(PinCode)){
var = PinCode[i]
link=paste("http://dev.virtualearth.net/REST/v1/Locations?postalCode=", var, "&o=xml&maxResults=1&key=[YOurKey]",sep = "")
data<- xmlParse(link)
xml_data <- xmlToList(data)
PinCodeLatLongtemp <- data.frame(PinCode = "Temp", Lat = "Lat", Long = "Long")
PinCodeLatLongtemp$PinCode <- var
PinCodeLatLongtemp$Lat <- 
xml_data$ResourceSets$ResourceSet$Resources$Location$Point$Latitude
PinCodeLatLongtemp$Long <- 
xml_data$ResourceSets$ResourceSet$Resources$Location$Point$Longitude

PinCodeLatLong <- rbindlist(list(PinCodeLatLongtemp,PinCodeLatLong), fill = T)
}

Es wird ein neuer Datenrahmen erstellt, in dem Sie 'Pincode' und zwei neue Spalten mit Lat und Long eingeben. Sie erhalten Ihren Schlüssel von [hier] ( https://www.bingmapsportal.com ).

0
Harshal Gajare