3

我正在使用 D3 使用画布而不是 SVG 创建墨卡托投影。我已经找到了土地的路径,但我不知道如何(如果可能的话)在特定的长/纬度位置添加 d3.geo.circle。

如果是 SVG,我会使用类似的东西

var group = svg.append('g');
group.append('circle')
   .attr('cx', coords[0])
   .attr('cy', coords[1])
   .attr('r', 10)
   .style('fill', 'red');

但是我不知道如何将其转换为画布,而且我没有找到太多使用画布而不是 SVG 的 D3 资源方式。

有什么建议么?

4

2 回答 2

3

您只需使用 canvasarc命令手动创建它:

var coords = [50, 50];
var r = 10;

ctx.beginPath();
// Make an arc from 0 to Math.PI*2, aka a full circle
ctx.arc(coords[0], coords[1], r, 0, Math.PI*2, false);
ctx.fillStyle = 'red';
ctx.fill();

现场示例:http: //jsfiddle.net/9kmV3/


编辑:看来您的意思是在画布上通过适当的转换来表达纬度和经度,请看一下:

var coords = [47.61, -122.33];
var r = 5;

ctx.beginPath();
// Make an arc from 0 to Math.PI*2, aka a full circle

// X = Longitude
// Y = Latitude
// Negative latitude values go upwards, so we reverse the sign of latitude

ctx.arc(coords[1], -coords[0], r, 0, Math.PI*2, false);
ctx.fillStyle = 'red';
ctx.fill();

将西雅图放在地图上的实时示例:http: //jsfiddle.net/9kmV3/1/

于 2013-07-31T20:42:01.910 回答
1

这是我目前正在处理的一段代码:

    var circle = d3.geo.circle().angle(circleSize()).origin([0, 52]);
    circles = [circle()];
    context.beginPath();
    path({type: "GeometryCollection", geometries: circles});
    context.fillStyle = "rgba(0,100,0,.5)";
    context.fill();
    context.lineWidth = .2;
    context.strokeStyle = "#000";
    context.stroke();

这会绘制一个圆圈并将其投影到画布上。即,如果您使用的是正交投影,它将以透视的形式出现。

于 2014-03-25T11:22:08.293 回答