Иногда возникает необходимость провести геокодирование группы адресов (определить географические координаты) для последующего их использования в своих проектах.
Это можно сделать используя HTML-геокодер.
Версия геокодера для 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.
В начале нам необходимо создать таблицу с адресами для меток, это можно сделать с помощью 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 — значения координат.
Затем заполнить таблицу данными.
Например, такими:
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
Перед запуском необходимо внести Ваши параметры доступа к базе данных в строки
//Имя сервера базы данных, обычно localhost $sdb_name = "localhost"; //Имя пользователя - логин для доступа $user_name = "root"; //Пароль доступа $user_password = ""; //Название базы данных $db_name = "gmap_bd"; |
После этого необходимо выполнить скрипт и в окне браузера будут выведены найденные координаты, а также сообщения об ошибках, если геокодирование некоторых адресов выполнить не удалось.
Одновременно обновятся данные о координатах в таблице markers базы данных.
Для написания заметки использовалась статья о создании аналогичного решения для API Яндекс.Карт «Получение координат для списка адресов».
Здравствуйте. У меня есть вопрос, может глупый но я не могу разщбраться, получается, что запрос выглядит так:
http://maps.google.com/maps/api/geocode/xml?address=г. Нижний Новгород, Печеры сл., 177, Гребной канал&sensor=false ?
Да
У меня вопрос — если будет много записей в БД, ну к примеру 10 тыс. гугл не забанит ? а если забанит, то как можно прогнать такое количество адресов ?
Да у Googla есть ограничения на количество обращений к геокодеру с одного IP, точно не помню, надо смотреть документацию. Вы можете разбить Ваши данные на части и провести геокодирование по частям.
В лицензии об использовании написано, что запрещается записывать и копировать данные геокодера себе в базу.
Как вы думаете можно ли как-то частично использовать адреса в публичном проекте не нарушая законодательства?
В принципе возможно частичное использование, в документации даже был пример занесения координат в базу данных с использованием html-геокодера.