2013-08-25 3 views
1

MaxMind의 GeoLite City 데이터베이스를 사용하여 IP 주소를 위도/경도 조합으로 변환하고 좌표를 기준으로 가장 가까운 도시를 찾으려고합니다.MaxMind 무료 GeoLite City DB 신뢰할 수 없습니까?

먼저 나는 (이 자바입니다)를 사용하는 int로 IP를 변환 :

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에 대해 많은 온라인 calulators 중 하나를 사용하여 계산을 수행하고 확인.

그런 다음 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 주소를 사용하여 테스트하고 있습니다. 결과는 콩코드, 노스 캐롤라이나 (나는이 지역에 살고 콩코드는 매우 가깝지만 정확한 도시도 그다지 적지 않다)를 반환합니다. 나는 텍사스, 캘리포니아, 워싱턴 등의 다른 ips에서 테스트를 해봤지만 비슷한 결과를 반환하는 몇 가지가 있습니다 ... 정확하지만 정확하지는 않습니다.

Max Minds 웹 사이트는 유료 버전이 무료 버전보다 정확하다고 말합니다. 또는 내 질문에 잘못된 것이 있습니까? 유료 버전 온라인 데모를 사용하여 Max Minds 웹 사이트에서 ip를 테스트하면 정확한 도시가 반환되지만 무료 데이터베이스를 테스트 할 수는 없습니다. 무료 버전 단순히 사용할 수 없게 정확하지 않은 경우 데이터베이스에 대해 지불하는 것에 대해 아무것도 없지만 데이터를 확인하지 않고 오히려 그것을하지 않을 거라고 훨씬 더 정확합니다.

참고로 API에 대한 제안 사항이 없습니다. 데이터가 로컬로 쿼리하는 것을 선호 할 것입니다. 프로젝트가 참여하면 데이터베이스가 상당히 자주 발생하고 API 호출이 너무 느려지므로 말입니다.

답변

0

일반적으로 IP 위치는 고객에게 서비스를 제공하는 인터넷 서비스 공급자의 위치입니다. 따라서 귀하의 ISP는 Concord, NC에있을 수 있으므로 데이터베이스 결과가 정확합니다. 일반적으로 이러한 유형의 위치는 다른 정보와 결합되지 않는 한 핀 포인트 정확도를 제공하지 않습니다.