para - latitud y longitud google maps
Convertir las coordenadas de latitud y longitud al nombre del país en R (2)
Gracias por la pregunta cuidadosamente construida. Se requiere solo un par de cambios de línea para poder usar rworldmap (que contiene países actualizados), ver más abajo. No soy un experto en CRS, pero no creo que el cambio que tuve que hacer en el proyecto haga ninguna diferencia. A otros les gustaría comentar sobre eso.
Esto funcionó para mí y dio:
> coords2country(points)
[1] United Kingdom Belgium Germany Austria
[5] Republic of Serbia
Todo lo mejor, Andy
library(sp)
library(rworldmap)
# 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)
{
countriesSP <- getMap(resolution=''low'')
#countriesSP <- getMap(resolution=''high'') #you could use high res map from rworldxtra if you were concerned about detail
# convert our list of points to a SpatialPoints object
# pointsSP = SpatialPoints(points, proj4string=CRS(" +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"))
#setting CRS directly to that from rworldmap
pointsSP = SpatialPoints(points, proj4string=CRS(proj4string(countriesSP)))
# use ''over'' to get indices of the Polygons object containing each point
indices = over(pointsSP, countriesSP)
# return the ADMIN names of each country
indices$ADMIN
#indices$ISO3 # returns the ISO3 code
#indices$continent # returns the continent (6 continent model)
#indices$REGION # returns the continent (7 continent model)
}
Tengo una lista de coordenadas de latitud y longitud, y deseo saber en qué país residen.
Modifiqué una respuesta de esta pregunta sobre los estados de EE. UU . Y tengo una función de trabajo, pero me encuentro con el problema de que el mapa worldHires
(del paquete mapdata
) está terriblemente desactualizado y contiene muchos países obsoletos como como Yugoslavia y la URSS.
¿Cómo modificaría esta función para usar un paquete más moderno, como rworldmap
? Sólo he logrado frustrarme hasta ahora ...
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...
Puede usar mi paquete de geonames
para buscar desde el servicio http://geonames.org/ :
> GNcountryCode(51.5,0)
$languages
[1] "en-GB,cy-GB,gd"
$distance
[1] "0"
$countryName
[1] "United Kingdom of Great Britain and Northern Ireland"
$countryCode
[1] "GB"
> GNcountryCode(44.5,20)
$languages
[1] "sr,hu,bs,rom"
$distance
[1] "0"
$countryName
[1] "Serbia"
$countryCode
[1] "RS"
Obténgalo de r-forge porque no estoy seguro de que me haya molestado en lanzarlo a CRAN:
https://r-forge.r-project.org/projects/geonames/
Sí, depende de un servicio externo, pero al menos sabe lo que pasó con el comunismo ... :)