【发布时间】:2019-07-05 01:52:35
【问题描述】:
我有一张使用 d3-tile 创建的地图。我添加了代码来显示根据经度和纬度从数据集中收集的 hexbin。但是hexbins没有显示。我只找到了在 hexbins 中绘制普通笛卡尔数据的示例,而不是在 d3-tile 制作的地图上放置 hexbins 的纬度经度。为什么我的 hexbin 没有显示?
这是我如何定义投影、图块和 hexbins:
var projection = d3.geo.mercator()
.scale((1 << 22) / 2 / Math.PI)
.translate([width / 2, height / 2]);
var tile = d3.geo.tile()
.size([width, height]);
// define hexbins
var hexbin = d3.hexbin()
.size([width, height])
.radius(4);
以下是我处理数据并将 hexbins 添加到地图的方式:
data.forEach(function (d) {
d.lat = +d.lat;
d.lon = +d.lon;
});
points = [];
// x,y maps to lng,lat - ref[2]
data.forEach(function (d) {
d.lat = +d.lat;
d.lon = +d.lon;
var x = projection([d.lon, d.lat])[0];
var y = projection([d.lon, d.lat])[1];
points.push([x, y]);
});
// bin coords
var bins = hexbin(points);
var bins_n = []; // points per hexbin
bins.forEach(function (d) {
bins_n.push(d.length);
});
// second of two scales for linear hexagon fill - ref[1]
var extent = d3.extent(bins_n);
var fill_scale2 = d3.scale.linear()
.domain([extent[0], extent[1]])
.range([0, 1]);
hex.selectAll(".hexagon")
.data(hexbin(points))
.enter()
.append("path")
.attr("class", function (d) { return "hexagon bin_" + d.length; })
.attr("d", hexbin.hexagon())
.attr("transform", function (d) {
return "translate(" + d.x + "," + d.y + ")";
})
.style("fill", function (d) {
return fill_scale1(fill_scale2(d.length));
});
【问题讨论】:
-
你是如何定义你的投影的?
-
var projection = d3.geo.mercator() .scale((1
-
这是一个非常大的比例值 - 如果您记录投影的 x,y 坐标(或
points在您的情况下),您可能会看到不在范围内的坐标你的svg。 d3-tile 的比例通常为1/Math.PI/2:它将世界投影到一个 1 像素的正方形,然后使用缩放在屏幕上平移和缩放。这不是最直观的方法。投影会导致您的问题,但是通过缩放,六边形比平时要复杂一些。我现在有点忙,过会再仔细看看。
标签: d3.js hexagonal-tiles