Как получить координаты долготы и широты из названия города и страны в R?

У меня есть длинный список названий городов и стран, и я хотел бы нанести их на карту. Для этого мне нужна информация о долготе и широте каждого из городов.

Моя таблица называется test и имеет следующую структуру:

Cityname  CountryCode
New York  US
Hamburg   DE
Amsterdam NL

4 ответа

Решение

С помощью следующего кода я успешно решил проблему.

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
}

Поскольку это вызов внешнего сервиса (openstreetmaps.org), для больших наборов данных может потребоваться некоторое время. Однако вы, вероятно, делаете это только время от времени, когда новые города добавляются в список.

Несколько других вариантов для вас.

ggmaps

у ggmaps есть функция geocode который использует Google Maps для геокодирования. Это ограничивает вас до 2500 в день.

taRifx.geo

Последняя версия taRifx.geo имеет geocode функция, которая использует Google или Bing Maps для геокодирования. Версия Bing требует, чтобы вы использовали (бесплатную) учетную запись Bing, но взамен вы можете геокодировать больше записей. Особенности в этой версии:

  • Выбор службы (поддерживается Bing и Google Maps)
  • Поддержка входа в систему (особенно для Bing, который требует ключ учетной записи, но в обмен позволяет на порядок больше ежедневных запросов)
  • Геокодирование всего data.frame за один раз, включая некоторые экономящие время, такие как игнорирование любых строк, которые уже были геокодированы
  • Надежное пакетное геокодирование (чтобы любая ошибка не приводила к потере всей ценности геокодирования data.frame для больших заданий)
  • Поиск маршрута (время в пути из пункта А в пункт Б)

Попробуйте это, я думаю, что это будет лучшее решение для этой проблемы

> 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

Попробуй это...

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

получить полный код отсюда..

Другие вопросы по тегам