Maps сохранить окно карты как изображение

Добрый день! Существует ли возможность содержимое компонента 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. На клиенте получаю элемент, в котором хранится карта, и отдаю его на экспорт.

На что стоит обратить внимание:

  1. Аннотация @JavaScript, на MapExtension может принимать в себя полный URL до нужной библиотеки или путь до файла с JS библиотекой в папке resources/VAADIN.
  2. Добавил завсимости, чтобы были доступны соответствующие классы на клиенте:
    implementation 'io.jmix.maps:jmix-maps-ui-widgets'
    implementation 'io.jmix.ui:jmix-ui-widgets'
    
  1. Структура пакетов для extension, наличие пакета widgets/client обязательно.

Полезные ссылки:

  1. Creating GWT Component :: Документация Jmix
  2. JmixPivotTableExtension - ещё один пример реализации AbstractExtension, только без JS зависимостей.
1 симпатия

Роман спасибо большое! Пример завелся - изображение получается, буду разбираться. Спасибо еще раз.

Роман, изучив ваш пример, я понял что мое решение о достаточности выгрузки картинки на клиенте было поспешным. Я думаю, что мне необходимо получать изображение в памяти на сервере. Это возможно реализовать?

Теоретически можно. Надо полученые байты передать на сервер через ServerRpc. Можно отправить их в виде Base64 строки и на сервере декодировать в обычный массив байтов.

Пример ServerRpc и как вызвать переданный Consumer из JS функции можно посмотреть здесь:

  1. jmix/JmixAmchartsJsOverlay.java at master · jmix-framework/jmix · GitHub
  2. JmixAmchartsSceneConnector, JmixAmchartsServerRpc и JmixAmchartsScene
1 симпатия