如何在R中通过城市名和国家获取经纬度坐标?

16

我有一个长长的城市和国家名称列表,我想在地图上标出它们。为此,我需要每个城市的经纬度信息。

我的表格名为test,具有以下结构:

Cityname  CountryCode
New York  US
Hamburg   DE
Amsterdam NL
3个回答

18

使用以下代码,我已成功解决了这个问题。

library(RJSONIO)
nrow <- nrow(test)
counter <- 1
test$lon[counter] <- 0
test$lat[counter] <- 0
while (counter <= nrow){
  CityName <- gsub(' ','%20',test$CityLong[counter]) #remove space for URLs
  CountryCode <- test$Country[counter]
  url <- paste(
    "http://nominatim.openstreetmap.org/search?city="
    , CityName
    , "&countrycodes="
    , CountryCode
    , "&limit=9&format=json"
    , sep="")
  x <- fromJSON(url)
  if(is.vector(x)){
    test$lon[counter] <- x[[1]]$lon
    test$lat[counter] <- x[[1]]$lat    
  }
  counter <- counter + 1
}

由于这里调用了一个外部服务(openstreetmaps.org),对于较大的数据集可能需要一些时间。不过,你很可能只在列表中添加新城市时偶尔这样做。


1
你也可以使用我的geonames包中的GNsearch来实现这一点 - 它调用了geonames.org网络服务,该服务与OpenStreetMap的Nominatim服务共享许多数据。 - Spacedman
@Jochem,我该如何做到相反的效果?我有纬度和经度,需要使用与您上面相同的JSON格式通过Open Street查找城市和国家名称。 - Asad Feroz Ali

15

这里还有一些其他的选项供您选择。

ggmaps

ggmaps有一个名为geocode的函数,它使用Google Maps进行地理编码。这使您每天只能编码2,500个地址。

taRifx.geo

最新版本的taRifx.geo有一个名为geocode的函数,它可以使用Google或Bing地图进行地理编码。Bing版本需要您使用(免费)的Bing账户,但换取更多的地址编码次数。此版本具有以下功能:

  • 服务选择(Bing和Google Maps都支持)
  • 登录支持(特别是对于Bing,它需要一个账户密钥,但作为交换,允许更多每日请求)
  • 批量编码整个数据框,包括一些时间优化选项(如忽略已经编码过的行)
  • 强大的批量地理编码(以避免任何错误导致整个数据框的地理编码丢失,适用于更大的作业)
  • 路径查找(从A点到B点的旅行时间)

10

尝试这个,我认为这将是解决这个问题的更好方法。

> library(ggmap) 
Loading required package: ggplot2
Google Maps API Terms of Service: http://developers.google.com/maps/terms.
Please cite ggmap if you use it: see citation('ggmap') for details.

#Now you can give city name or country name individually

> geocode("hamburg")
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=hamburg&sensor=false
       lon      lat
1 9.993682 53.55108

geocode("amsterdam")
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=amsterdam&sensor=false
       lon      lat
1 4.895168 52.37022

> geocode("new york")
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=new+york&sensor=false
        lon      lat
1 -74.00594 40.71278


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接