Используем HTML-геокодер для Google Maps JavaScript API v3

Иногда возникает необходимость провести геокодирование группы адресов (определить географические координаты) для последующего их использования в своих проектах.

Это можно сделать используя 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);

Скачать файл markers.sql

Проводить геокодирование мы будем с помощью следующего скрипта:

<?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, Гребной канал&amp;sensor=false ?
  • Гость: Да
  • Гость: У меня вопрос - если будет много записей в БД, ну к примеру 10 тыс. гугл не забанит ? а если забанит, то как можно прогнать такое количество адресов ?
  • Гость: Да у Googla есть ограничения на количество обращений к геокодеру с одного IP, точно не помню, надо смотреть документацию. Вы можете разбить Ваши данные на части и провести геокодирование по частям.
  • Гость: В лицензии об использовании написано, что запрещается записывать и копировать данные геокодера себе в базу. Как вы думаете можно ли как-то частично использовать адреса в публичном проекте не нарушая законодательства?
  • Гость: В принципе возможно частичное использование, в документации даже был пример занесения координат в базу данных с использованием html-геокодера.
  • Гость: Здраствуйте, а можно ли статью с обратным геокодированием, из координат в названия?
  • Гость: почему не видно гуглекарту на сервере, а на локалке видно?