Java调用MaxMind GeoIP库查询IP地理信息

本文详细介绍了GeoIP2和GeoLite2的安装、配置与使用方法,包括数据库文件的下载与更新,以及如何在Java环境中查询IP的地理位置信息。同时,文章还深入探讨了不同地图坐标系的区别及其在中国的应用规范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.zip

rpm -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.com

30 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 数据库文件mmdb
		File 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坐标转换开发指南

内容概要 本资源为 MaxMind Geo-IP 免费数据(GeoLite2),包含全球IP地址与地理位置的精准映射数据,支持通过IP查询: 国家/地区、城市/省份、经纬度坐标、时区 ASN(自治系统号) 数据格式为CSV及二进制兼容格式(需配合官方API或第三方工具解析),定期更新至最新版本,覆盖全球IPv4/IPv6地址范围,助您快速实现IP定位功能。 适用人群 开发者:需为网站/APP集成IP定位功能的程序员(如登录风控、地域化内容推荐)。 网络安全工程师:分析异常IP来源,增强安全防护策略。 数据分析师/研究员:统计用户地域分布或网络行为趋势。 企业市场团队:精准广告投放或区域化运营策略制定。 使用场景及目标 场景1:网站根据用户IP自动切换语言/货币,提升用户体验。 场景2:识别高风险地区登录行为,加强账号安全防护。 场景3:电商平台分析用户地域分布,优化物流及促销策略。 目标:无需依赖第三方API,低成本实现高精度地理位置服务。 其他说明 注意事项 本资源为MaxMind官方 免费版GeoLite2,需遵守其许可协议。 商业用途需购买MaxMind企业级数据(本资源仅供学习/测试/轻量级场景)。 资源包附带简易解析教程(Python/Java示例代码),帮助快速上手。 提示 建议定期同步官方更新(资源内附更新脚本)。 配合Nginx/ELK等工具可实现实时IP分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值