Я долго искал способ получить координаты районов, областей, округов и других географических объектов. Вначале пытался вытянуть с Яндекс.Карт, потом с кадастровой палаты росреестра. Не получилось. Поиск в гугл выдавал много довольно мучительных способов. А потом, случайно наткнулся на ответ на 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 написать этот код?
Огромное спасибо за очень полезную информацию!