Google Maps: Часть 3. Как получить координаты места по адресу. HTML-геокодер для Google Maps JavaScript API v3.
При создании сайтов туристической тематики, сайтов и приложений о путешествиях, часто имеем дело с базой данных по странам, городам, местам. Чтобы отобразить на карте какое-то место, необходимо знать его координаты (широту и долготу). Вручную добавлять их в базу, дело "велосипедное", ибо даже по прошествии многих лет и столетий точки так незначительно меняют свои координаты, что это нет смысла учитывать.
Способ автоматически получить координаты места по его названию (адресу) - прямое геокодирование.
Нижеописанный способ мы применили на сайте о прекрасных местах мира (Посмотрите страницы со странами). В одной из прошлых статей мы говорили как установить свои значки для меток на Google Maps.
С помощью геокодера для Google Maps JavaScript API v3 проведём геокодирование группы адресов (определим географические координаты для каждого города, страны или любого места) для последующего их использования в своих проектах.
Версия геокодера для Google Maps JavaScript API v3 обеспечивает вывод результатов геокодирования в форматах XML и JSON и не требует использования ключа API.
Запрос производиться по адресу http://maps.google.com/maps/api/geocode/, затем указывается формат ответа xml или json, после него через знак вопроса указывается адрес для геокодирования address=.
После него еще один параметр sensor=false через символ &.
При обратном геокодировании (определении адреса по координатам) вместо адреса указывают значения координат через запятую latlng= 56.3299170,44.0091920.
Подробнее Вы можете прочитать здесь.
Приведу несколько примеров запросов:
1. Запрос к геокодеру с ответом в формате XML (Нижний Новгород)
http://maps.google.com/maps/api/geocode/xml?address=Нижний%20Новгород&sensor=false
2. Запрос к геокодеру с ответом в формате JSON (Нижний Новгород)
http://maps.google.com/maps/api/geocode/json?address=Нижний%20Новгород&sensor=false
3. Запрос — обратное геокодирование с ответом в формате XML
http://maps.google.com/maps/api/geocode/xml?latlng=56.3299170,44.0091920&sensor=false
4. Запрос — обратное геокодирование с ответом в формате JSON
http://maps.google.com/maps/api/geocode/json?latlng=56.3299170,44.0091920&sensor=false
Рассмотрим пример, когда в базе данных MySQL хранятся все записи с адресами (названия страны, города) и напишем php-скрипт геокодера.
В начале нам необходимо создать таблицу с адресами для меток, это можно сделать с помощью SQL-запроса:
CREATE TABLE IF NOT EXISTS `markers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(120) NOT NULL, `address` varchar(160) NOT NULL, `lat` float(10,6) NOT NULL, `lng` float(10,6) NOT NULL, PRIMARY KEY (`id`), FULLTEXT KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Таблица имеет следующие поля:
id – уникальный идентификатор адреса;
name – наименование метки;
address – адрес, который мы будем геокодировать;
lat и lng — значения координат.
Затем, выполняя следующий SQL-запрос, заполним таблицу данными.
INSERT INTO `markers` (`id`, `name`, `address`, `lat`, `lng`) VALUES (1, 'Оазис, ООО "Лига"', ' г. Нижний Новгород, Печеры сл., 177, Гребной канал', 0.000000, 0.000000), (2, 'Крона, кафе, ООО', ' г. Нижний Новгород, Гагарина пр., 25 б', 0.000000, 0.000000), (3, 'Shizgara, караоке-клуб, ООО', ' г. Нижний Новгород, Рождественская ул., 20', 0.000000, 0.000000), (4, 'Cafe, ИП Ушакова Е. В.', ' г. Нижний Новгород, М. Ямская ул., 78 а', 0.000000, 0.000000), (5, '12 стульев, кафе, ООО', ' г. Нижний Новгород, Зеленский съезд, 8/10', 0.000000, 0.000000), (6, '2 х 2, кафе ООО "Аргоф"', ' г. Нижний Новгород, Кирова пр., 6', 0.000000, 0.000000), (7, '3 Пескаря, харчевня, ООО', ' г. Нижний Новгород, Попова героя ул., 39/1', 0.000000, 0.000000), (8, '57-я Параллель, кафе, ООО', ' г. Нижний Новгород, Бурнаковский проезд, 1', 0.000000, 0.000000), (9, '9-е небо, кафе, ИП Щербаков А. Л.', ' г. Нижний Новгород, Ванеева ул., 127', 0.000000, 0.000000), (10, 'ABCafe, кафе ООО "АвтоВолга"', ' г. Нижний Новгород, Родионова ул., 163', 0.000000, 0.000000);
Сам скрипт, проводящий геокодирование и записывающий координаты в нашу базу данных:
<?php //Имя сервера базы данных, обычно localhost $sdb_name = "localhost"; //Имя пользователя - логин для доступа $user_name = "root"; //Пароль доступа $user_password = ""; //Название базы данных $db_name = "gmap_bd"; // соединение с сервером базы данных if(!$link = mysql_connect($sdb_name, $user_name, $user_password)) { echo "<br>Не могу соединиться с сервером базы данных<br>"; exit(); } // выбираем базу данных if(!mysql_select_db($db_name, $link)) { echo "<br>Не могу выбрать базу данных<br>"; exit(); } mysql_query('SET NAMES utf8'); // Выборка данных из таблицы $addresses = mysql_query('SELECT * FROM markers') or die('Ошибка при выполнении запроса к таблице markers": '.mysql_error()); // Общее количество адресов и количество адресов, в обработке которых произошла ошибка $countGeocode = $countGeocodeFault = 0; // Обработка адресов $result = '<table style="width:600px">'; while ($row = mysql_fetch_assoc($addresses)) { $countGeocode++; // Обращение к http-геокодеру $xml = simplexml_load_file('http://maps.google.com/maps/api/geocode/xml?address='.$row["address"].'&sensor=false'); // Если геокодировать удалось, то записываем в БД $status = $xml->status; echo $xml; if ($status == 'OK') { $lat = $xml->result->geometry->location->lat; $lng = $xml->result->geometry->location->lng; $result .= '<tr><td>'.$row['address'].'</td><td>'.$lat.', '.$lng.'</td></tr>'; mysql_query("UPDATE markers SET lat = '$lat', lng = '$lng' WHERE id = '$row[id]'") or die("Ошибка при обновлении данных в таблице: ".mysql_error()); } else { $result .= '<tr style="color:red"><td>'.$row['address'].'</td><td>ошибка</td></tr>'; $countGeocodeFault++; } }; $result .= '</table>'; // Вывод результата echo $result; // Закрытие соеденинения с сервером mysql_close($dp); // Вывод общего количество прогеокодированных результатов if ($countGeocode) { echo '<div style="margin-top:1em">Всего обработано адресов: '.$countGeocode.'</div>'; if ($countGeocodeFault) { echo '<div style="color:red">Не удалось прогеокодировать: '.$countGeocodeFault.'</div>'; } } else { echo '<div>Таблица с адресами пуста.</div>'; } ?>
Скачать файл html-geocoder.php (сохраняйте его с расширением .php)
Измените данные доступа к базе данных на свои.
Вот что у нас получилось для сайта lovelyplaces.ru:
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 Composer – пакетный менеджер PHP. Что и как? (22.07.2014)
- 0 MySQL и PHP: Вычисление возраста (количество лет) по дате рождения (20.06.2017)
- 0 Как изменить часовой пояс на сервере (16.11.2013)
- 0 PHP: Как удалить файлы по маске? (07.11.2013)
- 0 Регулярные выражения в PHP (12.04.2014)
- 0 Защита от спама в phpBB3 без капчи (09.10.2013)
- 0 Php функция implode внутри запроса SELECT к MySQL. (02.09.2013)
- 0 Как убрать папку www из денвера? (22.03.2013)
- 0 Устанавливаем и настраиваем WampServer (аналог MAMP в Mac и возможная замена Denwer'у) на Windows (22.03.2013)
- 0 Полезные возможности PhpStorm и настройка горячих клавиш (14.03.2013)
- Артефакты при ресайзе библиотекой GD изображений с однородным (белым) фоном (07.12.2017)
- Задаем область печати документа для PHPExcel (05.12.2017)
- Как включить SSL и сделать редирект на HTTPS. На примере Opencart 2 (03.12.2017)
- Смена кодировки Битрикса с windows-1251 в UTF-8 (utf8) (01.12.2017)
- Свой дизайн кнопок социальных сетей для сайта. Кнопки "Поделиться" (19.06.2017)
- Ошибка: Invalid argument supplied for foreach() in ... (09.04.2017)
- Загрузка файлов (картинок) по ajax через форму для Opencart (04.09.2016)
- Модальное окно Bootstrap 3 с формой, отправляющей email по Ajax (JQuery/PHP/HTML5/JqBootstrapValidation) (20.08.2015)
- VQmod — да или нет? (29.08.2014)
- Настройка PhpStorm для работы с Yii (24.02.2013)
- Флаги в подстановке директивы модуля - RewriteRule в файле .htaccess. Важность флага QSA. (02.01.2013)
- Как корректно вставить в MySQL текст с кавычками, используя PHP? (06.12.2012)
- Как объединить два массива в один на PHP (слить элементы массивов) (18.09.2012)
- Команды для сron job (для планировщика Cron на хостинге) (29.08.2012)
- Отправка сообщений в Twitter через php (13.08.2012)
1 комментарий