【发布时间】:2011-10-08 12:52:36
【问题描述】:
我熟悉用于返回用户位置粗略坐标的 HTML5 地理位置。
但是,我怎样才能返回他们坐标所在国家的名称?
【问题讨论】:
-
地理位置不是 HTML5 的一部分:isgeolocationpartofhtml5.com
标签: javascript html geolocation
我熟悉用于返回用户位置粗略坐标的 HTML5 地理位置。
但是,我怎样才能返回他们坐标所在国家的名称?
【问题讨论】:
标签: javascript html geolocation
如果您无法像我在 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);
});
【讨论】:
注意你需要设置'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);
【讨论】:
来自@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)
}
})
}
【讨论】:
如果您只想要国家/地区,这里有一个更简单的方法,使用 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 随意使用它:Deferred look up country code via multiple geolocation webapis
【讨论】:
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;
}
这是我用的:)
【讨论】:
您需要Reverse Geocoder 服务。
【讨论】: