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
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 ... !!
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"
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 )