[Из песочницы] Делаем карту кабельных трасс «на коленке»
Привет, Хабр! Работая в структуре телеком-провайдинга, я ежедневно сталкиваюсь с такими данными, как схема распределения волокон в оптическом кабеле. Это документ (обычно Visio), где схематически отрисован какой-либо кабель и его разварка на ODF и в муфтах. Выглядит это примерно так:
В нашей организации «исторически сложилось» деление кабелей по районам, поэтому на общем сетевом диске есть условная папка «Схемы», а в ней папки по районам. Кабелей много, есть деление по типам. Каждый раз поиск трассы до какого-либо узла осуществлялся последовательным открытием схем кабелей от начала «включения» и до этого узла. Если трасса короткая и находится в пределах района — проблем нет, но когда она включает в себя несколько — это становится утомительным занятием.
Ввиду того что, однажды я заинтересовался таким проектом как OpenStreetMap, было принято решение отрисовать схему прохождения кабелей поверх картографической основы и научить эту схему быть «интерактивной».
Итак, задача:
Схематично отрисовать трассу прохождения кабелей Привязать участки трассы к visio-документам Осуществить показ документа при клике на участок трассы Отрисовать пункты в городах Для реализации используем:
QGIS — отрисовка геоданных Sqlite с дополнением spatialite — хранение данных Leaflet — отображение геоданных PHP — магия Внимание! В статье описан примерный порядок действий для получения простейшей карты. Отрисовка геоданныхСкачиваем/устанавливаем QGIS, доставляем плагин QSpatiaLite.
Создаем базу данных, соглашаемся на преобразование
Хранить данные будем в разных таблицах, т.к. 1 таблица = 1 слой в QGIS, а слои должны быть только идентичных типов (Точка, линия, полигон).
Создаем 2 таблицы и загружаем их в QGIS:
Point — для пунктов провайдера Line — соединительные линии
А дальше, отрисовываем что нам нужно: Для отрисовки на основе каких-либо карт нужно добавить подложку этих самых карт. В этом поможет плагин QuickMapServices
Векторные геоданные теперь у нас есть в базе данных, их можно редактировать в QGIS и выводить куда угодно.
Отображение геоданных Для отображения данных будем использовать библиотеку Leaflet (обзор на хабре — раз, два).Для вывода массива точек и линий на карту Leaflet-у нужен geojson, значит, возьмем в руки PHP.Нам понадобится прекрасный проект geoPHP, а так же дополнение PHP SpatiaLite — libspatialite. Первый будет получать данные из sqlite и преобразовывать в geojson, а дополнение будет преобразовывать координаты в читаемый формат.
Делаем страницу layer.php, преобразующую данные из БД в geojson: out ('json'); } $layer = $_GET['layer'];
# Подключение к БД $conn = new SQLite3('myDB.sqlite');
# Добавляем расширение $conn→loadExtension ('libspatialite.so');
# Строим SQL запрос, в зависимости от запрашиваемого слоя switch ($layer) { case 'point': $sql = 'SELECT PK_UID, ST_asText (Geometry) AS wkt FROM '.$layer.''; break; case 'line': $sql = 'SELECT PK_UID, ST_asText (Geometry) AS wkt FROM '.$layer.''; break; }
# Пробуем выполнить запрос или возвращаем ошибку $rs = $conn→query ($sql); if (!$rs) { echo 'An SQL error occured.\n'; exit; }
# Строим массив GeoJson $geojson = array ( 'type' => 'FeatureCollection', 'features' => array () );
while ($row = $rs→fetchArray (SQLITE3_ASSOC)) { $properties = $row; # Удаляем ненужное unset ($properties['wkt']); unset ($properties['GEOMETRY']); $feature = array ( 'type' => 'Feature', 'geometry' => json_decode (wkt_to_json ($row['wkt'])), 'properties' => $properties ); # Добавляем параметры array_push ($geojson['features'], $feature); } header ('Content-type: application/json; charset=utf8'); echo json_encode ($geojson, JSON_UNESCAPED_UNICODE); $conn = NULL; ?>
Закидываем файл на сервер, кладем рядом myDB.sqlite, в котором отрисовано 2 слоя.
В ту же папку кладем библиотеку geoPHP.В php.ini прописываем путь к расширениям sqlite3, разрешаем динамическую загрузку и закидываем дополнение в указанную папку:
[sqlite3] sqlite3.extension_dir = /usr/lib/ enable_dl=on; Теперь при открытии файла layer.php? layer=point будет отображаться geojson c точками из слоя point.Настала пора отобразить данные на карте.
Создадим простейшую HTML-страницу с библиотекой Leaflet:
Останется конвертировать схемы из VSD в PNG и положить в папку line рядом с файлами карты.