如何获得用户的地理位置?

时间:2012-08-08 12:06:54

标签: geolocation

在我看到的许多网站上,我打印出了我现在所在的城市(例如“柏林你好”)。他们是怎么做到的?那需要什么呢? 我想主要部分是javascript,但是我需要将所有这些内容实现到我自己的应用程序中? (或者Rails有一些宝石吗?)

另外,我想问一件事 - 我在状态列表中很有趣(通常在选择框中),用户选择他的状态(比如德国),根据状态值在另一个选择中显示德国的所有地区,选择地区后,将显示所选地区的相应城市。

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

7 个答案:

答案 0 :(得分:3)

您需要一个支持geolocation api的浏览器来获取用户的位置(但是,您需要得到用户的同意(例如here)才能这样做(大多数较新的浏览器都支持该功能,包括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
    });
}

position对象将保存用户位置的纬度和经度(但是在桌面浏览器上人口较少的区域中这可能非常不准确,因为它们没有内置的GPS设备)。进一步解释:在莱比锡这里,在台式电脑上获得大约300米的精度 - 用我的手机的GPS设备可以获得大约30米的精度。

然后,您可以继续使用Google Maps API的坐标(请参阅here for reverse geocoding)来查找用户的位置。如果您愿意,可以few gems for Rails。我从来没有觉得有必要使用它们,但有些人似乎喜欢它们。

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

答案 1 :(得分:1)

我发现getCurrentPosition()经常不准确,因为它不会花很多时间等待GPS来获得良好的准确性。我写了一小段JavaScript,模仿getCurrentPosition(),但实际上使用了手表位置并监控结果,直到它们更准确。

以下是它的外观:

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

代码就在这里 - https://github.com/gwilson/getAccurateCurrentPosition

答案 2 :(得分:1)

Correc语法将是:

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

答案 3 :(得分:0)

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

或者,您可以尝试查找具有位置的ISP数据库以及已分配的IP范围的块。你可能会找到一个换钱,但是一个免费的可能更难找到。 或者,查看此免费数据库http://www.maxmind.com/app/geolite

答案 4 :(得分:0)

这是另一个用PHP查找位置的API,

http://ipinfodb.com/ip_location_api.php

答案 5 :(得分:0)

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

答案 6 :(得分:0)

如果你更喜欢使用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*/})