【问题标题】:How to get user's geolocation?如何获取用户的地理位置?
【发布时间】:2012-08-08 12:06:54
【问题描述】:

在许多网站上,我看到打印出我当前所在的城市(例如“Hello to Berlin.”)。他们是怎么做到的?为此需要什么? 我想主要部分是这里的 javascript,但是我需要什么来为我自己的应用程序实现这样的东西? (或者是否有一些适用于 Rails 的宝石?)

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

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

【问题讨论】:

    标签: geolocation


    【解决方案1】:

    您需要一个支持 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
        });
    }
    

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

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

    关于国家/城市列表,我们曾经在项目中使用过从Geonames获得的数据,但我们需要先将其转换为我们的需要。

    【讨论】:

      【解决方案2】:

      我发现getCurrentPosition() 经常不准确,因为它不会花费大量时间等待 GPS 获得良好的准确度。我编写了一小段模仿 getCurrentPosition() 的 JavaScript,但实际上使用手表位置并监视返回的结果,直到它们更准确为止。

      它的外观如下:

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

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

      【讨论】:

        【解决方案3】:

        正确的语法是:

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

        【讨论】:

          【解决方案4】:

          如果你更喜欢使用 ES6 并且 promises 这里是另一个版本

          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*/})
          

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              【解决方案6】:

              这是另一个在 PHP 中查找位置的 api,

              http://ipinfodb.com/ip_location_api.php

              【讨论】:

                【解决方案7】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-09-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-06-21
                  相关资源
                  最近更新 更多