如何把IP转换成经纬度(Java版)
经常有这种需求,拥有用户的IP地址,想要在地图上显示用户的访问量。这个时候就需要用到经纬度...应为一般的地图插件都是基于经纬度的。
那么问题来了,如何把IP转换成经纬度?
百度API
最国产的方式,就是使用百度API了,百度提供了两种服务:
普通的IP服务:http://lbsyun.baidu.com/index.php?title=webapi/ip-api
https://api.map.baidu.com/location/ip?ak=请输入您的AK&coor=bd09ll
返回值:
{
address: "CN|吉林|长春|None|CERNET|1|None",
content:
{
address: "吉林省长春市",
address_detail:
{
city: "长春市",
city_code: 53,
district: "",
province: "吉林省",
street: "",
street_number: ""
},
point:
{
x: "125.31364243",
y: "43.89833761"
}
},
status: 0
}
精准的服务:http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip
https://api.map.baidu.com/highacciploc/v1?qcip=220.181.38.113&qterm=pc&ak=请输入您的AK&coord=bd09ll
返回值:
{
content: {
location: {
lat: 40.047726,#纬度
lng: 116.313304 #经度
},
locid: "8b1bf81d208bc2ce657fb6e6c270de66",#定位结果唯一ID
radius: 30, #定位结果半径
confidence: 1 #定位结果可信度
},
result: {
error: 161,#定位结果状态码
loc_time: "2016-08-23 15:14:12"#定位时间
}
}
这个API也不是随便问的,首先就需要注册;每个时间段的访问量还有限...因此不适合做数据分析使用。因为数据分析往往是大批量的数据同时去进行经纬度的转换。
Logstash进行转换
Logstash本身提供了IP地址转换成经纬度的功能:
input{
file{
path => "D:\access.json"
start_position => "beginning"
}
}
filter{
json{
source => "message"
}
date{
match => ["time","yyyy-MM-dd HH:mm:ss"]
timezone => "Asia/Shanghai"
}
geoip {
source => "ip"
target => "geoip"
}
}
output{
stdout{
codec => rubydebug
}
}
MaxMind提供的GeoIp服务
这个公司提供了GeoIp的转换服务,当然如果想要精确的匹配也是收费的。
这里有一个体验的网址:https://www.maxmind.com/en/geoip-demo
东拼西凑山寨方案
这个山寨的方案灵感来源于Logstash,Logstash本身提供了IP转换经纬度的功能。原理就是它自己有一个IP数据库,可以通过它执行查询。其实这个数据库时老版的MaxMind提供的数据文件,凑合用吧!新的需要花钱呀!
废话不多说,在Java中想要使用这个数据文件需要下载相应的Jar包和dat文件:
把dat文件放在自己的本地目录,然后项目中导入geoip.jar即可:
import com.maxmind.geoip.Location;
import com.maxmind.geoip.LookupService;
import java.io.IOException;
public class TestMain {
public static void main(String[] args) {
try {
LookupService cl = new LookupService("D:/lib/geoip/GeoLiteCity-2013-01-18.dat", LookupService.GEOIP_MEMORY_CACHE);
Location l2 = cl.getLocation("144.0.9.29");
System.out.println(
"countryCode: " + l2.countryCode +"\n"+
"countryName: " + l2.countryName +"\n"+
"region: " + l2.region +"\n"+
"city: " + l2.city +"\n"+
"latitude: " + l2.latitude +"\n"+
"longitude: " + l2.longitude);
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出内容:
countryCode: CN
countryName: China
region: 25
city: Jinan
latitude: 36.668304
longitude: 116.99719
最后晒一个图,兴奋一下

参考
1 国外Geoip服务 MaxMind:https://www.maxmind.com/en/geoip-demo
2 国内Geoip服务 百度开放API: http://lbsyun.baidu.com/index.php?title=webapi/ip-api
如何把IP转换成经纬度(Java版)的更多相关文章
- IP转换成域名
DNS就是域名解析系统,它可以将IP转换成域名,也可以将域名转换成IP 1. 安装DNS服务 开始—〉设置—〉控制面板—〉添加/删除程序—〉添加/删除Windows组件—〉“网络服务”—〉选择“域名服 ...
- IP转换成LONG 的 问题
如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如 <?php echo ip2long("10.2.1.3"); ?> ...
- Segment(技巧 相乘转换成相加 + java)
Segment Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- 十六进制转换十进制(JAVA版)
解题思路路大概为:现将十六进制数转换为二进制数,再讲二进制数转换为八进制数.在进行十六进制转换为八进制时可以利用JAVA中的‘&’运算符号,一个十六进制数可以表示为四个二进制数,利用‘& ...
- 百度地图API地址转换成经纬度
public class LngAndLatUtil { public static Map<String,Double> getLngAndLat(String address){ Ma ...
- [转]字符型IP地址转换成数字IP的SQL函数
使用SQL函数可以实现许多的功能,下面为您介绍的是字符型IP地址转换成数字IP的SQL函数示例,供您参考,希望对您学习SQL函数能够有所帮助. /**//*--调用示例 sele ...
- Java-Runoob-高级教程-实例-时间处理:04. Java 实例 - 时间戳转换成时间
ylbtech-Java-Runoob-高级教程-实例-时间处理:04. Java 实例 - 时间戳转换成时间 1.返回顶部 1. Java 实例 - 时间戳转换成时间 Java 实例 以下实例演示 ...
- mysql IP转换函数
1.将字符串类型的实际IP转换成十进制数值型的 SELECT INET_ATON('209.207.224.40'); 执行结果:
- php的IP转换成整型函数ip2long()易出现负数
php中将IP转换成整型的函数ip2long()容易出现问题,在IP比较大的情况下,会变成负数.如下<?php$ip = "192.168.1.2";$ip_n = ip2l ...
随机推荐
- SpringMVC 的RequestMapping
Spring MVC之@RequestMapping 详解 2013-10-13 23:39 150698人阅读 评论(6) 收藏 举报 分类: Java 精华文章(161) 目录(?)[+] ...
- 由Selenium1转变为Selenium2所遇到的问题
1.使用ant脚本运行测试,报NoClassDefError,但使用junit方式运行或debug,都没有错误. 原因:找不到包,但具体是哪个包,不清楚:且为何使用junit方式运行就没有问题,也不清 ...
- Struts2之文件上传下载
本篇文章主要介绍如何利用struts2进行文件的上传及下载,同时给出我在编写同时所遇到的一些问题的解决方案. 文件上传 前端页面 <!-- 引入struts标签 --> <%@tag ...
- Changing the Color of Linux ls Command 改变Linux的ls命令显示的颜色
Linux command ls basically use the file /etc/DIR_COLORS or /etc/DIR_COLORS.xterm to define the color ...
- Poj.Grids 2951 浮点数求高精度幂
2951:浮点数求高精度幂 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个实数 R ( 0.0 < R < 99.999 ) ,要求写程序精确计算 R 的 n 次方. ...
- (完全背包 大数)Dollar Dayz (POJ 3181)
http://poj.org/problem?id=3181 Description Farmer John goes to Dollar Days at The Cow Store and disc ...
- MFC 关于如何实现浏览文件
在做界面的时候,如果涉及到文件,就要输入文件的地址 第一种方法是直接输入,嗯...╮( ̄▽ ̄)╭ 第二种方法就是常见的浏览,然后选择文件<( ̄︶ ̄)/ 其代码如下: CString filena ...
- Linux初记
ctrl+u可以在shell下删除行,如果此键不起作用,就试试ctrl+x ctrl+z可以将程序挂起,不会终止程序,但可以将程序挂起. 通过fg命令可再把此作业切换到前台 cp命令的目标文件如果是一 ...
- Java 后台获取当前时间
Calendar c = Calendar.getInstance();//可以对每个时间域单独修改 int year = c.get(Calendar.YEAR); int month = c.ge ...
- install skype4.3 in ubuntu15.04
Canonical Partners repository finally adds support for Ubuntu 15.04. Here’s how to enable the reposi ...