В данной статье будет рассмотрен вариант получения координат для списка адресов с использованием 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, 'абракадабра', '');
Геокодирование будем производить с помощью следующего скрипта:
// Выбор нужной БД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.yande
x.ru/1.x/?geocode='.urlen ["address"]).'&key='.urlecode($row ncode($config['apikey']). '&results=1'); // Если геокодировать удалось, то записываем в БД
$found = $xml->GeoObjectCollection
->metaDataProperty->Geoco derResponseMetaData->foun d; if ($found > 0) {
$coords = str_replace(' ', ',', $xml->GeoObjectCollection
->featureMember->GeoObjec t->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>';
}
Перед запуском скрипта необходимо прописать ваши параметры доступа к БД, а также указать API-ключ (получить ключ можно с помощью специальной формы
$config = Array(
'host' => 'localhost',
'user' => 'root',
'password' => '',
'dbname' => 'test',
'tablename' => 'addresses',
'apikey' => 'ВАШ API-КЛЮЧ'
После внесения изменений выполните скрипт.
В окно браузера будет выведены найденные координаты и сообщения об ошибках, если некоторые адреса прогеокодировать не удалось. Также скрипт обновит записи в таблице, добавив найденные координаты.
Рассмотренный скрипт демонстрирует пример геокодирования списка адресов. Вы можете его модернизировать и изменять по своему усмотрению.
Если у вас возникли вопросы при использовании предложенного скрипта, то вы их всегда можете задать в нашем клубе разработчиков.
Получение координат для списка адресов
Пост в архиве.
27 июля 2010, 17:38
Получение координат для списка адресов