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

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

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

一个简单的方法是使用GeoLite( http://dev.maxmind.com/geoip/legacy/geolite/ )。 因为它使用本地数据库,所以不需要Web服务调用,并且对于大量IP的地理编码要快得多。

方法如下:

添加这个Maven工件:

 com.maxmind.geoip geoip-api 1.2.11  

从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 。

WiFi 到位的最大数据库可能是SkyHook Wireless ,苹果和谷歌用它们的地理位置。 有SDK可用 – 请参阅http://skyhookwireless.com/developers/ 。

Java中Geolocation的最佳开源库现在是http://geo-google.sourceforge.net/index.html ,基于google maps API(你只需要一个谷歌地图API密钥即可使用它)

如果您需要本地数据库,可以查看IPInfoDB提供的内容。

如果你可以使用网络服务,那里有一些,但我不确定他们的服务条款允许什么。 Google搜索“ip geolocation lookup web service”会出现一些问题,但其中很多都是商业产品,你必须仔细阅读他们的ToS,以确保你在指南中使用它们。

如果我理解得足够好,您希望获得访问您网站或Web应用程序的访问者的地理位置。 我知道的替代方案是:

Google Gears有一些function可以制作GeoLocation( http://code.google.com/apis/gears/api_geolocation.html ),但是需要安装Gears

使用调用IP位置工具(www dot iplocationtools dot com)等在线服务的JavaScript函数。 该网站有示例,甚至还有一个video教程。

你可以尝试http://code.google.com/p/mygeoloc/

如果您使用svn jgeocoder,我建议使用http://jgeocoder.sourceforge.net/ – 免费Java Geocoder

如果您想知道Firefox 3.5(或Google Chrome)如何获得地理位置,请查看此处: Google / Firefox Geolocation API的工作原理

基本上,Firefox 3.5(以及Chrome)的作用是获取附近Wi-Fi网络的列表,并使用JSON将该列表发送到Google Web服务,然后返回近似坐标。

顺便说一下,这个过程中没有Java。 要从Firefox / Chrome获取地理位置,您只需调用一些JavaScript方法即可。 (我真的希望你知道Java与JavaScript不同)

你说你对Web服务没问题,所以你可以使用我的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 。

这是一个基于ipdata.co API的示例, 每天最多 1500个请求。

用你要查找的ip替换8.8.8.8

 // Maven : Add these dependecies to your pom.xml (java6+) //  // org.glassfish.jersey.core // jersey-client // 2.8 //  //  // org.glassfish.jersey.media // jersey-media-json-jackson // 2.8 //  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));