反向地理编码多个Lon / Lat R

时间:2016-11-23 06:22:07

标签: r google-maps-api-3 coordinates reverse-geocoding

注意:我对R没有太多经验。我希望这不是我的想法!

我正在尝试将美国经度和纬度数据集的地理编码反转为邮政编码。

首先,我更喜欢不受查询限制的内容(例如google maps API)。如果那是不可能的,那么非常感谢您对以下内容的帮助。

我学会了使用从以下博客post找到的函数reverseGeoCode()来反转地理编码单个坐标。它工作得很好,但我试图反转地理编码坐标列表。

#load in my data
dir()
tw.data <- read.csv(file.choose(),header=T)
#organize coodinates
long <- tw.data[,7]
lat <- tw.data[,8]
coords <- cbind(long,lat)

#reverse geocoding
reverseGeoCode <- function(latlng) {
latlngStr <-  gsub(' ','%20', paste(latlng, collapse=","))#Collapse and Encode     URL Parameters
  library("RJSONIO") #Load Library
  #Open Connection
  connectStr <- paste('http://maps.google.com/maps/api/geocode/json?sensor=false&latlng=',latlngStr, sep="")
  con <- url(connectStr)
  data.json <- fromJSON(paste(readLines(con), collapse=""))
  close(con)
  #Flatten the received JSON
  data.json <- unlist(data.json)
  if(data.json["status"]=="OK")
    address <- data.json["results.formatted_address"]
  return (address)
}
addresses <- reverseGeoCode(coords)
addresses

我需要以不同的方式组织我的坐标吗?这个功能甚至没有处理多个点吗?

任何帮助都将 greaaatly apprediated :)

1 个答案:

答案 0 :(得分:0)

假设您有matrix个坐标。您可以使用apply

#create some random coordinates
set.seed(3)
coords<-matrix(runif(10,0,45),ncol=2) 
#          [,1]      [,2]
#[1,]  7.561869 27.197732
#[2,] 36.338238  5.608505
#[3,] 17.322406 13.257042
#[4,] 14.748044 25.992446
#[5,] 27.094530 28.394067
apply(coords,1,reverseGeoCode)
#[1] "Wau, South Sudan"                                                 
#[2] "Unnamed Road, Dehamcha, Algeria"                                  
#[3] "Nguigmi, Niger"                                                   
#[4] "Mellit, Sudan"                                                    
#[5] "Al Farafra - Al Wahat, Al Farafrah, New Valley Governorate, Egypt"

如果您使用listlat组件lon,则可以使用mapply

coordlist<-list(lat=coords[,1],lon=coords[,2])
#$lat
#[1]  7.561869 36.338238 17.322406 14.748044 27.094530
#$lon
#[1] 27.197732  5.608505 13.257042 25.992446 28.39406
mapply(function(x,y) reverseGeoCode(c(x,y)),coordlist$lat,coordlist$lon)
#same output as above

正如评论中已经说明的那样,revgeocode包中的ggmap功能会执行reverseGeoCode所做的工作。