GeoLite2 Java根据IP获得城市、经纬度

avatar 2020年03月17日19:59:47 3 2317 views
之前我们介绍过通过 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"
}
}

 

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

 

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
可以匿名评论或者登录后台评论,评论回复后会有邮件通知

  

已通过评论:1   待审核评论数:0
  1. avatar Scott

    您好,我想詢問,如果我Centos7要使用,應該如何安裝呢? 感謝您

    • avatar 言曌

      这个跟操作系统关系不大

      • avatar Scott

        您好,主要是我是使用Linux Centos7 环境 最主要是我不清楚解压缩包应该要放在哪个路径底下 以及 Demo 实践那边的Demo 这步骤是如何去做的