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