我正在尝试扩展原生地理位置功能
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
});
}
这样我就可以使用访问者的国家名称(也许会返回一个信息数组)。
到目前为止,所有我能找到的功能都显示了谷歌地图界面,但没有一个实际上给出了我想要的东西,除了this library效果很好in this example但由于某种原因没有'在我的电脑上工作。我不确定那里为什么会出错。
无论如何,你知道如何从纬度和经度值中简单地返回一个包含国家,城市等信息的数组吗?
答案 0 :(得分:172)
您可以使用我的服务http://ipinfo.io。它将为您提供客户端IP,主机名,地理位置信息(城市,地区,国家,地区代码,邮政编码等)和网络所有者。这是一个记录城市和国家的简单示例:
$.get("https://ipinfo.io", function(response) {
console.log(response.city, response.country);
}, "jsonp");
这是一个更详细的JSFiddle示例,它还打印出完整的响应信息,因此您可以看到所有可用的详细信息:http://jsfiddle.net/zK5FN/2/
该位置通常不如原生地理位置详细信息准确,但不需要任何用户权限。
答案 1 :(得分:30)
如果您只需要他们的国家/地区,则无需找到该用户。您可以在任何IP到位置服务(例如maxmind)中查找其IP地址。这在大多数情况下都是准确的。
如果您确实需要获取其位置,则可以使用该方法获取其lat / lng,然后查询Google's或Yahoo's反向地理编码服务。
答案 2 :(得分:20)
您可以使用您的IP地址来获取“国家/地区”,“城市”,“isp”等... 只需使用一个为您提供简单api的Web服务,http://ip-api.com就可以在http://ip-api.com/json为您提供JSON服务。简单地发送一个Ajax(或Xhr)请求,然后解析JSON以获取您需要的任何数据。
var requestUrl = "http://ip-api.com/json";
$.ajax({
url: requestUrl,
type: 'GET',
success: function(json)
{
console.log("My country is: " + json.country);
},
error: function(err)
{
console.log("Request failed, error= " + err);
}
});
答案 3 :(得分:11)
请参阅ipdata.co我构建的服务速度快且性能可靠,因为有10个全局端点,每个端点每秒能够处理> 10,000个请求!
这个答案使用了'测试' API密钥非常有限,仅用于测试几个调用。 Signup用于您自己的免费API密钥,每天最多可获得1500个请求以进行开发。
此代码段将返回当前 ip的详细信息。要查找其他IP地址,只需将ip附加到https://api.ipdata.co?api-key=test url,例如
https://api.ipdata.co/1.1.1.1?api-key=test
API还提供is_eu
字段,指示用户是否在欧盟国家/地区。
$.get("https://api.ipdata.co?api-key=test", function (response) {
$("#response").html(JSON.stringify(response, null, 4));
}, "jsonp");

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="response"></pre>
&#13;
这是小提琴; https://jsfiddle.net/ipdata/6wtf0q4g/922/
我还写了this对8个最佳IP地理位置API的详细分析。
答案 4 :(得分:9)
ws.geonames.org
提供了一项非常易于使用的服务。这是一个示例网址:
http://ws.geonames.org/countryCode?lat=43.7534932&lng=28.5743187&type=JSON
这是我在代码中添加的一些(jQuery)代码:
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('Country: ' + result.countryName + '\n' + 'Code: ' + result.countryCode);
});
});
}
答案 5 :(得分:8)
您无法通过IP获取城市位置。 在这里你可以通过jquery获得国家:
$.get("http://ip-api.com/json", function(response) {
console.log(response.country);}, "jsonp");
答案 6 :(得分:3)
Webtechriser (click here to read the article)(称为wipmania)提供免费且易于使用的服务。这是一个 JSONP 服务,需要使用 HTML 进行简单的 javascript 编码。它也可以在 JQuery 中使用。我稍微修改了代码以更改输出格式,这是我已经使用并发现它的工作原理:(它是我的HTML页面的代码)
<html>
<body>
<p id="loc"></p>
<script type="text/javascript">
var a = document.getElementById("loc");
function jsonpCallback(data) {
a.innerHTML = "Latitude: " + data.latitude +
"<br/>Longitude: " + data.longitude +
"<br/>Country: " + data.address.country;
}
</script>
<script src="http://api.wipmania.com/jsonp?callback=jsonpCallback"
type="text/javascript"></script>
</body>
</html>
&#13;
请注意:与 HTML 5地理定位API不同,此服务会获取访问者的位置,而不会提示访问者选择是否共享其位置/ strong>(您编写的代码)。因此,隐私受到损害。所以,你应该司法使用这项服务。
答案 7 :(得分:2)
对于寻找全功能地理定位实用程序的开发人员,您可以查看geolocator.js(我是作者)。
下面的示例将首先尝试使用HTML5 Geolocation API来获取精确的坐标。如果失败或被拒绝,它将回退到Geo-IP查找。一旦获得坐标,它就会将坐标反向地理编码为一个地址。
var options = {
enableHighAccuracy: true,
timeout: 6000,
maximumAge: 0,
desiredAccuracy: 30,
fallbackToIP: true, // if HTML5 geolocation fails or rejected
addressLookup: true, // get detailed address information
timezone: true,
map: "my-map" // this will even create a map for you
};
geolocator.locate(options, function (err, location) {
console.log(err || location);
});
它支持地理位置(通过HTML5或IP查找),地理编码,地址查找(反向地理编码),距离&amp;持续时间,时区信息等......
答案 8 :(得分:2)
您可以使用ip-api.io来获取访问者的位置。它支持IPv6。
作为奖励,它允许检查IP地址是否为tor节点,公共代理或垃圾邮件发送者。
JavaScript代码:
function getIPDetails() {
var ipAddress = document.getElementById("txtIP").value;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
console.log(JSON.parse(xhttp.responseText));
}
};
xhttp.open("GET", "http://ip-api.io/json/" + ipAddress, true);
xhttp.send();
}
<input type="text" id="txtIP" placeholder="Enter the ip address" />
<button onclick="getIPDetails()">Get IP Details</button>
jQuery代码:
$(document).ready(function () {
$('#btnGetIpDetail').click(function () {
if ($('#txtIP').val() == '') {
alert('IP address is reqired');
return false;
}
$.getJSON("http://ip-api.io/json/" + $('#txtIP').val(),
function (result) {
alert('Country Name: ' + result.country_name)
console.log(result);
});
});
});
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<div>
<input type="text" id="txtIP" />
<button id="btnGetIpDetail">Get Location of IP</button>
</div>
答案 9 :(得分:0)
我想在不使用任何外部 api 的情况下本地化少数国家/地区的客户端定价,因此我使用本地 Date 对象来获取国家/地区 new Date()).toString().split('(')[1].split(" ")[0]
document.write((new Date()).toString().split('(')[1].split(" ")[0])
基本上这个小代码片段从 Date 对象中提取第一个单词。要检查各种时区,您可以更改本地机器的时间。
就我而言,我们的服务仅包括三个国家/地区,因此我能够使用以下代码获取位置。
const countries = ["India", "Australia", "Singapore"]
const countryTimeZoneCodes = {
"IND": 0,
"IST": 0,
"AUS": 1,
"AES": 1,
"ACS": 1,
"AWS": 1,
"SGT": 2,
"SIN": 2,
"SST": 2
} // Probable three characters from timezone part of Date object
let index = 0
try {
const codeToCheck = (new Date()).toString().split('(')[1].split(" ")[0].toUpperCase().substring(0, 3)
index = countryTimeZoneCodes[codeToCheck]
} catch (e) {
document.write(e)
index = 0
}
document.write(countries[index])
这只是为了改善用户体验。这不是检测位置的完整证明解决方案。作为未正确检测的后备,我在菜单栏中添加了一个用于选择国家/地区的下拉菜单。