MaxMind 免费 GeoLite City DB 不可靠?

Posted

技术标签:

【中文标题】MaxMind 免费 GeoLite City DB 不可靠?【英文标题】:MaxMind Free GeoLite City DB Unreliable? 【发布时间】:2013-08-25 05:17:43 【问题描述】:

我正在尝试使用 MaxMind 的 GeoLite City 数据库将 IP 地址转换为经纬度组合,并根据坐标找到最近的城市。

首先,我使用(这是 Java)将 ip 转换为 int:

String ip = "24.123.181.38";
private int ipToInt(String ip) 
    String[] nums = ip.split("\\.");
    double a = Double.valueOf(nums[0]);
    double b = Double.valueOf(nums[1]);
    double c = Double.valueOf(nums[2]);
    double d = Double.valueOf(nums[3]);
    double answer = (a*Math.pow(256, 3))+(b*Math.pow(256, 2))+(c*256)+d;
    return (int) answer; 

//Returns 410760486

我验证了我正在使用众多在线计算器之一正确执行计算,用于 ip 到整数的转换。

然后我使用 mysql 查询来获取纬度/经度并执行距离检查。这种距离检查似乎适用于我所做的其他邮政编码。

SET @ip := 410760486, @dist := 10;
SELECT @orig_lat := ip_locations_latitude, @orig_lon := ip_locations_longitude FROM ip_locations WHERE @ip BETWEEN ip_locations_start_ip AND ip_locations_end_ip;

SELECT *,
(3956 * 2 * ASIN(SQRT( POWER(SIN((@orig_lat - abs(latitude)) * pi()/180 / 2),2) + COS(@orig_lat * pi()/180 ) * COS(abs(latitude) *  pi()/180) * POWER(SIN((@orig_lon - longitude) *  pi()/180 / 2), 2) )))
AS distance
FROM geolite_locations
HAVING distance < @dist ORDER BY distance LIMIT 0, 1;

我正在使用位于北卡罗来纳州夏洛特的 IP 地址进行测试。结果返回北卡罗来纳州康科德(我住在这个地区,康科德非常接近,但仍然不是正确的城市)。我已经在德克萨斯、加利福尼亚、华盛顿等地的其他 ip 上进行了测试,除了少数几个似乎都返回了类似的结果......接近,但不准确。

Max Minds 网站称付费版比免费版更准确,但应该有这样的不同吗?还是我在查询中做错了什么?使用他们的付费版本在线演示测试 Max Minds 网站上的 ip 返回正确的城市,但我无法测试他们的免费数据库。如果免费版本根本无法使用,我不反对为数据库付费,但我宁愿在没有验证数据更准确的情况下不这样做。

附带说明,请不要对 API 提出建议。我更喜欢在本地查询数据,因为它所涉及的项目会非常频繁地访问数据库,并且 API 调用会使其太慢。

【问题讨论】:

【参考方案1】:

通常,IP 位置是向客户提供服务的互联网服务提供商的位置。因此,在您的情况下,您的 ISP 很可能位于北卡罗来纳州康科德,因此数据库结果是正确的。通常,除非与其他信息结合使用,否则此类位置无法提供精确定位。

【讨论】:

以上是关于MaxMind 免费 GeoLite City DB 不可靠?的主要内容,如果未能解决你的问题,请参考以下文章

maxmind GeoLite2-City accuracy_radius

通过 Maxmind GeoLite2 Free 获取用户城市的本地化名称

如何在 MySQL 中创建数据库以导入 Maxmind GeoLite2 city csv

MaxMind:为 lat/lng 关联文件?

Maxmind GeoLite2纯javascript / html示例

GeoLite City如何使用,如何获取startIpNum和endIpNum