как найти геолокацию из ip-адреса в java [duplicate]

Причина в том, что, поместив символ + перед строкой, вы пытаетесь преобразовать строку 'b' в число, что приводит к NaN. Код в вашем вопросе эквивалентен этому:

'a' + Number('b')

Следовательно, Number('b') возвращает NaN, который затем принуждается к строке и добавляется к a. Это поведение является неотъемлемой частью JS, поэтому используемая библиотека (будь то jQuery, node или любой другой) не имеет значения.

17
задан yxk 12 September 2009 в 20:13
поделиться

10 ответов

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

1
ответ дан Ben Dowling 19 August 2018 в 16:50
поделиться

Если вы хотите узнать, как Firefox 3.5 (или Google Chrome) получает геолокацию, пожалуйста, посмотрите здесь: Как работает API геолокации Google / Firefox

В принципе, то, что делает Firefox 3.5 (а также Chrome), - это получить список ближайших сетей Wi-Fi и отправить этот список с помощью JSON в веб-сервис Google, который затем вернет приблизительные координаты.

Кстати , Java не участвует в этом процессе. Чтобы получить геолокацию из Firefox / Chrome, вы просто вызываете несколько методов JavaScript. (Я очень надеюсь, что вы знаете, что Java отличается от JavaScript)

1
ответ дан Denilson Sá Maia 19 August 2018 в 16:50
поделиться
  • 1
    Ссылка, добавленная в этом ответе, сейчас мертва – SpringLearner 14 October 2014 в 07:41
  • 2
    @SpringLearner: Спасибо! Я должен поместить свой блог в онлайн. Между тем, я обновил ссылку на Wayback Machine. – Denilson Sá Maia 14 October 2014 в 14:26
  • 3
    Привет @ DenilsonSáMaia Я хочу точно такое же решение, используя java-метод, который принимает ip как аргумент. Можете ли вы указать некоторый указатель? Если вы сможете обеспечить реализацию javascript, это также поможет. – Shashi Ranjan 7 December 2016 в 15:01

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

6
ответ дан Isaac Waller 19 August 2018 в 16:50
поделиться
  • 1
    Кажется, что для C ++ существует ли версия Java? – yxk 12 September 2009 в 20:19
  • 2
    Если вы хотите использовать это, вы, вероятно, можете использовать JNI для вызова собственного кода на C ++, однако это, вероятно, уменьшит кросс-платформенные возможности вашего Java-приложения. – Thomas Owens 12 September 2009 в 20:23
  • 3
    В эти дни JNA следует использовать вместо JNI – Thorbjørn Ravn Andersen 12 September 2009 в 20:35

Вот пример, основанный на 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));
0
ответ дан Jonathan 19 August 2018 в 16:50
поделиться

Простым способом является использование 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 .

15
ответ дан Marquez 19 August 2018 в 16:50
поделиться

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

4
ответ дан Michael Pereira 19 August 2018 в 16:50
поделиться
  • 1
    К сожалению, здесь нет поддержки GeoLocation. Только геокодирование. – Reno 25 May 2012 в 10:20

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

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

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

1
ответ дан Mig 19 August 2018 в 16:50
поделиться
  • 1
    Hey @Mig Эта ссылка кажется мертвой. Любой другой указатель с точно таким же решением? – Shashi Ranjan 7 December 2016 в 15:04

Я рекомендую использовать http://jgeocoder.sourceforge.net/ , если вы используете svn jgeocoder - Free Java Geocoder

1
ответ дан pudaykiran 19 August 2018 в 16:50
поделиться

вы можете попробовать http://code.google.com/p/mygeoloc/

1
ответ дан Samiulla Shariff 19 August 2018 в 16:50
поделиться

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

Если вы можете использовать веб-службу, там есть номер, но Я не уверен, что позволяют их Условия предоставления услуг. Поиск Google для «веб-службы поиска геолокации ip» раскрывает некоторые вещи, но многие из них являются коммерческими продуктами, и вам нужно будет внимательно прочитать их ToS, чтобы убедиться, что вы используете их в рамках рекомендаций.

2
ответ дан Thomas Owens 19 August 2018 в 16:50
поделиться
  • 1
    «Более 99,5% на уровне страны и около 80% на уровне города для США в радиусе 25 миль. База данных, используемая для этого API, скомпилирована из бесплатной базы данных Maxmind CSV (Geolite City) и перегруппирована со многими сценариями. Хм, кажется, что город прав, карты Google делают это довольно точно, только на милю или около того. – yxk 12 September 2009 в 20:26
  • 2
    Конечно, вам нужно периодически обновлять файлы CSV или SQL с помощью IPInfoDB. Но все дело в компромиссах. Ручное обновление баз данных IP и возможность забивать его запросами. – Thomas Owens 12 September 2009 в 20:56
Другие вопросы по тегам:

Похожие вопросы: