Я долго искал способ получить координаты районов, областей, округов и других географических объектов. Вначале пытался вытянуть с Яндекс.Карт, потом с кадастровой палаты росреестра. Не получилось. Поиск в гугл выдавал много довольно мучительных способов. А потом, случайно наткнулся на ответ на stackoverflow, где говорилось, что это можно сделать с помощью API OSM. Как легко и быстро получить координаты городов, смотрите читайте ниже.
Получаем координаты районов с помощью API OSM
Итак, всё до безобразия просто, делаем запрос:
http://nominatim.openstreetmap.org/search?format=json&q=%D0%9A%D1%80%D0%BE%D0%BD%D1%88%D1%82%D0%B0%D0%B4%D1%82%D1%81%D0%BA%D0%B8%D0%B9%20%D1%80%D0%B0%D0%B9%D0%BE%D0%BD,%20%D0%A1%D0%B0%D0%BD%D0%BA%D1%82-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3&polygon_geojson=1
Всё 🙂 Получаем в ответ geojson (массив с географическими координатами) и делаем с ним что хотим.
Например, я решил обработать его в несколько ином виде, чтобы скармливать Яндекс.Картам. Для этого я накидал простеньку функцию на PHP:
function areaCoordsParser($search)
{
$query = http_build_query([
'format' => 'json',
'q' => $search,
'polygon_geojson' => 1,
]);
$url = "http://nominatim.openstreetmap.org/search?$query";
$response = json_decode(file_get_contents($url), true);
$result = [];
if ($response[0]['geojson']['type'] === 'MultiPolygon') {
$coords = $response[0]['geojson']['coordinates'];
foreach ($coords as $coord) {
$temp = [];
foreach ($coord[0] as $item) {
$temp[] = array_reverse($item);
}
$result[] = $temp;
}
} elseif ($response[0]['geojson']['type'] === 'Polygon') {
$coords = $response[0]['geojson']['coordinates'][0];
foreach ($coords as $coord) {
$result[] = array_reverse($coord);
}
}
return $result;
}
echo json_encode(areaCoordsParser('Адмиралтейский район, Санкт-Петербург'));
Функция выдаёт PHP-массив координат районов. Запрос может быть любым, просто попробуйте.
Успехов вам! 🙂
Спасибо! Очень помогло!
Спасибо, это гениально!
Добрый а как на Swift написать этот код?
Огромное спасибо за очень полезную информацию!