MaxMind免费GeoLite城市数据库不可靠



我正试图在中使用MaxMind的GeoLite城市数据库,将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查询来获取lat/long并执行距离检查。这种距离检查似乎适用于我做的其他邮政编码的东西。

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地址进行测试。结果返回北卡罗来纳州康科德(我住在这个地区,康科德离这里很近,但也不是正确的城市)。我在得克萨斯州、加利福尼亚州、华盛顿等地的其他ips上进行了测试,除少数外,所有ips似乎都返回了类似的结果。。。接近,但不准确。

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

顺便说一下,请不要对API提出任何建议。我更愿意在本地查询数据,因为它所涉及的项目将非常频繁地访问数据库,而API调用会使其速度太慢。

通常,IP位置是为客户提供服务的互联网服务提供商的位置。因此,在您的情况下,您的ISP很可能位于北卡罗来纳州康科德,因此数据库结果是正确的。通常,除非与其他信息相结合,否则这种类型的位置不能提供接点精度。

相关内容

  • 没有找到相关文章

最新更新