Обычно в ГИС источником слоя является либо физическая таблица, либо sql-вьюшка в БД. Это необходимо для фиксации схемы источника, т.е. по сути для набора полей слоя. Далее в зависимости от атрибутивных или пространственных фильтров, заданных пользователем, формируется конечный SQL-фильтр на источник данных для получения нужной выборки объектов.
Однако бывают более специфические варианты, когда объекты слоя могут отличаться от первоисточника, по которому формируется слой.

Рассмотрим карту на нашем демо-портале https://cogisdemo.dataeast.com/portal/features/sqlbasedview
С виду всё просто: полигональный слой стран и точечный слой городов. Однако попробуйте задать фильтр в виджете справа сверху, например, указать "От" = 1000000, т.е. оставить на карте города с населением более 1 млн человек. Слой городов отфильтруется, это понятно. Однако и слой стран, раскрашенный по численности населения, тоже перекрасится на основании отфильтрованного слоя городов. Практически магия, и в CoGIS это возможно.

Как это работает? Используется "Представление на основе SQL-запроса (SQL-based view)". У слоя в QGS-проекте задаётся свойство elitegis_query со значением полного SQL-запроса к БД для формирования списка объектов. Сам запрос можете увидеть во второй вкладке того же виджета в карте. Этот SQL-запрос может содержать:

  • стандартные CoGIS макросы, такие как {CurrentUser} (логин текущего авторизованного пользователя) и другие (смотрите документацию), т.е. можно рассчитывать показатели по-разному для разных пользователей одной и той же карты (а вы знали, что так тоже можно?)
  • и макрос {WhereClause}, который вбирает в себя весь атрибутивный SQL-фильтр на слой (если фильтр пустой, то используется вырожденный фильтр "1=1")

С точки зрения пользователя, он задаёт фильтр на поле population, которое есть в слое стран. Но технически итоговый sql-фильтр (например, "population >= 1000000") применяется не на сам слой стран, а проталкивается внутрь SQL-запроса и оседает внутри подзапроса на статистический расчет по городам. А чтобы не смущать карту на Портале, для слоя стран задаётся виртуальное поле population, хоть и по факту не используется.

Осталось только уточнить, что блок атрибтивной фильтрации в виджете настроен на слой городов, однако в Конструкторе используется опция "Копировать фильтры и идимость на карте" (вкладка "Данные" у добавленного карт.сервиса) для проброски этого же фильтра на слой стран.

В итоге получается такая цепочка:

  1. пользователь задаёт фильтр на поле population у слоя городов
  2. карта на Портале этот фильтр копирует на слой стран, где есть такое же поле population, хоть и с вырожденным значением NULL
  3. ГИС-сервер получает этот фильтр, но использует его не для источника слоя, а лишь заменяет им макрос {WhereClause}
  4. ГИС-сервер при отрисовке слоя стран использует раскраску по расчетным полям city_count и population_sum, которые как раз опираются на выборку городов, отфильтрованных по {WhereClause}