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.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=[email protected]

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座標轉換開發指南

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章