Подтвердить что ты не робот

Учитывая координаты lat/long, как мы можем узнать город/страну?

Например, если у нас есть такой набор координат

"latitude": 48.858844300000001,
"longitude": 2.2943506,

Как мы можем узнать город/страну?

4b9b3361

Ответ 1

Бесплатный API Google Geocoding предоставляет эту услугу через HTTP REST API. Обратите внимание, что API ограничен в использовании и скорости, но вы можете платить за неограниченный доступ.

Попробуйте эту ссылку, чтобы увидеть пример вывода (это в json, вывод также доступен в XML)

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true

Ответ 2

Другая опция:

  • Загрузите базу данных городов из http://download.geonames.org/export/dump/
  • Добавьте каждый город в виде отображения в формате lat/long → City в пространственный индекс, такой как R-Tree (некоторые БД также имеют функциональность)
  • Используйте поиск ближайших соседей, чтобы найти ближайший город для любой точки.

Преимущества:

  • Не зависит от доступности внешнего сервера.
  • Очень быстро (легко выполняет тысячи запросов в секунду)

Недостатки:

  • Не обновляется автоматически
  • Требуется дополнительный код, если вы хотите отличить случай, когда ближайший город находится за десятки миль.
  • Может дать странные результаты вблизи полюсов и международной линии дат (хотя в любом случае в этих местах нет ни одного города

Ответ 3

Вам нужно 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'}

Ответ 4

Я искал похожую функциональность и увидел, что данные " 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.

Ответ 5

Альтернативой Open Source является Nominatim с Open Street Map. Все, что вам нужно сделать, это установить переменные в URL-адресе и вернуть город/страну этого местоположения. Пожалуйста, ознакомьтесь со следующей ссылкой для официальной документации: Nominatim

Ответ 6

Я потратил около 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: '/' }); 
                }
        });
    }
}

Ответ 7

Я использовал Geocoder, хорошую библиотеку Python, которая поддерживает несколько провайдеров, включая Google, Geonames и OpenStreetMaps, чтобы упомянуть лишь некоторые. Я пытался использовать библиотеку GeoPy, и она часто получает таймауты. Разработка собственного кода для GeoNames - не лучшее использование вашего времени, и вы можете получить нестабильный код. Geocoder очень прост в использовании и имеет достаточно хорошую документацию. Ниже приведен пример кода для поиска города по широте и долготе или по поиску широты/долготы по названию города.

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

Ответ 8

Это действительно зависит от того, какие у вас есть технологии.

Один из способов состоит в том, чтобы иметь пространственную базу данных с набросками стран и городов, в которых вы заинтересованы. По контуру я имею в виду, что страны и города хранятся как многоугольник пространственного типа. Ваш набор координат можно преобразовать в точку пространственного типа и запросить против полигонов, чтобы получить название страны/города, где находится точка.

Вот некоторые из баз данных, которые поддерживают пространственный тип: SQL Server 2008, MySQL, postGIS - расширение postgreSQL и Oracle.

Если вы хотите использовать услугу вместо своей собственной базы данных, вы можете использовать Yahoo GeoPlanet. Для сервисного подхода вы можете проверить этот ответ на gis.stackexchange.com, который охватывает доступность услуг для решения вашей проблемы.

Ответ 9

Я знаю, что этот вопрос действительно старый, но я работал над одной и той же проблемой, и я нашел чрезвычайно эффективный и удобный пакет reverse_geocoder, созданный Ajay Thampi. Код доступен здесь. Это основано на параллельной реализации деревьев K-D, которая чрезвычайно эффективна для большого количества точек (мне потребовалось несколько секунд, чтобы получить 100 000 очков.

Он основан на этой базе данных, уже выделенной @turgos.

Если ваша задача - быстро найти страну и город списка координат, это отличный инструмент.

Ответ 10

Вы можете использовать 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;
}

Ответ 11

Пожалуйста, проверьте приведенный ниже ответ. Это работает для меня

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

Ответ 12

Если вы используете API Google Адресов, вы можете получить страну и город от объекта места с помощью 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;
  }
}

Ответ 13

Loc2country - это инструмент на основе Golang, который возвращает код страны ISO альфа-3 для заданных координат местоположения (широта/долгота). Он отвечает в микросекундах. Он использует геохэш к карте страны.

Данные геохеша генерируются с помощью геораптора.

Мы используем геохэш на уровне 6 для этого инструмента, то есть ящики размером 1,2 км х 600 м.