2017-11-22 8 views
2

2014年と2012年に基づいて異なるデータを表示する2つの別々のマップを持つダッシュボードがあります。エリアごとに私がする必要があるのは、2つのマップのいずれかをマウスオーバーすると、それぞれのマップ上に同時に2012年と2014年の地図のツールチップを表示することです。両方を同時にどのように表示できますか?私はこれに助けていただければ幸いです。ありがとう。D3jsのマップの1つに表示されたときに複数のマップのツールチップを表示するには

<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
\t <meta charset="UTF-8"> 
 
\t <title>Test dashboard</title> 
 
\t <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" > 
 
\t <style> 
 
\t \t #gujarat-viz-2017, #buttons { 
 
\t \t \t border-right: 1px solid #ccc 
 
\t \t } 
 
\t \t .container { 
 
\t \t \t background-color: #d5e8ec; 
 
\t \t } 
 
\t \t .const0 { 
 
\t \t \t display: none; 
 
\t \t } 
 
\t \t .emptyparty { 
 
\t \t \t fill:#f9f9f1; 
 
\t \t } 
 

 
\t \t .emptyparty:hover, .constituency:hover { 
 
\t \t \t fill:#ccc; 
 
\t \t } 
 

 
\t \t .hidden { display: none; } 
 
\t \t .showtooltip { position: absolute; z-index: 10000; background-color: #333; 
 
\t \t border-radius: 10px; color: #fff; padding: 5px; } 
 

 
\t \t /*Party colors*/ 
 
\t \t .bjp{ fill: #f88101;} 
 
\t \t .inc{ fill: #6da736;} 
 
\t \t .ncp{ fill: #076598;} 
 
\t \t .gpp{ fill: #5a469d;} 
 
\t \t .ind{ fill: #25a29a;} 
 
\t \t .jdu{ fill: #eb4d4c;} 
 
\t </style> 
 
</head> 
 
<body> 
 
\t <div class="container"> 
 

 
\t \t <div class="row"> 
 
\t \t \t <div id="gujarat-viz-2014" class="col-md-6"> 
 
\t \t \t \t <h2>2014</h2> 
 

 
\t \t \t </div> 
 
\t \t \t <div id="gujarat-viz-2012" class="col-md-6"> 
 
\t \t \t \t <h2>2012</h2> 
 
\t \t \t \t 
 
\t \t \t </div> 
 
\t \t </div> <!-- .row --> 
 
\t </div> 
 
\t <script src="http://www.thehindu.com/static/js/jquery-1.10.2.min.js"></script> 
 
\t <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> \t 
 
\t <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.js"></script> 
 
\t <script src="https://d3js.org/topojson.v2.min.js"></script> 
 
\t <script> 
 
\t \t function map_function(map_settings){ 
 
    // Global variables 
 
    var margin = { top: 50, left:50, right:50, bottom:50 }, 
 
     height = 400 - margin.top - margin.bottom, 
 
     width = 500 - margin.left - margin.right; 
 

 
    // Create SVG canvas with responsive resizing 
 
    var svg = d3.select(map_settings["htmlelement"]) 
 
      .append("svg") 
 
      .attr("viewBox", "0 0 " + width + " " + height) 
 
      .attr("preserveAspectRatio", "xMinYMin") 
 
       .append("g") 
 
       .attr("class", "data"+map_settings["year"]) 
 

 
    // Add a tooltip to visualization 
 
    var tooltip = d3.select('body').append('div') 
 
      .attr('class', 'hidden showtooltip') 
 
      .attr('id', "tooltip"+map_settings["year"]) 
 

 
    // queue and read the topojson, json data file 
 
    d3.queue() 
 
    .defer(d3.json, "https://api.myjson.com/bins/17m3if") 
 
    .defer(d3.json, map_settings.data) 
 
    .await(render_map) 
 

 
    var projection = d3.geoMercator() 
 
     .scale(3000) 
 
     .center([71.5, 22.3]) 
 
     .translate([width/2, height/2]) 
 

 
    var geoPath = d3.geoPath() 
 
     .projection(projection) 
 

 
    function render_map(error, mapshape, mapdata){ 
 

 
     var constituency = topojson.feature(mapshape, mapshape.objects.collection).features; 
 

 

 
     dataMap = {}; 
 
     mapdata.forEach(function(d){ 
 
     dataMap[d.constNo] = d; 
 
     }) 
 

 
     var fill_function = function(d) { 
 
     // d3.select(this).attr('fill', "white")      
 
     } // end of mousemove_function 
 

 
     var mousemove_function = function(d) { 
 
     var constinfo = dataMap[d.properties.AC_NO]; 
 
     // console.log(constinfo.constituencyName) 
 
     // console.log(d3.select(this).data()[0].properties) 
 
     var html = "<p>"+constinfo.constituencyName+"</p>" 
 
     tooltip.classed('hidden', false) 
 
          .html(html) 
 
          .style("left", (d3.event.clientX - 10) + "px") 
 
          .style("top", (d3.event.clientY - 45) + "px");  
 
     } // end of mousemove_function 
 

 
     var class_function = function(d) { 
 
     var constinfo = dataMap[d.properties.AC_NO]; 
 
     var className = "constituency "; 
 
     if(constinfo !== undefined) { 
 
      className += ("c"+constinfo.constNo+" ") 
 
      className += constinfo.leadingParty.replace(/[^a-zA-Z ]/g, "").toLowerCase() 
 
     } else { 
 
      className += "emptyparty" 
 
      className += " const" 
 
      className += d.properties.AC_NO 
 
     }     
 
     return className; 
 
     } // end of class_function 
 

 
     var mouseout_function = function(d) { 
 
     tooltip.classed('hidden', true)       
 
     } // end of mousemove_function 
 

 
     svg.selectAll(".constituency") 
 
     .data(constituency) 
 
     .enter().append("path") 
 
     .attr("d", geoPath) 
 
     .attr('class', class_function) 
 
     .attr('fill', "white") 
 
     .attr('stroke', "#e8e8e8") 
 
     .attr('stroke-width', "0.5") 
 
     .on('mouseover', mousemove_function) 
 
     .on('mouseout', mouseout_function) 
 

 
    } // render_map 
 

 
    
 
} // map_function 
 

 
\t \t var gujarat_data_2014 = { 
 
\t \t \t htmlelement: "#gujarat-viz-2014", 
 
\t \t \t data: "https://api.myjson.com/bins/yolfr", 
 
\t \t \t year: "2014" 
 
\t \t }; 
 
\t \t var gujarat_data_2012 = { 
 
\t \t \t htmlelement: "#gujarat-viz-2012", 
 
\t \t \t data: "https://api.myjson.com/bins/19ztxj", 
 
\t \t \t year: "2012" 
 
\t \t }; 
 

 
\t \t map_function(gujarat_data_2014); 
 
\t \t map_function(gujarat_data_2012); 
 
\t </script> 
 
</body> 
 
</html>

答えて

2

私は同時に両方のマップを操作するためにあなたのmousemovemouseoutを変更したい:

var mousemove_function = function(d) { 
     var constinfo = dataMap[d.properties.AC_NO]; 
     var html = "<p>" + constinfo.constituencyName + "</p>" 
     var tooltips = d3.selectAll('.showtooltip'); 
     // get paths from all maps 
     d3.selectAll('.c' + constinfo.constNo) 
      .each(function(d,i){ 
      var pos = this.getBoundingClientRect(); 
      // operate on appropriate tooltip 
      d3.select(tooltips.nodes()[i]).classed('hidden', false) 
       .html(html) 
       .style("left", (pos.x + pos.width/2) + "px") 
       .style("top", (pos.y - pos.height/2) + "px"); 
      }); 
     } // end of mousemove_function 

    var mouseout_function = function(d) { 
     d3.selectAll('.showtooltip').classed('hidden', true); 
    } // end of mousemove_function 

はコードhereを実行します。

+0

ありがとうございます。それは問題なく動作しますが、マップ上に表示される情報は、対応するデータファイルのデータではなく、すべてのツールチップに重複して表示されます。たとえば、この行 'var html ="

"+ constinfo.constituencyName +"

"+"

"+ constinfo.leadingParty +"

"を編集すると、この行を表示することができます。 –

+0

@EuniceDhivya、その場合、データを隠すのに 'd3.local'を使います。そのため、あなたはそれをクロージャの外側にアクセスできます。更新プログラム[ここ](http://plnkr.co/edit/hCxNYL6WUZCbx7gzHPAr?p=preview)を参照してください。 – Mark

関連する問題