문제
주소, 도시, 주, 지퍼 엔티티가있는 데이터 프레임이 있습니다. 거기에서 나는 야후 API를 사용하여 각 주소를 지오 코드로 사용하려고합니다.
r 튜토리얼을 사용하여 O'Reilly의 데이터 매시업에서 코드를 기반으로합니다. 원래 예제는 거리 주소의 벡터를 취하고 하드 코딩 된 도시를 사용합니다. 나는 여러 도시를 지원하는 역동적 인 예를 만들려고 노력하고 있습니다.
코드의 약식 버전은 다음과 같습니다.
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를 모두 저장합니다.
해결책
만약에 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)
}
다른 팁
당신이 이것을하려고한다면, 나는 그것에 대해 공개적으로 이야기하지 않을 것입니다. 서비스 약관에 위배됩니다. 사용하는 것이 좋습니다 USC Webgis 대신에. 몇 달 전에 나는 너무 많은 문제없이 약 50 만 개의 기록을 지구 코딩했습니다.
제휴하지 않습니다 StackOverflow