2015-02-03 8 views
6

Załadowano kod us.json, ale gdy próbuję dodać nazwę etykiety, nie można jej uruchomić. Nie widzę właściwości nazwy w pliku .json, więc jak mogę dodać nazwę każdego stanu? Jestem naprawdę nowy w tej strukturze.Jak dodać etykietę do każdego stanu w pliku d3.js (albersUsa)?

Próbuję różnych tutoriali w Google i Stackoverflow, ale żaden z nich nie działa dla mnie. Oto link do paru tutoriala, który wypróbowałem, który uważam za warty.

obawy mam:

  1. Chyba brakuje właściwości name w pliku us.json. (jeśli to jest problem, czy istnieje inny plik .json zawierający nazwę stanu i jak używać nazwy stanu z tym plikiem?)
  2. Czy nazwa stanu USA jest zawarta w http://d3js.org/topojson.v1.min.js?

.html plików (ramowa Loaded)

<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script> 
<script src="http://d3js.org/topojson.v1.min.js"></script> 

.js Plik:

var width = 1500, 
    height = 1100, 
    centered; 


var usData = ["json/us.json"]; 
var usDataText = ["json/us-states.json"]; 

var projection = d3.geo.albersUsa() 
    .scale(2000) 
    .translate([760, height/2]); 

var path = d3.geo.path() 
    .projection(projection); 

var svg = d3.select("body").append("svg") 
    .style("width", "100%") 
    .style("height", "100%"); 


svg.append("rect") 
    .attr("class", "background") 
    .attr("width", width) 
    .attr("height", height) 
    .on("click", clicked); 

var g = svg.append("g"); 

d3.json(usData, function(unitedState) { 
    g.append("g") 
    .attr("class", "states-bundle") 
    .selectAll("path") 
    .data(topojson.feature(unitedState, unitedState.objects.states).features) 
    .enter() 
    .append("path") 
    .attr("d", path) 
    .attr("class", "states") 
    .on("click", clicked); 
}); 

Dziękuję wszystkim w zaawansowanych. Doceniam również, jeśli powiesz mi, gdzie nauczyłeś się d3.js.

Odpowiedz

7

Jak podano, twoje us.json nie ma w nim nazw stanów. To, co ma, jest unikatowe i szczęśliwie, pan Bostock zmapował te identyfikatory na nazwy here.

Naprawmy ten kod.

Po pierwsze, upewnij się json wnioski wyciągnąć dane:

// path data 
d3.json("us.json", function(unitedState) { 
    var data = topojson.feature(unitedState, unitedState.objects.states).features; 
    // our names 
    d3.tsv("us-state-names.tsv", function(tsv){ 
    // extract just the names and Ids 
    var names = {}; 
    tsv.forEach(function(d,i){ 
     names[d.id] = d.name; 
    }); 

Teraz dodaj naszą wizualizację:

// build paths 
g.append("g") 
    .attr("class", "states-bundle") 
    .selectAll("path") 
    .data(data) 
    .enter() 
    .append("path") 
    .attr("d", path) 
    .attr("stroke", "white") 
    .attr("class", "states"); 

// add state names 
g.append("g") 
    .attr("class", "states-names") 
    .selectAll("text") 
    .data(data) 
    .enter() 
    .append("svg:text") 
    .text(function(d){ 
    return names[d.id]; 
    }) 
    .attr("x", function(d){ 
     return path.centroid(d)[0]; 
    }) 
    .attr("y", function(d){ 
     return path.centroid(d)[1]; 
    }) 
    .attr("text-anchor","middle") 
    .attr('fill', 'white'); 

    .... 

Oto pracuje example.

+0

Dziękuję bardzo, Ta praca doskonale i pozwala mi zrozumieć to jasno. Czas na wstawienie Google API, Cheers! – Xrait

+0

Ta odpowiedź działała głównie, ale od września 2017 r. Pole 'id' w TopoJSON jest łańcuchem o długości zerowej 2 (" 01 "," 05 ", ... '21' ...) i" id " 'pole w nazwach TSV jest ciągiem o zmiennej długości, który nie jest wypełniony zerami. To spowodowało problem w kilku stanach. Aby to naprawić, dodaj zero wypełnienia. 'tsv.forEach (funkcja (d, i) {klawisz var = d.id.length> 1? d.id: '0' + d.id; names [key] = d.name; });' '; –

Powiązane problemy