有没有办法使用任何Google API来实时获取用户的IP地理位置?
我认为它将使用Analytics Database,这是唯一一个在城市级别跟踪我的用户实际上是正确的(我可以测试的任何其他IP-Location-API显示我的IP地址距离我的真实位置近200公里)。谷歌显示它200米(!)!)
我想知道我的用户的位置(在浏览器端并将其传输到我的服务器或服务器端)以提供与城市相关的内容。但我不想让我的用户中的一个令人讨厌的弹出窗口要求使用GPS,所以我想使用IP地址。
有什么建议?
如果您不想使用HTML5 style client-enabled GeoIP information,您将需要一个像MaxMind's GeoIP Lite database这样的GeoIP数据库,它是免费的,适用于99%的用例。任何其他具有更准确/详细信息的服务都会花费您很多钱。 MaxMind受到很多人的赞扬,并且非常适合我的需求。它可以为您提供国家/地区/城市/纬度 - 经度 - 坐标/大陆信息。
您可以使用Google的地理编码API获取某个位置的真实地址,但该API所需的输入是纬度和经度坐标。
示例:http://maps.googleapis.com/maps/api/geocode/json?latlng=43.473,-82.533&sensor=false
您需要从其他供应商处找到IP到Location API以进入城市级别或保留选项以提示他们授予您对其地理位置的访问权限。
IPInfoDB在通过IP自动缩小位置而不使用输入方面做得非常好:
您可以使用Google的地理位置API根据用户的IP地址获取lat和lon:
function findLatLonFromIP() {
return new Promise((resolve, reject) => {
$.ajax({
url: `https://www.googleapis.com/geolocation/v1/geolocate?key=${friendlyPix.IpFilter.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=${friendlyPix.IpFilter.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
查找您需要的信息(城市,街道,国家等...)将上述两个功能一起使用:
findLatLonFromIP().then((latlng) => {
return getCountryCodeFromLatLng(latlng.lat, latlng.lng);
}).then((countryCode) => {
console.log('User\'s country Code:', countryCode);
});