d3.js地图上的鱼眼失真

时间:2015-05-27 05:00:56

标签: javascript d3.js maps fisheye

我正在尝试使用fisheye.js插件(https://github.com/d3/d3-plugins/tree/master/fisheye)扭曲d3.geo.path()地图。

要扭曲对象,插件需要x& y属性。

在d3.js wiki中,它说:

  

投影函数采用表示位置坐标的两元素数组,[经度,纬度],并返回表示投影像素位置[x,y]的类似的两元素数字数组。例如,一个基本的球形墨卡托投影:

https://github.com/mbostock/d3/wiki/Geo-Paths

所以扭曲应该是可能的,我只是无法绕过它。

我正在使用世界-50m.json进行投影。一旦加载,就会出现一个arcs数组。我认为这些是我需要操纵的坐标。但这是猜测......

谢谢,

1 个答案:

答案 0 :(得分:2)

我发现你的帖子正在寻找答案,而且它似乎并没有出现在互联网上。但是,就像你说的那样,它是可能的!

根据fisheye.js(https://github.com/d3/d3-plugins/tree/master/fisheye)的文档,在mousemove回调中你需要在坐标上使用鱼眼。

由于鱼眼使用.x.y属性,我修改了鱼眼代码,只使用两对[x,y],以避免每次在回调中都使用该中间数据结构。 / p>

然后你可以这样做:

canvas.on("mousemove", function() {
    // console.log("mouse:");
    // console.log(d3.mouse(this));
    var here = d3.mouse(this);
    // console.log(here); // [1030, 125]
    // console.log(projection.invert(here)); // [-72.4713375653601, 45.14035261565636]
    var inverted = projection.invert([here[0],here[1]]); // [-72.4713375653601, 45.14035261565636]
    // console.log(inverted); // [-72.4713375653601, 45.14035261565636]
    // burlington is lat 44, lon -73
    fisheye.focus(inverted);

    // of course, the path function takes [longitude, latitude], so -72, 44 for burlington
    // https://github.com/mbostock/d3/wiki/Geo-Paths
    // (so that's what it gives back)

    states.attr("d",null)
        .attr("d", function(d) {
            // console.log("original:");
            // console.log(d.geometry);

            if (d.geometry.type === "Polygon") {
                var b = d.geometry.coordinates.map(function(d) { return d.map(function(f) { return fisheye(f);}); });
            }
            else {
                var b = d.geometry.coordinates.map(function(d) { return d.map(function(f) { return f.map(function(g) { return fisheye(g); }); }); });
            }
            // console.log(b);
            var c = {type: d.geometry.type, coordinates: b};

            // console.log("new:");
            // console.log(c);

            return path(c);
    });

您可以在此处查看实时版本:http://panometer.org/instruments/teletherms/?window=25&var=maxT&year=1914&city=BURLINGTON%20WSO%20AP,%20VT