Breiten- und Längengrad-Koordinaten in den Ländernamen in R umrechnen

Ich habe eine Liste mit Breiten- und Längengradkoordinaten und möchte herausfinden, in welchem ​​Land sie sich alle befinden.

Ich habe eine Antwort von geändertDiese Frage über Lat-Long zu US-Bundesstaaten, und habe eine funktionierende Funktion, aber ich stoße auf das Problem, dass dieworldHires Karte (von dermapdata Paket) ist schrecklich veraltet und enthält viele veraltete Länder wie Jugoslawien und die UdSSR.

Wie würde ich diese Funktion ändern, um ein moderneres Paket zu verwenden, wie zrworldmap? Ich habe es bisher nur geschafft, mich selbst zu frustrieren ...

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...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage