【问题标题】:How to add zoom effect into dc.geoChoroplethChart?如何在 dc.geoChoroplethChart 中添加缩放效果?
【发布时间】:2014-08-06 10:07:25
【问题描述】:

我开始使用 dc.js 库创建各种图表,但在尝试使用 dc.js 创建 Geo Choropleth 地图时遇到了一个问题,并且无法添加缩放和移动地图的功能.
我看到的所有示例都是使用 d3 和 svg.. 但是一旦我使用了这些示例,我就无法使用 dc.dimention 的数据和所有的交叉过滤器计算。

例如我的代码是:

 d3.json("world-countries.json", function (statesJson) {
        geoChart.width(1000)
                .height(600)
                .dimension(countryDim)
                .projection(d3.geo.mercator()
                .scale((960 + 1) / 4 )
                .translate([960 / 4, 960 / 4])
                .precision(.1))
                .group(countryGroup)
                .colors(d3.scale.quantize().range(["#E2F2FF","#C4E4FF","#9ED2FF","#81C5FF","#6BBAFF","#51AEFF","#36A2FF","#1E96FF","#0089FF","#0061B5"]))
                .colorDomain([0, 200])
                .colorCalculator(function(d){ returnd ?geoChart.colors()(d) :'#ccc'; })
                .overlayGeoJson(statesJson.features,"state",function(d){
                    return d.properties.name;
                })
                .title(function (d) {
                    return "State: " + d.key + (d.value ? d.value : 0) + "Impressions";
                });        

效果很好,但我想添加缩放效果并能够移动地图。我该怎么做?!?!

提前致谢!

【问题讨论】:

    标签: map zooming dc.js


    【解决方案1】:

    所以,答案是:

    var width = 960,
        height = 400;
    
    var projection = d3.geo.mercator()
        .scale(200)
        .translate([width/2, height]);
    
    function zoomed() {
        projection
        .translate(d3.event.translate)
        .scale(d3.event.scale);
        geoChart.render();
    }
    
    var zoom = d3.behavior.zoom()
        .translate(projection.translate())
        .scale(projection.scale())
        .scaleExtent([height/2, 8 * height])
        .on("zoom", zoomed);
    
    var svg = d3.select("#geo-chart")
        .attr("width", width)
        .attr("height", height)
        .call(zoom);
    
    geoChart
        .projection(projection)
        .width(1000)
        .height(400)
        .transitionDuration(1000)
        .dimension(countryDim)
        .group(ctrGroup)
        .filterHandler(function(dimension, filter){     
            dimension.filter(function(d) {return geoChart.filter() != null ? d.indexOf
            (geoChart.filter()) >= 0 : true;}); // perform filtering
            return filter; // return the actual filter value
         })
        .colors(d3.scale.quantize().range(["#E2F2FF", "#C4E4FF", "#9ED2FF", "#81C5FF",     
         "#6BBAFF", "#51AEFF", "#36A2FF", "#1E96FF", "#0089FF", "#0061B5"]))
        .colorDomain([0, 200])
        .colorCalculator(function (d) { return d ? geoChart.colors()(d) : '#ccc'; })      
        .overlayGeoJson(statesJson.features, "state", function (d) { return d.id; })    
        .title(function (d) {
            return "State: " + d.key + " " + (d.value ? d.value : 0) + " Impressions";
        });
    

    【讨论】:

    • 那么如何重置缩放的地图呢?例如,reset all function 当前会重置选中状态,但不会恢复到原来的大小。
    • 一旦我们开始缩放地图,我们如何设置地图的比例 - 我的地图很大,我想把它放在一种“边界框”中并显示它,而不是全部一次,但基于预定的质心,然后允许用户随意导航。如何做到这一点?
    • 这对我不起作用! d3.event.translate 抛出 undefined 错误。
    • 对我有一点帮助。我只能缩小,而且非常突然。我试着摆弄 scaleExtent 但还没有运气。
    • 啊,我只需要再玩一些数字。
    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多