2015-04-01 34 views
26

Ho cercato un po 'di tempo per una risposta a questo, e non sono stato in grado di capirlo.Armi di livellamento/punti di trama in D3.js/GeoJSON/TopoJSON/Shapefile (da qualche parte lungo la strada)

  • Alla fine sto creando un file TopoJSON da dati basati su griglia (file GRIB).
  • Posso facilmente interpolare i dati fino a una griglia di risoluzione più fine in modo che i punti di trama appaiano10 più agevoli quando si esegue lo zoom indietro, ma quando si esegue lo zoom in avanti, è inevitabile vedere i punti di griglia bloccati.
  • Ho anche esaminato la semplificazione, che aiuta un po ' ma non è abbastanza liscia.
  • Sto utilizzando D3 per il rendering dei dati.
  • È qualcosa che può essere eseguito sul front-end o dovrebbe/può essere eseguito nei dati TopoJSON non elaborati?
  • In sostanza, non voglio che tu sia in grado di dire che è una griglia, anche se ingrandisci il 10.000%.
  • Ecco un esempio di quello che sto cercando:

enter image description here

+4

correlati [Creare un percorso SVG come una linea liscia invece di essere irregolare] (http://stackoverflow.com/questions/28638327/) – Hugolpz

+0

Ogni volta che si richiedono linee continue e uniformi a tutte le risoluzioni, le scelte si riducono sostanzialmente a file enormi o SVG. Mi aspetterei che la soluzione sarebbe prendere i dati semplificati e convertirli in SVG con arrotondamenti agli angoli per ottenere l'effetto desiderato. – brichins

+1

Inoltre, in qualità di ingegnere civile, vorrei prima chiedere perché questo è stato necessario - implica un livello di precisione che non esiste nel set di dati, e per la maggior parte dei problemi che ho a che fare, esagerare con la precisione è una responsabilità seria problema. A seconda del tuo utilizzo, fare ciò potrebbe essere una cattiva pratica se potrebbe indurre in errore un utente e portare a conclusioni errate.Personalmente preferirei visualizzare (per esempio) qualcosa di blocky per rappresentare visivamente '+/- 5 piedi' rispetto a una linea perfetta, a larghezza 0, che potrebbe atterrare sul lato sbagliato di un angolo di una proprietà. – brichins

risposta

1

Is questo qualcosa che può essere fatto sul front end o dovrebbe/può essere fatto nel raw Dati TopoJSON?

Questo è qualcosa che dovrebbe essere fatto sul front-end. Se dovessi lisciare i dati prima di scriverli nel file JSON, il file sarebbe inutilmente grande.

+1

Sto accettando questo, perché questo è fondamentalmente quello che ho trovato. Gli algoritmi devono farlo sul front-end, altrimenti la dimensione del file sarebbe straordinaria. Con D3/topojson, non ci sono al momento funzionalità in grado di farlo correttamente. Deve essere arrotolato a mano. – stewart715

+1

Inoltre, se eseguita sul front-end, l'interpolazione può essere eseguita pigramente - se l'utente non esegue lo zoom in avanti, non è necessario eseguire l'interpolazione. – Sam

+0

Potrebbe anche valere la pena sottolineare un'affermazione ovvia: GeoJSON/Topojson non supporta le curve di Bézier. Curve così lisce in quel formato sono in realtà molte, molte linee rette che formano una curva. Quindi, la dimensione del file più grande se si decide di inserire questo nei dati grezzi. – stewart715

1

Se stai usando d3.js, e si sta lavorando con le linee, la funzione di interpolare built-in() è la strada da percorrere.

Ecco un esempio di lavoro di line.interpolate di D3() utilizzando "cardinale" smoothing:

example of D3's line.interpolate()

Ecco il codice:

var margin = { 
    top: 30, 
    right: 20, 
    bottom: 30, 
    left: 50 
    }, 
    width = 600 - margin.left - margin.right, 
    height = 270 - margin.top - margin.bottom; 
// Parse the date/time 
var parseDate = d3.time.format("%d-%b-%y").parse; 
// Set the ranges 
var x = d3.time.scale().range([0, width]); 
var y = d3.scale.linear().range([height, 0]); 
// Define the axes 
var xAxis = d3.svg.axis().scale(x).orient("bottom").ticks(5); 
var yAxis = d3.svg.axis().scale(y).orient("left").ticks(5); 

// Define the line 
var valueline = d3.svg.line() 
    .interpolate("cardinal") 
    .x(function(d) { 
    return x(d.date); 
    }) 
    .y(function(d) { 
    return y(d.close); 
    }); 

// Adds the svg canvas 
var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform", 
    "translate(" + margin.left + "," + margin.top + ")"); 

// Get the data 
d3.json('https://api.myjson.com/bins/175jl', function(error, data) { 
    data.forEach(function(d) { 
    d.date = parseDate(d.date); 
    d.close = +d.close; 
    }); 
    // Scale the range of the data 
    // Starting with a basic graph 14 
    x.domain(d3.extent(data, function(d) { 
    return d.date; 
    })); 
    y.domain([0, d3.max(data, function(d) { 
    return d.close; 
    })]); 
    // Add the valueline path. 
    svg.append("path") 
    .attr("class", "line") 
    .attr("d", valueline(data)); 
    // Add the X Axis 
    svg.append("g") 
    .attr("class", "x axis") 
    .attr("transform", "translate(0," + height + ")") 
    .call(xAxis); 
    // Add the Y Axis 
    svg.append("g") 
    .attr("class", "y axis") 
    .call(yAxis); 
}); 
+0

Grazie, ma topojson aggiunge percorsi, non linee. L'interpolazione/livellamento standard non funziona purtroppo. – stewart715