У меня есть листовка с большим количеством геойсонов. Я хочу иметь возможность экспортировать изображение карты в формате PNG. Я попробовал плагин leaflet-image, который экспортирует базовую карту, и я также попытался (независимо) из библиотеки html2canvas вывести содержимое div карты в файл png.
К сожалению, при выводе с использованием leaflet-image отображается только фоновый слой (карта), а не какая-либо из областей геоджонов, тогда как при выводе результатов с использованием html2canvas отображаются слои, но не фоновая карта.
Я не думаю, что плагин листовки-изображения будет жизнеспособным, поскольку у него слишком много ограничений. Это требует, чтобы все слои были визуализированы на холст, но при этом производительность падает - кажется, что он не способен обрабатывать так много географических регионов. У меня также нет большого контроля над сервером, и nodejs там не установлен.
html2canvas гораздо более перспективный. Используя это и файл-заставку, я смог вывести полное изображение и регионы следующим образом:
html2canvas(myMap, {
allowTaint:false,
useCORS: true,
width: 650,
height: 500,
}).then(canvas => {
canvas.toBlob((blob) => {
saveAs(blob, "my-map.png");
});
});
Это сработало блестяще, за исключением одной проблемы - области рендеринга на холсте обрезаны в неправильном положении. То есть смещение региона неверно. Вот пример. Нижняя и правая части карты должны быть покрыты краем цветными участками хороплета:
![leaflet image with regions, clipped](https://i.stack.imgur.com/CbHtV.png)
Как заставить регионы правильно отображаться на карте, а не обрезаться в неправильном месте?
Редактировать: Я посмотрел на проблему на сайте html2canvas здесь , которая выглядела многообещающе. У меня, похоже, нет проблемы трансформации как таковой, но был кто-то, кто испытал, как мне казалось, проблему смещения слоя. Я реализовал их решение здесь:
function redraw() {
var lat_tmp = map.getCenter().lat;
var lng_tmp = map.getCenter().lng;
map.setView([-66.22149259832975, -1.142578125]);
setTimeout(function () {
waitForTilesToLoad()
}, 50000);
map.setView([lat_tmp, lng_tmp]);
}
но это тоже не сработало, поэтому я все еще пытаюсь решить эту проблему. На самом деле это не проблема смещения слоя, а проблема отсечения слоя.