Подключить d3-zoom очень просто, чтобы изменить преобразование родительского элемента <g>
в ответ на события масштабирования.
Сначала вытащите инициализация проекции, потому что нам понадобятся начальные значения позже:
const scale0 = 100, x0 = 800 / 2, y0 = 400 / 2,
projection = d3.geoEquirectangular()
.scale(scale0)
.translate([x0, y0])
worldMap
.projection(projection)
Затем добавьте обработчики масштабирования после рендеринга диаграммы:
worldMap.on('postRender', chart => {
const zoom = d3.zoom();
zoom.on('zoom', () => {
const {k, x, y} = d3.event.transform;
chart.select('g.layer0')
.attr('transform', `translate(${x},${y}) scale(${k})`)
})
chart.svg().call(zoom);
});
Каждый раз, когда мы получаем событие масштабирования, мы ' Вытяните масштаб, смещение x и y от события и примените их к преобразованию, которое выглядит как
translate(-350.6778787924404,-173.42665430196223) scale(1.9132163161837539)
. С первой попытки я применил новую проекцию и перерисовал диаграмму. Это работало, но у него были проблемы с производительностью. Изменение преобразования - это путь к go!
Вилка вашей скрипки , с панорамированием и масштабированием.