Google Maps: Часть 3. Как получить координаты места по адресу. HTML-геокодер для Google Maps JavaScript API v3.

Google Maps: Часть 3. Как получить координаты места по адресу. HTML-геокодер для Google Maps JavaScript API v3. Преобразуем (геокодируем) название места в координаты долготы и широты, пользуясь 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'а.



Другие статьи по этой теме:

Комментарии (1)     Подпишитесь на RSS комментариев к этой статье.

1 комментарий

#1277
Dek говорит:
November 16, 2014 at 05:37 pm
Отлично, спасибо.