如何使用 HTML5 地理定位查找用户所在的国家/地区?

IT技术 javascript html geolocation
2021-03-02 04:31:19

我熟悉 HTML5 地理定位,用于返回用户位置的粗略坐标。

但是,如何返回其坐标所在的国家/地区的名称?

6个回答

如果你只想要这个国家,这里有一个更简单的方法,使用ws.geonames.org而不是谷歌:

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 使用它:通过多个地理定位 webapis 延迟查找国家代码

ws.geonames.org 现在似乎已经死了
2021-04-20 04:31:19
@zloctb:是的,geonames 似乎已将其网络服务更改为现在需要注册用户名:“每个请求都需要传递参数‘用户名’。可以在此处注册您的应用程序的用户名。然后您将收到一封电子邮件,其中包含确认链接,在您确认电子邮件后,您可以在您的帐户页面上启用您的网络服务帐户
2021-04-23 04:31:19
阻止谷歌的国家的最佳答案:)
2021-04-28 04:31:19
我真的很喜欢这个答案的简单性......而且它的答案更开放;)
2021-05-11 04:31:19
错误:为每个调用添加一个用户名,以便 geonames 能够识别调用应用程序并计算信用
2021-05-16 04:31:19
    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;
}

这就是我使用的:)

请注意:“地理编码服务:您必须使用 API 密钥来验证对 Google Maps Platform API 的每个请求。有关其他信息,请参阅g.co/dev/maps-no-account
2021-04-19 04:31:19
浏览不同的类型,看看你是否能抓住你想要的。code.google.com/apis/maps/documentation/geocoding/#Types
2021-04-20 04:31:19
这几乎是完美的,但谷歌返回“英国”而不是“英格兰”或“苏格兰”等。理想情况下,它需要返回“英格兰”等,因为我正在构建的应用程序的目的是识别它们两个!:/
2021-04-25 04:31:19
只是在这里非常挑剔,但使用 '===' 而不是 '==' 来比较空值更安全。
2021-05-06 04:31:19

如果您在像我在 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);   
});
请注意,截至 2020 年,这不起作用。服务现在是优质的(尽管有一个有限的免费帐户)。
2021-04-17 04:31:19
很少行的简洁解决方案!它也不需要用户交互来找出他的位置。
2021-05-06 04:31:19
它重定向到有定价的ipstack.com
2021-05-14 04:31:19

注意你需要设置'username'属性才能使用这个api,否则你会得到错误。

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

您将需要反向地理编码器服务。