Клуб API Карт

Получение координат для списка адресов

rodlex
27 июля 2010, 17:38
В блоге опубликована статья с примером множественного геокодирования с использованием PHP и MySQL
Получение координат для списка адресов

В данной статье  будет рассмотрен вариант получения координат для списка адресов с использованием PHP и MySQL. Полученные координаты можно будет использовать для отображения на карте списка ваших объектов (например, местоположение офисов компании, пользователей и пр.). Если вы хотите обрабатывать массивы адресов на клиенте, обратите внимание на статью «Множественное геокодирование».

Для начала необходимо создать таблицу и занести в нее адреса, для которых требуется определить координаты. Например, назовем ее addresses.

Внимание. Если у вас есть таблица, содержащая адреса, которые необходимо геокодировать, то вы можете добавить в нее поле coords и перейти к настройке скрипта.

Таблица имеет три поля:

  • id – уникальный идентификатор адреса;
  • address – адрес, который необходимо геокодировать;
  • coords – координаты.
Создать таблицу можно, используя любую оболочку управления БД (например, phpMyAdmin), либо выполнив следующий sql-код:
CREATE TABLE `addresses` (
  `id` int(3) NOT NULL auto_increment,
  `address` varchar(1000) NOT NULL,
  `coords` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Далее заполните таблицу адресами, например, так:

INSERT INTO `addresses` VALUES (1, 'Москва, ул. Льва Толстого, 16', '');

INSERT INTO `addresses` VALUES (2, 'Санкт-Петербург, Свердловская набережная, 44', '');

INSERT INTO `addresses` VALUES (3, 'Екатеринбург, ул. Хохрякова, 10', '');

INSERT INTO `addresses` VALUES (4, 'Новосибирск, ул. Красноярская, 35', '');

INSERT INTO `addresses` VALUES (5, 'Казань, ул. Спартаковская 6, 11', '');

INSERT INTO `addresses` VALUES (6, 'Киев, ул. Луначарского, 4', '');

INSERT INTO `addresses` VALUES (7, 'Одесса, пр. Шевченко, дом 4-Д', '');

INSERT INTO `addresses` VALUES (8, 'Симферополь, ул. Героев Аджимушкая, 6/13', '');

INSERT INTO `addresses` VALUES (9, 'абракадабра', '');

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

<?

    // Параметры

    $config = Array(

        'host' => 'localhost',

        'user' => 'root',

        'password' => '',

        'dbname' => 'test',

        'tablename' => 'addresses',

        'apikey' => 'ВАШ API-КЛЮЧ'

    

    // Соединение с сервером СУБД

    $dp = mysql_connect($config['host'], $config['user'], $config['password']) or die('Ошибка при подключении к серверу СУБД: '.mysql_error()

    // Выбор нужной БД

    mysql_select_db($config['dbname']) or die('Невозможно выбрать БД с именем "'.$config['dbname'].'": '.mysql_error()

    // Назначение кодировки

    mysql_query('SET NAMES utf8');

    // Выборка данных из таблицы

    $addresses = mysql_query('SELECT * FROM '.$config['tablename']) or die('Ошибка при выполнении запроса к таблице "'.$config['tablename'].'": '.mysql_error()

    // Общее количество адресов и количество адресов, в обработке которых произошла ошибка

    $countGeocode = $countGeocodeFault = 0;

    // Обработка адресов

    $result = '<table style="width:600px">';

    while ($row = mysql_fetch_assoc($addresses)) {

        $countGeocode++;

        // Обращение к http-геокодеру

        $xml = simplexml_load_file('http://geocode-maps.yandex.ru/1.x/?geocode='.urlencode($row["address"]).'&key='.urlencode($config['apikey']).'&results=1');

        // Если геокодировать удалось, то записываем в БД

        $found = $xml->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found;

        if ($found > 0) {

            $coords = str_replace(' ', ',', $xml->GeoObjectCollection->featureMember->GeoObject->Point->pos);

            $result .= '<tr><td>'.$row['address'].'</td><td>'.$coords.'</td></tr>';

            mysql_query("UPDATE `{$config['tablename']}` SET coords = '".mysql_real_escape_string($coords)."' 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>';

    }

?>Скачать php-файл

Перед запуском скрипта необходимо прописать ваши параметры доступа к БД, а также указать API-ключ (получить ключ можно с помощью специальной формы

$config = Array(

    'host' => 'localhost',

    'user' => 'root',

    'password' => '',

    'dbname' => 'test',

    'tablename' => 'addresses',

    'apikey' => 'ВАШ API-КЛЮЧ'

После внесения изменений выполните скрипт.

В окно браузера будет выведены найденные координаты и сообщения об ошибках, если некоторые адреса прогеокодировать не удалось. Также скрипт обновит записи в таблице, добавив найденные координаты.

Рассмотренный скрипт демонстрирует пример геокодирования списка адресов. Вы можете его модернизировать и изменять по своему усмотрению.

Если у вас возникли вопросы при использовании предложенного скрипта, то вы их всегда можете задать в нашем клубе разработчиков.