使用java把IP转换成经纬度

JAVA herman 1799浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

经常有这种需求,拥有用户的IP地址,想要在地图上显示用户的访问量。这个时候就需要用到经纬度…应为一般的地图插件都是基于经纬度的。
那么问题来了,如何把IP转换成经纬度?

先看效果图

百度IP定位

百度普通IP定位API

普通的IP服务:http://lbsyun.baidu.com/index.php?title=webapi/ip-api

https://api.map.baidu.com/location/ip?ak=请输入您的AK&coor=bd09ll

返回结果(地址解析的结果)

{  
    address: "CN|北京|北京|None|CHINANET|1|None",    #地址  
    content:    #详细内容  
    {  
        address: "北京市",    #简要地址  
        address_detail:    #详细地址信息  
        {  
            city: "北京市",    #城市  
            city_code: 131,    #百度城市代码  
            district: "",    #区县  
            province: "北京市",    #省份  
            street: "",    #街道  
            street_number: ""    #门址  
        },  
        point:    #百度经纬度坐标值  
        {  
            x: "116.39564504",  
            y: "39.92998578"  
        }  
    },  
    status: 0    #返回状态码  
}

百度高精度IP定位API

精准的服务:http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip

https://api.map.baidu.com/highacciploc/v1?qcip=220.181.38.113&qterm=pc&ak=请输入您的AK&coord=bd09ll

返回结果(地址解析的结果)

{
    content: {
        location: {
            lat: 40.047726,#纬度
            lng: 116.313304 #经度  
        },
        locid: "8b1bf81d208bc2ce657fb6e6c270de66",#定位结果唯一ID
        radius: 30, #定位结果半径
        confidence: 1 #定位结果可信度
    },
    result: {
        error: 161,#定位结果状态码
        loc_time: "2016-08-23 15:14:12"#定位时间
    }
}

这个API也不是随便问的,首先就需要注册;每个时间段的访问量还有限…因此不适合做数据分析使用。因为数据分析往往是大批量的数据同时去进行经纬度的转换。

Logstash进行转换

Logstash本身提供了IP地址转换成经纬度的功能:

input{
    file{
        path => "D:\access.json"
        start_position => "beginning"
    }   
}
filter{
    json{
        source => "message"
    }
    date{
        match => ["time","yyyy-MM-dd HH:mm:ss"]
        timezone => "Asia/Shanghai"
    }
    geoip {
                source => "ip"
                target => "geoip"
    }
}
output{
    stdout{
            codec => rubydebug
    }
}

MaxMind提供的GeoIp服务

这个公司提供了GeoIp的转换服务,当然如果想要精确的匹配也是收费的。

这里有一个体验的网址:https://www.maxmind.com/en/geoip-demo

其他方案

这个山寨的方案灵感来源于Logstash,Logstash本身提供了IP转换经纬度的功能。原理就是它自己有一个IP数据库,可以通过它执行查询。其实这个数据库时老版的MaxMind提供的数据文件,凑合用吧!新的需要花钱呀!

废话不多说,在Java中想要使用这个数据文件需要下载相应的Jar包和dat文件:

把dat文件放在自己的本地目录,然后项目中导入geoip.jar即可

import com.maxmind.geoip.Location;
import com.maxmind.geoip.LookupService;
import java.io.IOException;

public class TestMain {
    public static void main(String[] args) {
        try {
            LookupService cl = new LookupService("D:/lib/geoip/GeoLiteCity-2013-01-18.dat", LookupService.GEOIP_MEMORY_CACHE);
            Location l2 = cl.getLocation("144.0.9.29");
            System.out.println(
                    "countryCode: " + l2.countryCode +"\n"+
                    "countryName: " + l2.countryName +"\n"+
                    "region: " + l2.region +"\n"+
                    "city: " + l2.city +"\n"+
                    "latitude: " + l2.latitude +"\n"+
                    "longitude: " + l2.longitude);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果

countryCode: CN
countryName: China
region: 25
city: Jinan
latitude: 36.668304
longitude: 116.99719

参考资料

国外Geoip服务 MaxMind:https://www.maxmind.com/en/geoip-demo
国内Geoip服务 百度开放API: http://lbsyun.baidu.com/index.php?title=webapi/ip-api

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 使用java把IP转换成经纬度