Geolocation 如何获取用户的地理位置?

Geolocation 如何获取用户的地理位置?,geolocation,Geolocation,在许多网站上,我看到打印出我现在所在的城市,如柏林你好。。他们是怎么做到的?这一切需要什么? 我想主要的部分是javascript,但是在我自己的应用程序中实现类似的东西需要什么呢?还是有一些适合Rails的宝石 另外,我还想问一件事——我对通常在选择框中的州列表很感兴趣,用户在其中选择他的州,比如说德国,根据州值在另一个选择中显示德国的所有地区,在选择一个地区后,显示所选地区的各个城市 有可能在任何地方获得这个州/城市/地区的庞大数据库吗?在我们的应用程序中有类似的东西会很有趣,但我不知道这些

在许多网站上,我看到打印出我现在所在的城市,如柏林你好。。他们是怎么做到的?这一切需要什么? 我想主要的部分是javascript,但是在我自己的应用程序中实现类似的东西需要什么呢?还是有一些适合Rails的宝石

另外,我还想问一件事——我对通常在选择框中的州列表很感兴趣,用户在其中选择他的州,比如说德国,根据州值在另一个选择中显示德国的所有地区,在选择一个地区后,显示所选地区的各个城市


有可能在任何地方获得这个州/城市/地区的庞大数据库吗?在我们的应用程序中有类似的东西会很有趣,但我不知道这些列表是从哪里来的…

互联网服务提供商购买了大量的IP地址,所以你最可能看到的是将你的IP回溯到已知的ISP。他们有一个包含ISP及其在世界上的位置的数据库,因此他们可以尝试查看您来自哪里。你可以尝试使用一个网站来做你的工作。如果你环顾四周,肯定会有一个站点允许你输入IP并获取位置,因此你只需向该站点发送一个带有访问者IP的POST请求,并从响应中获取位置

或者,您可以尝试查找一个ISP数据库,该数据库具有位置和分配的IP范围块。你可能会找到一个赚钱的,但一个免费的可能更难找到。
或者,查看这个免费数据库

这里有另一个api,可以在PHP中查找位置


您需要一个支持地理定位api的浏览器来获取用户的位置。但是,您需要用户的同意。例如,大多数较新的浏览器都支持该功能,包括IE9+和大多数移动操作系统浏览器,包括Windows Phone 7.5+

然后,您只需使用JavaScript获取位置:

if (window.navigator.geolocation) {
    var failure, success;
    success = function(position) {
      console.log(position);
    };
    failure = function(message) {
      alert('Cannot retrieve location!');
    };
    navigator.geolocation.getCurrentPosition(success, failure, {
      maximumAge: Infinity,
      timeout: 5000
    });
}
positionobject将保留用户位置的纬度和经度,但是在桌面浏览器上人口较少的区域,这可能会非常不准确,因为它们没有内置GPS设备。进一步解释一下:在年的莱比锡,台式电脑的精确度约为300米——我的手机GPS设备的精确度约为30米

然后,您可以继续使用see的坐标来查找用户的位置。如果你愿意的话,这里有一个。我从未觉得有必要使用它们,但有些人似乎喜欢它们

至于国家/城市列表,我们在一个项目中使用了从once获得的数据,但我们需要先将其转换为我们需要的数据。

我发现getCurrentPosition经常不准确,因为它不会花很多时间等待GPS获得良好的精度。我编写了一小段JavaScript,它模仿getCurrentPosition,但实际上使用watch position,并监视返回的结果,直到结果更准确

下面是它的外观:

navigator.geolocation.getAccurateCurrentPosition(onSuccess, onError, {desiredAccuracy:20, maxWait:15000});

代码在这里-

正确的语法是:

navigator.geolocation.getCurrentPosition(successCallBack, failureCallBack);
使用:

    navigator.geolocation.getCurrentPosition(
        function(position){
            var latitude  = position.coords.latitude;
            var longitude = position.coords.longitude;
            console.log("Latitude : "+latitude+" Longitude : "+longitude);
        },
        function(){
            alert("Geo Location not supported");
        }
    );         

我已经使用geoip.maxmind.com有一段时间了,它100%有效。它可以通过HTTP请求访问。

如果您喜欢使用ES6,这里是另一个版本

function getPositionPromised() {
  function successCb(cb) {
    return position => cb(position);
  }

  function errorCb(cb) {
    return () => cb('Could not retrieve geolocation');
  }

  return new Promise((resolve, reject) => {
    if (window.navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(successCb(resolve), errorCb(reject));
    } else {
      return reject('No geolocation support');
    }
  })
}
您可以这样使用它:

getPositionPromised()
  .then(position => {/*do something with position*/})
  .catch(() => {/*something went wrong*/})