I have a long list of city names and countries and I would like to plot them on a map. In order to do this I need the longitude and latitude information of each of the cities.
My table is called test
and has the following structure:
Cityname CountryCode
New York US
Hamburg DE
Amsterdam NL
Yes, you can use google maps to find the country for given latitudes and longitudes. Use the reverse geocoding service. You can get the country, city, zip code and the complete address from the response you get from the server.
A few other options for you.
ggmaps
ggmaps has a function geocode
which uses Google Maps to geocode. This limits you to 2,500 per day.
taRifx.geo
taRifx.geo's latest version has a geocode
function which uses either Google or Bing Maps to geocode. The Bing version requires you to use a (free) Bing account, but in return you can geocode way more entries. Features in this version:
With the following code I have successfully solved the problem.
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
}
As this is calling an external service (openstreetmaps.org) it can take a while for larger datasets. However, you probably only do this once in a while when new cities have been added to the list.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With