Получение координат полигона очерчивающего районы Вологодской области
Ну или собственно легко адаптировать под любую область.
Одной и задач явилось отрисовывание контуров районов Вологодской области на карте. Для этого нужно знать координаты точек полигона очерчивающего районы. Через API Яндекс.Карты возможно получить только полигоны областей, а не районов. Поэтому было принято решение вытянуть координаты точек из OpenStreetMap. Из нюансов:
- Обязательно нужно указывать UserAgent — иначе сервис забанит
- Ограничение — 1 запрос в секунду. Именно поэтому координаты «складируем» в файлы для последующего использования, а не вытягиваем «на лету»
- Координаты в OpenStreetMap хранятся «наоборот», а не как в Яндексе, поэтому сразу «переворачиваем»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?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"); ?> |
Сохранив файлы, отрисуем районы на карте:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
<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> |