如何把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

最后晒一个图,兴奋一下

449064-20161020181335076-1670534887.png

参考

1 国外Geoip服务 MaxMind:https://www.maxmind.com/en/geoip-demo
2 国内Geoip服务 百度开放API: http://lbsyun.baidu.com/index.php?title=webapi/ip-api

本文转自博客园xingoo的博客,原文链接:如何把IP转换成经纬度(Java版),如需转载请自行联系原博主。
相关文章
|
4月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
43 1
|
5月前
|
网络协议 Java
Java的Socket编程:TCP/IP与UDP深入探索
Java的Socket编程:TCP/IP与UDP深入探索
75 0
|
4月前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
50 3
|
3月前
|
Java Redis 数据安全/隐私保护
Redis13的Java客户端-Jedis快速入门,建立连接的写法,ip地址,设置密码密码,选择库的写法
Redis13的Java客户端-Jedis快速入门,建立连接的写法,ip地址,设置密码密码,选择库的写法
|
4月前
|
Java Apache Maven
蓝易云 - java判断ip是否为指定网段
在这个例子中,我们首先创建了一个 `SubnetUtils`对象,它表示一个子网。然后,我们使用 `isInRange`方法来检查指定的IP地址是否在这个子网内。如果IP地址在子网内,`isInRange`方法将返回 `true`,否则返回 `false`。
82 3
|
4月前
|
数据采集 Java 数据安全/隐私保护
使用Java进行网络采集:代理IP与参数传递详解
Java参数传递是按值传递,包括对象引用的值。当传递对象时,方法内部修改对象内容会影响原始对象,但不能改变原始引用。示例展示了如何在爬虫代理中使用此机制,通过`ProxySettings`类传递代理信息,方法内可访问但不能更改原始对象。理解这一机制对编写高效无错的Java代码至关重要。
使用Java进行网络采集:代理IP与参数传递详解
|
5月前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
238 11
|
5月前
|
存储 Java 定位技术
【Java】根据IP地址获取省市
【Java】根据IP地址获取省市
511 1
|
5月前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
5月前
|
Java Python
设置代理ip——java
设置代理ip——java
下一篇
无影云桌面