根据ip获取地理位置信息,不用http和webservice接口,减少请求时间。我们可以利用了GeoLite2 库,GeoLite2 数据库是一个免费的 IP 地理定位数据库,GeoLite2 Country 与 City 数据库在每月的第一个周二更新。GeoLite2 ASN 数据库的更新时间为每周二。
数据库下载 : https://dev.maxmind.com/zh-hans/geoip/geoip2/geolite2/#i
java文档: http://maxmind.github.io/GeoIP2-java/
以下是一个工具类demo
-
首先将下载好的文件放置的resources 目录下,这利用的是city数据库
-
工具类编写
/**
-
ip地理坐标获取工具类
*/
public class Geoip2Client {public static Map<String,Object> getGenIp(String ipAddr){
Map<String,Object> result = new HashMap<>();
try{
String dbPath = this.getClass().getClassLoader().getResource(“GeoLite2-City.mmdb”).getPath();
// 这是GeoIP2 或 GeoLite2 database 文件所在的位置 ,此处从项目resources路径下获取,当然也可以写成绝对路径
File database = new File(dbPath);DatabaseReader reader = new DatabaseReader.Builder(database).withCache(new CHMCache()).build(); InetAddress ipAddress = InetAddress.getByName(ipAddr); CityResponse response = reader.city(ipAddress); Country country = response.getCountry(); Subdivision subdivision = response.getMostSpecificSubdivision(); City city = response.getCity(); Location location = response.getLocation(); result.put("lat",location.getLatitude());//纬度 result.put("long",location.getLongitude()); // 经度 result.put("country",country.getNames().get("zh-CN"));// 国家名 result.put("subdivision",subdivision.getNames().get("ja"));//省份 result.put("city",city.getNames().get("ja")); // 城市 } catch( Exception e){ e.printStackTrace(); } return result;
}
}