Convertir la latitude et de la longitude de nom de pays dans la R
J'ai une liste de latitude et de longitude, et souhaitez découvrir les pays d'où ils résident tous dans.
J'ai modifié une réponse de cette question de la lat-long aux états-unis, et disposer d'une fonction, mais je rencontre le problème que la worldHires
carte (à partir de la mapdata
package) est affreusement de jour et contient beaucoup de l'obsolescence des pays comme la Yougoslavie et l'URSS.
Comment puis-je modifier cette fonction pour utiliser une plus modernes paquet, comme rworldmap
? J'ai seulement réussi à déjouer moi-même de si loin...
library(sp)
library(maps)
library(rgeos)
library(maptools)
# The single argument to this function, points, is a data.frame in which:
# - column 1 contains the longitude in degrees
# - column 2 contains the latitude in degrees
coords2country = function(points)
{
# prepare a SpatialPolygons object with one poly per country
countries = map('worldHires', fill=TRUE, col="transparent", plot=FALSE)
names = sapply(strsplit(countries$names, ":"), function(x) x[1])
# clean up polygons that are out of bounds
filter = countries$x < -180 & !is.na(countries$x)
countries$x[filter] = -180
filter = countries$x > 180 & !is.na(countries$x)
countries$x[filter] = 180
countriesSP = map2SpatialPolygons(countries, IDs=ids, proj4string=CRS("+proj=longlat +datum=wgs84"))
# convert our list of points to a SpatialPoints object
pointsSP = SpatialPoints(points, proj4string=CRS("+proj=longlat +datum=wgs84"))
# use 'over' to get indices of the Polygons object containing each point
indices = over(pointsSP, countriesSP)
# Return the state names of the Polygons object containing each point
myNames = sapply(countriesSP@polygons, function(x) x@ID)
myNames[indices]
}
##
## this works... but it has obsolete countries in it
##
# set up some points to test
points = data.frame(lon=c(0, 5, 10, 15, 20), lat=c(51.5, 50, 48.5, 47, 44.5))
# plot them on a map
map("worldHires", xlim=c(-10, 30), ylim=c(30, 60))
points(points$lon, points$lat, col="red")
# get a list of country names
coords2country(points)
# returns [1] "UK" "Belgium" "Germany" "Austria" "Yugoslavia"
# number 5 should probably be in Serbia...
Le paquet de cartes est maintenant mis à jour avec de nouveaux pays. Pas plus URSS ou de la Yougoslavie, etc.
OriginalL'auteur Iain S | 2013-01-15
Vous devez vous connecter pour publier un commentaire.
Merci pour l'soigneusement construit question.
Il exigeait seulement un couple de modifications de la ligne pour être en mesure d'utiliser rworldmap (contenant jusqu'à la date de pays), voir ci-dessous. Je ne suis pas un expert sur les CRS, mais je ne pense pas que la modification que j'ai eu à faire à la proj4string fait une différence. D'autres pourraient faire un commentaire sur cela.
Cela a fonctionné pour moi & a :
Tout le meilleur,
Andy
identicalCRS(x, y) is not TRUE
Qui doit être fixée par le présent edit : pointsSP = SpatialPoints(points, proj4string=CRS(proj4string(countriesSP)))
cela pourrait-il être modifié pour extraire un continent? et j'ai aussi eu quelques NA quand j'ai couru ce, par exemple (53.225516,-4.132845,NA) (41.524314,-70.669578,NA) - savez-vous pourquoi?
J'ai ajouté 2 lignes à la fin pour montrer comment la fonction peut être modifiée pour revenir continent. Concernant le retour de NAs, je pense qu'ils sont dans l'océan. Pour vérifier :
library(rworldmap) plot(getMap()) points(53.225516,-4.132845,col='green')
OriginalL'auteur Andy
Vous pouvez utiliser mon
geonames
paquet de rechercher à partir de la http://geonames.org/ service:L'obtenir à partir de r-forge parce que je ne suis pas sûr que j'ai pris la peine de le libérer à CRAN:
https://r-forge.r-project.org/projects/geonames/
Oui, elle dépend d'un service externe, mais au moins il sait ce qui s'est passé au communisme... 🙂
GNcountryCode
fonction ne permet pas pour un nom d'utilisateur. Allez-vous régler les appels de l'API? @SpacedmanOriginalL'auteur Spacedman