
Показать фотографии объектов прямо на карте в 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-вьюшке.
Вот и вся магия.