简体   繁体   English

从R中的经度和纬度点获取国家(和大陆)

[英]Get country (and continent) from longitude and latitude point in R

As a follow up on a question I posted yesterday , is there package/function within R that can give me the country (and continent) in which a point defined by longitude and latitude is located? 作为我昨天发布的一个问题的后续, R中是否有可以让我了解由经度和纬度定义的点所在的国家(和大陆)的软件包/功能? Something along the lines of what is done here in MatLab. 与MatLab中所做的事情类似

Dataframe looks like this... 数据框看起来像这样...

Point_Name              Longitude   Latitude
University of Arkansas  36.067832   -94.173655
Lehigh University       40.601458   -75.360063
Harvard University      42.379393   -71.115897

And I would like to output the above dataframe with country and continent columns added to it. 我想输出上面添加了国家和大洲列的数据框。 As an added bonus , a column with US states for those in the US (and "other" for those outside the US)? 作为额外的奖励 ,您可以在美国各州设有专栏,为美国境内的人提供专栏(对美国以外地区的专栏则为“其他”专栏)?

To get continents you can modify the last line of the coords2country function using rworldmap from this answer to create a coords2continent function as shown below. 要获得大洲,您可以使用rworldmap从此答案中修改coords2country函数的最后一行,以创建coords2continent函数,如下所示。 Choose whether you want the 6 or 7 continent model. 选择您想要的是6洲还是7洲模型。 I'll think about putting this code into rworldmap . 我会考虑将这段代码放入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 
}

Here is a test. 这是一个测试。

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

So this is an alternative that uses the reverse geocoding API on Google. 因此,这是在Google上使用反向地理编码API的替代方法。 This code is based in part on this reference . 此代码部分基于此参考

Calling your dataframe above df , df以上调用数据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

In the API definition, "administrative_area_level_1" is the highest administrative area below country. 在API定义中,“ administrative_area_level_1”是国家/地区下方的最高管理区域。 In the US these are states. 在美国,这些州。 In other countries the definition varies (might be provinces, for example). 在其他国家,定义有所不同(例如,可能是省份)。

Incidentally, I'm fairly certain you have latitude and longitude reversed. 顺便说一句,我相当确定您的经纬度已颠倒。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM