Эта статья о совместном использовании двух web сервисов: IPLoc и Яндекс.Карты.
Прежде всего, разберемся зачем нужны одновременно два сервиса.
С Яндекс.Картами, все просто. Этот сервис позволяет разместить на странице спутниковую или обычную карту. При этом карта будет интерактивной, т.е. посетитель сможет перемещать её, изменять масштаб, тип, измерять расстояния и т.д.
Сервис IPLoc, в свою очередь, позволяет определить географические координаты указанного IP адреса, т.е. широту и долготу. А это как раз те данные, которые нужны чтобы указать точку на Яндекс.Карте.
Примечание. Вместо Яндекс.Карт можно использовать Google Maps, о которых я уже рассказывал. В этот раз я выбрал Яндекс.Карты потому что они содержат более подробные карты с названиями улиц для городов СНГ.
Таким образом, используя оба сервиса одновременно мы можем определить место нахождения посетителя и показать его на карте.
Принцип работы.
1) С помощью IPLoc определяем где находится посетитель.
2) Размещаем на странице Яндекс.Карту.
3) Центрируем карту в соответствии с полученными координатами.
4) Дополнительно можно разместить на карте сообщение (балун) с каким-нибудь текстом, например, названием города.
Получение данных от IPLoc.
Прежде всего нужно сформировать запрос вида
http://iploc.mwudka.com/iploc/ххх.ххх.ххх.ххх/format
Вместо ххх.ххх.ххх.ххх
подставляем нужный IP адрес.
Последний сегмент адреса указывает формат в котором вы хотите получить данные.
С точки зрения обработки PHP скриптом, самым удобным является JSON формам. В этом случае можно преобразовать строку с данными в объект PHP с помощью всего одной функции — json_decode
.
Т.е. запрос примет вид
http://iploc.mwudka.com/iploc/ххх.ххх.ххх.ххх/json
Теперь пару слов об использовании Яндекс.Карт.
Прежде всего, вам придется зарегистрироваться на Яндексе и получить API-ключ.
Примечание. В отличие от Google Maps получить ключ для localhost’а нельзя, поэтому чтобы локально потестировать сайт создайте виртуальный хост, например, http://mysite.l
и получите ключ для него (главное, чтобы имя состояло хотя бы из двух частей, разделенных точкой).
UPD. Тут я ошибся. См. комментарий Андрея Кармацкого.
Переходим к реализации
Создаем PHP скрипт (index.php) со следующим кодом.
<?php $visitorIP = $_SERVER['REMOTE_ADDR']; $location = json_decode(file_get_contents('http://iploc.mwudka.com/iploc/'.$visitorIP.'/json')); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html" /> <meta http-equiv="X-UA-Compatible" content="IE=7"/> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>Где я? :-)</title> <script src="http://api-maps.yandex.ru/1.0/index.xml?key=your_api_key" type="text/javascript"></script> <script type="text/javascript"> window.onload = function() { var map; map = new YMaps.Map(document.getElementById("mymap")); map.setCenter(new YMaps.GeoPoint(<?php echo $location->longitude; ?>, <?php echo $location->latitude; ?>), 13, YMaps.MapType.HYBRID); map.addControl(new YMaps.TypeControl()); map.addControl(new YMaps.Zoom()); map.addControl(new YMaps.ScaleLine()); map.enableRuler(); var text = "<?php echo $location->city; ?>"; map.openBalloon(new YMaps.GeoPoint(<?php echo $location->longitude; ?>, <?php echo $location->latitude; ?>), text); }; </script> </head> <body> <div id="mymap" style="height:400px; width:600px;"></div> </body> </html>
Разберем по порядку работу скрипта.
Строки 2 и 3 – получаем IP адрес посетителя, формируем и отправляем запрос на IPLoc. Функция json_decode преобразует ответ сервиса в объект PHP.
Для справки привожу структуру этого объекта:
object(stdClass)[1]
public 'country_code' => string 'UA' (length=2)
public 'country_code3' => string 'UKR' (length=3)
public 'country_name' => string 'Ukraine' (length=7)
public 'region' => string '13' (length=2)
public 'city' => string 'Kiev' (length=4)
public 'postal_code' => null
public 'latitude' => float 50.4333
public 'longitude' => float 30.5167
public 'area_code' => null
public 'dma_code' => null
Названия свойств говорят сами за себя, поэтому комментировать я их не буду.
После того, как данные получены, создаем страницу. Тут наибольший интерес представляет подключение и настройка карты.
Прежде всего, мы определяем на странице блок в котором будет находится карта. В данном случае это:
<div id="mymap" style="height:400px; width:600px;"></div>
Для вставки карты нужно добавить два тега скрипт. В первом указываем ключ, а во втором – функцию, которая создает и настраивает карту.
Как видите, для работы с картой используется объект YMaps
. Он позволяет изменять любые настройки отображения данной карты.
В данном случае для установки центра карты мы использовали данные от IPLoc (строка 19) метод setCenter
. И затем добавили несколько элементов управления (строки 21 — 23). Кроме того, включили функцию измерения расстояний (строка 24). В данном примере она, конечно, не нужна, но возможности карты демонстрирует очень хорошо 😉
И завершающим этапом добавили название города на карту (строки 25, 26).
Как видите, минимум кода и вполне работоспособный результат 😉
Скачать
Хотите поэкспериментировать? Качайте архив с этим примером.
Перед экспериментами не забудьте указать свой API-ключ.
Обо всех вопросах, замечаниях, предложениях и пожеланиях пишите в комментариях, они отрыты 🙂
До встречи!
Интересно почитать.
Живете в Одессе и хотите создать сайт? Сайты в одессе помогут вам решить эту задачу.
Захист інформації — необхідна умова нормальної роботи будь-якого бізнесу цифровий підпис закон