2012-12-16 30 views

risposta

14

Con questo codice che ho risolto con successo il problema.

library(RJSONIO) 
nrow <- nrow(test) 
counter <- 1 
test$lon[counter] <- 0 
test$lat[counter] <- 0 
while (counter <= nrow){ 
    CityName <- gsub(' ','%20',test$CityLong[counter]) #remove space for URLs 
    CountryCode <- test$Country[counter] 
    url <- paste(
    "http://nominatim.openstreetmap.org/search?city=" 
    , CityName 
    , "&countrycodes=" 
    , CountryCode 
    , "&limit=9&format=json" 
    , sep="") 
    x <- fromJSON(url) 
    if(is.vector(x)){ 
    test$lon[counter] <- x[[1]]$lon 
    test$lat[counter] <- x[[1]]$lat  
    } 
    counter <- counter + 1 
} 

Poiché questo sta chiamando un servizio esterno (openstreetmaps.org) può richiedere del tempo per set di dati più grandi. Tuttavia, probabilmente lo fai solo una volta ogni tanto quando nuove città sono state aggiunte alla lista.

+0

Puoi farlo anche con GNsearch dal mio pacchetto geonames: chiama il servizio web geonames.org che condivide molti dei suoi dati con il servizio Nominatim di OpenStreetMap. – Spacedman

+0

@Jochem Come posso fare il contrario? Ho latitudine e longitudine e ho bisogno di trovare nomi di città e paesi usando la strada aperta attraverso il formato JSON come hai fatto sopra? –

11

Alcune altre opzioni per voi.

ggmaps

ggmaps ha una funzione geocode che usa Google Maps per geocoding. Questo ti limita a 2.500 al giorno.

taRifx.geo

ultima versione di taRifx.geo ha una funzione geocode che utilizza sia Google o Bing Maps per geocoding. La versione di Bing richiede l'utilizzo di un account Bing (gratuito), ma in cambio è possibile geocodificare in modo più voci. Caratteristiche di questa versione:

  • scelta servizio (Bing Maps e Google entrambi supportati)
  • Log-in di sostegno (in particolare per Bing, che richiede una chiave di conto, ma in cambio consente per un ordine di grandezza richieste più quotidiane)
  • Geocode un'intera data.frame alla volta, compresi alcuni risparmio di tempo come ignorare le righe già geocodificate
  • Robust geocoding batch (in modo che qualsiasi errore non causa vale dell'intero data.frame di geocoding da perdere, per lavori più grandi)
  • Route find ING (tempi di viaggio dal punto A al punto B)
6

Prova questo penso che sarà meglio soluzione per questo problema

> library(ggmap) 
 
Loading required package: ggplot2 
 
Google Maps API Terms of Service: http://developers.google.com/maps/terms. 
 
Please cite ggmap if you use it: see citation('ggmap') for details. 
 

 
#Now you can give city name or country name individually 
 

 
> geocode("hamburg") 
 
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=hamburg&sensor=false 
 
     lon  lat 
 
1 9.993682 53.55108 
 

 
geocode("amsterdam") 
 
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=amsterdam&sensor=false 
 
     lon  lat 
 
1 4.895168 52.37022 
 

 
> geocode("new york") 
 
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=new+york&sensor=false 
 
     lon  lat 
 
1 -74.00594 40.71278

0

Try This ...

function geocodeAddress(geocoder, resultsMap) { 
    var address = document.getElementById('address').value; 
    geocoder.geocode({'address': address}, function(results, status) { 
     if (status === 'OK') { 
     resultsMap.setCenter(results[0].geometry.location); 
     var marker = new google.maps.Marker({ 
      map: resultsMap, 
      position: results[0].geometry.location, 
      draggable:true 
     }); 
     var infowindow = new google.maps.InfoWindow({ 
      content: "Please drag this marker to your position.." 
      }); 
      infowindow.open(resultsMap,marker); 
     document.getElementById('lat').value=marker.getPosition().lat(); 
     document.getElementById('lng').value=marker.getPosition().lng(); 
     marker.addListener('drag', handleEvent); 
marker.addListener('dragend', handleEvent); 
     } else { 
     alert('Geocode was not successful for the following reason: ' + status); 
     } 
    }); 
    } 

get full code from here..

Problemi correlati