Каков наилучший способ получить геолокацию на Java (по возможности свободно)?
Обновление: не с устройства GPS. В основном, как Firefox 3.5/HTML 5 делает это
Каков наилучший способ получить геолокацию на Java (по возможности свободно)?
Обновление: не с устройства GPS. В основном, как Firefox 3.5/HTML 5 делает это
Простым способом является использование GeoLite (http://dev.maxmind.com/geoip/legacy/geolite/). Поскольку он использует локальную базу данных, вызовы веб-служб не требуются, и это намного быстрее для геокодирования большого количества 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");
Результат будет в объекте Location в свойствах широты, долготы, города, региона и страны.
Пожалуйста, ознакомьтесь с их оценками точности, чтобы убедиться, что он отвечает потребностям вашего проекта: http://www.maxmind.com/en/geolite_city_accuracy.
Самая большая база данных Wi-Fi-местоположения, вероятно, SkyHook Wireless, используемая Apple и Google для их геолокации. Доступны SDK - см. http://skyhookwireless.com/developers/.
Лучшая библиотека с открытым исходным кодом для Geolocation в Java теперь http://geo-google.sourceforge.net/index.html на основе API карт google (вам просто нужен Google ключ API карты для его использования)
Если вам нужна локальная база данных, вы можете проверить, что IPInfoDB может предложить.
Если вы можете использовать веб-службу, там есть номер, но я не уверен, что позволяют их Условия использования. A Поиск Google для "веб-службы поиска ip-адресов" открывает некоторые вещи, но многие из них являются коммерческими продуктами, и вам нужно будет прочитать их ToS, чтобы убедиться, что вы используете их в рамках рекомендаций.
Если вы хотите узнать, как Firefox 3.5 (или Google Chrome) получает геолокацию, пожалуйста, посмотрите здесь: Как работает API геолокации Google/Firefox
В принципе, Firefox 3.5 (а также Chrome) делает это, чтобы получить список ближайших сетей Wi-Fi и отправить этот список с помощью JSON в веб-сервис Google, который затем вернет приблизительные координаты.
Кстати, Java не участвует в этом процессе. Чтобы получить геолокацию из Firefox/Chrome, вы просто вызываете несколько методов JavaScript. (Я очень надеюсь, что вы знаете, что Java отличается от JavaScript)
Если я понимаю достаточно хорошо, вы хотите получить географическое расположение посетителей на своем сайте или в веб-приложении. Альтернативы, которые я знаю:
Google Gears имеет некоторые функции, чтобы сделать GeoLocation (http://code.google.com/apis/gears/api_geolocation.html), но нужно установить Gears
Использование функций JavaScript, которые вызывают онлайн-сервис, например, инструменты IP-поиска (www dot iplocationtools dot com). На сайте есть примеры и даже есть видео-учебник.
вы можете попробовать http://code.google.com/p/mygeoloc/
Я рекомендую использовать http://jgeocoder.sourceforge.net/ если вы используете svn jgeocoder - бесплатный Java-геокодер
Вот пример, основанный на API ipdata.co, который бесплатен до 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));
Один из лучших клиентов, которыми я когда-либо пользовался, из Ipregistry:
https://github.com/ipregistry/ipregistry-java
Он имеет встроенную поддержку кэширования, работает с Java 8+, а зависимости доступны в Maven Central. Кроме того, обработка ошибок хорошо разработана.
Вы говорите, что все в порядке с веб-службами, поэтому вы можете использовать мой API http://ipinfo.io. Здесь пример вывода JSON для IP-адреса:
$ 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.
Другой веб-сервис RESTful, который я могу порекомендовать, это 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
}