GeoLite2 Java根据IP获得城市、经纬度附源代码

之前我们介绍过通过 qqwry.dat 根据IP获得所属城市和运营商信息。但是这个 qqwry.dat 已经太久没更新了,数据有些不准确,而且现在我们有个需求就是想获取某个IP所在的经纬度。

这里我们可以使用 GeoLite2,这个是国外开源的一个库,需要在其官网注册才能下载。

下面介绍基本使用。

一、注册账号

GeoLite2 地址:https://dev.maxmind.com/geoip/geoip2/geolite2/

可以访问上面链接,下面有一个注册按钮,需要填写注册信息,然后会收到一个邮件,设置密码,账号为邮箱。注册完成后,点击登录。

二、下载库文件

下载页面地址:https://www.maxmind.com/en/accounts/243575/geoip/downloads

因为我需要获取城市信息,所以选择第三个,压缩包大概30MB,解压后里面的 mmdb 有60MB

三、Demo 实践

官方文档地址:https://dev.maxmind.com/geoip/geoip2/downloadable/

Java的地址:https://maxmind.github.io/GeoIP2-java/

我这里就介绍Java的应用

1、添加依赖

<dependency><groupId>com.maxmind.geoip2</groupId><artifactId>geoip2</artifactId><version>2.13.1</version></dependency>

或者自行下载jar包

2、Demo

import com.maxmind.geoip2.DatabaseReader;import com.maxmind.geoip2.model.CityResponse; import java.io.File;import java.io.IOException;import java.net.InetAddress; /** * @author 言曌 * @date 2020/3/17 3:23 下午 */ public class Demo {     public static void main(String[] args) {         // IP V4        String ip = "113.87.18.136";        // IP V6 也是可以的        DatabaseReader reader = null;        CityResponse response = null;        try {            File database = new File("/Users/liuyanzhao/code/sensboot/src/main/java/GeoLite2-City.mmdb");            // 读取数据库内容            reader = new DatabaseReader.Builder(database).build();            InetAddress ipAddress = InetAddress.getByName(ip);            // 获取查询结果            response = reader.city(ipAddress);            System.out.println(response);        } catch (Exception e) {            e.printStackTrace();         } finally {            if (reader != null) {                try {                    reader.close();                } catch (IOException e) {                    e.printStackTrace();                 }            }         }    }}

3.结果

{	"city": {		"geoname_id": 1795565,		"names": {			"de": "Shenzhen",			"ru": "Шэньчжэнь",			"pt-BR": "Shenzhen",			"ja": "深セン市",			"en": "Shenzhen",			"fr": "Shenzhen",			"zh-CN": "深圳市",			"es": "Shenzhen"		}	},	"continent": {		"code": "AS",		"geoname_id": 6255147,		"names": {			"de": "Asien",			"ru": "Азия",			"pt-BR": "Ásia",			"ja": "アジア",			"en": "Asia",			"fr": "Asie",			"zh-CN": "亚洲",			"es": "Asia"		}	},	"country": {		"geoname_id": 1814991,		"is_in_european_union": false,		"iso_code": "CN",		"names": {			"de": "China",			"ru": "Китай",			"pt-BR": "China",			"ja": "中国",			"en": "China",			"fr": "Chine",			"zh-CN": "中国",			"es": "China"		}	},	"location": {		"accuracy_radius": 5,		"latitude": 22.5333,		"longitude": 114.1333,		"time_zone": "Asia/Shanghai"	},	"maxmind": {},	"postal": {},	"registered_country": {		"geoname_id": 1814991,		"is_in_european_union": false,		"iso_code": "CN",		"names": {			"de": "China",			"ru": "Китай",			"pt-BR": "China",			"ja": "中国",			"en": "China",			"fr": "Chine",			"zh-CN": "中国",			"es": "China"		}	},	"represented_country": {		"is_in_european_union": false	},	"subdivisions": [{		"geoname_id": 1809935,		"iso_code": "GD",		"names": {			"en": "Guangdong",			"fr": "Province de Guangdong",			"zh-CN": "广东"		}	}],	"traits": {		"ip_address": "113.87.18.136",		"is_anonymous": false,		"is_anonymous_proxy": false,		"is_anonymous_vpn": false,		"is_hosting_provider": false,		"is_legitimate_proxy": false,		"is_public_proxy": false,		"is_satellite_provider": false,		"is_tor_exit_node": false,		"network": "113.87.18.0/23"	}}

城市获取没问题,经纬度会有些偏差,我们通常想让这个经纬度为这个城市的市中心,这里实现不了。

0
分享到:

评论0

请先

没有账号? 忘记密码?