ich eine Liste von Breiten- und Längenkoordinaten haben und wollen, um herauszufinden, in welchem Land sie alle wohnen in.Convert Breiten- und Längenkoordinaten zu Ländernamen in R
ich eine Antwort von this question about lat-long to US states modifiziert und haben eine Arbeits Funktion, aber ich laufe auf das Problem, dass die worldHires
Karte (aus dem mapdata
Paket) schrecklich veraltet ist und viele veraltete Länder wie Jugoslawien und die UdSSR enthält.
Wie würde ich diese Funktion ändern, um ein moderneres Paket zu verwenden, z. B. rworldmap
? Ich habe es geschafft mich nur vereiteln so weit ...
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([email protected], function(x) [email protected])
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...
Die Karten-Paket mit neuen Ländern wird jetzt aktualisiert. Keine UdSSR oder Jugoslawien, etc. – ZacharyST