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

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

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

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

 hippietrail31 июл. 2012 г., 14:35
 beatgammit28 мая 2011 г., 03:19
Вам, вероятно, понадобится какая-то база данных. Я бы попробовал поиграть с Google Maps API самостоятельно ... он поддерживает широту / долготу.

Ответы на вопрос(13)

пытаясь найти пример кода, как это сделать в Javascript. Я не смог найти быстрый четкий ответ на вопрос, который вы разместили. Итак ... Я сделал свой собственный. Надеемся, что люди могут использовать это без необходимости копаться в API или смотреть на код, который они не знают, как читать. Ха, если ничего другого, я могу сослаться на этот пост для моего собственного материала .. Хороший вопрос и спасибо за форум обсуждения!

Это использует Google API.

<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: '/' }); 
                }
        });
    }
}
Решение Вопроса

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

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

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

 ming yeow16 июн. 2011 г., 08:30
принимая это, потому что это то, к чему я в конечном итоге и стремлюсь :) Ответ Майкла, безусловно, отличный вариант!
 Tom02 авг. 2014 г., 18:07
mapquest api - это еще один вариант, так как в некоторых случаях он не имеет ограничений скорости и очень высоких ограничений скорости для различных нужд геокодирования.
 James D09 мая 2012 г., 00:11
Обратное геокодирование Google допускается только в сочетании с картой Google. Если вы хотите решение, которое не имеет таких ограничений (хотя оно коммерческое и имеет только города США), проверьте:askgeo.com
 Petah06 окт. 2017 г., 02:41
свободно спорно, он свободен только в определенных пределах.
 user27664813 мар. 2019 г., 02:14
@JamesD:Политики API утверждает, что если вы отображаете данные на карте, то это должна быть карта Google, но вам не нужно отображать ее на карте (или вообще).

проверьте ответ ниже. Меня устраивает

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

Я использовал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

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

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

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

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

 turgos01 дек. 2015 г., 20:28
Это правильно. алгоритм ищет ближайший город, доступный в наборе данных. Для вышеперечисленного сервера я использовал "towns1000.txt". Здесь есть только крупные города. Исходный код доступен наgithub.com/turgos/Location, Вы можете начать свой собственный с более подробных данных из "download.geonames.org/export/dump».
 smartmouse25 нояб. 2015 г., 17:06
Это не работает должным образом. Если он не может получить город, он ищет ближайший известный город. Вот пример:scatter-otl.rhcloud.com/... Там написано "Бастер" вместо "Сент-Джон" ...
 smartmouse26 мар. 2016 г., 21:05
Похоже, что city1000.txt - это более подробные данные. Я прав?

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

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

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

Недостатки:

Не обновляется автоматическиТребуется дополнительный код, если вы хотите различить случай, когда ближайший город находится в десятках мильМожет дать странные результаты возле полюсов и международной линии дат (хотя в любом случае в этих местах нет городов)
 Kevin15 июн. 2011 г., 11:27
+1 за отличный источник бесплатных данных.
 mcont07 дек. 2016 г., 16:16
GeoNames также предлагает бесплатный веб-сервис, который просто потрясающий!
 Hack-R13 июл. 2016 г., 19:42
Пример был бы неоценим
 jeudyx21 июл. 2015 г., 07:15
Они также имеют REST API и выглядят довольно прилично:api.geonames.org/...
 Noel Abrahams27 июн. 2012 г., 19:56
Также даст странные результаты для городов в пределах городов, например, определенные места в Риме могут возвращать «Ватикан» - в зависимости от широты / долготы, указанной в базе данных для каждого.

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

 Matthew Wise06 июл. 2018 г., 13:42
Обратите внимание, что политика использования Nominatimoperations.osmfoundation.org/policies/nominatim устанавливает максимальную скорость одного запроса в секунду, поэтому действительно подходит только для специальных запросов.

какие технологические ограничения у вас есть.

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

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

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

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

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

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

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

Сильфон - это функция 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;
}
 August24 янв. 2017 г., 10:11
если мне нужно только административное_реализация_level_ 3 или местность (если административное_реализация_реклама 3 отсутствует), какой из них мне следует изменить? новичок в php ..

Тебе нужно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'}
 Satys25 февр. 2019 г., 08:04
Есть ли ограничения для этого? Это, кажется, самый быстрый подход. Может ли быть какая-то причина не использовать это из-за подхода @ Майкла?

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

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

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

Ваш ответ на вопрос