Добрый день! Существует ли возможность содержимое компонента GeoMap (проще говоря отрисованный в интерфейсе фрагмент карты) получить в виде изображения?
Здравствуйте!
К сожалению, такой возможности сейчас в компоненте нет. Сам комопнент leafletjs по умолчанию не умеет сохранять карту как изображение, но есть специальные аддоны.
Создал соответствую задачу на добавление: Add ability to export map to image · Issue #1145 · jmix-framework/jmix · GitHub
Добрый день! Можете порекомендовать какой либо способ получения изображения карты в текущих условиях? Это необходимо для формирования различных отчетов.
В принципе можно написать реализацию AbstractExtension
, которая смогла бы на клиенте формировать изображение из видимой части компнента Map и скачивать её пользователю. Что-то похожее на пример экспорта для PivotTable: Sampler::pivottable-data-export.
Только для этого ещё нужно будет использовать JS библиотеки, например: GitHub - tsayen/dom-to-image: Generates an image from a DOM node using HTML5 canvas.
Или требуется получать изображение в памяти на сервере?
Реализация для клиента вполне устроит. Я честно говоря так и попробовал сделать (используя https://html2canvas.hertzen.com и GitHub - SuperAL/canvas2image: a tool for saving or converting canvas as img) но это не сработало (у меня оно не рендерило нормально даже обычную верстку не говоря уже о карте). Я так и не понял как получить DOM компонента карты (пробовал разные варианты но такое впечатление что html2canvas его не видит или я не правильно его указывал) и как встроить использование библиотек JS в код JMIX (за исключением использования компонентов - это описано в документации). За наводку AbstractExtension спасибо - поизучаю.
Подготовил небольшой пример экспорта Map в PNG/JPEG: mapimage.zip (93.1 КБ)
В проекте реализовал свой MapExtension
, который принимает в себя Map
. На клиенте получаю элемент, в котором хранится карта, и отдаю его на экспорт.
На что стоит обратить внимание:
- Аннотация @JavaScript, на
MapExtension
может принимать в себя полный URL до нужной библиотеки или путь до файла с JS библиотекой в папкеresources/VAADIN
. - Добавил завсимости, чтобы были доступны соответствующие классы на клиенте:
implementation 'io.jmix.maps:jmix-maps-ui-widgets' implementation 'io.jmix.ui:jmix-ui-widgets'
- Структура пакетов для extension, наличие пакета widgets/client обязательно.
Полезные ссылки:
- Creating GWT Component :: Документация Jmix
- JmixPivotTableExtension - ещё один пример реализации AbstractExtension, только без JS зависимостей.
Роман спасибо большое! Пример завелся - изображение получается, буду разбираться. Спасибо еще раз.
Роман, изучив ваш пример, я понял что мое решение о достаточности выгрузки картинки на клиенте было поспешным. Я думаю, что мне необходимо получать изображение в памяти на сервере. Это возможно реализовать?
Теоретически можно. Надо полученые байты передать на сервер через ServerRpc. Можно отправить их в виде Base64 строки и на сервере декодировать в обычный массив байтов.
Пример ServerRpc и как вызвать переданный Consumer из JS функции можно посмотреть здесь: