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

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

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

Cityname  CountryCode
New York  US
Hamburg   DE
Amsterdam NL

Ответ 1

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

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), для больших наборов данных может потребоваться некоторое время. Однако вы, вероятно, делаете это только время от времени, когда в список добавляются новые города.

Ответ 2

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

ggmaps

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

taRifx.geo

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

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

Ответ 3

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

> 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

Ответ 4

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

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

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