从R中的经纬度点获取国家(和大陆)
作为跟进,R中是否有软件包/功能可以为我提供经纬度定义的点所在的国家(和大陆)?类似于所做工作的内容 Dataframe看起来像这样从R中的经纬度点获取国家(和大陆),r,maps,R,Maps,作为跟进,R中是否有软件包/功能可以为我提供经纬度定义的点所在的国家(和大陆)?类似于所做工作的内容 Dataframe看起来像这样 Point_Name Longitude Latitude University of Arkansas 36.067832 -94.173655 Lehigh University 40.601458 -75.360063 Harvard University 42.379393 -71.1158
Point_Name Longitude Latitude
University of Arkansas 36.067832 -94.173655
Lehigh University 40.601458 -75.360063
Harvard University 42.379393 -71.115897
我想输出上面的数据框,并在其中添加国家和大陆列作为一个额外的奖励,一个包含美国各州的专栏,适用于美国境内的人(以及“其他”适用于美国境外的人)?因此这是一个在谷歌上使用的替代方案。此代码部分基于 调用上面的数据帧
df
reverseGeoCode <- function(latlng) {
require("XML")
require("httr")
latlng <- as.numeric(latlng)
latlngStr <- gsub(' ','%20', paste(round(latlng,2), collapse=","))
url <- "http://maps.google.com"
path <- "/maps/api/geocode/xml"
query <- list(sensor="false",latlng=latlngStr)
response <- GET(url, path=path, query=query)
if (response$status !=200) {
print(paste("HTTP Error:",response$status),quote=F)
return(c(NA,NA))
}
xml <- xmlInternalTreeParse(content(response,type="text"))
status <- xmlValue(getNodeSet(xml,"//status")[[1]])
if (status != "OK"){
print(paste("Query Failed:",status),quote=F)
return(c(NA,NA))
}
xPath <- '//result[1]/address_component[type="country"]/long_name[1]'
country <- xmlValue(getNodeSet(xml,xPath)[[1]])
xPath <- '//result[1]/address_component[type="administrative_area_level_1"]/long_name[1]'
state <- xmlValue(getNodeSet(xml,xPath)[[1]])
return(c(state=state,country=country))
}
st.cntry <- t(apply(df,1,function(x)reverseGeoCode(x[2:3])))
result <- cbind(df,st.cntry)
result
# Point_Name Longitude Latitude state country
# 1 University of Arkansas 36.06783 -94.17365 Arkansas United States
# 2 Lehigh University 40.60146 -75.36006 Pennsylvania United States
# 3 Harvard University 42.37939 -71.11590 Massachusetts United States
reverseGeoCode要获取大陆,您可以使用rworldmap
修改coords2country
函数的最后一行,以创建Coords2Continental
函数,如下所示。选择您想要的是6大陆模型还是7大陆模型。我将考虑将此代码放入rworldmap
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
coords2continent = function(points)
{
countriesSP <- getMap(resolution='low')
#countriesSP <- getMap(resolution='high') #you could use high res map from rworldxtra if you were concerned about detail
# converting points to a SpatialPoints object
# 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)
#indices$continent # returns the continent (6 continent model)
indices$REGION # returns the continent (7 continent model)
#indices$ADMIN #returns country name
#indices$ISO3 # returns the ISO3 code
}
看一看,从本页右边空白处“相关”下的问题列表中选择。谢谢,我不知道我怎么会错过这些(我看了很多,但没有找到那些)-一旦我的脚本根据旧的答案运行,我会删除我的问题。(目前国家和州都在运行-一些国家提出了NA,并试图将大陆排序)为什么大陆看起来有点偏僻?就像墨西哥和中美洲是南美洲的一部分(而不是北美洲),整个俄罗斯都是欧洲的一部分,而其中一些应该在亚洲?很好的代码,我唯一的问题是我想把落入海洋的点分配到最近的大陆,因为目前的结果是NA。
points = data.frame(lon=c(0, 90, -45, -100, 130), lat=c(52, 40, -10, 45, -30 ))
coords2continent(points)
#[1] Europe Asia South America North America Australia
coords2country(points)
#[1] United Kingdom China Brazil United States of America Australia