Javascript 如何使用moveTo函数在画布上定位D3路径?
我正在使用D3.js解析一些geoJson文件,并将它们显示在画布上。然而,我正在努力使用moveTo()函数来定位它们,我希望在使用HTML5画布时使用这个函数 委员会: path.context([context]) 如果指定了上下文,则设置渲染上下文并返回路径 发电机。如果上下文为null,则路径生成器将返回 在给定功能上调用时的SVG路径字符串。如果上下文是 非null,则路径生成器将调用 指定要渲染几何体的上下文。上下文必须实现 以下方法: beginPath()Javascript 如何使用moveTo函数在画布上定位D3路径?,javascript,html,canvas,d3.js,geojson,Javascript,Html,Canvas,D3.js,Geojson,我正在使用D3.js解析一些geoJson文件,并将它们显示在画布上。然而,我正在努力使用moveTo()函数来定位它们,我希望在使用HTML5画布时使用这个函数 委员会: path.context([context]) 如果指定了上下文,则设置渲染上下文并返回路径 发电机。如果上下文为null,则路径生成器将返回 在给定功能上调用时的SVG路径字符串。如果上下文是 非null,则路径生成器将调用 指定要渲染几何体的上下文。上下文必须实现 以下方法: beginPath() 移动到(x,y) l
移动到(x,y)
lineTo(x,y)
圆弧(x,y,半径,星形,端角)
closePath() 请注意,这是画布的一个子集 元素的2D渲染上下文,因此可以创建画布上下文 传递给路径生成器,在这种情况下将渲染几何体 直接到画布。如果未指定上下文,则返回 当前渲染上下文,默认为null 因此,我知道我可以将画布的上下文传递到
路径
,但到目前为止我还没有取得任何成功-我的输出始终位于0,0
我的代码如下:
var files = ["file-a.geojson", "file-b.geojson", "file-c.gpx.geojson"];
var canvas = d3.select("body").append("canvas")
.attr("style", "outline: thin solid red;")
.attr("width", "1052")
.attr("height", "1488");
var context = canvas.node().getContext("2d");
var routeWidth = 105,
routeHeight = 105;
for (var i=0;i<files.length;i++){
d3.json("example-data/"+files[i], function(error, data) {
var projection = d3.geo.mercator()
.scale(1)
.translate([0, 0]);
var path = d3.geo.path()
.projection(projection);
var b = path.bounds(data),
s = 0.95 / Math.max((b[1][0] - b[0][0]) / routeWidth, (b[1][1] - b[0][1]) / routeHeight),
t = [(routeWidth - s * (b[1][0] + b[0][0])) / 2, (routeHeight - s * (b[1][1] + b[0][1])) / 2];
projection
.scale(s)
.translate(t);
context.beginPath();
context.moveTo(300, 300);
path.context(context)(data);
context.stroke();
context.closePath();
});
};
var files=[“file-a.geojson”、“file-b.geojson”、“file-c.gpx.geojson”];
var canvas=d3.选择(“主体”).追加(“画布”)
.attr(“样式”,“轮廓:薄实心红色;”)
.attr(“宽度”、“1052”)
.attr(“高度”、“1488”);
var context=canvas.node().getContext(“2d”);
var routeWidth=105,
路线高度=105;
对于(var i=0;i,D3画布路径生成器在被调用时会启动一个新路径,因此没有简单的方法来偏移起始位置。但是,您可以将多个重叠的canvas
元素适当定位。这样,每个路径都从您希望它开始的位置开始。而不是调用context.moveTo(300,300)在循环中,调用context.translate(300300)循环之前。方法是将多个canvas
元素放置在适当的位置。D3路径生成器会在您调用它时启动一个新路径。@Larskothoff感谢您为我指出了正确的方向。我不知道我可以将多个canvas元素“缝合”在一起。这是我采取的方法。如果您愿意的话我想补充一下你的建议作为答案,我很乐意把它标记为正确的。