4 changed files with 94 additions and 1 deletions
			
			
		- 
					50src/data.js
 - 
					5src/index.js
 - 
					33src/render.js
 - 
					7src/style.sass
 
@ -0,0 +1,50 @@ | 
				
			|||
var d3 = require('d3') | 
				
			|||
 | 
				
			|||
export function readxml(xmldoc) { | 
				
			|||
    let forcast = xmldoc.childNodes[0] | 
				
			|||
    let data = forcast.children[1] | 
				
			|||
 | 
				
			|||
    // Time
 | 
				
			|||
    let times = data.getElementsByTagName('time-layout')[0] | 
				
			|||
    var startTimes = [] | 
				
			|||
    for (let time of times.getElementsByTagName('start-valid-time')) { | 
				
			|||
        let date = new Date(time.textContent) | 
				
			|||
        startTimes.push(date) | 
				
			|||
    } | 
				
			|||
    var endTimes = [] | 
				
			|||
    for (let time of times.getElementsByTagName('end-valid-time')) { | 
				
			|||
        let date = new Date(time.textContent) | 
				
			|||
        endTimes.push(date) | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    // Temperature
 | 
				
			|||
    var temperatures = [] | 
				
			|||
    for (let temp_type of data.getElementsByTagName('temperature')) { | 
				
			|||
        if (temp_type.attributes.type.nodeValue === 'hourly') { | 
				
			|||
            for (let temp of temp_type.getElementsByTagName('value')) { | 
				
			|||
                let degC = (parseFloat(temp.textContent) - 32) * (5.0/9.0) | 
				
			|||
                temperatures.push(degC) | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    // Map
 | 
				
			|||
    let nElements = startTimes.length | 
				
			|||
    var forcastData = [] | 
				
			|||
    for (var i = 0; i < nElements; i++) { | 
				
			|||
        let midtimeScale = d3.scaleTime() | 
				
			|||
            .domain([0, 1]) | 
				
			|||
            .range([startTimes[i], endTimes[i]]) | 
				
			|||
        let midpointTime = midtimeScale(0.5) | 
				
			|||
        forcastData.push({ | 
				
			|||
            'date': midpointTime, | 
				
			|||
            'temp': temperatures[i] | 
				
			|||
        }) | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    return { | 
				
			|||
        'startTimes': startTimes, | 
				
			|||
        'endTimes': endTimes, | 
				
			|||
        'temperature': forcastData | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -1,9 +1,12 @@ | 
				
			|||
var d3 = require('d3') | 
				
			|||
import {readxml} from './data.js' | 
				
			|||
import {render} from './render.js' | 
				
			|||
 | 
				
			|||
let canvas = d3.select('svg') | 
				
			|||
 | 
				
			|||
//const url = 'https://forecast.weather.gov/MapClick.php?lat=39.9243509&lon=-75.1696126&FcstType=digitalDWML'
 | 
				
			|||
const url = '/forcast.xml' | 
				
			|||
d3.xml(url).then(function(xmldoc) { | 
				
			|||
    console.log(xmldoc) | 
				
			|||
    let data = readxml(xmldoc) | 
				
			|||
    render(canvas, data) | 
				
			|||
}) | 
				
			|||
@ -0,0 +1,33 @@ | 
				
			|||
var d3 = require('d3') | 
				
			|||
 | 
				
			|||
export function render(canvas, data) { | 
				
			|||
    let xWidth = canvas.node().getBoundingClientRect().width | 
				
			|||
    let yHeight = canvas.node().getBoundingClientRect().height | 
				
			|||
    let xMargin = 50 | 
				
			|||
    let yMargin = 25 | 
				
			|||
    let nElements = data.startTimes.length | 
				
			|||
 | 
				
			|||
    let beginTime = new Date( | 
				
			|||
        data.startTimes[0].getFullYear(), | 
				
			|||
        data.startTimes[0].getMonth(), | 
				
			|||
        data.startTimes[0].getDate(), | 
				
			|||
        0,0,0 | 
				
			|||
    ) | 
				
			|||
 | 
				
			|||
    let xRange = d3.scaleTime() | 
				
			|||
        .domain([beginTime, data.endTimes[nElements - 1]]) | 
				
			|||
        .range([xMargin, xWidth]) | 
				
			|||
    let yRange = d3.scaleLinear() | 
				
			|||
        .domain([-15, 45]) | 
				
			|||
        .range([yHeight - yMargin, 0]) | 
				
			|||
 | 
				
			|||
    let line = d3.line() | 
				
			|||
        .x(function(d) { return xRange(d.date) }) | 
				
			|||
        .y(function(d) { return yRange(d.temp) }) | 
				
			|||
        .curve(d3.curveBasis) | 
				
			|||
 | 
				
			|||
    canvas.append('path') | 
				
			|||
        .data([data.temperature]) | 
				
			|||
        .attr('class', 'data') | 
				
			|||
        .attr('d', line) | 
				
			|||
} | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue