2009-09-12 2 views
16

Каков наилучший способ получить географическое местоположение в Java (по возможности свободно)?Лучший способ получить геолокацию в Java

Обновление: не с устройства GPS. В основном, как Firefox 3.5/HTML 5 делает это

+0

Что именно вы имеете в виду? Вы хотите получить координаты с устройства GPS или найти местоположение на основе IP-адреса или найти координаты определенных пунктов назначения в базе данных или что-то еще? – Wolfgang

+0

Это для настольного приложения, которое нужно делать в автономном режиме? Или веб-сервисы в порядке? –

+0

веб-сервисы в порядке – yxk

ответ

6

Самая большая база данных WiFi-to-location, вероятно, SkyHook Wireless, используемая Apple и Google для их геолокации. Имеются SDK - см. http://skyhookwireless.com/developers/.

+0

Кажется, что для C++ существует ли версия Java? – yxk

+0

Если вы хотите использовать это, вы, вероятно, можете использовать JNI для вызова собственного кода на C++, однако это, вероятно, уменьшит межплатформенные возможности вашего Java-приложения. –

+3

В настоящее время JNA следует использовать вместо JNI –

2

Если вам нужна локальная база данных, вы можете проверить, что может предложить IPInfoDB.

Если вы можете использовать веб-службу, там есть номер, но я не уверен, что позволяют их Условия предоставления услуг. A Google search for "ip geolocation lookup web service" раскрывает некоторые вещи, но многие из них являются коммерческими продуктами, и вам нужно будет внимательно прочитать их TOS, чтобы убедиться, что вы используете их в рамках рекомендаций.

+0

«Более 99,5% на уровне страны и около 80% на уровне города для США в радиусе 25 миль. База данных, используемая для этого API, скомпилирована из бесплатной базы данных Maxmind CSV (Geolite City) и перестроены многими сценариями ». Хм, кажется, что город прав, карты Google делают это довольно точно, только на милю или около того. – yxk

+0

Конечно, вам нужно периодически обновлять файлы CSV или SQL с помощью IPInfoDB. Но все дело в компромиссах. Ручное обновление баз данных IP и возможность забивать его запросами. –

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)

+0

Ссылка, добавленная в этом ответе, уже мертва – SpringLearner

+0

@SpringLearner: Спасибо! Я должен поместить свой блог в онлайн. Между тем, я обновил ссылку на Wayback Machine. –

+0

Привет @ DenilsonSáMaia Я хочу точно такое же решение, используя java-метод, который принимает ip как аргумент. Можете ли вы указать некоторый указатель? Если вы сможете обеспечить реализацию javascript, это также поможет. –

1

Если я понимаю достаточно хорошо, вы хотите получить географическое местоположение посетителей вашего сайта или веб-приложения. Альтернативы я знаю, являются:

Google Gears имеет некоторые функции, чтобы сделать GeoLocation (http://code.google.com/apis/gears/api_geolocation.html), но необходимо установить Gears

Использование функций JavaScript, которые требуют онлайн сервис, такие как IP-Tools Location (WWW точка iplocationtools точка ком). На сайте есть примеры и даже есть видео-учебник.

+0

Эй @ Миг Эта ссылка кажется мертвой. Любой другой указатель с точно таким же решением? –

4

Лучшая библиотека с открытым исходным кодом для геолокации в Java теперь http://geo-google.sourceforge.net/index.html, основанный на API Google Maps (вам просто нужен ключ Google Maps API, чтобы использовать его)

+0

К сожалению, здесь нет поддержки GeoLocation. Только геокодирование. – Reno

15

простой способ это с керамзита (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 в широта, долгота, город, область и COUNTRYCODE свойствами.

Пожалуйста, ознакомьтесь с их оценкой точности, чтобы убедиться, что она отвечает потребностям вашего проекта: http://www.maxmind.com/en/geolite_city_accuracy.

0

Вы говорите, что все в порядке с веб-сервисами, поэтому вы можете использовать мой 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 для более подробной информации.

0

Вот пример, основанный на API https://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") 
    .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)); 
Смежные вопросы