Le géocodage dans R avec Google Maps
J'ai essayé d'exécuter le code de géocoder des emplacements dans R par l'intermédiaire de Google Maps et de la XML
package à partir de ce blog:
http://www.r-chart.com/2010/07/maps-geocoding-and-r-user-conference.html
Voici ses fonctions:
getDocNodeVal=function(doc, path){
sapply(getNodeSet(doc, path), function(el) xmlValue(el))
}
gGeoCode=function(str){
library(XML)
u=paste('http://maps.google.com/maps/api/geocode/xml?sensor=false&address=',str)
doc = xmlTreeParse(u, useInternal=TRUE)
str=gsub(' ','%20',str)
lng=getDocNodeVal(doc, "/GeocodeResponse/result/geometry/location/lat")
lat=getDocNodeVal(doc, "/GeocodeResponse/result/geometry/location/lng")
c(lat,lng)
}
Quand je lance gGeoCode()
, j'obtiens l'erreur suivante:
> gGeoCode("Philadelphia, PA")
failed to load external entity "http%3A//maps.google.com/maps/api/geocode/xml%3Fsensor=false&address=%20Philadelphia,%20PA"
Error: 1: failed to load external entity "http%3A//maps.google.com/maps/api/geocode/xml%3Fsensor=false&address=%20Philadelphia,%20PA"
Si je viens de le coller dans un navigateur l'url de l'API avec Philadelphia, PA
ajouté à la fin, comme la chaîne de caractères passée à xmlParseTree
, j'obtiens un résultat qui ressemble légitime xml lorsque je le télécharge.
Est-ce un problème avec le code, ou ai-je pas réussi à configurer quelque chose ou d'une autre?
- Côté/off-topic: au lieu de str=gsub(' ','%20',str), il pourrait faire str=URLencode(str). Je ne commente ici parce que je pense que c'est une fonction de refroidissement 🙂
- Oui, un très cool de la fonction. Si seulement ça marchait! :-/
- l'appel json œuvres, voir ma réponse ci-dessous 🙂
- Je sais que cette question est ancienne, mais il vaut la peine d'ajouter qu'il existe maintenant une
geocode
fonction dans le packageggmap
qui fait tout ce travail pour vous.
Vous devez vous connecter pour publier un commentaire.
Avez-vous pensé à utiliser le json appel à la place? En regardant votre code, vous pouvez obtenir la même chose de faire cela (vous aurez besoin d'installer les paquets RCurl et RJSONIO de omegahat.com).
De copier et de les coller dans R:
Voici comment utiliser les fonctions ci-dessus:
C'est le résultat que vous obtenez. Je pense que dans le code d'origine, lat et de gnl sont mélangés? Mais j'espère que c'est ce que vous voulez:
Espère que ça aide un peu mate,
Tony Breyal
Error in x$results[[1]]$geometry$location$lat : $ operator is invalid for atomic vectors
. Ce que je fais mal ici?sapply
appeler quand vous avez besoin de géocoder des centaines d'adresses (elle revient aujourd'huiNA
plutôt qu'une vague d'erreur lorsque Google ne peut pas géocodage à l'adresse). Est votre fonction dans un paquet quelque part?gGeoCode
à mon florilège paquettaRifx
donc, c'est plus largement disponible, je pourrais le faire. Vous auriez du être répertorié comme l'auteur évidemment.Ce code fonctionne en utilisant la bibliothèque XML
Ceci est une autre option pour le géocodage - il peut être plus facile à analyser:
https://webgis.usc.edu/Services/Geocode/Default.aspx
J'ai modifié Tony Breyal solution afin que la
gGeoCode
fonction prend également un vecteur d'adresses en entrée. Avec cette version, vous pouvez non seulement fairegGeoCode("Philadelphia, PA")
mais aussigGeoCode(c("Philadelphia, PA","New York, NY"))
avec cette valeur de retour.Noter que l'api google maps a une limite quotidienne de 2 500, de sorte que votre vecteur ne devrait pas être trop long. Voici la mise à jour de la fonction:
EDIT: Petite correction dans le code de sorte que la lat et de gnl sont retournés sous forme de valeurs numériques.
J'avais besoin pour obtenir tous les anciens d'adresses à partir de
geocode
pas seulement le premier, j'ai donc écrit une petite fonction pour le faire. Il peut être utilisé pour de géocodage et à de géocodage inverséDe géocodage exemple:
De Géocodage inversé exemple:
noter que l'adresse peut être mis en forme d'adresse ou de latlng, le
reverse
paramètre n'est pas utilisé, mais il est, y compris pour une utilisation future avec d'autres services de géocodageCela peut aussi être fait avec mon colis googleway et une carte Google Maps API key
Et à l'inverse de géocodage