2015-05-25 8 views
0

я установки пример, чтобы продемонстрировать вопрос-х я столкнулся:D3.js Проблемы Фильтрация данных topojson

Чтобы быть кратким, я использую d3, чтобы сделать карту Соединенных Штатов. Я добавляю соответствующие атрибуты данных для обработки событий кликов и определения того, какое состояние было нажато.

по щелчку событий следующих предварительно формуют:

  • Я захватывая topojson файл округа США (который содержит все американские графств).

    Извлечение нерелевантных округов из данных и их отображение на карте состояния, которая была нажата.

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

Когда я регистрирую данные, которые возвращаются из отфильтрованного списка, я показываю точное количество округов, но они только частично нарисованы на карте. Некоторые штаты не возвращают. Pennsylvania и Texas частично работаю.

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

Если я использую файл counties JSON для отображения всей карты Соединенных Штатов, все они присутствуют.

Если кто-то может помочь пролить свет на то, что может произойти, это было бы здорово.

svg { 
 
fill:#cccccc; 
 
height:100%; 
 
width:100%; 
 
} 
 
.subunit{ 
 
outline:#000000; 
 
stroke:#FFFFFF; 
 
stroke-width: 1px; 
 
} 
 
.subunit:hover{ 
 
\t fill:#ffffff; 
 
\t stroke:#FFFFFF; 
 
\t stroke-width="10"; 
 
}
<body> 
 
<script src="http://www.cleanandgreenfuels.org/jquery-1.11.3.min.js"></script> 
 
<script src="http://www.cleanandgreenfuels.org/d3.v3.min.js"></script> 
 
<script src="http://www.cleanandgreenfuels.org/topojson.v1.min.js"></script> 
 
<script> 
 

 

 
var width = window.innerWidth; 
 
    height = window.innerHeight; 
 

 
var projection = d3.geo.albers() 
 
    .scale(1500) 
 
    .translate([width/2, height/2]); 
 

 
\t //d3.geo.transverseMercator() 
 
    //.rotate([77 + 45/60, -39 - 20/60]); 
 
    //.rotate([77+45/60,-40-10/60]) 
 
    //.scale(500) 
 
    //.translate([width/2, height/2]); 
 
var path = d3.geo.path() 
 
    .projection(projection); 
 

 

 
var svg = d3.select("body").append("svg") 
 
    .attr("width", width+"px") 
 
    .attr("height", height+"px"); 
 

 

 

 
d3.json("http://www.cleanandgreenfuels.org/usstates2.json.php", function(error, us, init) { 
 
    //svg.append("path") 
 
    // .datum(topojson.feature(us, us.objects.counties)) 
 
     //.attr("d", path); 
 
\t function init(){ 
 
\t \t $(document).ready(function() { 
 
\t 
 
\t \t \t $('.subunit').on('click',function(){ 
 
\t \t \t \t var stateid = $(this).attr("data-stateid"); 
 
\t \t \t \t 
 
\t \t \t \t function clearStates(stateid){ 
 
\t \t \t \t 
 
\t \t \t \t 
 
\t \t \t \t \t \t d3.json("http://www.cleanandgreenfuels.org/uscounties2.json.php", function(error, us) { 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t console.log(us); 
 
\t \t \t \t \t \t \t console.log("DATA CLICKED ID "+stateid); 
 
\t \t \t \t \t \t 
 
\t \t \t \t \t \t \t test = jQuery.grep(us.objects.counties.geometries, function(n){ 
 
\t \t \t \t \t \t \t \t return (n.properties.stateid == stateid); 
 
\t \t \t \t \t \t \t }); 
 
\t \t \t \t \t \t \t us.objects.counties.geometries = test; 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t \t console.log(test.length); 
 
\t \t \t \t \t \t \t console.log(us.objects.counties.geometries.length); 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t var test = topojson.feature(us, us.objects.counties).features; 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t console.log(test); 
 
\t \t \t \t \t \t \t console.log(test.length); 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t \t svg.selectAll(".subunit") 
 
\t \t \t \t \t \t \t \t \t .data(test) 
 
\t \t \t \t \t \t \t \t \t .enter().append("path") 
 
\t \t \t \t \t \t \t \t \t .attr("class", function(d) { return "subunit"; }) 
 
\t \t \t \t \t \t \t \t \t .attr("d", path) 
 
\t \t \t \t \t \t \t \t \t .attr("data-countyid", function(r){ return r.id; }); 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t }); 
 
\t \t \t \t \t 
 
\t \t \t \t \t 
 
\t \t \t \t } 
 
\t \t \t \t 
 
\t \t \t \t clearStates(stateid); 
 
\t \t \t }); 
 
\t \t \t 
 
\t \t \t 
 
\t \t \t 
 
\t 
 
\t \t }); 
 
\t } 
 

 
    
 
     
 
svg.selectAll(".subunit") 
 
    .data(topojson.feature(us, us.objects.us).features) 
 
    .enter().append("path") 
 
    .attr("class", function(d) { return "subunit"; }) 
 
    .attr("d", path) 
 
    .attr("data-stateid", function(r){ return r.id; }); 
 
    
 
    init(); 
 
    
 
     
 
}); 
 

 

 

 

 

 

 
</script> 
 
</body>

+0

Я нашел этот ресурс http://bl.ocks.org/mbostock/4108203, который, как представляется, обеспечивает лучшую реализацию. Хотя легкое решение состоит в том, чтобы лучше структурировать данные, мне все же интересно узнать, что происходит с приведенным выше примером. – user2355051

ответ

0

Кажется, как будто я пытался использовать устаревшие функции, используя topojson.mesh и .datum() добавить новые данные разрешил эту проблему, но представила новую ошибку.

Теперь выглядит так, как если бы многоугольники, которые были визуализированы, должны быть последовательно построены таким образом.

Я думаю, что данные должны быть очищены, чтобы оптимизировать способ работы d3, но мне все же хотелось бы узнать больше о том, как он передает эту информацию, полученную из набора данных.

function clearStates(stateid){ 


         d3.json("http://www.cleanandgreenfuels.org/uscounties2.json.php", function(error, us) { 


          console.log(us); 
          console.log("DATA CLICKED ID "+stateid); 

          test = jQuery.grep(us.objects.counties.geometries, function(n){ 
           return (n.properties.stateid == stateid); 
          }); 
          us.objects.counties.geometries = test; 

           console.log(test.length); 
          console.log(us.objects.counties.geometries.length); 

          **var test = topojson.mesh(us, us.objects.counties);** 


          console.log(test); 
          console.log(test.length); 

           **svg.append("path") 
            .datum(test) 
            .attr("class", function(d) { return "subunit"; }) 
            .attr("d", path) 
            .attr("data-countyid", function(r){ return r.id; });** 

         }); 


       }