D3.js,SVG-移动锚点

问题描述 投票:0回答:2

我有一个包含机场坐标的airport.json文件,并希望通过以下功能在地图上的每个坐标处附加一个airport.svg图标:

function draw_airports() {

  d3.json('airports.json').then(function(airport_data) {
    var svg = d3
      .select('map_container')
      .append('svg')
      .attr('width', width)
      .attr('height', height);

    var g = svg.append('g');

    var img = g
        .selectAll('img')
        .data(airport_data)
        .enter()
        .append('svg:image')
        .attr('xlink:href', 'airport.svg')
        .attr('x', function(d) {
           return projection([d.lon, d.lat])[0];
        })
        .attr('y', function(d) {
           return projection([d.lon, d.lat])[1];
        })
        .attr('width', 8)
        .attr('height', 8);
  });

此代码将图标附加到地图上坐标的右侧和下方。如何将airport.svg的锚点(0,0)移到图标的中心?

[airport.svg的坐标空间:

“

d3.js svg nested element coordinate-transformation
2个回答
0
投票

添加一行:

。attr('transform','translate(-4,-4)')

将宽度/高度属性分配给图标后。 translation的x和y的值取决于图标的宽度和高度。应该是:

x = -width / 2,y = -height / 2。

让我们知道是否有帮助


0
投票

为了能够更改正在移动的图像的中心,您应该使用transform-origin MDN,这样您就可以将图像的中心控制为原点或运动:

var img = g
  .selectAll('img')
  .data(airport_data)
  .enter()
  .append('svg:image')
  .attr('xlink:href', 'airport.svg')
  .attr('x', function(d) {
      return projection([d.lon, d.lat])[0];
  })
  .attr('y', function(d) {
      return projection([d.lon, d.lat])[1];
  })
  .attr('width', 8)
  .attr('height', 8)
  .style('style', 'transform-origin: center center');

由于无法测试,可能无法正常工作,在这种情况下,请尝试删除x,y坐标属性,并将其替换为:

.attr('transform', `translate(${projection([d.lon, d.lat])[0]}, ${projection([d.lon, d.lat])[1]})`)
© www.soinside.com 2019 - 2024. All rights reserved.