如何使用地理位置获取访问者的位置(即国家/地区)?

时间:2010-08-15 22:02:18

标签: javascript geolocation

我正在尝试扩展原生地理位置功能

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
        var latitude = position.coords.latitude;
        var longitude = position.coords.longitude;
    });
}

这样我就可以使用访问者的国家名称(也许会返回一个信息数组)。

到目前为止,所有我能找到的功能都显示了谷歌地图界面,但没有一个实际上给出了我想要的东西,除了this library效果很好in this example但由于某种原因没有'在我的电脑上工作。我不确定那里为什么会出错。

无论如何,你知道如何从纬度和经度值中简单地返回一个包含国家,城市等信息的数组吗?

10 个答案:

答案 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'sYahoo'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;
&#13;
&#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);
        });
    });
}​

Try it on jsfiddle.net ...

答案 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页面的代码)

&#13;
&#13;
<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;
&#13;
&#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])

这只是为了改善用户体验。这不是检测位置的完整证明解决方案。作为未正确检测的后备,我在菜单栏中添加了一个用于选择国家/地区的下拉菜单。