web-dev-qa-db-fra.com

R essayant de trouver des données de latitude/longitude pour des villes en europe et obtenant une erreur de géocodage

J'ai récemment posté une question concernant le tracé des positions sur les villes d’europe sous forme de points sur une carte. Voir R, obtenir des données de longitude/latitude pour les villes et les ajouter à mon cadre de données

le fichier xlsx contient environ 20000 villes de europe.

J'ai reçu un message d'erreur lorsque j'essayais de trouver les données de latitude/longitude à l'aide du géocodage. J'ai inséré une partie du code ci-dessous:

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

Je suppose que les données (villes) de mon cadre de données ne figurent pas dans l'appel de géocode. Y a-t-il un moyen d'ignorer la ville dans le fichier dtaframe si elle ne correspond pas au géocode 

Mise à jour de question après suggestion .......

géocode essayé (as.character (villes))

Ensuite, mon cadre ressemble à ceci:

> 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

Je n'ai pas du tout de données long/lat, seulement NA

11
jonas

Vous devez géocoder uniquement la colonne cities (il est un peu déroutant que vous disposiez d'un bloc de données appelé cities et d'une colonne nommée cities). En cas de doute, essayez de diviser les choses en morceaux plus petits.

Par exemple, essayez-les un à la fois ...

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

Maintenant, essayez le vecteur à la fois:

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

Maintenant, essayez avec un cadre de données:

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

Je ne sais pas ce que le résultat pour BOGUS_PLACE signifie ... !!

19
Ben Bolker

Je viens de trouver que ce message d'erreur:

Erreur: is.character (location) n'est pas VRAI

cela peut être dû au fait que l’adresse est codée sous forme de nombre et non de caractère. Cela peut arriver lorsque vous sélectionnez un cadre de données, par exemple, ce qui était mon cas.

Faire:

typeof(address)

et s'il s'avère numérique, changez-le en caractère

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

Voici une autre façon de gérer cela. 

# 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

Vous pouvez utiliser le code ci-dessous pour extraire des informations de l'API Bing Map

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)
}

Il créera une nouvelle trame de données avec votre entrée "Pincode" et deux nouvelles colonnes avec Lat et Long. Vous pouvez obtenir votre clé à partir de [ici] ( https://www.bingmapsportal.com )

0
Harshal Gajare