Определение местоположения пользователя по его IP

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

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

Для работы нам потребуется GeoIP. Скачиваем бинарный файл с данными и вот эту вот php’ешную API. Распаковываем архив в проект, в отдельную папку, например geo

Для начала была реализована функция определения IP-адреса, ибо $_SERVER[‘REMOTE _ ADDR’] не всегда предоставляет действительную информацию.

Далее создадим страничку на которой и разместим наш функционал. Допустим, это будет geo-ip-example.php. Код странички следующий:

include("geo/geoipcity.inc");
$gi = geoip_open("geo/GeoLiteCity.dat",GEOIP_STANDARD);
$record = geoip_record_by_addr($gi,getRealIpAddr() );
if( is_null($record) )
{
	print 'Неудалось определить';
}
geoip_close($gi);

Например, для IP 206.130.100.140 (США) информация содержащаяся в массиве будет следующей:

array(
   'country_code' => 'US',
   'country_code3' => 'USA',
   'country_name' => 'United States',
   'region' => 'UT',
   'city' => 'Providence',
   'postal_code' => '84332',
   'latitude' => 41.6929,
   'longitude' => -111.8147,
   'area_code' => 435,
   'dma_code' => 770,
)

Это одна из функций, но она предоставляет самую полную информацию.


Есть функции предоставляющие какую-то определенную информацию, например, определение кода страны по IP-адресу:

geoip_country_code_by_addr($gi,getRealIpAddr() );

Определение названия страны по IP-адресу:

geoip_country_name_by_addr($gi,getRealIpAddr() );

Определение местоположения пользователя по его IP: 19 комментариев

  1. а ничего что файл с базой 25 метров почти весит?

  2. Ну что тут можно сказать, весит то да, да и не уверен я что поиск по нему сильно не нагружает сервер, но это как способ решения, у меня есть еще парсер, который перегоняет все эти данный из данного бинарника в базу данных, тогда и получаешь такую штуку как все города мира разбитые по странам и регионам.

    Может вы знаете другой способ определения широты и долготы местности по её IP? Буду очень рад узнать об альтернативных вариантах

  3. В принципе соглашусь, что ваш метод опрадан в данной ситуации, уж очень подробная инфа нужна о посетителе. Как вариант можно поискать какой нибудь сервис(сходу не нашел под данную задачу, только определение страны и города, пример wipmania.com/ru/), но тут так же возможны проблемы, с быстродействием и прочим

  4. Ну и с данной базой есть еще небольшие проблем с точностью + Москва может быть написана для одного диапазона как Moscow, а для другого как Moskva.
    Но база постоянно обновляется и шлифуется.
    А за ссылку спасибо, будет время изучу доскональней. Скоро напишу о том как я по координатам искал близлежайшие города и салоны

    • Да конечно, если она не противоречит законам и моральным принципам, то любой желающий может обратиться через контактную форму Реклама на блоге

    • Ну конкретно это решение использовалось для следующего: по IP пользователя определялось откуда он пришел и отображались, например,ближайшие точки по карте, которые отметили владельцы салонов как свои заведения. Работало это все вместе с gmap, собственно координаты для этого и брались чтобы показать именно то место на земном шаре откуда пришел юзер

  5. Можно ли на JavaScript определить страну откуда пришёл посетитель и если он входить в список из 5 стран, то отправить его СРАЗУ на страницу сайта на его РОДНОМ языке
    Те кто не попадают в список отправляются на страницу «по умолчанию»
    Спасибо!

    • У меня была похожая задача, но там все сводилось к тому, чтобы определить язык браузера(англ. или фр. — делалось для Канады) и отображать ту или иную кнопку. Такой способ знаю, но он не совсем то, что вам нужно. Да и зачем это делать JavaScript’ом, можно отлично редиректнуть на php

  6. Нашел 2 варианта не требующих познаний в бинарнниках :
    1.скачать программку Wandering IPs например тут ru-admin.net/soft/53545-wandering-ips-v129.html (наверное можно и с оф.сайта,но нужон серийник, а тут он есть) которая сама скачает себе базу данных и на 3D-глобусе рисует трассировки и краткую инфо
    2. скачать тут wipmania.com/plugins плагин для Mozilla, который «Он отображает информацию о физическом расположении веб-сервера страницы, на которой Вы находитесь в данный момент …»
    Поставил! Красотень!!! 🙂

  7. А у меня не работает((((
    Fatal error: Call to undefined function getRealIpAddr()
    Подскажите что может быть.

  8. Люблю тексты в таком духе! Большое спасибо 🙂

  9. Спасибо автору за статью! вечер поисков и вроде как я могу определять широту и долготу юзера, с базой конечно муторно, не скинете парсер для MySQL? Уж очень не хочется чтобы каждый раз данные брались из файла.

    • Ну тут как, парсер там простой переборщик, я не вдавался в тонкости организации этого файла, работает долго, да и с каждым обновлением файла придется «перепаршивать» базу

  10. Прикольно написано, но как говорится, для общей картины нужно как минимум три источника 🙂

  11. Значит всё-таки отреагировали… Не быстро 🙂

Обсуждение закрыто.