d3js v5 + topojson v3将方形质心居中缩放

时间:2018-11-22 14:41:44

标签: javascript d3.js topojson

我尝试在地理实体的中心放置一个正方形。 我添加了橙色圆圈以标记质心的位置。

比例范围= 1 (无缩放)时,正方形的位置正确。 enter image description here

但是,在比例范围> 1 (带缩放)的情况下,正方形的位置会平移。 enter image description here

我认为在定义正方形的位置时会发生问题。

let ctrSquare = g.attr("class","ctr_square")
    .selectAll(".ctr_square")
    .data(featureCollectionZe.features)
    .enter()
    .append("rect")
    .attr("x", (d)=>{return path.centroid(d)[0] - 7/2;})
    .attr("y", (d)=>{return path.centroid(d)[1] - 7/2;})
    .attr("width",7)
    .attr("height",7)
    .attr("fill","#0000ff")
    .attr("stroke","#0000ff");

这是我的代码:https://plnkr.co/edit/K0k9ACxFWgzsqzHmQHmM

1 个答案:

答案 0 :(得分:2)

问题是您要保持矩形大小与当前比例无关。因此,在.on("zoom", ...)期间,您可以修改区域widthheight

ctrSquare
    .attr("width",7/d3.event.transform.k)
    .attr("height",7/d3.event.transform.k);

考虑到这一点,它们xy位置的正确代码如下:

ctrSquare
    .attr("x",d => path.centroid(d)[0] - 7/d3.event.transform.k/2)
    .attr("y",d => path.centroid(d)[1] - 7/d3.event.transform.k/2)

因此只需将这些行添加到.on("zoom", ...)中。