11

有没有办法使用任何 Google API 实时获取我的用户的 IP 地理位置?

我认为它将使用分析数据库,这是唯一一个在城市级别跟踪我的用户并且实际上是正确的(我可以测试的任何其他 IP-Location-API 显示我的 IP 地址距离我的真实位置近 200 公里。谷歌显示它 200 米(!) !)

我想知道我的用户的位置(在浏览器端并将其传输到我的服务器或在服务器端)以提供与城市相关的内容。但是我不想让我的用户在这些烦人的弹出窗口中要求使用 GPS,所以我想使用 IP 地址。

有什么建议么?

4

3 回答 3

10

如果您不想使用HTML5 样式的客户端启用的 GeoIP 信息,您将需要一个 GeoIP 数据库,例如MaxMind 的 GeoIP Lite 数据库,它是免费的,适用于 99% 的用例。任何其他具有更准确/详细信息的服务都会花费您很多钱。MaxMind 受到很多人的好评,并且非常适合我个人的需求。它可以为您提供国家/地区/城市/纬度-经度-坐标/大陆信息。

于 2012-12-10T01:12:23.657 回答
3

您可以使用 Google 的 geolocation API 根据用户的 IP 地址获取 lat 和 lon:

  var apiKey = "Your Google API Key";

  function findLatLonFromIP() {
    return new Promise((resolve, reject) => {
      $.ajax({
        url: `https://www.googleapis.com/geolocation/v1/geolocate?key=${apiKey}`,
        type: 'POST',
        data: JSON.stringify({considerIp: true}),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: (data) => {
          if (data && data.location) {
            resolve({lat: data.location.lat, lng: data.location.lng});
          } else {
            reject('No location object in geolocate API response.');
          }
        },
        error: (err) => {
          reject(err);
        },
      });
    });
  }

然后,您可以使用这些坐标来使用地理编码 API 获取用户的地址。这是一个返回国家/地区的示例:

  function getCountryCodeFromLatLng(lat, lng) {
    return new Promise((resolve, reject) => {
      $.ajax({
        url: `https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${apiKey}`,
        type: 'GET',
        data: JSON.stringify({considerIp: true}),
        dataType: 'json',
        success: (data) => {
          console.log('reverse geocode:', data.results[0].address_components);
          data.results.some((address) => {
            address.address_components.some((component) => {
              if (component.types.includes('country')) {
                return resolve(component.short_name);
              }
            });
          });
          reject('Country not found in location information.');
        },
        error: (err) => {
          reject(err);
        },
      });
    });
  }

上面,只需浏览一下data.results即可找到您需要的信息(City、Street、Country 等) 将上面的这两个功能一起使用:

findLatLonFromIP().then((latlng) => {
  return getCountryCodeFromLatLng(latlng.lat, latlng.lng);
}).then((countryCode) => {
  console.log('User\'s country Code:', countryCode);
});
于 2018-05-28T18:58:16.813 回答
0

您可以使用 Google 的地理编码 API 来获取某个位置的真实地址,但该 API 所需的输入是纬度和经度坐标。

示例: http ://maps.googleapis.com/maps/api/geocode/json?latlng=43.473,-82.533&sensor=false

您需要从其他供应商那里找到 Location API 并通过 IP 访问某个城市级别,或者保留提示他们授予您对其地理位置的访问权限的选项。

IPInfoDB 在不使用输入的情况下通过 IP 自动缩小位置方面做得很好:

http://ipinfodb.com/ip_location_api.php

于 2012-12-10T01:12:03.820 回答