【发布时间】:2014-07-08 19:56:39
【问题描述】:
我正在使用 D3.js 解析一些 geoJson 文件并将它们显示在画布上。但是,我正在努力使用在使用 HTML5 画布时使用的 moveTo() 函数 id 来定位它们。
path.context([上下文])
如果指定了上下文,则设置渲染上下文并返回路径 发电机。如果上下文为空,则路径生成器将返回 在给定功能上调用时的 SVG 路径字符串。如果上下文是 非空,路径生成器将改为调用 指定的上下文来渲染几何。上下文必须实现 以下方法:
开始路径()
移动到(x, y)
lineTo(x, y)
弧(x,y,半径,startAngle,endAngle)
关闭路径()请注意,这是画布的子集 元素的 2D 渲染上下文,因此画布上下文可以是 传递给路径生成器,在这种情况下将渲染几何图形 直接到画布上。如果未指定上下文,则返回 当前渲染上下文,默认为 null。
所以我知道我可以将画布的上下文传递给 path,但迄今为止我没有任何成功 - 我的输出始终位于 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();
});
};
所以我的问题是,当我遍历它们时,如何将每个 path 定位在我的画布上?
【问题讨论】:
-
这样做的方法是让几个
canvas元素定位适当。 D3 路径生成器在您调用它时会启动一条新路径。 -
@LarsKotthoff 感谢您为我指明了正确的方向。我不知道我可以将多个画布元素“缝合”在一起。这是我采取的方法。如果您想添加您的建议作为答案,我很乐意将其标记为正确。
标签: javascript html canvas d3.js geojson