10

我正在解决这个问题,我在剪裁红色圆圈元素时遇到了麻烦,因为它们出现在地球上,即使超过 90˚ 剪裁角度。此外,有没有一种方法可以将投影应用于红色圆圈,因为看起来它们相对于正交角度位于地球表面上?目前,它们只是相对于屏幕显示为 2d 圆圈。

4

1 回答 1

28

您可以使用 GeoJSON 点几何而不是使用<circle>元素:

{type: "Point", coordinates: [λ, φ]}

然后可以通过 D3 的投影系统对这些进行剪辑,具体取决于您设置的 clipAngle。所以你可能有类似的东西:

var path = d3.geo.path().projection(…);

data.forEach(function(d) {
  svg.append("path")
      .datum({type: "Point", coordinates: [d.Lon, d.Lat]})
      .attr("d", path.pointRadius(d.Magnitude));
});

请注意如何通过每个点的路径设置点的半径。您还可以将 pointRadius 设置为一个函数,因此您可以执行以下操作:

var path = d3.geo.path()
    .projection(…)
    .pointRadius(function(d) { return d.radius; });

svg.selectAll("path.point")
    .data(data)
  .enter().append("path")
    .datum(function(d) {
       return {type: "Point", coordinates: [d.Lon, d.Lat], radius: d.Magnitude};
    })
    .attr("class", "point")
    .attr("d", path);

您问题的第二部分询问这些圆圈是否可以是真正的地理圆圈。d3.geo.circle可以生成地理圈特征(同样,作为 GeoJSON),将被正确裁剪:

var path = d3.geo.path().projection(…),
    circle = d3.geo.circle();

svg.selectAll("path.point")
    .data(data)
  .enter().append("path")
    .datum(function(d) {
       return circle
           .origin([d.Lon, d.Lat])
           .angle(d.Magnitude)();
    })
    .attr("class", "point")
    .attr("d", path);
于 2013-04-04T08:15:06.630 回答