Sypex Geo — быстрое определение города по IP. Определение города посетителя Определение по ip через api

Определение местоположения пользователя – крайне полезная вещь для интернет-магазинов и для лендингов. Но и для простых сайтов будет также интересно сделать, например, автоматическое заполнение поля город, страны и т.д. Собственно, различного рода автозаполнения позволят ускорить регистрацию и оформление заказа.

Установка

Подключаем библиотеку Яндекса:

Парсим данные о местоположении:


window.onload = function () {
jQuery("#user-city").text(ymaps.geolocation.city);
jQuery("#user-region").text(ymaps.geolocation.region);
jQuery("#user-country").text(ymaps.geolocation.country);
}

В том, месте, где нужно вывести город, регион и страну вставляем:

Вы можете просто скопировать все три фрагмента и вставить в одном месте на сайте. Странно, но Я проверял скрипт на демо-сайте и он не выводил никаких данных. Вставив на Урааа, скрипт выдал все данные по городу, региону и стране. Причину почему на демо-сайте скрипт не работал пока не понял.

Если вы хотите сделать автоматическое заполнение города где либо на сайте (например, в форме заказа), то узнайте ID поля и замените его содержимое таким образом:

jQuery("#user-city").val(ymaps.geolocation.city);

Отображать город посетителя для улучшения конверсионных показателей магазина. Готовый код вставки в любое место сайта с указанием города, региона и страны. Я перелапатил много скриптов, но именно этот оказался самым простым и результативным! Я использовал его при создании сайта www.mzm-market.ru , где скрипт выводит «доставка в______»

Втавляем в index.tpl (или на странице доставка) в любом нужном месте cледующий код:



window.onload =function(){
jQuery("#user-city").text(ymaps.geolocation.city);
jQuery("#user-region").text(ymaps.geolocation.region);
jQuery("#user-country").text(ymaps.geolocation.country);}


Вывод производится с помощью:

// страна, город, регион.
geolocation.country, geolocation.city, geolocation.region

Хочу немного дополнить данный пост (редакция от 18.02.2017).

При использовании вышеописанного скрипта во многих городах и браузерах просто ничего не отображалось и после долгих поисков я нашел наверное самый работоспособный скрипт определение страны, региона, города через яндекс API. Проверял его через своих клиентов, которые находятся практически по всей России и за её пределами и этот скрипт показал себя отлично! Вот скриншот моего клиента:

Сами понимаете что всё опредилилось чётко! Ну не буду вас мучать писаниной и приведу пример!

js Определение страны, области, города через яндекс API

Просто вставьте этот код между тегами




$(document).ready(function(){
ymaps.ready(function(){
var geolocation = ymaps.geolocation;
$("#cou").html("Ваша страна: "+geolocation.country);
$("#tow").html("Ваш город: "+geolocation.city);
$("#reg").html("Ваш регион: "+geolocation.region);
});
});

А этот код в нужное место на своей странице:

Ваша страна: ... определяется...
Ваш город: ... определяется...
Ваш регион: ... определяется...

Демонстрация

Ваша страна: ... определяется...

Ваш город: ... определяется...

Ваш регион: ... определяется...

Скрипт работает без проблем, но возможно, что для тех кто находится в маленьких селениях скорее всего город определиться неверно, а будет определён город вашего интернет провайдера.

В которой упоминался мой «велосипед» отличающийся высокой скоростью работы. Одним из популярных вопросов стала возможность определения города по IP.

И вот несколько месяцев спустя, проект начинавшийся, как «for fun» перерос в самостоятельный проект.
Открыт отдельный сайт посвященный проекту Sypex Geo , на котором можно скачать свежие версии API и баз данных, а также ознакомиться с документацией.

Для желающих скорее протестировать правильность определения города по IP - вот ссылка на демо-страницу . А под хабракатом, я опишу некоторые технические подробности и приведу результаты небольшого тестирования.

Формат Sypex Geo 2.1 С момента публикации последней статьи, формат Sypex Geo (сокращенно SxGeo) был оптимизирован, а также добавлена возможность включения в БД двух справочников - городов и регионов.

При создании нового формата, ставились следующие приоритеты:

  • высокая скорость
  • низкое потребление ресурсов
  • открытость (спецификации формата бинарного файла БД и API открыты)
  • универсальность (возможность создания баз данных с любыми наборами данных)
Формат позволяет хранить данные в разной кодировке. После выхода из беты, будут опубликованы скрипты для конвертирования базы данных из MySQL в бинарный файл БД.

В БД хранится следующая информация:

  • ID страны
  • Код страны ISO 3166-1 (двухсимвольный)
  • Код региона FIPS 10-4 (двухсимвольный)
  • Название региона (опционально)
  • Город
  • Широта
  • Долгота
  • Timezone (опционально)
Этот список может быть изменен и/или расширен при необходимости. Более подробную информацию о формате SxGeo 2.1 можно найти на сайте. Собственная база данных После весьма близкого знакомства с популярной системой геолокации GeoLite City от MaxMind, было принято решение о создании собственной базы данных. Проблема заключается в том, что в GeoLite City очень много неточностей, мусора, городов дубликатов, излишнего дробления диапазонов, а также проблем с городами бывшего СССР (например, вместо городов взяты названия фирм или имена ответственных из Whois).

В данный момент база основана на GeoLite City, но уже содержит полностью переработанное покрытие России, Украины и Беларуси. Постепенно будут уточняться другие страны, в первую очередь СНГ и Европа. База данных Sypex Geo City содержит названия городов и регионов на русском языке в UTF-8 (встречаются еще не переведенные названия), а также timezone.

Кроме того на сайте доступны другие базы данных преобразованные в формат SxGeo 2.1.

Использование Использование Sypex Geo API максимально упрощено.
1. Скопировать SxGeo.php и SxGeoCity.dat (или другие базы) на сервер 2. Подключить файл SxGeo.php в свой скрипт, добавив строку include("SxGeo.php"); 3. Создать объект SxGeo //$SxGeo = new SxGeo(); // Режим по умолчанию, файл бд SxGeo.dat $SxGeo = new SxGeo("SxGeoCity.dat", SXGEO_BATCH | SXGEO_MEMORY); // Самый быстрый режим 4. Определяем город (SxGeo City, GeoLite City, IpGeoBase) $SxGeo->get($ip); (возвращает информацию о городе, без названия региона и временной зоны) // $SxGeo->getCityFull($ip); (возвращает полную информацию о городе и регионе) Тестирование производительности И на десерт, небольшое сравнительное тестирование производительности. В качестве оппонентов выступают GeoLite API и Geobaza API. Все участники тестирования используют бинарную базу данных собственного формата, и используют API на PHP. Тестирование проходит под Win 7 (на Linux пропорции сохраняются), PHP 5.2.17.

Результаты после 10 прогонов для каждого API в двух режимах (обычном и с кэшированием в памяти) усреднения и округления до десятков. Для каждого прогона создается массив из 50 000 случайных IP адресов, и в цикле осуществляется поиск каждым алгоритмом.

Предложение и пожелание приветствуются. Также ищутся желающие помочь с портированием API на другие языки, и созданием модулей для Apache и nginx.

В которой упоминался мой «велосипед» отличающийся высокой скоростью работы. Одним из популярных вопросов стала возможность определения города по IP.

И вот несколько месяцев спустя, проект начинавшийся, как «for fun» перерос в самостоятельный проект.
Открыт отдельный сайт посвященный проекту Sypex Geo , на котором можно скачать свежие версии API и баз данных, а также ознакомиться с документацией.

Для желающих скорее протестировать правильность определения города по IP - вот ссылка на демо-страницу . А под хабракатом, я опишу некоторые технические подробности и приведу результаты небольшого тестирования.

Формат Sypex Geo 2.1 С момента публикации последней статьи, формат Sypex Geo (сокращенно SxGeo) был оптимизирован, а также добавлена возможность включения в БД двух справочников - городов и регионов.

При создании нового формата, ставились следующие приоритеты:

  • высокая скорость
  • низкое потребление ресурсов
  • открытость (спецификации формата бинарного файла БД и API открыты)
  • универсальность (возможность создания баз данных с любыми наборами данных)
Формат позволяет хранить данные в разной кодировке. После выхода из беты, будут опубликованы скрипты для конвертирования базы данных из MySQL в бинарный файл БД.

В БД хранится следующая информация:

  • ID страны
  • Код страны ISO 3166-1 (двухсимвольный)
  • Код региона FIPS 10-4 (двухсимвольный)
  • Название региона (опционально)
  • Город
  • Широта
  • Долгота
  • Timezone (опционально)
Этот список может быть изменен и/или расширен при необходимости. Более подробную информацию о формате SxGeo 2.1 можно найти на сайте. Собственная база данных После весьма близкого знакомства с популярной системой геолокации GeoLite City от MaxMind, было принято решение о создании собственной базы данных. Проблема заключается в том, что в GeoLite City очень много неточностей, мусора, городов дубликатов, излишнего дробления диапазонов, а также проблем с городами бывшего СССР (например, вместо городов взяты названия фирм или имена ответственных из Whois).

В данный момент база основана на GeoLite City, но уже содержит полностью переработанное покрытие России, Украины и Беларуси. Постепенно будут уточняться другие страны, в первую очередь СНГ и Европа. База данных Sypex Geo City содержит названия городов и регионов на русском языке в UTF-8 (встречаются еще не переведенные названия), а также timezone.

Кроме того на сайте доступны другие базы данных преобразованные в формат SxGeo 2.1.

Использование Использование Sypex Geo API максимально упрощено.
1. Скопировать SxGeo.php и SxGeoCity.dat (или другие базы) на сервер 2. Подключить файл SxGeo.php в свой скрипт, добавив строку include("SxGeo.php"); 3. Создать объект SxGeo //$SxGeo = new SxGeo(); // Режим по умолчанию, файл бд SxGeo.dat $SxGeo = new SxGeo("SxGeoCity.dat", SXGEO_BATCH | SXGEO_MEMORY); // Самый быстрый режим 4. Определяем город (SxGeo City, GeoLite City, IpGeoBase) $SxGeo->get($ip); (возвращает информацию о городе, без названия региона и временной зоны) // $SxGeo->getCityFull($ip); (возвращает полную информацию о городе и регионе) Тестирование производительности И на десерт, небольшое сравнительное тестирование производительности. В качестве оппонентов выступают GeoLite API и Geobaza API. Все участники тестирования используют бинарную базу данных собственного формата, и используют API на PHP. Тестирование проходит под Win 7 (на Linux пропорции сохраняются), PHP 5.2.17.

Результаты после 10 прогонов для каждого API в двух режимах (обычном и с кэшированием в памяти) усреднения и округления до десятков. Для каждого прогона создается массив из 50 000 случайных IP адресов, и в цикле осуществляется поиск каждым алгоритмом.

Предложение и пожелание приветствуются. Также ищутся желающие помочь с портированием API на другие языки, и созданием модулей для Apache и nginx.

Обновление от 05.02.2016

В данный момент API Карт, подключаемое в панели управления uCoz возвращает только страну и координаты посетителя.

О заметке

Определение местоположения покупателя - одна из важнейших задач в электронной коммерции.

В заметке будем рассматривать способ определения страны, региона и города посетителя для сайта. Вся информация получена из песочницы API Яндекс.Карт , мы просто ее подготовим для магазина uCoz.

Подключение сервиса Яндекс.Карты

В первую очередь необходимо подключить сервис карт в панели управления сайтом. Для этого переходим в настройки интернет магазина.

В настройках листаем вниз страницы и выбираем в пункте "Использовать сервис карт:" - Yandex Maps.

Теперь необходимо получить API ключ для интернет магазина, нам предложено перейти по ссылке "Получить ключ для выбранного API". Сделаем это.

На открывшейся странице заполняем данные и нажимаем "Получить API ключ".

Определение местоположения

В первую очередь необходимо в head страницы (например, оформления заказа) поместить код:

Теперь размещаем сам скрипт определения местоположения.

Дожидаемся загрузки API и готовности DOM.

Ymaps.ready(init);

Записываем местоположение:

Function init() {  // Данные о местоположении, определённом по IP   var geolocation = ymaps.geolocation;  // Результат смотрим в консоли   console.log(geolocation.country, geolocation.city, geolocation.region); }

После того, как мы получили данные о местоположении, мы можем делать с ними все, что захотим: заполнить за пользователя форму заказа, отобразить особые условия доставки, скрыть ненужные способы оплаты, показать стоимость доставки на странице товара.

Переменная Описание
geolocation.country Страна
geolocation.region Регион
geolocation.city Город
Автозаполнение адреса доставки

Расширим наш скрипт, чтобы облегчить пользователям оформление заказа, внесем полученные данные о местоположении в поле формы "Адрес доставки".

Для этого нам нужно знать id поля с адресом доставки, для этого заходим в Панель управления сайтом - Интернет магазин - Управление полями заказа. Смотрим последнюю перед символом "$" цифру в "Код поля для шаблона":

Итого

Объединим все вместе и получим:

Ymaps.ready(init); function init() {  var geolocation = ymaps.geolocation;  if (geolocation) {  $("#order-fld-2").html(geolocation.country + ", " + geolocation.region + ", " + geolocation.city);  } else {  console.log("Не удалось установить местоположение");  } }

И не забудьте заменить id поля на свой и подключить в head страницы. Удачи!