Иногда возникает необходимость провести геокодирование группы адресов (определить географические координаты) для последующего их использования в своих проектах.
Это можно сделать используя 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-геокодера.