注意:我对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 :)
答案 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"
如果您使用list
和lat
组件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
所做的工作。