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