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

Как я могу найти страну-пользователя, использующую геолокацию HTML5?

Я знаком с геолокацией HTML5 для возвращения грубых координат местоположения пользователей.

Однако, как я могу вернуть название страны, в которой находятся их координаты?

4b9b3361

Ответ 1

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'latLng': <YOURLATLNGRESPONSEFROMGEO>}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    var loc = getCountry(results);
                }
            }
        });

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

Это то, что я использую:)

Ответ 2

Если вы просто хотите страну, здесь гораздо проще использовать ws.geonames.org, а не Google:

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
        $.getJSON('http://ws.geonames.org/countryCode', {
            lat: position.coords.latitude,
            lng: position.coords.longitude,
            type: 'JSON'
        }, function(result) {
            alert(result.countryName);
        });
    });
}​

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


Кстати, я сделал несколько экспериментов, используя все бесплатные службы геокодирования, которые я мог найти. Он возвращает страну и имя службы, которая отвечает, как только один из них найдет приемлемый результат.

Не стесняйтесь играть с ним через JSFiddle: Отложенный поиск кода страны через несколько веб-сайтов геолокации

Ответ 3

Если у вас возникли проблемы с работой геолокации, как в Chrome, тогда я могу порекомендовать этот альтернативный способ (пример с jQuery):

$.getJSON("https://freegeoip.net/json/", function(data) {
    const countryCode = data.country_code;
    const countryName = data.country_name;
    const ip = data.ip;
    const timezone = data.time_zone;
    const latitude = data.latitude;
    const longitude = data.longitude;

    alert("Country Code: " + countryCode);
    alert("Country Name: " + countryName);
    alert("IP: " + ip); 
    alert("Time Zone: " + timezone);
    alert("Latitude: " + latitude);
    alert("Longitude: " + longitude);   
});

Ответ 4

Обратите внимание, что для использования этого api вам нужно установить свойство "username", иначе вы получите сообщение об ошибке.

setTimeout(function() {
                if (navigator.geolocation) {
                    navigator.geolocation.getCurrentPosition(function(position) {
                        $.getJSON('http://api.geonames.org/countryCode', {
                            lat : position.coords.latitude,
                            lng : position.coords.longitude,
                            type : 'JSON',
                            username : 'demo'
                        }, function(result) {
                            alert(result.countryName);
                        });
                    });
                }

            }, 1000);

Ответ 6

Подобный ответ, как с @hippietrail, но с другой услугой без регистрации.

if ( navigator.geolocation ) {
  navigator.geolocation.getCurrentPosition(function(position) {

  $.ajax('http://www.datasciencetoolkit.org/coordinates2politics/'
    + position.coords.latitude + ','
    + position.coords.longitude, {dataType: 'jsonp'})
  .done(function(data, textStatus, jqXHR) {
    if ( textStatus === 'success' ) {
      var country = data[0].politics[0].name
      alert(country)
    }
  })
}