Получение координат полигона очерчивающего районы Вологодской области

Ну или собственно легко адаптировать под любую область.

Одной и задач явилось отрисовывание контуров районов Вологодской области на карте. Для этого нужно знать координаты точек полигона очерчивающего районы. Через API Яндекс.Карты возможно получить только полигоны областей, а не районов. Поэтому было принято решение вытянуть координаты точек из OpenStreetMap. Из нюансов:

  1. Обязательно нужно указывать UserAgent — иначе сервис забанит
  2. Ограничение — 1 запрос в секунду. Именно поэтому координаты «складируем» в файлы для последующего использования, а не вытягиваем «на лету»
  3. Координаты в OpenStreetMap хранятся «наоборот», а не как в Яндексе, поэтому сразу «переворачиваем»
<?php

 function GetAreaPolygon($region,$area,$filename){

            $address= urlencode($region.",".$area);
            $rul="https://nominatim.openstreetmap.org/search?q=".$address."&format=json&polygon_geojson=1&limit=2";
            var_dump($rul);
            $ch = curl_init($rul);
            $config['useragent'] = 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0';
            curl_setopt($ch, CURLOPT_USERAGENT, $config['useragent']);
            curl_setopt($ch, CURLOPT_REFERER, 'https://укмцукму.ru/');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
            $res_curl=curl_exec($ch);
            $res=json_decode($res_curl);
            if ($res!=null){
                $geo=$res[0]->geojson->coordinates;
                // переворачиваем координаты..
                foreach ($geo as &$coors) {
                    foreach ($coors as &$coor) {
                        $tmp=$coor[0];
                        $coor[0]=$coor[1];
                        $coor[1]=$tmp;
                    };
                };
                file_put_contents($filename,json_encode($geo));
            };
            sleep(2); //делаем паузу, чтоб не забанили
 }

    GetAreaPolygon("Вологодская область","Вологодский район","1.json");
    GetAreaPolygon("Вологодская область","Бабаевский район","2.json");
    GetAreaPolygon("Вологодская область","Бабушкинский район","3.json");
    GetAreaPolygon("Вологодская область","Белозерский район","4.json");
    GetAreaPolygon("Вологодская область","Вашкинский район","5.json");
    GetAreaPolygon("Вологодская область","Великоустюгский район","6.json");
    GetAreaPolygon("Вологодская область","Верховажский район","7.json");
    GetAreaPolygon("Вологодская область","Вожегодский район","8.json");
    GetAreaPolygon("Вологодская область","Вытегорский район","9.json");
    GetAreaPolygon("Вологодская область","Грязовецкий район","10.json");
    GetAreaPolygon("Вологодская область","Кадуйский район","11.json");
    GetAreaPolygon("Вологодская область","Кирилловский район","12.json");
    GetAreaPolygon("Вологодская область","Кичменгско-Городецкий район","13.json");
    GetAreaPolygon("Вологодская область","Междуреченский район","14.json");
    GetAreaPolygon("Вологодская область","Никольский район","15.json");
    GetAreaPolygon("Вологодская область","Нюксенский район","16.json");
    GetAreaPolygon("Вологодская область","Сокольский район","17.json");
    GetAreaPolygon("Вологодская область","Сямженский район","18.json");
    GetAreaPolygon("Вологодская область","Тарногский район","19.json");
    GetAreaPolygon("Вологодская область","Тотемский район","20.json");
    GetAreaPolygon("Вологодская область","Усть-Кубинский район","21.json");
    GetAreaPolygon("Вологодская область","Устюженский район","22.json");
    GetAreaPolygon("Вологодская область","Харовский район","23.json");
    GetAreaPolygon("Вологодская область","Чагодощенский район","24.json");
    GetAreaPolygon("Вологодская область","Череповецкий район","25.json");
    GetAreaPolygon("Вологодская область","Шекснинский район","26.json");

?>

Сохранив файлы, отрисуем районы на карте:

<script src="https://api-maps.yandex.ru/2.1/?lang=RU_ru&apikey=<?=$config->api_map?>" type="text/javascript"></script>    

<div id="map"></div>

<script>
 ymaps.ready(init);
 
 function GetAreaPolygon(region,area,filename,fillcolor){
    var url = "https://eуцкацукаc/areas/"+filename;
    $.getJSON(url, {})
    .then(function (data) {    
        var p = new ymaps.Polygon(
            data,
            {
              hintContent: area   
            },
            {
                fillColor: fillcolor,
                strokeColor: '#0000FF',
                opacity: 0.2,
                strokeWidth: 2,
                strokeStyle: 'shortdash'
            }                            
            );
    myMap.geoObjects.add(p);                                                        
    });     
 }
 
 function init () {
    latitude=59.2084992;
    longitude=39.8491648;

    myMap = new ymaps.Map('map', {
        center: [latitude, longitude], 
        controls: ['routeButtonControl','geolocationControl'],
        zoom: 7,
    }, {
        searchControlProvider: 'yandex#search',
        geoObjectBalloonAutoPan: false,
        geoObjectBalloonPanelMaxMapArea: Infinity,
        balloonPanelMaxMapArea: Infinity // балун-всегда панель - проблема с наложением надписи "Открыть на яндекс картах", из-за динамической загрузки
    });
    GetAreaPolygon("Вологодская область","Вологодский район","1.json","#FF0000");
    GetAreaPolygon("Вологодская область","Бабаевский район","2.json","#dcec3c");
    GetAreaPolygon("Вологодская область","Бабушкинский район","3.json","#3c9cec");
    GetAreaPolygon("Вологодская область","Белозерский район","4.json","#ec813c");
    GetAreaPolygon("Вологодская область","Вашкинский район","5.json","#ca5784");
    GetAreaPolygon("Вологодская область","Великоустюгский район","6.json","#57cab2");
    GetAreaPolygon("Вологодская область","Верховажский район","7.json","#467623");
    GetAreaPolygon("Вологодская область","Вожегодский район","8.json","#764923");
    GetAreaPolygon("Вологодская область","Вытегорский район","9.json","#236c76");
    GetAreaPolygon("Вологодская область","Грязовецкий район","10.json","#3eb9ca");
    GetAreaPolygon("Вологодская область","Кадуйский район","11.json","#4fca3e");
    GetAreaPolygon("Вологодская область","Кирилловский район","12.json","#cab13e");
    GetAreaPolygon("Вологодская область","Кичменгско-Городецкий район","13.json","#e47694");
    GetAreaPolygon("Вологодская область","Междуреченский район","14.json","#e176e4");
    GetAreaPolygon("Вологодская область","Никольский район","15.json","#7694e4");
    GetAreaPolygon("Вологодская область","Нюксенский район","16.json","#76e4e4");
    GetAreaPolygon("Вологодская область","Сокольский район","17.json","#76e4af");
    GetAreaPolygon("Вологодская область","Сямженский район","18.json","#80e476");
    GetAreaPolygon("Вологодская область","Тарногский район","19.json","#b2e476");
    GetAreaPolygon("Вологодская область","Тотемский район","20.json","#e4a576");
    GetAreaPolygon("Вологодская область","Усть-Кубинский район","21.json","#e48676");
    GetAreaPolygon("Вологодская область","Устюженский район","22.json","#e4768a");
    GetAreaPolygon("Вологодская область","Харовский район","23.json","#d776e4");
    GetAreaPolygon("Вологодская область","Чагодощенский район","24.json","#a876e4");
    GetAreaPolygon("Вологодская область","Череповецкий район","25.json","#76dae4");
    GetAreaPolygon("Вологодская область","Шекснинский район","26.json","#FF0000");
    
    
};

</script>