我试图创建旋转地球仪与酒吧一样,在this example。你可以看到我的例子here。一切都很顺利,直到酒吧超过地平线。我不知道如何削减酒吧从底部时,他们在地球的另一边。有人能建议我怎么做吗?
/*
* Original code source
* http://codepen.io/teetteet/pen/Dgvfw
*/
var width = 400;
var height = 400;
var scrollSpeed = 50;
var current = 180;
var longitudeScale = d3.scale.linear()
.domain([0, width])
.range([-180, 180]);
var planetProjection = d3.geo.orthographic()
.scale(200)
.rotate([longitudeScale(current), 0])
.translate([width / 2, height / 2])
.clipAngle(90);
var barProjection = d3.geo.orthographic()
.scale(200)
.rotate([longitudeScale(current), 0])
.translate([width / 2, height / 2])
.clipAngle(90);
var path = d3.geo.path()
.projection(planetProjection);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
d3.json("https://dl.dropboxusercontent.com/s/4hp49mvf7pa2cg2/world-110m.json?dl=1", function(error, world) {
if (error) throw error;
var planet = svg.append("path")
.datum(topojson.feature(world, world.objects.land))
.attr("class", "land")
.attr("d", path);
d3.csv("https://dl.dropboxusercontent.com/s/v4kn2hrnjlgx1np/data.csv?dl=1", function(error, data) {
if (error) throw error;
var max = d3.max(data, function(d) {
return parseInt(d.Value);
})
var lengthScale = d3.scale.linear()
.domain([0, max])
.range([200, 250])
var bars = svg.selectAll(".bar")
.data(data)
.enter()
.append("line")
.attr("class", "bar")
.attr("stroke", "red")
.attr("stroke-width", "2");
function bgscroll() {
current += 1;
planetProjection.rotate([longitudeScale(current), 0]);
barProjection.rotate([longitudeScale(current), 0]);
planet.attr("d", path);
bars.attr("x1", function(d) {
return planetProjection([d.Longitude, d.Latitude])[0];
}).attr("y1", function(d) {
return planetProjection([d.Longitude, d.Latitude])[1];
}).attr("x2", function(d) {
barProjection.scale(lengthScale(d.Value));
return barProjection([d.Longitude, d.Latitude])[0];
}).attr("y2", function(d) {
barProjection.scale(lengthScale(d.Value));
return barProjection([d.Longitude, d.Latitude])[1];
});
}
// bgscroll();
setInterval(bgscroll, scrollSpeed);
})
})
4条答案
按热度按时间wpcxdonn1#
为了在地平线上剪掉条形图,我们添加了一个以地球仪2D中心为中心的蒙版,并带有它的半径。然后,我们仅在底边穿过地平线时应用此遮罩(通过跟踪经度)。
创建遮罩
敷面膜
我们也可以通过测量距离来做到这一点。
小提琴-http://jsfiddle.net/gp3wvm8o/
jm81lzqq2#
只需跟踪可见经度的范围,如果不在该范围内,则隐藏条形图
小提琴-http://jsfiddle.net/b12ryhda/
6yjfywim3#
使用canvas的一个更简单的方法是:
1.绘制所有的条形图而不进行剪裁
1.画Map
1.仅绘制前景条(即,使用剪裁)
这个裁剪不必手动向下,但可以利用
path.centroid
方法,该方法考虑clipAngle
在投影上设置的裁剪。伪代码可能看起来像这样:有些条将绘制两次,但我发现canvas的速度足够快,可以跟上绘制的速度,并保持至少200+条的动画流畅。
举个例子,看看这个code on GitHub和live page。
cclgggtu4#
我以前做过很多次,后来忘记了,最近在JSFiffle here上找到了一个工作示例。