2016-02-18 5 views
2

Я создал карту состояний choropleth, используя d3, datamaps и topojson. У меня возникают проблемы с изменением данных исходной карты на основе нажатия кнопки. Предпочтительный способ - просто обновить исходные данные карты внутри функции изменения. Вместо этого у меня есть функции выполнения кнопки, исключающие div, содержащие карту, затем воссоздают div, а затем полностью генерируют новую карту (см. Мой код ниже). Это работает, но я думаю, что есть намного более простой и сложный способ обновления данных. Любая помощь будет оценена по достоинству.Обновление данных о состоянии карты D3 choropleth при нажатии кнопки

<!DOCTYPE HTML> 
<html> 
<head> 
     <script src='js/d3.min.js'></script> 
     <script src='http://d3js.org/topojson.v1.min.js'></script> 
     <script src='js/datamaps.all.min.js'></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> 
     <style> 
      #map{height:400px; width: 600px; border-style: solid; border-color:white;} 

       #floating-panel1 { 
       position: absolute; 
       top: 10px; 
       left: 1%; 
       z-index: 5; 
       /*background-color: #fff;*/ 
       padding: 5px; 
       border: 1px solid #999; 
       text-align: center; 
       font-family: 'Roboto','sans-serif'; 
       line-height: 30px; 
       padding-left: 1px; 
      } 
    </style> 

    <script> 

     var costChange = { 
     'AR':{'fillKey':'heavy','Percentage':'236%'}, 
     'IL':{'fillKey':'light','Percentage':'5%'}, 
     'IN':{'fillKey':'medium','Percentage':'20%'}, 
     'KS':{'fillKey':'heavy','Percentage':'76%'}, 
     'KY':{'fillKey':'heavy','Percentage':'289%'}, 
     'MS':{'fillKey':'heavy','Percentage':'110%'}, 
     'NC':{'fillKey':'heavy','Percentage':'261%'}, 
     'TN':{'fillKey':'heavy','Percentage':'57%'}, 
     'VA':{'fillKey':'heavy','Percentage':'57%'}, 
     'WA':{'fillKey':'medium','Percentage':'18%'}, 
     'WI':{'fillKey':'medium','Percentage':'18%'} 

    }; 

    var rateChange = {'AL':{'fillKey':'medium','Percentage':'10%'}, 
     'AR':{'fillKey':'medium','Percentage':'16%'}, 
     'AZ':{'fillKey':'light','Percentage':'7%'}, 
     'CO':{'fillKey':'heavy','Percentage':'44%'}, 
     'CT':{'fillKey':'heavy','Percentage':'132%'}, 
     'DE':{'fillKey':'light','Percentage':'6%'}, 
     'FL':{'fillKey':'heavy','Percentage':'62%'}, 
     'GA':{'fillKey':'medium','Percentage':'17%'}, 
     'ID':{'fillKey':'heavy','Percentage':'66%'}, 
     'IN':{'fillKey':'light','Percentage':'4%'}, 
     'KS':{'fillKey':'medium','Percentage':'11%'}, 
     'KY':{'fillKey':'medium','Percentage':'24%'}, 
     'LA':{'fillKey':'medium','Percentage':'25%'}, 
     'MA':{'fillKey':'heavy','Percentage':'55%'}, 
     'MD':{'fillKey':'heavy','Percentage':'28%'}}; 



//initialize map with cost data 
var map; 
    $(document).ready(function(){ 
     map = new Datamap({ 
     scope: 'usa', 
     element: document.getElementById('map'), 
     geographyConfig: { 
      highlightBorderColor: '#bada55', 
      popupTemplate: function(geography, data) { 
       return "<div class='hoverinfo'>" + geography.properties.name + ' %:' + data.Percentage + ' ' 
      }, 
      highlightBorderWidth: 3 
     }, 
     fills: { 
      'light': '#ffad99', 
      'medium': '#ff704d', 
      'heavy': '#ff3300', 
      defaultFill: '#ffebe6' 
     }, 
     data:costChange 

    }); 
     map.labels(); 

}); 


//button click removes map and recreated with cost data 
    function cstchng(){ 
     $("#map").remove(); 
     $("#title").after("<div id='map'></div>"); 
     map = new Datamap({ 
      scope: 'usa', 
      element: document.getElementById('map'), 
      geographyConfig: { 
       highlightBorderColor: '#bada55', 
       popupTemplate: function(geography, data) { 
        return "<div class='hoverinfo'>" + geography.properties.name + ' %:' + data.Percentage + ' ' 
       }, 
       highlightBorderWidth: 3 
      }, 
      fills: { 
       'light': '#ffad99', 
       'medium': '#ff704d', 
       'heavy': '#ff3300', 
       defaultFill: '#ffebe6' 
      }, 
      data:costChange 

     }); 
     map.labels(); 
    } 

//button click removes map and recreated with rate data 
    function rtchng(){ 
     $("#map").remove(); 
     $("#title").after("<div id='map'></div>"); 
     map = new Datamap({ 
      scope: 'usa', 
      element: document.getElementById('map'), 
      geographyConfig: { 
       highlightBorderColor: '#bada55', 
       popupTemplate: function(geography, data) { 
        return "<div class='hoverinfo'>" + geography.properties.name + ' %:' + data.Percentage + ' ' 
       }, 
       highlightBorderWidth: 3 
      }, 
      fills: { 
       'light': '#ffad99', 
       'medium': '#ff704d', 
       'heavy': '#ff3300', 
       defaultFill: '#ffebe6' 
      }, 
      data:rateChange 

     }); 
     map.labels(); 
    } 

     </script> 
</head> 

<body> 
    <div id="floating-panel1"> 
    <button type="button" onclick = "cstchng()">Cost Change</button> 
    <button type="button" onclick = "rtchng()">Range Change</button> 
    </div> 
    <div id="title"></div> 
    <div id="map"></div> 

</body> 
</html> 

ответ

1

Я думаю, что я могу помочь. В таких случаях, когда у вас есть избыточный код, обычно, как вы говорите, проще всего выполнить все. Если вы посмотрите на documentation и примеры из данных, вы можете пройти через них один за другим, чтобы лучше понять, как работает процесс построения карты, это должно помочь для любых будущих проектов.

Я взглянул на примеры их примеров choropleth и state label, чтобы выяснить, как это сделать. Описанный вами атрибут onclick в порядке. Вам нужно всего лишь отобразить карту. Чтобы обновить его, вы можете использовать их метод .updateChoropleth(), как показано в примере choropleth. Кроме того, похоже, что вам не нужен jQuery. По какой-то причине у меня были некоторые проблемы в прошлом с попыткой использовать jQuery и d3 вместе. В большинстве случаев вы можете выполнить то, что вам нужно с d3. Вот ссылка на другой вопрос о SO об этом: What is the difference between D3 and jQuery?

Я создал плункер, чтобы вы могли видеть результат в том, что я сделал. Дайте мне знать, если это то, что вы пытаетесь сделать:

http://plnkr.co/edit/Uaau983AQUbMoknZoROf?p=preview

и вот код, я использовал для справки:

<!DOCTYPE HTML> 
<html> 
<head> 
     <script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.min.js"></script> 
     <script src="//cdnjs.cloudflare.com/ajax/libs/topojson/1.6.9/topojson.min.js"></script> 
     <script src='datamaps.all.min.js'></script> 
</head> 

<body> 
<button id="costChange" onclick='updateCost(costChange)'>Cost Change</button> 
<button id="rateChange" onclick='updateCost(rateChange)'>Range Change</button> 
<div id="container" style="position: relative; width: 500px; height: 300px;"> 
</div> 
<script> 

var election = new Datamap({ 

    scope: 'usa', 

    element: document.getElementById('container'), 

    geographyConfig: { 
    highlightBorderColor: '#bada55', 
    popupTemplate: function(geography, data) { 
     return '<div class="hoverinfo">' + geography.properties.name + 'Percentage:' + data.electoralVotes + ' ' 
    }, 
    highlightBorderWidth: 3 
    }, 

    fills: { 
    'light': '#ffad99', 
      'medium': '#ff704d', 
      'heavy': '#ff3300', 
      defaultFill: '#ffebe6' 
    }, 

    data:{} 

    }); 

    election.labels(); 


    var costChange = { 
     'AR':{'fillKey':'heavy','Percentage':'236%'}, 
     'IL':{'fillKey':'light','Percentage':'5%'}, 
     'IN':{'fillKey':'medium','Percentage':'20%'}, 
     'KS':{'fillKey':'heavy','Percentage':'76%'}, 
     'KY':{'fillKey':'heavy','Percentage':'289%'}, 
     'MS':{'fillKey':'heavy','Percentage':'110%'}, 
     'NC':{'fillKey':'heavy','Percentage':'261%'}, 
     'TN':{'fillKey':'heavy','Percentage':'57%'}, 
     'VA':{'fillKey':'heavy','Percentage':'57%'}, 
     'WA':{'fillKey':'medium','Percentage':'18%'}, 
     'WI':{'fillKey':'medium','Percentage':'18%'} 
    }; 

    var rateChange = {'AL':{'fillKey':'medium','Percentage':'10%'}, 
     'AR':{'fillKey':'medium','Percentage':'16%'}, 
     'AZ':{'fillKey':'light','Percentage':'7%'}, 
     'CO':{'fillKey':'heavy','Percentage':'44%'}, 
     'CT':{'fillKey':'heavy','Percentage':'132%'}, 
     'DE':{'fillKey':'light','Percentage':'6%'}, 
     'FL':{'fillKey':'heavy','Percentage':'62%'}, 
     'GA':{'fillKey':'medium','Percentage':'17%'}, 
     'ID':{'fillKey':'heavy','Percentage':'66%'}, 
     'IN':{'fillKey':'light','Percentage':'4%'}, 
     'KS':{'fillKey':'medium','Percentage':'11%'}, 
     'KY':{'fillKey':'medium','Percentage':'24%'}, 
     'LA':{'fillKey':'medium','Percentage':'25%'}, 
     'MA':{'fillKey':'heavy','Percentage':'55%'}, 
     'MD':{'fillKey':'heavy','Percentage':'28%'} 
     }; 

    function updateCost(arg) { 
    election.updateChoropleth(null, {reset: true}); 
    election.updateChoropleth(arg); 
    } 

</script> 
</body> 
</html> 

Будем надеяться, что это помогает, дайте мне знать, если у вас есть какие-либо вопросы, :)

 Смежные вопросы

  • Нет связанных вопросов^_^