
А вы знали, что в CoGIS можно "на лету" обрезать выдаваемую картинку при отрисовки карты?
Например, у вас есть высокоточный непубличный растр на значительную территорию, и есть корпоративные пользователи из разных территориальных подразделений (например, из разных городов), и надо каждому выдавать только ту часть растра, которая доступна согласно правам доступа на вверенную ему территорию.
Вариант нарезки растра на кусочки и дальнейшие сложности формирования целой громады веб-карт в Конструкторе выглядит явно не желательно. Но с CoGIS всегда можно сказать "хоба" и решить задачу красиво и декларативно.
В руководстве по созданию картографических проектов эта возможность описана в разделе "Обрезка карты по слою (MaskLayer)". Пример карты с данной настройкой - на нашем демонстрационном портале:
https://cogisdemo.dataeast.com/portal/features/rasters/clip
Когда пользователь навигируется по карте, то от каждого используемого мап-сервиса запрашивается изображение карты на текущий охват карты. И после генерации итоговой картинки, но до выдачи её пользователю в процесс встраивается MaskLayer со словами "мне только спросить" и обрезает эту картинки своей полигональной геометрией, суммарной по всем своим объектам, входящими в этот же экстент.
Кроме того, эту возможность можно совместить с гибкостью задания атрибутивного фильтра на слой, ведь MaskLayer это тоже слой, и на него можно навесить динамический фильтр, используя логин текущего пользователя или группу, в которые он входит. Вот и получается, что каждому достанется та картинка, на которую он имеет право. Растр будет единый, а границы области видимости можно редактировать как обычные векторные объекты через CoGIS.
Но есть и другой вариант использования - зависимость от времени.
Рассмотрим ещё пару схожих демонстрационных карт:
https://cogisdemo.dataeast.com/portal/features/masklayer
https://cogisdemo.dataeast.com/portal/truedrive/police
Получается, практически "город засыпает и просыпается мафия". По ночным дорогам города патрулируют полицейские машины. В каждый момент времени вблизи их местоположения безопасно, и эти области подсвечиваются как днём. Разберём, как это сделано технически:
1. Данные по машинам могут поступать из смежной системы прямо в БД или редактироваться в CoGIS.
2. При этом можно настроить автоматическое построение буферных зон вокруг объектов (например, через использование готовых геотриггеров CoGIS SOE) при любых изменениях объектов. Да и буфер может строится в виде кружка (или колбаски для линии, например), так и в виде зоны транспортной доступности через модуль TrueDrive, входящий в CoGIS.
3. Этот буферный слой определяем как MaskLayer в qgs-проекте через переменную слоя elitegis_mask_layer.
4. На этот слой при необходимости можно наложить динамический sql-фильтр, используя текущую дату-время - через макрос "{CurrentDate}" или sql-функции now() в PostgreSQL или GETUTCDATE() в MSSQL. А значит в каждой момент времени будет разная геометрия, которой надо обрезать изображение. И оно не обязательно должно быть на основе растра. Векторные слои тоже подойдут.
5. Публикуем два тайловых мап-сервиса по одним и тем же данным. Просто слои одного сервиса раскрашены для дневного режима, а второй - инвертировано, как для ночного режима.
6. Тёмный сервис добавляем в Конструктор как подложку.
7. Светлый сервис добавляем как TMS внутрь qgs-проекта, туда же бросаем буферный полигональный слой MaskLayer.
8. Публикуем такой qgs-проект в ГИС-сервере CoGIS, добавляем его в Конструктор, и включаем опцию "Автоматически обновлять карты каждые ... секунд".
В итоге сегодня в пакмена поиграли, в мафию поиграли. Пора за работу с настоящими картами!