А вы знали, что в 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, добавляем его в Конструктор, и включаем опцию "Автоматически обновлять карты каждые ... секунд".

В итоге сегодня в пакмена поиграли, в мафию поиграли. Пора за работу с настоящими картами!