Причина в том, что, поместив символ +
перед строкой, вы пытаетесь преобразовать строку 'b'
в число, что приводит к NaN
. Код в вашем вопросе эквивалентен этому:
'a' + Number('b')
Следовательно, Number('b')
возвращает NaN
, который затем принуждается к строке и добавляется к a
. Это поведение является неотъемлемой частью JS, поэтому используемая библиотека (будь то jQuery, node или любой другой) не имеет значения.
Вы говорите, что все в порядке с веб-службами, поэтому вы можете использовать мой 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 .
Если вы хотите узнать, как Firefox 3.5 (или Google Chrome) получает геолокацию, пожалуйста, посмотрите здесь: Как работает API геолокации Google / Firefox
В принципе, то, что делает Firefox 3.5 (а также Chrome), - это получить список ближайших сетей Wi-Fi и отправить этот список с помощью JSON в веб-сервис Google, который затем вернет приблизительные координаты.
Кстати , Java не участвует в этом процессе. Чтобы получить геолокацию из Firefox / Chrome, вы просто вызываете несколько методов JavaScript. (Я очень надеюсь, что вы знаете, что Java отличается от JavaScript)
Самая большая база данных WiFi для местоположения, вероятно, SkyHook Wireless , используемая Apple и Google для их геолокации. Доступны SDK - см. http://skyhookwireless.com/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));
Простым способом является использование 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 .
Лучшая библиотека с открытым исходным кодом для Geolocation в Java теперь http://geo-google.sourceforge.net/index.html , основанная на API карт google (вам просто нужен Google ключ API карты для его использования)
Если я понимаю достаточно хорошо, вы хотите получить географическое расположение посетителей на своем сайте или в веб-приложении. Альтернативы, которые я знаю:
Google Gears имеет некоторые функции для создания GeoLocation ( http://code.google.com/apis/gears/api_geolocation.html ), но нужно для установки Gears
Использование функций JavaScript, которые вызывают онлайн-сервис, такой как инструменты IP-поиска (www dot iplocationtools dot com). На сайте есть примеры и даже есть видео-учебник.
Я рекомендую использовать http://jgeocoder.sourceforge.net/ , если вы используете svn jgeocoder - Free Java Geocoder
вы можете попробовать http://code.google.com/p/mygeoloc/
Если вам нужна локальная база данных, вы можете проверить, что IPInfoDB может предложить.
Если вы можете использовать веб-службу, там есть номер, но Я не уверен, что позволяют их Условия предоставления услуг. Поиск Google для «веб-службы поиска геолокации ip» раскрывает некоторые вещи, но многие из них являются коммерческими продуктами, и вам нужно будет внимательно прочитать их ToS, чтобы убедиться, что вы используете их в рамках рекомендаций.