[Из песочницы] Делаем карту кабельных трасс «на коленке»

Привет, Хабр! Работая в структуре телеком-провайдинга, я ежедневно сталкиваюсь с такими данными, как схема распределения волокон в оптическом кабеле. Это документ (обычно Visio), где схематически отрисован какой-либо кабель и его разварка на ODF и в муфтах. Выглядит это примерно так: image

В нашей организации «исторически сложилось» деление кабелей по районам, поэтому на общем сетевом диске есть условная папка «Схемы», а в ней папки по районам. Кабелей много, есть деление по типам. Каждый раз поиск трассы до какого-либо узла осуществлялся последовательным открытием схем кабелей от начала «включения» и до этого узла. Если трасса короткая и находится в пределах района — проблем нет, но когда она включает в себя несколько — это становится утомительным занятием.

Ввиду того что, однажды я заинтересовался таким проектом как OpenStreetMap, было принято решение отрисовать схему прохождения кабелей поверх картографической основы и научить эту схему быть «интерактивной».

Итак, задача:

Схематично отрисовать трассу прохождения кабелей Привязать участки трассы к visio-документам Осуществить показ документа при клике на участок трассы Отрисовать пункты в городах Для реализации используем:

QGIS — отрисовка геоданных Sqlite с дополнением spatialite — хранение данных Leaflet — отображение геоданных PHP — магия Внимание! В статье описан примерный порядок действий для получения простейшей карты.image Отрисовка геоданныхСкачиваем/устанавливаем QGIS, доставляем плагин QSpatiaLite.image

Создаем базу данных, соглашаемся на преобразование

image

Хранить данные будем в разных таблицах, т.к. 1 таблица = 1 слой в QGIS, а слои должны быть только идентичных типов (Точка, линия, полигон).

Создаем 2 таблицы и загружаем их в QGIS:

Point — для пунктов провайдера Line — соединительные линии image

image

А дальше, отрисовываем что нам нужно: Для отрисовки на основе каких-либо карт нужно добавить подложку этих самых карт. В этом поможет плагин QuickMapServices

image

Векторные геоданные теперь у нас есть в базе данных, их можно редактировать в QGIS и выводить куда угодно.

image Отображение геоданных Для отображения данных будем использовать библиотеку 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 рядом с файлами карты.

© Habrahabr.ru