Клуб API Карт

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

nikita-argov
10 февраля 2010, 11:34
Задача достаточно простая - есть 500 адресов формата "Санкт-Петербург, Садовая ул., 21", нужно получить для них координаты. Конечно, можно и стандартным инструментом http://api.yandex.ru/maps/tools/getlonglat/ воспользоваться, но больно долго. Сам я совершенно ничего не понимаю в xml, YMapsML и вообще толком разобраться с геокодером не получилось. Подскажите, как бы это по-человечески сделать. Заранее спасибо.
10 комментариев
Подписаться на комментарии к посту
а) прочитать руководство внимательно б) free-lance.ru
я же говорю, что недостаточно разбираюсь в данном языке.
и по-моему всё дело пахнет одной строчкой, в духе echo координаты("Санкт-Петербург, Садовая ул., 21");
хочется верить, что найдутся люди, которые подскажут такую строчку и без денег.
Для таких целей лучше воспользоваться http-геокодером и сделать описанные вами действия на серверной стороне. http-геокодер возвращает данные в формате YMapsML (специализированный XML), который может быть обработан богатым арсеналом инструментов по работе с XML.

Также можете посмотреть схожее обсуждение:
http://clubs.ya.ru/mapsapi/replies.xml?item_no=8010
Написал скрипт на PHP.
Для своих целей нужен был.
Берет список адресов из текстового файла, $base_a, находит координаты всех объектов в заданной области и посылает их в файл $base_c в формате [адрес]|[долгота]|[широта].
Кодировка всех файлов желательно utf-8 - будет меньше проблем.





ini_set('memory_limit', '500M');

$key='AG8mbUsBAAAAdt5MUAIAhXRcbhY4edtzaIWZem5p4f6-EhwAAAAAAAAAAABUoYEu6xZGFQ1k092bC6S7tsklew=='; // API-ключ
$site='http://geocode-maps.yandex.ru/1.x/';
$ll='31.734094,59.82502'; // Центр области поиска
$spn='8.371582,3.052674'; // Ширина и высота области поиска - если не нужно - удалить и отредактировать переменную
$l_type='house'; // Тип объекта
$base_a='adress.txt';
$base_c = 'adress_c.txt';


$mass = file($base_a); // Создаем массив со строками файла адресов

$fd = fopen($base_c, "w");
fwrite($fd, "");  // Обнуляем файл координат
fclose($fd);

$handle = fopen($base_c, 'a'); // Открываем файл для записи адресов и координат
for ($i=1; $i{
$city=$mass[$i];

$city=str_replace (' ', '+', $city); // Заменяем все пробелы на +
$url=$site.'?geocode='.$city.'&rspn=1&ll='.$ll.'&spn='.$spn.'&key='.$key;

$text = file_get_contents($url); // Записываем содержимое файла в строку

// Выуживаем из ответа геокодера нужные данные:
$pos = explode("", $text);
// Начиная элемента '1' в элементе массива $pos[$i]
// содержится данные в формате: {долгота широта...}
$kind = explode("", $text);
// Начиная элемента '1' в элементе массива $kind[$i]
// содержится данные в формате: {тип_объекта...}
$c_name = explode("", $text);
// Начиная элемента '1' в элементе массива $c_name[$i]
// содержится данные в формате:
// {Адрес_объекта...}

// Далее проходимся по всем найденным объектам
// и выуживаем из ответа геокодера нужную информацию
for ($k=1; $k{
$mass3 = explode("", $kind[$k]);
$type = $mass3['0']; // Тип объекта

// Обнуляем координаты:
$lng='';
$lat='';

if($type==$l_type)    // Проверяем тип объекта
{
$mass4 = explode("", $c_name[$k]);
$l_name = $mass4['0'];  // Адрес по базе Яндекса

$mass2 = explode("", $pos[$k]);
$coord = explode(" ", $mass2['0']); // Разделяем координаты
// Координаты:
$lng=$coord[0];
$lat=$coord[1];
}

// Если объект найден и известны его координаты:
if($lng and $lat)
{
// Формируем строку, которую нужно добавить в файл:
$somecontent = " ".$l_name."|".$lng."|".$lat;
fwrite($handle, $somecontent);   // Пишем в файл
// Далее радуемся, что запись добвалена:
echo "Запись($somecontent) добавлен в файл ($base_c)
";
}
}
}
fclose($handle); // Закрываем файл.
?>



Спасибо огромное! Всё получилось!)
Только rspn=1&ll='.$ll.'&spn='.$spn.' из $url убрал, у меня с ними почему-то не работало.

У меня ответ от geocode всегда 400 - Bad Request хотя если отправить туже строку запроса с браузера - то выдает ответ.

Попробуйте пропустить адрес и ключ через urlencode

У меня не работает. Просто белая страница без ошибок.

Подкажите пожалуйста, может я что-то неправильно сделал? Пробовал запустить через Denwer. Никакой ошибки не пишет. В файл "adress.txt" добавил одну улицу.