Показать фотографии объектов прямо на карте в CoGIS в местоположении этих объектов? Легко!

Наглядно это представлено на некоторых демонстрационных картах нашего портала CoGIS, например:

https://cogisdemo.dataeast.com/portal/features/import/photos

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

У каждого объекта на карте в CoGIS могут быть файловые вложения. Их можно прикреплять прям в карточке через веб. Это могут быть и документы, и фотографии. У каждого вложения могут быть свои настраиваемые атрибуты. При добавлении фотографии к объекту CoGIS автоматически формирует превьюшку для этой фото. Такие превью-фото удобно использовать в нескольких случаях:

  • в блоке файловых вложений для отображения фотографий в виде плашек
  • в галерее картинок как виджет внизу карты, где происходит совмещение карты и списка фотографий от геопривязанных объектов
  • в виджете в рамках блока "Таблица с исходными данными" с вариантом отображения в виде плашек (см. пост от 13 января)
  • прямо на карте, чтобы геопривязанные объекты отображались не выбранным у слоя символом, а фотографией каждого из объектов

Сейчас рассмотрим последний упомянутый вариант - фото на карте. Как это реализовать в CoGIS?

Каждый объект может иметь несколько фотографий, а значит получать одну из фото для каждого объекта "на лету" это не отвечает должной скорострельности, поэтому первый шаг - вывести ссылку на нужное фото в виде поле геопространственного слоя. Мы как раз рассказывали об этом в посте от 13 января про фото у плашек в виджете. Это делается через простой SELECT-запрос к ATTACH-таблице. В тот раз надо было вывести ID вложения для формирования URL до картинки, а для текущий задачи (фото на карте) надо сформировать:

  • либо полный путь до файла (например, если ваши файловые вложения храняться не в БД, а на диске)
  • либо base64 от байтов самой картинки
  • Звучит сложно, но для подкованного ГИС-специалиста сделать это достаточно просто.

Источник слоя надо задать через SQL-представление. Например, для карты https://cogisdemo.dataeast.com/portal/features/import/photos мы написали такой SQL-запрос для вьюшки в PostgreSQL:

CREATE OR REPLACE VIEW photo_view AS
SELECT
  v1.objectid,
  v1.geom,
  'base64:'::text || encode(v1.image_data, 'base64'::text) AS image_data
FROM (
  SELECT
    photo.objectid,
    photo.geom,
    photo.name,
    photo.date,
    (
      SELECT "photo__ATTACH"."DATA"
      FROM "photo__ATTACH"
      WHERE photo.objectid = "photo__ATTACH"."REL_OBJECTID" AND "photo__ATTACH"."ATT_NAME"::text ~~ 'preview%'::text
      LIMIT 1
    ) AS image_data
  FROM photo
) v1;

Далее эту SQL-вьюшку надо бросить в QGS-проект как точечный слой и в раскраске использовать "Растровый маркер". Затем задать ему размеры, а источник растровой картинки определить через имя поля с base64 картинки, которое как раз определено в SQL-вьюшке.

Вот и вся магия.