А вы знали, что полигональные и линейные объекты можно отображать через центроиды их геометрий? Иначе на мелком масштабе карты (при отдалении) объекты просто превращаются в точку и не видны.

1. Центроиды для полигональных слоев

Как отобразить точечными символами полигональные объекты в месте их центроидов?

Рассмотрим карту благоустройства муниципальных территорий:

https://cogisdemo.dataeast.com/portal/solutions/urban_environment

На масштабе всего города на подложке города видны только объекты территорий, причем в виде пушпинов в центроидах своих полигональных геометрий. Такой вариант отображения наглядно показывает густоту расположения объектов, ведь конкретная форма площадного объекта на таких масштабах просто будет не видна. По мере приближения, на средних масштабах, пушпины превращаются в полноценные полигональные объекты с детализацией своих границ. А уже на самых крупных масштабах появляется детализация каждой территории с целым набором дополительных слоев по элементам благоустройства (дорожки, зеленые насаждения, МАФ и пр.).

Отображение дополнительных слоёв при приближении задаётся классическим ограничением по масштабам видимости слоев, тут не должно быть вопросов.

Но как отображать один и тот же слой площадных территорий в виде точек при отдалении, и в виде полигонов при приближении?

Надо просто использовать вариант раскраски слоя как "Символизация на основе правил". Задаёте два правила. Для каждого правила указывайте холостой атрибутивный фильтр "1=1". Определяете взаимоисключающие масштабы видимости:

  • правило с полигональным символом: до определённого минимального масштаба (например, до 1:100к)
  • правило с центроидом: начиная с этого же масштаба и дальше (от 1:100к)

Но можно пойти по другому - сделать два слоя, каждый с "Простой отрисовкой", но в одном рисуем полигоны, а во втором выбираем отрисовку через цеонтроиды. Так тоже удобно и понятно.

2. Центральная точка для линейных объектов

Как отобразить точечными символами линейные объекты в месте их центральной точки?

С линийными объектами непродолжительной длины, но разбросанными по территории интереса вашей карты - та же беда. При отдалении карты линейные объекты превращаются в невидимые точки, а хочется узнать примерное их расположение, взглянув на всю территорию.

Рассмотрим карту ремонта теплосетей Красноярска за 2022 год:

https://cogisdemo.dataeast.com/portal/customers/sgk/city/krasnoyarsk?year=2022#scale=36112&centerX=92.8&centerY=56

Если вы приблизитесь на крупный масштаб, то увидите цветные линейные объекты, в центре которых дополнительно отрисовывается точечный символ. А при отдалении, все линии становятся настолько незначительными, что кроме значков ничего и не видно.

Тут вся магия кроется в возможности задать стиль отображения как "Маркерную линию", включив галочку "На центральной точке", выключив при этом "С интервалом". Вот и получается, что от всей линейной геометрии возьмётся её центральная точка и отрисуется тем точечным символом, который вы зададите.

3. Кластеризация центроидов

А можно ли на мелком масштабе не просто показывать полигональные и линейные объекты в виде точечных символов в местах их центроидов, а ещё и кластеризовать их? Штатными средствами в рамках одного слоя в картографическом проекте это уже не получится, наука до такого ещё не дошла.

Однако такая задача решается чуть более сложным подходом. Рассмотрим Инвестиционную карту Сахалинской области:

https://cogisdemo.dataeast.com/portal/regions_rf/sakhalin/invest

Нас интересует слой "Территории парков". На крупных масштабах он отображается в виде полигонов, а при отдалении - в виде центроидов, причем которые как раз кластеризуется по критерию пространственной близости.

Для этого нужно в БД создать sql-вьюшку на основе вашего полигонального класса объектов. В PostgreSQL получить центроид для любого типа геометрии (мультиточка, линия, полигон) можно через sql-функцию ST_Centroid. А чтобы данная точка лежала на изначальном объекте, используйте sql-функцию ST_PointOnSurface:
SELECT *, ST_PointOnSurface(parks.geom) AS point_geom FROM parks

В карт.проекте как источник данных для слоя используйте это sql-представление, выбрав авторасчетное геометрическое поле point_geom. Тогда у вас будут два разных слоя - полигональный и точечный, останется лишь в Конструкторе:

  • связать слои через настройку "Копировать фильтры и видимость на карте" (во вкладке "Данные" у мап-сервиса в Конструкторе)
  • скрыть дополнительный точечный слой, оставив только "основной" полигональный слой из этой пары (во вкладке "Легенда" опция "Использовать в легенде" с указанием слоев, у мап-сервиса в Конструкторе)

И для слоя с центроидами уже штатными средствами в карт.проекте вы можете настроить кластеризацию как для обычного точечного слоя, о чем мы уже расписывали и рассказывали:

https://cogis.dataeast.com/ru/blog/features/clustering-objects-on-map/

https://cogis.dataeast.com/ru/blog/video/video-clusters/