Как получить координаты долготы и широты из названия города и страны в 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);
}
});
}