2016-11-23 102 views
1

注意:我对R没有太多经验,我希望这不会太过头我!反向地理编码多个Lon/Lat 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

该API已被'ggmap :: revgeocode' – alistaire

回答

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" 

如果不是有与latlon组件list,你可以使用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做什么。