我有一个数据框有地址、城市、国家、邮实体。从那里,我试图使用雅虎的Api进行地理编码的每个地址。

我是基于这一关代码在O'reilly的数据混合使用R教程。原来如需要一矢量的街道地址和使用硬编码的城市。我在尝试做一个动态的例子支持多个城市。

缩写版本的代码是:

    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$城市和myStreet$Address,我收到一个错误

$ operator is invalid for atomic vectors

除循环,通过数据框架myStreets,我不知道我可以打电话给雅虎API只有一次对每个行和存储的长/纬度为每一个构件。

有帮助吗?

解决方案

如果 myStreets 是的数据。框架然后 for 循环需要每个柱。所以第一步需要地址和地址$城市没有意义。

你可以改变 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)
}

其他提示

如果你要这样做,我不会谈论它在公众面前。这是对他们的服务条款。我建议使用 南加州大学的一种方式来发现 代替。几个月前我的地理编码的一半左右有一百万个记录的没有太多的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top