D3.Geo.Circle with Canvas

时间:2013-07-31 20:05:50

标签: canvas d3.js geo

我正在使用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资源。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

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

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/

答案 1 :(得分: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();

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