Svg 转换<;g>;d3.js地图上的属性

Svg 转换<;g>;d3.js地图上的属性,svg,d3.js,Svg,D3.js,我在d3.js中准备了一个map示例。我想在地图上使用和节点(包含圆圈、笑脸和文本)实现缩放。到目前为止,我将圆圈和笑脸放在地图上,以显示不同国家的城市。当我放大地图时,我无法转换标签,所以根据我的逻辑,smiley被放错了位置。所以,如何仅转换地图上的g标记。我不想在标记内变换形状(圆、图像) var zoom=d3.behavior.zoom() .on(“缩放”,函数(){ g、 属性(“变换”、“平移”(+ d3.event.translate.join(“,”+”)比例(“+d3.e

我在d3.js中准备了一个map示例。我想在地图上使用和节点(包含圆圈、笑脸和文本)实现缩放。到目前为止,我将圆圈和笑脸放在地图上,以显示不同国家的城市。当我放大地图时,我无法转换标签,所以根据我的逻辑,smiley被放错了位置。所以,如何仅转换地图上的g标记。我不想在标记内变换形状(圆、图像)

var zoom=d3.behavior.zoom()
.on(“缩放”,函数(){
g、 属性(“变换”、“平移”(+
d3.event.translate.join(“,”+”)比例(“+d3.event.scale+”);
g、 选择全部(“.node”)
.attr(“宽度”,函数(){
var self=d3.选择(此项);
var r=28/d3.event.scale;//根据比例设置半径
self.style(“笔划宽度”,r<4?(r<2?0.5:1):2);//缩放笔划宽度
返回r;
});
g、 全选(“.circle”)
.attr(“r”,函数(){
var self=d3.选择(此项);
var r=8/d3.event.scale;//根据比例设置半径
self.style(“笔划宽度”,r<4?(r<2?0.5:1):2);//缩放笔划宽度
返回r;
});
});

请任何人帮助我解决我的问题。

要进行语义缩放,需要调整笑脸的
宽度
高度
,以及调整
x
y
位置,因为调整将相对于宽度/高度发生变化:

 g.selectAll(".node")
 .attr("x", function(d) { return (projection([d.lon, d.lat])[0]) - (8 / d3.event.scale); })
 .attr('y', function(d) { return (projection([d.lon, d.lat])[1]) - (8 / d3.event.scale); })
 .attr('width', function () { return 20 / d3.event.scale; })
 .attr('height', function () { return 20 / d3.event.scale; })

演示:

Musi,谢谢您的更正,但我不想缩放smiley,只有地图可以缩放。就像语义缩放(例如())一样,当我们继续缩放时,平面图的图像会被分开。@MayurChavda更新了答案。非常感谢!让我一天都很愉快
 g.selectAll(".node")
 .attr("x", function(d) { return (projection([d.lon, d.lat])[0]) - (8 / d3.event.scale); })
 .attr('y', function(d) { return (projection([d.lon, d.lat])[1]) - (8 / d3.event.scale); })
 .attr('width', function () { return 20 / d3.event.scale; })
 .attr('height', function () { return 20 / d3.event.scale; })