Как получить координаты районов, областей, городов

  • 6 092
  • Комментарии: 4
Координаты Адмиралтейского района, СПб

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

Понравилась статья? Оцени её!
4 комментария
  • Виталий пишет:

    Спасибо! Очень помогло!

  • Саша пишет:

    Спасибо, это гениально!

  • Сергей пишет:

    Добрый а как на Swift написать этот код?

  • Александр пишет:

    Огромное спасибо за очень полезную информацию!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *