Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the longitude and latitude coordinates from a city name and country in R?

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
like image 257
Jochem Avatar asked Dec 16 '12 20:12

Jochem


People also ask

How do I find the latitude and longitude of a country?

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.


2 Answers

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:

  • Service choice (Bing and Google Maps both supported)
  • Log-in support (particularly for Bing, which requires an account key but in exchange allows for an order of magnitude more daily requests)
  • Geocode a whole data.frame at a time, including some time-savers like ignoring any rows which have already been geocoded
  • Robust batch geocoding (so that any error does not cause the whole data.frame's worth of geocoding to be lost, for bigger jobs)
  • Route finding (travel times from point A to point B)
like image 126
Ari B. Friedman Avatar answered Oct 08 '22 08:10

Ari B. Friedman


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.

like image 17
Jochem Avatar answered Oct 08 '22 09:10

Jochem