Круги масштабируются, но пути не из-за того, как вы их добавляете. Во-первых, давайте посмотрим, как применить увеличение:
var svg = d3.select("body")
.append("svg")
...
.call(d3.zoom().on("zoom", function () {
svg.attr("transform", d3.event.transform)
}))
.append("g"); // returns a selection of a newly appended g element
Таким образом, выбор svg
на самом деле является g
элементом. Хотя zoom вызывается для элемента svg (не для выбора svg), он изменяет выбор svg (который фактически содержит g): svg.attr(("transform"...
.
Когда вы добавляете свои пути, вы используете var map = d3.select("svg").insert(...
и создаете новый g
для хранения путей. Но - этот g
не входит или не является дочерним для выбора svg
- поэтому он не обновляется: d3.select("svg") != svg
в этом случае. Вместо этого используйте:
var map = svg.insert(... // we insert into the svg selection which holds a g
Таким образом, мы вставляем элементы в родительский элемент g
, который обновляется при каждом увеличении.
Хотя это действительно второй вопрос, решение достаточно простое. Поведение d3.zoom () может быть ограничено как масштабированием, так и переводом:
d3.zoom().scaleExtent([1,4]) // limit scale to full size or 4x size.
.translateExtent([[0,0],[width,height]]) // limit pan to original SVG dimensions
zoom.translateExtent([p1,p2])
занимает две точки, верхний левый и нижний правый. Мы можем ограничить на основе этих измерений, если ваши объекты не выходят за границы SVG при первоначальной загрузке со шкалой 1.
Вот обновленный bin .