Каков наилучший способ получить географическое местоположение в Java (по возможности свободно)?Лучший способ получить геолокацию в Java
Обновление: не с устройства GPS. В основном, как Firefox 3.5/HTML 5 делает это
Каков наилучший способ получить географическое местоположение в Java (по возможности свободно)?Лучший способ получить геолокацию в Java
Обновление: не с устройства GPS. В основном, как Firefox 3.5/HTML 5 делает это
Самая большая база данных WiFi-to-location, вероятно, SkyHook Wireless, используемая Apple и Google для их геолокации. Имеются SDK - см. http://skyhookwireless.com/developers/.
Кажется, что для C++ существует ли версия Java? – yxk
Если вы хотите использовать это, вы, вероятно, можете использовать JNI для вызова собственного кода на C++, однако это, вероятно, уменьшит межплатформенные возможности вашего Java-приложения. –
В настоящее время JNA следует использовать вместо JNI –
Если вам нужна локальная база данных, вы можете проверить, что может предложить IPInfoDB.
Если вы можете использовать веб-службу, там есть номер, но я не уверен, что позволяют их Условия предоставления услуг. A Google search for "ip geolocation lookup web service" раскрывает некоторые вещи, но многие из них являются коммерческими продуктами, и вам нужно будет внимательно прочитать их TOS, чтобы убедиться, что вы используете их в рамках рекомендаций.
«Более 99,5% на уровне страны и около 80% на уровне города для США в радиусе 25 миль. База данных, используемая для этого API, скомпилирована из бесплатной базы данных Maxmind CSV (Geolite City) и перестроены многими сценариями ». Хм, кажется, что город прав, карты Google делают это довольно точно, только на милю или около того. – yxk
Конечно, вам нужно периодически обновлять файлы CSV или SQL с помощью IPInfoDB. Но все дело в компромиссах. Ручное обновление баз данных IP и возможность забивать его запросами. –
Если вы хотите знать, как 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)
Ссылка, добавленная в этом ответе, уже мертва – SpringLearner
@SpringLearner: Спасибо! Я должен поместить свой блог в онлайн. Между тем, я обновил ссылку на Wayback Machine. –
Привет @ DenilsonSáMaia Я хочу точно такое же решение, используя java-метод, который принимает ip как аргумент. Можете ли вы указать некоторый указатель? Если вы сможете обеспечить реализацию javascript, это также поможет. –
Если я понимаю достаточно хорошо, вы хотите получить географическое местоположение посетителей вашего сайта или веб-приложения. Альтернативы я знаю, являются:
Google Gears имеет некоторые функции, чтобы сделать GeoLocation (http://code.google.com/apis/gears/api_geolocation.html), но необходимо установить Gears
Использование функций JavaScript, которые требуют онлайн сервис, такие как IP-Tools Location (WWW точка iplocationtools точка ком). На сайте есть примеры и даже есть видео-учебник.
Эй @ Миг Эта ссылка кажется мертвой. Любой другой указатель с точно таким же решением? –
Лучшая библиотека с открытым исходным кодом для геолокации в Java теперь http://geo-google.sourceforge.net/index.html, основанный на API Google Maps (вам просто нужен ключ Google Maps API, чтобы использовать его)
К сожалению, здесь нет поддержки GeoLocation. Только геокодирование. – Reno
вы могли бы попробовать http://code.google.com/p/mygeoloc/
I рекомендуется использовать http://jgeocoder.sourceforge.net/ , если вы используете SVN jgeocoder - Free Java Geocoder
простой способ это с керамзита (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.
Вы говорите, что все в порядке с веб-сервисами, поэтому вы можете использовать мой 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 для более подробной информации.
Вот пример, основанный на 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));
Что именно вы имеете в виду? Вы хотите получить координаты с устройства GPS или найти местоположение на основе IP-адреса или найти координаты определенных пунктов назначения в базе данных или что-то еще? – Wolfgang
Это для настольного приложения, которое нужно делать в автономном режиме? Или веб-сервисы в порядке? –
веб-сервисы в порядке – yxk