本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序

腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
经常有这种需求,拥有用户的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)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 使用java把IP转换成经纬度