我有緯度和經度座標的列表,並希望找出他們都居住在哪個國家。轉換緯度和經度座標,以國名中的R
我修改的答案從this question about lat-long to US states,並有一個工作功能,但我遇到的問題是worldHires
地圖(來自mapdata
包)顯得過時了,並且包含許多過時的國家,例如南斯拉夫和蘇聯。
我該如何修改此功能以使用更現代的軟件包,例如rworldmap
?我只設法阻撓自己那麼遠,
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...
的地圖包現在有新的國家進行更新。沒有更多的蘇聯或南斯拉夫等 – ZacharyST