在Java中获取地理位置的最佳方法是什么?(如果可能,可以自由)?
更新:不是来自GPS设备。基本上Firefox 3.5 / HTML 5是如何做到的
答案 0 :(得分:16)
一种简单的方法是使用GeoLite(http://dev.maxmind.com/geoip/legacy/geolite/)。因为它使用本地数据库,所以不需要Web服务调用,并且对大量IP进行地理编码要快得多。
以下是:
添加此Maven工件:
<dependency>
<groupId>com.maxmind.geoip</groupId>
<artifactId>geoip-api</artifactId>
<version>1.2.11</version>
</dependency>
从http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
下载地理位置数据文件将文件解压缩到任何文件夹中。然后做:
LookupService cl = new LookupService("/var/geolite/GeoLiteCity.dat",
LookupService.GEOIP_MEMORY_CACHE | LookupService.GEOIP_CHECK_CACHE);
Location location = cl.getLocation("some ip address");
结果将位于纬度,经度,城市,区域和countryCode属性中的Location对象中。
请查看其准确度估算值,以确保其符合您项目的需求:http://www.maxmind.com/en/geolite_city_accuracy。
答案 1 :(得分:6)
最大的WiFi到位数据库可能是SkyHook Wireless,Apple和Google用它们的地理位置。有可用的SDK - 请参阅http://skyhookwireless.com/developers/。
答案 2 :(得分:4)
Java中地理定位的最佳开源库现在是http://geo-google.sourceforge.net/index.html,基于谷歌地图API(您只需使用谷歌地图API密钥即可使用它)
答案 3 :(得分:2)
如果您需要本地数据库,可以查看IPInfoDB提供的内容。
如果您可以使用网络服务,那里有一些数字,但我不确定他们的服务条款允许什么。一个Google search for "ip geolocation lookup web service"出现了一些东西,但其中许多是商业产品,你必须仔细阅读他们的ToS,以确保你在指南中使用它们。
答案 4 :(得分:1)
如果您想了解Firefox 3.5(或Google Chrome)如何获取地理位置,请查看此处:How Google/Firefox Geolocation API works
基本上,Firefox 3.5(以及Chrome)的作用是获取附近Wi-Fi网络的列表,并使用JSON将该列表发送到Google网络服务,然后返回近似坐标。
顺便说一下,这个过程中没有涉及Java。要从Firefox / Chrome获取地理位置,您只需调用一些JavaScript方法即可。 (我真的希望你知道Java与JavaScript不同)
答案 5 :(得分:1)
如果我理解得足够好,您希望获得您网站或网络应用程序的访问者的地理位置。我知道的替代方案是:
Google Gears有一些功能可以进行GeoLocation(http://code.google.com/apis/gears/api_geolocation.html),但需要安装Gears
使用调用IP位置工具(www dot iplocationtools dot com)等在线服务的JavaScript函数。该网站有示例,甚至还有视频教程。
答案 6 :(得分:1)
答案 7 :(得分:1)
答案 8 :(得分:1)
您说您对网络服务没问题,因此您可以使用我的API http://ipinfo.io。以下是IP地址的JSON输出示例:
$ curl ipinfo.io
{
"ip": "24.6.61.239",
"hostname": "c-24-6-61-239.hsd1.ca.comcast.net",
"city": "Mountain View",
"region": "California",
"country": "US",
"loc": "37.3845,-122.0881",
"org": "AS7922 Comcast Cable Communications, LLC",
"postal": "94040"
}
有关详细信息,请参阅https://ipinfo.io/developers。
答案 9 :(得分:1)
以下是基于ipdata.co API的示例,每天最多可提供1500个请求。
将8.8.8.8
替换为您要查找的IP
// Maven : Add these dependecies to your pom.xml (java6+)
// <dependency>
// <groupId>org.glassfish.jersey.core</groupId>
// <artifactId>jersey-client</artifactId>
// <version>2.8</version>
// </dependency>
// <dependency>
// <groupId>org.glassfish.jersey.media</groupId>
// <artifactId>jersey-media-json-jackson</artifactId>
// <version>2.8</version>
// </dependency>
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
Client client = ClientBuilder.newClient();
Response response = client.target("https://api.ipdata.co/8.8.8.8?api-key=test")
.request(MediaType.TEXT_PLAIN_TYPE)
.header("Accept", "application/json")
.get();
System.out.println("status: " + response.getStatus());
System.out.println("headers: " + response.getHeaders());
System.out.println("body:" + response.readEntity(String.class));
答案 10 :(得分:1)
到目前为止,我使用过的最好的客户之一来自Ipregistry:
https://github.com/ipregistry/ipregistry-java
它具有对缓存的本地支持,可与Java 8+一起使用,并且Maven Central上提供了依赖项。此外,错误处理也经过精心设计。
答案 11 :(得分:0)
我推荐的另一个RESTful Web服务是ip-api.com。它支持不同的格式和查询类型,例如http://ip-api.com/json/88.130.57.69返回
{
"query": "88.130.57.69",
"status": "success",
"country": "Germany",
"countryCode": "DE",
"region": "HH",
"regionName": "Hamburg",
"city": "Hamburg",
"district": "",
"zip": "22041",
"lat": 53.5741,
"lon": 10.076,
"timezone": "Europe/Berlin",
"isp": "Versatel Deutschland",
"org": "1&1 Versatel Deutschland GmbH",
"as": "AS8881 1&1 Versatel Deutschland GmbH",
"mobile": false,
"proxy": false
}