在Java中获取地理位置的最佳方法

时间:2009-09-12 19:02:03

标签: java geolocation

在Java中获取地理位置的最佳方法是什么?(如果可能,可以自由)?

更新:不是来自GPS设备。基本上Firefox 3.5 / HTML 5是如何做到的

12 个答案:

答案 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
}