В настоящее время вы ограничиваете размер основной карты до 600 пикселей с помощью включающего элемента div
, а мини-карту - до 200 пикселей.Обратите внимание, что система координат, которую используют оба, будет одинаковой.Ваши расчеты должны учитывать разницу между размером SVG viewBox и размером основной карты, т.е.
let mapWidth = parseFloat( d3.select('#map').style('width') );
let mapHeight = parseFloat( d3.select('#map').style('height') );
let factor = mapWidth / d3.select('#map svg').attr('viewBox').split(' ')[2]
Размеры rect
на мини-карте должны быть установлены с использованием этого коэффициента масштабирования:
let minimapRect = minimap.append('rect')
.attr('id', 'minimapRect')
.attr('width', mapWidth / factor )
.attr('height', mapHeight / factor )
Когда происходят события масштабирования, у вас уже есть значения x
и y
и коэффициент масштабирования d3.event.transform.k
, поэтому вам просто нужно разделить все на коэффициент масштабирования:
let dx = d3.event.transform.x / d3.event.transform.k;
let dy = d3.event.transform.y / d3.event.transform.k;
let minimapRect = minimap.append('rect')
.attr('id', 'minimapRect')
.attr('width', mapWidth / factor / d3.event.transform.k )
.attr('height', mapHeight / factor / d3.event.transform.k )
.attr('stroke', 'red')
.attr('fill', 'black')
.attr('transform', `translate(${-dx},${-dy})`);