Например, если у нас есть этот набор координат
"latitude": 48.858844300000001,
"longitude": 2.2943506,
Как узнать город / страну?
Например, если у нас есть этот набор координат
"latitude": 48.858844300000001,
"longitude": 2.2943506,
Как узнать город / страну?
Бесплатный Google Geocoding API предоставляет эту услугу через HTTP REST API. Обратите внимание, что API ограничены по использованию и скорости, но вы можете заплатить для неограниченного доступа.
Попробуйте эту ссылку, чтобы увидеть пример вывода (это в json, вывод также доступен в XML)
http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true
Другой вариант:
Преимущества:
Недостатки:
Вам нужно geopy
pip install geopy
а потом:
from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.reverse("48.8588443, 2.2943506")
print(location.address)
чтобы получить дополнительную информацию:
print (location.raw)
{'place_id': '24066644', 'osm_id': '2387784956', 'lat': '41.442115', 'lon': '-8.2939909', 'boundingbox': ['41.442015', '41.442215', '-8.2940909', '-8.2938909'], 'address': {'country': 'Portugal', 'suburb': 'Oliveira do Castelo', 'house_number': '99', 'city_district': 'Oliveira do Castelo', 'country_code': 'pt', 'city': 'Oliveira, São Paio e São Sebastião', 'state': 'Norte', 'state_district': 'Ave', 'pedestrian': 'Rua Doutor Avelino Germano', 'postcode': '4800-443', 'county': 'Guimarães'}, 'osm_type': 'node', 'display_name': '99, Rua Doutor Avelino Germano, Oliveira do Castelo, Oliveira, São Paio e São Sebastião, Guimarães, Braga, Ave, Norte, 4800-443, Portugal', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'}
Альтернативой с открытым исходным кодом является Nominatim от Open Street Map. Все, что вам нужно сделать, это установить переменные в URL-адресе, и он вернет город / страну этого местоположения. Официальную документацию можно найти по следующей ссылке: Nominatim
Я искал аналогичную функциональность и увидел данные "http://download.geonames.org/export/dump/ "поделился ранее полученным ответом (спасибо, что поделились, это отличный источник) и реализовал службу на основе данных city1000.txt.
Вы можете увидеть его работающим по адресу http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 (неработающая ссылка) Просто измените широту и долгота для вашего местоположения.
Развернут на OpenShift (платформа RedHat). Первый вызов после длительного периода бездействия может занять некоторое время, но обычно производительность удовлетворительная. Не стесняйтесь использовать эту услугу как хотите ...
Кроме того, вы можете найти исходный код проекта по адресу https://github.com/turgos/Location.
Я использовал Geocoder, хорошую библиотеку Python, которая поддерживает несколько поставщиков, включая Google, Geonames и OpenStreetMaps, чтобы упомянуть лишь несколько. Я пробовал использовать библиотеку GeoPy, и она часто дает таймауты. Разработка собственного кода для GeoNames - не лучшее использование вашего времени, и вы можете получить нестабильный код. По моему опыту, геокодер очень прост в использовании и содержит достаточно хорошую документацию. Ниже приведен пример кода для поиска города по широте и долготе или поиска широты / долготы по названию города.
import geocoder
g = geocoder.osm([53.5343609, -113.5065084], method='reverse')
print g.json['city'] # Prints Edmonton
g = geocoder.osm('Edmonton, Canada')
print g.json['lat'], g.json['lng'] # Prints 53.5343609, -113.5065084
geocoder
, то и сам хочу попробовать!
- person Hamman Samuel; 24.01.2020
Я знаю, что этот вопрос действительно старый, но я работал над той же проблемой и нашел чрезвычайно эффективный и удобный пакет reverse_geocoder
, созданный Аджаем Темпи. Код доступен здесь. Он основан на распараллеленной реализации деревьев K-D, которая чрезвычайно эффективна для большого количества точек (мне потребовалось несколько секунд, чтобы получить 100000 точек.
Он основан на этой базе данных, уже выделенной @turgos.
Если ваша задача - быстро найти страну и город по списку координат, это отличный инструмент.
Я потратил около 30 минут, пытаясь найти пример кода, как это сделать в Javascript. Я не смог найти четкого ответа на заданный вами вопрос. Итак ... Я сделал свой собственный. Надеюсь, люди смогут использовать это, не копаясь в API или не глядя на код, который они не знают, как читать. Ха, если уж на то пошло, я могу сослаться на этот пост для своего собственного материала .. Хороший вопрос и спасибо за обсуждение на форуме!
Это использует API Google.
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=<YOURGOOGLEKEY>&sensor=false&v=3&libraries=geometry"></script>
.
//CHECK IF BROWSER HAS HTML5 GEO LOCATION
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
//GET USER CURRENT LOCATION
var locCurrent = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
//CHECK IF THE USERS GEOLOCATION IS IN AUSTRALIA
var geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'latLng': locCurrent }, function (results, status) {
var locItemCount = results.length;
var locCountryNameCount = locItemCount - 1;
var locCountryName = results[locCountryNameCount].formatted_address;
if (locCountryName == "Australia") {
//SET COOKIE FOR GIVING
jQuery.cookie('locCountry', locCountryName, { expires: 30, path: '/' });
}
});
}
}
Это действительно зависит от того, какие технологические ограничения у вас есть.
Один из способов - иметь пространственную базу данных с контуром интересующих вас стран и городов. Под контуром я подразумеваю, что страны и города хранятся в виде многоугольника пространственного типа. Ваш набор координат можно преобразовать в точку пространственного типа и запросить у полигонов, чтобы получить название страны / города, в котором расположена точка.
Вот некоторые из баз данных, которые поддерживают пространственный тип: SQL Server 2008, MySQL, postGIS - расширение postgreSQL и Oracle.
Если вы хотите использовать службу вместо собственной базы данных, вы можете использовать GeoPlanet < / а>. Что касается сервисного подхода, вы можете проверить этот ответ на gis.stackexchange.com, где описывается доступность услуг для решения вашей проблемы.
Вы можете использовать API геокодирования Google
Bellow - это функция php, которая возвращает адрес, город, штат и страну.
public function get_location($latitude='', $longitude='')
{
$geolocation = $latitude.','.$longitude;
$request = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.$geolocation.'&sensor=false';
$file_contents = file_get_contents($request);
$json_decode = json_decode($file_contents);
if(isset($json_decode->results[0])) {
$response = array();
foreach($json_decode->results[0]->address_components as $addressComponet) {
if(in_array('political', $addressComponet->types)) {
$response[] = $addressComponet->long_name;
}
}
if(isset($response[0])){ $first = $response[0]; } else { $first = 'null'; }
if(isset($response[1])){ $second = $response[1]; } else { $second = 'null'; }
if(isset($response[2])){ $third = $response[2]; } else { $third = 'null'; }
if(isset($response[3])){ $fourth = $response[3]; } else { $fourth = 'null'; }
if(isset($response[4])){ $fifth = $response[4]; } else { $fifth = 'null'; }
$loc['address']=''; $loc['city']=''; $loc['state']=''; $loc['country']='';
if( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth != 'null' ) {
$loc['address'] = $first;
$loc['city'] = $second;
$loc['state'] = $fourth;
$loc['country'] = $fifth;
}
else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth == 'null' ) {
$loc['address'] = $first;
$loc['city'] = $second;
$loc['state'] = $third;
$loc['country'] = $fourth;
}
else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth == 'null' && $fifth == 'null' ) {
$loc['city'] = $first;
$loc['state'] = $second;
$loc['country'] = $third;
}
else if ( $first != 'null' && $second != 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null' ) {
$loc['state'] = $first;
$loc['country'] = $second;
}
else if ( $first != 'null' && $second == 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null' ) {
$loc['country'] = $first;
}
}
return $loc;
}
Если вы используете Google Places API, вот как вы можете получить страну и город из объекта места с помощью Javascript:
function getCityAndCountry(location) {
var components = {};
for(var i = 0; i < location.address_components.length; i++) {
components[location.address_components[i].types[0]] = location.address_components[i].long_name;
}
if(!components['country']) {
console.warn('Couldn\'t extract country');
return false;
}
if(components['locality']) {
return [components['locality'], components['country']];
} else if(components['administrative_area_level_1']) {
return [components['administrative_area_level_1'], components['country']];
} else {
console.warn('Couldn\'t extract city');
return false;
}
}
Loc2country - это инструмент на основе Golang, который возвращает код страны ISO alpha-3 для заданных координат местоположения (широта / лон). Он отвечает за микросекунды. Он использует геохеш для карты страны.
Данные геохеша генерируются с помощью georaptor.
Мы используем геохеш на уровне 6 для этого инструмента, то есть коробки размером 1,2 км x 600 м.
Пожалуйста, проверьте ответ ниже. Меня устраивает
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position){
initialize(position.coords.latitude,position.coords.longitude);
});
}
function initialize(lat,lng) {
//directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
//directionsService = new google.maps.DirectionsService();
var latlng = new google.maps.LatLng(lat, lng);
//alert(latlng);
getLocation(latlng);
}
function getLocation(latlng){
var geocoder = new google.maps.Geocoder();
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[0]) {
var loc = getCountry(results);
alert("location is::"+loc);
}
}
});
}
function getCountry(results)
{
for (var i = 0; i < results[0].address_components.length; i++)
{
var shortname = results[0].address_components[i].short_name;
var longname = results[0].address_components[i].long_name;
var type = results[0].address_components[i].types;
if (type.indexOf("country") != -1)
{
if (!isNullOrWhitespace(shortname))
{
return shortname;
}
else
{
return longname;
}
}
}
}
function isNullOrWhitespace(text) {
if (text == null) {
return true;
}
return text.replace(/\s/gi, '').length < 1;
}
Сведите к минимуму количество библиотек.
Получите ключ для использования api на своем веб-сайте и просто получите результат в http-запросе:
curl -i -H "key: YOUR_KEY" -X GET https://api.latlong.dev/lookup?lat=38.7447913&long=-9.1625173