Архив метки: геокодирование

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

Пусть перед нами поставлена следующая задача: есть файл in.txt со списком адресов в разных городах по России. Нам необходимо написать программу, результатом работы которой будет выходной файл out.txt , в соответствующей строке должна быть широта и долгота места.

Решение данной задачи предполагает использовать метод геокодирования, который предлагает Yandex static API.

Для этого напишем следующий код на PHP

//by default max execution time is 30 seconds. But grabber need more time.. so let's set to unlimited
set_time_limit(0);

$file = fopen('in.txt', 'r');
$res = array();
while ($line = fgets($file)){
    echo $line;
    echo "
";

    $params = array(
        'geocode' => $line, //address
        'format'  => 'json', //response format
        'results' => 1, //number of output result, first is the best
    );
    $response = json_decode(file_get_contents('http://geocode-maps.yandex.ru/1.x/?' . http_build_query($params, '', '&')));

    if ($response->response->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found > 0)
    {
        $res[] = $response->response->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos;
    }else{
        $res[] = ' - ';
    }
    //wait a bit (0.2 sec). it will predict blocking
    usleep(200000);
}
fclose($file);

//writing into file
file_put_contents('out.txt', implode("\n", $res));

В принципе всё очень просто, но немного прокомментирую:
1) как и в любом пауке, загрузка может занять много времени, поэтому не забываем увеличить время исполнения скрипта — set_time_limit()
2) Все файлы должны находится в кодировке utf-8
3) Иногда для одного запроса может находится несколько подобных мест, поэтому мы ограничиваем результат в 1 ответ — он по умолчанию самый подходящий
4) Если ничего не нашлось, то в файл будет записан прочерк
5) Брутфорсить и закидывать запросами ресурс не очень хорошо, поэтому чтобы нас не отключили за бомбёжку ставим задержку. Здесь поставлена задержка в 0.2 секунды

В результате исполнения данного скрипта, появится файл out.txt c географическими координатами каждого адреса, написанного на естественном языке. Более того, даже если адреса написаны с орфографической ошибкой, очень большой шанс что яндекс правильно интерпретирует и найдет в своей базе именно нужный объект.