【问题标题】:Google API for location, based on user IP address [closed]用于位置的 Google API,基于用户 IP 地址 [关闭]
【发布时间】:2013-06-28 10:25:33
【问题描述】:

我正在寻找一种使用 Google Maps API 根据 IP 地址获取用户当前位置(城市)的方法。

类似于http://freegeoip.net/json,但仅使用 Google Maps API。这可能吗?

【问题讨论】:

标签: google-app-engine google-maps geolocation


【解决方案1】:

Here's a script 将使用 Google API 获取用户邮政编码并填充输入字段。

function postalCodeLookup(input) {
    var head= document.getElementsByTagName('head')[0],
        script= document.createElement('script');
    script.src= '//maps.googleapis.com/maps/api/js?sensor=false';
    head.appendChild(script);
    script.onload = function() {
        if (navigator.geolocation) {
            var a = input,
                fallback = setTimeout(function () {
                    fail('10 seconds expired');
                }, 10000);

            navigator.geolocation.getCurrentPosition(function (pos) {
                clearTimeout(fallback);
                var point = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
                new google.maps.Geocoder().geocode({'latLng': point}, function (res, status) {
                    if (status == google.maps.GeocoderStatus.OK && typeof res[0] !== 'undefined') {
                        var zip = res[0].formatted_address.match(/,\s\w{2}\s(\d{5})/);
                        if (zip) {
                            a.value = zip[1];
                        } else fail('Unable to look-up postal code');
                    } else {
                        fail('Unable to look-up geolocation');
                    }
                });
            }, function (err) {
                fail(err.message);
            });
        } else {
            alert('Unable to find your location.');
        }
        function fail(err) {
            console.log('err', err);
            a.value('Try Again.');
        }
    };
}

您可以进行相应调整以获取不同的信息。欲了解更多信息,请查看Google Maps API documentation

【讨论】:

  • 嘿,谢谢分享!我正在尝试像这样(function () { var showPostCode = document.getElementById("showPS"); var ps = postalCodeLookup(showPostCode); showPostCode.value() = ps; }); 调用您的函数,但不高兴。我做错了什么?
  • stackoverflow.com/a/40049684/2557517 是一个更好的答案。它在客户端工作
【解决方案2】:

Google 已经将位置数据附加到进入 GAE 的所有请求中(请参阅 gojavaphppython 的请求标头文档)。您应该对 X-AppEngine-CountryX-AppEngine-RegionX-AppEngine-CityX-AppEngine-CityLatLong 标头感兴趣。

一个例子如下所示:

X-AppEngine-Country:US
X-AppEngine-Region:ca
X-AppEngine-City:norwalk
X-AppEngine-CityLatLong:33.902237,-118.081733

【讨论】:

  • 我浏览了您的链接并找到了它的 PHP 版本 (developers.google.com/appengine/docs/php/#PHP_Request_headers),但我不确定如何使用此服务。我基本上是在制作一个需要找出用户国家代码的网站,并且伴随着你提到的X-AppEngine-Country 标题。什么是 AppEngine 或它的目的是什么?我只是想知道我是否应该为了获得国家代码而实施它。提前致谢
  • 这仅适用于应用程序,涵盖应用程序提供的数据的服务器端处理。因此它不适用于网页。
  • 我同意@Patanjali 到目前为止,Google API 不接受“IP 地址”作为其参数的一部分。它将为您提供呼叫者的地理位置。如果您将此 api 调用放在您的服务器代码中,它会为您提供服务器的地理位置。除非这是客户端代码,否则可以为您提供用户的地理位置。 (无论如何我都会在不同的浏览器上测试它)
  • stackoverflow.com/a/40049684/2557517 也可以。它在客户端工作
【解决方案3】:

看起来 Google 不赞成使用 IP 到位置的映射:

https://developers.google.com/maps/articles/geolocation?hl=en

那篇文章鼓励使用 W3C 地理定位 API。我有点怀疑,但看起来几乎所有主流浏览器都已经支持地理定位 API:

http://caniuse.com/geolocation

【讨论】:

  • 遗憾的是,支持并不意味着用户启用了该功能,caniuse.com 列出的许多浏览器版本都支持,但默认情况下是禁用的。
  • @Jeremy Wadhams 这个 API 的精度非常好,但我正在寻找一种方法来根据用户所在的国家/地区启用某些折扣并让用户必须允许它只会破坏整体主意。对于如何以一种不依赖于第三方服务或可能只依赖于谷歌的简单方式了解用户所在国家/地区,您有什么建议吗,因为这是我雇主唯一信任的服务。
  • 两年后,但仍然相关。 OP 的上下文似乎是服务器端的,但 Google 的东西是客户端的(根据 W3C 使用 navigator.geolocation 属性,需要 javascript,这意味着您不能提供基于页面的服务freegeoip.net 等解决方案可以完全是服务器端的,尽管它们依赖于正确的 IP 地址(即没有 VPN)。
  • 在非洲大部分地区无法使用,因为 Opera 仍然不支持它(2016 年)。
  • stackoverflow.com/a/40049684/2557517 是一个更好的答案。它在客户端工作
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2011-02-10
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多