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


например, если у нас есть эти координаты

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

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

12 112

12 ответов:

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

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

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

другой вариант:

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

плюсы:

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

недостатки:

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

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

Я искал аналогичную функциональность, и я увидел данные"http://download.geonames.org/export/dump/ " поделился более ранним ответом (спасибо за обмен, это отличный источник) и реализовал сервис на основе cities1000.данных txt.

вы можете видеть, что он работает на http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 (битая ссылка) Просто измените широту и долготы для вашего местоположения.

он развернут на OpenShift (платформа RedHat). Первый вызов после длительного простоя может занять некоторое время, но обычно производительность удовлетворительна. Не стесняйтесь использовать эту услугу, как вам нравится...

кроме того, вы можете найти источник проекта по адресу https://github.com/turgos/Location.

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

Я потратил около 30 минут пытался найти пример кода как это сделать в JavaScript. Я не смог найти быстрый четкий ответ на вопрос, который вы выложили. Так... Я сделал свой собственный. Надеюсь, люди могут использовать это без необходимости копаться в 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: '/' }); 
                }
        });
    }
}

я использовал геокодер, хорошая библиотека 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

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

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

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

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

вы можете использовать Google Geocoding API

Ниже приведена функция 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;
}

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

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

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

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

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

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