我有一个包含地址,城市,州,邮政实体的数据框。从那里开始,我正在尝试使用Yahoo API对每个地址进行地理编码。
我基于使用R Tutorial在O'Reilly的Data Mashups中的代码。原始示例采用街道地址向量并使用硬编码城市。我正在尝试制作支持多个城市的动态示例。
代码的缩写版本是:
geocodeAddresses<-function(myStreets)
}
appid<-'<put your appid here>'
baseURL<-"http://local.yahooapis.com/MapsService/V1/geocode?appid="
myGeoTable<-data.frame(address=character(),lat=numeric(),long=numeric(),EID=numeric())
for (myStreet in myStreets){
requestUrl<-paste(baseURL, appid, "&street=", URLencode(myStreet$address),"&city=",URLencode(myStreet$city),"&state=",URLencode(myStreet$state),sep="")
xmlResult<-xmlTreeParse(requestUrl,isURL=TRUE,addAttributeNamespaces=TRUE)
geoResult<-xmlResult$doc$children$ResultSet$children$Result
lat<-xmlValue(geoResult[['Latitude']])
long<-xmlValue(geoResult[['Longitude']])
myGeoTable<-rbind(myGeoTable,data.frame(address=myStreet,Y=lat,X=long,EID=NA))
}
}
当我尝试引用myStreet $ City和myStreet $地址时,收到错误
$ operator is invalid for atomic vectors
除了遍历数据框myStreets之外,我不知道如何为每一行只调用一次Yahoo API,并为每个成员存储long / lat。
答案 0 :(得分:6)
如果myStreets
是data.frame,那么for
循环会获取它的每一列。所以第一步采取Addres和Addres $ City没有意义。
您可以更改for
条件以循环遍历行:
for (i in 1:nrow(myStreets)) {
myStreet <- myStreets[i,]
# rest is the same
}
为了优化您的代码,您还可以执行以下操作:
myGeoTable <- data.frame( address=myStreet$address, lat=NA_real_, long=NA_real_, EID=NA_real_)
for (i in 1:nrow(myStreets)) {
myStreet <- myStreets[i,]
requestUrl <- ...
...
myGeoTable[i,2:4] <- c(lat,long,NA)
}
答案 1 :(得分:4)
如果你打算这样做,我不会公开谈论它。这违反了他们的服务条款。我建议改用USC webgis。几个月前,我对大约50万条记录进行了地理编码,没有太多问题。