Java调用MaxMind GeoIP库查询IP地理信息
1. 概述
GeoIP 有收费版本 GeoIP2 和 GeoLite2 ,GeoLite2 为免费版本。
2. 安装GeoLite2数据库文件
- 下载RPM包安装
# centos版本
wget https://github.com/maxmind/geoipupdate/releases/download/v4.2.2/geoipupdate_4.2.2_linux_amd64.rpm
# windows版本
# wget https://github.com/maxmind/geoipupdate/releases/download/v4.2.2/geoipupdate_4.2.2_windows_amd64.ziprpm -ivh geoipupdate_4.2.2_linux_amd64.rpm
- 通过yum来安装
yum install -y geoipupdate
- 修改GeoIP更新配置文件
vim /etc/GeoIP.conf
AccountID 0
LicenseKey 000000000000
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country
或者到 https://www.maxmind.com/en/my_license_key 申请 AccountID 和 LicenseKey。
3. 更新GeoLite2数据库
具体帮助可参考 man geoipupdate
- 手动更新
geoipupdate -v
- 自动更新(利用crontab)
# top of crontab
MAILTO=your@email.com30 2 * * 3#1 /usr/local/bin/geoipupdate
# end of crontab
在每个月第一个星期三自动执行 geoipupdate 命令,执行时间在凌晨2点30分。因为Maxmind是每月的第一个星期二更新IP库,所以我们选择延迟一点,避免时差引起误差。
- 更新的数据库文件的存放位置
可以使用 geoipupdate -d /path/to/db_file 指定数据库文件的存放位置。如果不指定则默认将数据库文件存放于 /usr/share/GeoIP。此外使用 -f 参数可以指定配置文件的位置。
4. 使用Java查询IP的地理信息
可参考官方MaxMind官方API:
- http://maxmind.github.io/GeoIP2-java/doc/v2.13.0/
- https://github.com/maxmind/GeoIP2-java
- http://maxmind.github.io/GeoIP2-java/
一个例子
maven导入jar包
<dependency><groupId>com.maxmind.geoip2</groupId><artifactId>geoip2</artifactId><version>2.13.0</version>
</dependency>
package demo;import java.io.File;
import java.net.InetAddress;import com.maxmind.geoip2.DatabaseReader;
import com.maxmind.geoip2.model.CityResponse;
import com.maxmind.geoip2.record.City;
import com.maxmind.geoip2.record.Country;
import com.maxmind.geoip2.record.Location;
import com.maxmind.geoip2.record.Subdivision;public class GeoipTest {public static void main(String[] args) throws Exception {// GeoIP2-City 数据库文件mmdbFile database = new File("D:\\Tools\\GeoIP\\db\\GeoLite2-City.mmdb");// 创建 DatabaseReader对象DatabaseReader reader = new DatabaseReader.Builder(database).build();// 设置地址是使用IPv4还是IPv6
// System.setProperty("java.net.preferIPv4Stack", "true");System.setProperty("java.net.preferIPv6Addresses", "true");// 设置IP地址
// InetAddress ipAddress = InetAddress.getByName("39.130.56.106");InetAddress ipAddress = InetAddress.getByName("240C::6666");// 获取查询结果CityResponse response = reader.city(ipAddress);// 获取国家信息Country country = response.getCountry();System.out.println("国家code:" + country.getIsoCode());System.out.println("国家:" + country.getNames().get("zh-CN"));// 获取省份Subdivision subdivision = response.getMostSpecificSubdivision();System.out.println("省份code:" + subdivision.getIsoCode());System.out.println("省份:" + subdivision.getNames().get("zh-CN"));// 城市City city = response.getCity();System.out.println("城市code:" + city.getGeoNameId());System.out.println("城市:" + city.getName());// 获取城市Location location = response.getLocation();// 这里获得的经纬度是WGS84坐标系统下的坐标System.out.println("经度:" + location.getLatitude());System.out.println("维度:" + location.getLongitude());}
}
也可以在执行命令中设定:
java -Djava.net.preferIPv4Stack=true -cp .;classes/ my.main.className
或
java -Djava.net.preferIPv6Addresses=true -cp .;classes/ my.main.className
对于Tomcat服务器,可以在 catalina.bat 或者 catalina.sh 中增加如下环境变量即可:
SET CATALINA_OPTS=-Djava.net.preferIPv4Stack=true
或
SET CATALINA_OPTS=-Djava.net.preferIPv6Addresses=true
5. 关于地图坐标系
- 我们常说的坐标系有哪些?
WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
GCJ02:又称火星坐标系,是由中国国家测绘局制定的地理坐标系统,是由WGS84加密后得到的坐标系。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。
- 百度地图使用什么坐标体系?
使用百度地图的服务,需使用BD09坐标。
若使用非BD09坐标、未经过坐标转换(非BD09转成BD09)直接叠加在地图上,地图展示位置会偏移,因此通过其他坐标(WGS84、GCJ02)调用服务时,需先将其他坐标转换为BD09。
- 港澳台及海外,百度地图返回什么坐标?
中国地区(包括港澳台),百度地图开放平台的所有产品,都支持返回GCJ02坐标系、BD09坐标系。
海外地区,目前返回的是WGS84坐标。
- 注意
互联网地图在国内必须至少使用GCJ02进行首次加密,不允许直接使用WGS84坐标下的地理数据,同时任何坐标系均不可转换为WGS84坐标。
- 坐标系的转换
如果您想调用服务器端的坐标转换方法:请参考坐标转换API
如果您想在JS的前端网页中使用坐标转换功能:请参考JavaScript API坐标转换示例
如果您想在Android终端系统上使用坐标转换功能:请参考Android地图SDK坐标转换开发指南
如果您想在iOS的终端系统上使用坐标转换功能:请参考iOS地图SDK坐标转换开发指南
Java调用MaxMind GeoIP库查询IP地理信息相关推荐
- php查询ip归属地api接口_php调用新浪接口查询ip获取地理位置(ip归属地查询)
php调用新浪接口查询ip获取地理位置(ip归属地查询) 发布于 2014-11-17 08:35:58 | 115 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: ...
- java调用solr的分词查询结果
java调用solr的分词查询结果 https://www.jianshu.com/p/cb4cc151d23c
- 登录显示离线_使用emoji加密文本;nali—终端离线查询 IP 地理信息
1.使用emoji加密文本. 原理是将文本进行AES加密,然后替换字符串,变身后的Emoji可以添加任意字符.文字,而不影响还原.因为各版本操作系统对Emoji支持不一,可能出现Emoji显示不全的问 ...
- Java调用so动态库方法
在Java里面调用so动态库的方法 1.引入jna依赖 <dependency><groupId>net.java.dev.jna</groupId><art ...
- java调用C++ DLL库方法
转载地址: https://www.cnblogs.com/xiaocainiao2hao/p/5619862.html 最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是 ...
- java 调用企查查API查询企业信息
效果图: 首先需要设置token,API中要求token的格式为key+Timespan+SecretKey组成的32位md5加密的大写字符串,所以我也附赠了MD5加密的工具类.token要放在htt ...
- java linux so_linux平台java调用so动态库
实现将一个自己编写的Hello.c文件打包成libHello.so动态库,并通过gcc编译工具实现用一个test.c程序调用libHello.so和自定义头文件Hello.h的过程. 具体程序代码如下 ...
- Nali:一个离线查询 IP 地理信息和 CDN 提供商的终端利器
什么是 Nali dig.nslookup.traceroute 等都是非常实用的网络调试工具,Nali 是一个可以自动解析这些工具 stdout 中的 IP 并附上所属 ISP 和地理信息,对这些已 ...
- 调用淘宝接口查询IP所在地
#!/usr/bin/python # -*- coding: UTF-8 -*- import requests IP = raw_input("请输入:"); def chec ...
最新文章
- 华为八爪鱼自动驾驶云
- 02-NLP-01-python正则表达式
- 查询各个年级的平均分_二年级数学:期中考试前精心准备一下,会有意想不到的收获哦!...
- .net excel循环插数据_科普:1根、2根、4根内存条插在主板内存插槽的位置
- python手机自动化截图_python UI自动化截图对比
- cookies的存值问题
- 红帽安装Oracle步骤
- iPhone 9或于4月3日发布;复制粘贴之父Larry Tesler去世;Android 11开发者预览版来了!| 极客头条...
- anaconda 虚拟环境
- 万能五笔输入法下载|万能五笔输入法电脑版下载
- 2021-07-21
- Discuz!开发之模板制作CSS扩展规范与语法规范
- 第一章-问题求解策略-LA4234-Binary Clock
- 机器学习、深度学习、神经网络还傻傻分不清吗?
- 5 个免费的受欢迎的 SQLite 管理工具
- iptables火墙服务
- Vue +Element UI (饿了么UI) +Echarts 实现图表自适应配置
- JS实例、静态的属性和方法
- 虚幻引擎5 (UE5):开发你的前两个游戏
- 给自己写一个年终总结,新年快乐!