Domanda

Ho un dataframe con indirizzo, città, stato, enti Zip. Da lì, sto cercando di utilizzare le API di Yahoo il geocoding ogni indirizzo.

sto basando questa via il codice di dati mashup di O'Reilly usando R Tutorial. L'esempio originale prende un vettore di indirizzi stradali e utilizza una città hard-coded. Sto cercando di fare un esempio dinamico che supporta più le città.

La versione abbreviata del codice è:

    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))
          }
    }

Quando provo e riferimento myStreet $ City e myStreet $ Indirizzo, ricevo un errore

$ operator is invalid for atomic vectors

Oltre scorrendo myStreets struttura dati, non so come posso fare la chiamata alla API Yahoo sola volta per ogni riga e immagazzinare lungo / LAT per ciascun utente.

È stato utile?

Soluzione

Se myStreets è data.frame ciclo quindi for prende ogni colonna di esso. Quindi primo passo prende Addres e Addres $ Città non ha senso.

Si potrebbe cambiare condizione for al ciclo sopra le righe:

for (i in 1:nrow(myStreets))  {
   myStreet <- myStreets[i,]
   # rest is the same
}

Per ottimizzato il codice è possibile anche fare qualcosa di simile:

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)
}

Altri suggerimenti

Se avete intenzione di fare questo, non vorrei parlarne in pubblico. E 'contro i loro termini di servizio. Io suggerirei di utilizzare USC WebGIS . Un paio di mesi fa ho geocoding circa mezzo milione di record senza troppi problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top