Лучший способ получить геолокацию в 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). На сайте есть примеры и даже есть видео-учебник.

Ответ 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
}