首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >d3.js:在mouseclick上交换topojson地图?

d3.js:在mouseclick上交换topojson地图?
EN

Stack Overflow用户
提问于 2013-03-28 12:21:52
回答 1查看 1.1K关注 0票数 0

我正在用d3.js做一张拓朴松地图。我在一个大的topojson中有三个数据集,可以绘制不同的地图,我想在mouseclick的地图之间交换。

我认为我可以通过向mouseclick事件添加一个函数并将结果放入.datum()操作符来实现这一点。

更新:这是工作代码,谢谢拉尔斯!

代码语言:javascript
复制
var mapPath = d3.geo.path().projection(mapProjection),
    jsondata,
    jsonobject,
    jsonobjectkeys,
    numberOfKeys,
    currentMap
    mapNumber;

d3.json("test.json", function(error, json){
      if (error) return console.warn(error);
      jsondata = json; //Store data in the variable "jsondata"
      jsonobject = json.objects;
      jsonobjectkeys = [];
      numberOfKeys = 0;

      //Get the maps(keys) from the jsonobject
      for(var k in jsonobject) jsonobjectkeys.push(k);

      //Find number of objects in jsondata
      for (objects in jsonobject){
        if((jsonobject).hasOwnProperty(objects)){
            numberOfKeys++;
        }
      }

mapNumber = jsonobjectkeys[0];

currentMap = eval("jsonobject." + (mapNumber));

//Map
var mapSVG = d3.select(".the_map")
                .append("svg")
                .attr("width", mapW)
                .attr("height", mapH);
    mapSVG.append("path")
            .datum(topojson.object(jsondata, currentMap))
            .attr("d", mapPath)
            .attr("width", mapW)
            .attr("height", mapH)
            .attr("class", "land");

//Timeline

//Create scale
var xScale = d3.scale.linear()
    .domain([0, (numberOfKeys-1)])
    .range([timelinePadding, timelineW - timelinePadding]);

//Axis
var xAxis = d3.svg.axis()
    .scale(xScale)
    .orient("bottom")
    .ticks(numberOfKeys-1);

var timeline = d3.select("#timeline")
        .append("svg")
        .attr("width", timelineW)
        .attr("height", timelineH);
    timeline.append("g")
        .attr("class", "axis")
        .attr("transform", "translate(0, " + timelinePadding + ")")
        .call(xAxis);
    timeline.selectAll("circle")
       .data(jsonobjectkeys)
       .enter()
       .append("circle")
       .attr("width", timelineW)
       .attr("height", timelineH)
       .attr("cx", function(d,i){return xScale(i);})
       .attr("cy", timelinePadding)
       .attr("r", 7)
       .attr("class", "events")
       .style("cursor", "hand")
       .on("click", function(d){
            redrawMap(d);
       });

 function redrawMap(i){
            currentMap = eval("jsonobject." + (i));
    //Update
    mapSVG.selectAll("path")
    .datum(topojson.object(jsondata, currentMap))
    .attr("d", mapPath);
}

});

原始代码,非工作代码:

代码语言:javascript
复制
var mapPath = d3.geo.path().projection(mapProjection),
    jsondata,
    jsonobject,
    jsonobjectkeys,
    numberOfKeys;


d3.json("test.json", function(error, json){
      if (error) return console.warn(error);
      jsondata = json; //Store data in the variable "jsondata"
      jsonobject = json.objects;
      jsonobjectkeys = [];
      numberOfKeys = 0;

      //Get the maps(keys) from the jsonobject
      for(var k in jsonobject) jsonobjectkeys.push(k);

      //Find number of objects in jsondata
      for (objects in jsonobject){
        if((jsonobject).hasOwnProperty(objects)){
            numberOfKeys++;
        }
      }

var mapNumber = jsonobjectkeys[0];

var currentMap = eval("jsonobject." + (mapNumber));

currentMapData(mapNumber);

//Map
var mapSVG = d3.select(".the_map")
                .append("svg")
                .attr("width", mapW)
                .attr("height", mapH);
    mapSVG.append("path")
            .datum(topojson.object(jsondata, currentMap))
            .attr("d", mapPath)
            .attr("width", mapW)
            .attr("height", mapH)
            .attr("class", "land");

//Timeline

//Create scale
var xScale = d3.scale.linear()
    .domain([0, (numberOfKeys-1)])
    .range([timelinePadding, timelineW - timelinePadding]);

//Axis
var xAxis = d3.svg.axis()
    .scale(xScale)
    .orient("bottom")
    .ticks(numberOfKeys-1);

var timeline = d3.select("#timeline")
        .append("svg")
        .attr("width", timelineW)
        .attr("height", timelineH);
    timeline.append("g")
        .attr("class", "axis")
        .attr("transform", "translate(0, " + timelinePadding + ")")
        .call(xAxis);
    timeline.selectAll("circle")
       .data(jsonobjectkeys)
       .enter()
       .append("circle")
       .attr("width", timelineW)
       .attr("height", timelineH)
       .attr("cx", function(d,i){return xScale(i);})
       .attr("cy", timelinePadding)
       .attr("r", 7)
       .attr("class", "events")
       .style("cursor", "hand")
       .on("click", function(d,i){
            currentMapData(i);
       });

 function currentMapData(i){
            mapNumber = jsonobjectkeys[i];
    console.log("showing this map: " + mapNumber);
    currentMap = eval("jsonobject." + (mapNumber));
    return currentMap;
}

});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-28 13:14:38

看起来,您将对象键绑定为数据,但希望在currentMapData()中接收索引。因此,您所看到的错误是由于试图使用键对数组进行索引而导致的。您可以使用onclick处理程序的第二个参数,即替换,传递索引而不是键。

代码语言:javascript
复制
.on("click", function(d){
     currentMapData(d);
});

使用

代码语言:javascript
复制
.on("click", function(d, i){
     currentMapData(i);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15681693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档