Название страны для координат GPS
Есть ли простой способ узнать название страны, на территории которой находится данный пункт?
Меня не слишком заботит точность и неясности политических споров. Просто нужно достаточно хорошее приближение.
7 ответов
РЕДАКТИРОВАТЬ: Yahoo, где API больше не доступен.
Попробуйте Yahoo! API.
Широта и долгота
Широта и долгота могут быть указаны для параметра местоположения. Широта и долгота могут быть выражены в десятичных градусах или градусах-минутах-секундах с указанием направления вперед или конца или ведущих знаков. Если указаны направления, долгота может появиться перед широтой. Если направления не указаны, долгота может появиться перед широтой, если она находится вне диапазона от -90 до 90. В противном случае широта должна появляться первой. Знаки пунктуации (запятые, градусы, минуты, секунды) игнорируются.
Examples:
•50.3 -120.5
•50.3, -120.5
•-120.5 50.3
•50.3 N 120.5 W
•120.5 W 50.3 N
•50 18 0 -120 30 0
•50 18 0 N 120 30 0 W
•50° 18' 0" N 120° 30' 0" W
Элемент ответа даст вам страну, а также многие другие элементы.
Не забудьте отправить в качестве параметра gflags=R, чтобы сделать обратное геокодирование. Если вы хотите вывод в json, отправьте также параметр flags=J.
Как насчет использования сервиса обратной геокодировки Google?
Просто для справки, у geonames.org также есть хороший веб-сервис, но он ограничен по скорости (что было проблемой в моем случае, так как мне пришлось искать большую группу координат).
Пример: http://ws.geonames.org/findNearbyPlaceName?lat=47.3&lng=9
Вот некоторый код JavaScript, чтобы получить название страны из координат широты и долготы:
Использование сервисов геокодирования Google [jsfiddle]:
var lookupCountryWithGoogle = function (lat, lng) {var latlng = new google.maps.LatLng (lat, lng);
var geoCoder = new google.maps.Geocoder(); geoCoder.geocode({ location: latlng }, function(results, statusCode) { var lastResult = results.slice(-1)[0]; if (statusCode == 'OK' && lastResult && 'address_components' in lastResult) { alert('coordinates: ' + lat + ', ' + lng + '\n' + 'country: ' + lastResult.address_components.slice(-1)[0].long_name); } else { alert('coordinates: ' + lat + ', ' + lng + '\n' + 'failed: ' + statusCode); } });
};
lookupCountryWithGoogle (43.7534932, 28.5743187); // удастся выполнить lookupCountryWithGoogle(142, 124); // не удастся
(Вам нужно загрузить поддержку JavaScript Google для этого с URL-адреса, такого как maps.google.com/maps/api/js?sensor=false&fake=.js
)
С помощью
ws.geonames.org
[jsfiddle]:var lookupCountryWithGeonames = function (lat, lng) {
$.getJSON('http://ws.geonames.org/countryCode', { lat: lat, lng: lng, type: 'JSON' }, function(results) { if (results.countryCode) { alert('coordinates: ' + lat + ', ' + lng + '\n' + 'country: ' + results.countryName); } else { alert('coordinates: ' + lat + ', ' + lng + '\n' + 'failed: ' + results.status.value + ' ' + results.status.message); } });
};
lookupCountryWithGeonames (43.7534932, 28.5743187); // преуспеет
lookupCountryWithGeonames(142, 124); // потерпит неудачу
Вы также можете посмотреть на сервисы tinygeocoder.
Другой альтернативой является загрузка карт стран из естественной земли (или другого источника). Используя Geotools, вы можете искать, находится ли точка внутри одной из стран.
API Geonames немного изменился. Подробнее здесь: https://www.geonames.org/export/web-services.html
Рабочий пример с этой страницы:
curl "http://api.geonames.org/countryCode?lat=47.03&lng=10.2&username=demo"
Текущие ответы основаны на онлайн-API, которые могут меняться, ограничивать запросы, устаревать и т. д.
Для повторяющихся и/или многочисленных поисков быстрый и простой способ — загрузить фигуры стран в формате SHP ( Natural Earth кажется признанным источником, вы можете впоследствии отфильтровать страны, если вас интересует только определенный регион) и проверить если точка находится внутри границ.
Этот ответ может помочь настроить это с помощью Python.