Skip to content

Commit 0a9861d

Browse files
authored
Merge pull request #170 from opentraffic/misc-improvements
Misc improvements
2 parents 842779c + f78290c commit 0a9861d

File tree

6 files changed

+74
-33
lines changed

6 files changed

+74
-33
lines changed

circle.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
# Using Yarn, rather than NPM. See https://circleci.com/docs/1.0/yarn/
2+
13
machine:
24
node:
35
version: 8.2.0
6+
environment:
7+
PATH: "${PATH}:${HOME}/${CIRCLE_PROJECT_REPONAME}/node_modules/.bin"
8+
9+
dependencies:
10+
override:
11+
- yarn install
12+
cache_directories:
13+
- ~/.cache/yarn
14+
15+
test:
16+
override:
17+
- yarn test # run all tests, including the linter
18+
- yarn build # make sure we can successfully build

src/app/route.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ export function showRoute (waypoints) {
200200
const fullArrayDist = Distance(coordsSlice[0], coordsSlice[coordsSlice.length - 1])
201201
let speed = -1
202202
let speedByHour = []
203+
let percentDiff = 0
203204
let dist = 0
204205
if (edge.traffic_segments) {
205206
for (let t = 0; t < edge.traffic_segments.length; t++) {
@@ -248,6 +249,7 @@ export function showRoute (waypoints) {
248249
if (id === parsedIds[i].id) {
249250
speed = parsedIds[i].speed
250251
speedByHour = parsedIds[i].speedByHour
252+
percentDiff = parsedIds[i].percentDiff
251253
speeds.push({
252254
coordinates: coordsSlice,
253255
speed: speed,
@@ -270,7 +272,8 @@ export function showRoute (waypoints) {
270272
id: edge.traffic_segments[t],
271273
osmlr_id: edge.traffic_segments[t].segment_id,
272274
speed: speed,
273-
speedByHour: speedByHour
275+
speedByHour: speedByHour,
276+
percentDiff: percentDiff
274277
// Note, this is missing properties that are already there in the region view
275278
}
276279
})

src/components/Sidebar/ExportData/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ class ExportData extends React.Component {
1111
analysisName: PropTypes.string,
1212
analysisMode: PropTypes.string,
1313
date: PropTypes.object,
14-
route: PropTypes.object
14+
route: PropTypes.object,
15+
refSpeedComparisonEnabled: PropTypes.bool
1516
}
1617

1718
constructor (props) {
@@ -23,7 +24,7 @@ class ExportData extends React.Component {
2324
}
2425

2526
onClickButton = (format) => {
26-
const result = exportData(this.props.geoJSON, this.props.analysisName, format, this.props.analysisMode, this.props.date, this.props.route)
27+
const result = exportData(this.props.geoJSON, this.props.analysisName, format, this.props.analysisMode, this.props.date, this.props.refSpeedComparisonEnabled, this.props.route)
2728
if (result === false) {
2829
this.setState({
2930
message: 'There is no data to download.'
@@ -60,7 +61,8 @@ function mapStateToProps (state) {
6061
analysisName: state.app.viewName,
6162
analysisMode: state.app.analysisMode,
6263
date: state.date,
63-
route: state.route
64+
route: state.route,
65+
refSpeedComparisonEnabled: state.app.refSpeedComparisonEnabled
6466
}
6567
}
6668

src/components/Sidebar/Legend/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default class Legend extends React.PureComponent {
2222
return (
2323
<Segment>
2424
<Header as="h3">
25-
{ (this.props.compareEnabled) ? 'Percent change in speed' : 'Speed, in kilometers per hour' }
25+
{ (this.props.compareEnabled) ? 'Percent change, compared to reference speeds' : 'Speed, in kilometers per hour' }
2626
</Header>
2727
<table>
2828
<tbody>

src/components/Sidebar/TimeFilters/index.js

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -100,33 +100,32 @@ export class TimeFilters extends React.Component {
100100
render () {
101101
return (
102102
<Segment>
103-
<div className="radio">
104-
<strong>
105-
<Radio
106-
toggle
107-
label="Compare against reference speeds"
108-
checked={this.props.refSpeedComparisonEnabled}
109-
onChange={(event, data) => {
110-
this.props.dispatch(setRefSpeedComparisonEnabled(data.checked))
111-
}}
112-
/>
113-
</strong>
114-
</div>
115-
<Divider />
116103
<div className="timefilter-daily">
117104
<strong>
118-
{ (this.props.refSpeedComparisonEnabled) ? 'Percent change in Speed by day-of-week' : 'Average by day-of-week' }
105+
{ (this.props.refSpeedComparisonEnabled) ? 'Percent change in speed by day-of-week' : 'Average speed (KPH) by day-of-week' }
119106
</strong>
120107
<div ref={(ref) => { this.dailyChartEl = ref }} />
121108
</div>
122109

123110
<div className="timefilter-hourly">
124111
<strong>
125-
{ (this.props.refSpeedComparisonEnabled) ? 'Percent change in Speed by hour-of-day' : 'Average by hour-of-day' }
112+
{ (this.props.refSpeedComparisonEnabled) ? 'Percent change in speed by hour-of-day' : 'Average speed (KPH) by hour-of-day' }
126113
</strong>
127114
<div ref={(ref) => { this.hourlyChartEl = ref }} />
128115
</div>
129116
<Divider />
117+
<div className="radio">
118+
<strong>
119+
<Radio
120+
toggle
121+
label="Compare against reference speeds"
122+
checked={this.props.refSpeedComparisonEnabled}
123+
onChange={(event, data) => {
124+
this.props.dispatch(setRefSpeedComparisonEnabled(data.checked))
125+
}}
126+
/>
127+
</strong>
128+
</div>
130129
</Segment>
131130
)
132131
}

src/lib/exporter.js

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import _ from 'lodash'
33

44
const DAYS_OF_WEEK = [null, 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
55

6-
function prepareCsvForExport (data, analysisMode, route) {
6+
function prepareCsvForExport (data, analysisMode, refSpeedComparisonEnabled, route) {
77
let rows = []
88
if (analysisMode === 'ROUTE') {
99
rows.push({
@@ -12,15 +12,20 @@ function prepareCsvForExport (data, analysisMode, route) {
1212
'traffic_route_time': route.trafficRouteTime
1313
})
1414
}
15+
1516
rows = rows.concat(_.map(data.features, (segment) => {
1617
var row = {
1718
'row_type': 'segment',
1819
'osmlr_id': segment.properties.osmlr_id
1920
}
20-
segment.properties.speedByHour.forEach((speedByHour) => {
21-
let dayOfWeek = DAYS_OF_WEEK[speedByHour.dayOfWeek]
22-
row[`average_speed_on_${dayOfWeek}_at_hour_${speedByHour.hourOfDay}`] = speedByHour.speedThisHour
23-
})
21+
if (refSpeedComparisonEnabled) {
22+
row['percent_diff_from_reference_speed'] = segment.properties.percentDiff
23+
} else {
24+
segment.properties.speedByHour.forEach((speedByHour) => {
25+
let dayOfWeek = DAYS_OF_WEEK[speedByHour.dayOfWeek]
26+
row[`average_speed_on_${dayOfWeek}_at_hour_${speedByHour.hourOfDay}`] = speedByHour.speedThisHour
27+
})
28+
}
2429
return row
2530
}))
2631
let str = convertArrayOfObjectsToCsv(rows)
@@ -78,25 +83,42 @@ export function convertArrayOfObjectsToCsv (data, columnDelimiter = ',', lineDel
7883
* @param {Object} date
7984
* @param {Object} route
8085
*/
81-
export function exportData (obj, name = 'untitled', format = 'geojson', analysisMode, date, route) {
86+
export function exportData (obj, name = 'untitled', format = 'geojson', analysisMode, date, refSpeedComparisonEnabled, route) {
8287
if (!obj) return false
8388

8489
let blob
8590

86-
obj.properties.analysisMode = analysisMode
87-
obj.properties.analysisName = name
88-
obj.properties.date = {
91+
let data = JSON.parse(JSON.stringify(obj)) // deep clone, so we can modify the data
92+
93+
data.properties.analysisMode = analysisMode
94+
data.properties.analysisName = name
95+
const days = (date && date.dayFilter) ? _.slice(DAYS_OF_WEEK, date.dayFilter[0] + 1, date.dayFilter[1] + 1) : _.slice(DAYS_OF_WEEK, 1, 8)
96+
const hours = (date && date.hourFilter) ? _.range(date.hourFilter[0], date.hourFilter[1]) : _.range(0, 25)
97+
data.properties.date = {
8998
year: date.year,
9099
week: parseInt(date.week, 10),
91-
days: _.slice(DAYS_OF_WEEK, date.dayFilter[0] + 1, date.dayFilter[1] + 1),
92-
hours: _.range(date.hourFilter[0], date.hourFilter[1] + 1)
100+
days: days,
101+
hours: hours
102+
}
103+
104+
if (refSpeedComparisonEnabled) {
105+
data.features = data.features.map((feature) => {
106+
delete feature.properties.speedByHour
107+
delete feature.properties.speed
108+
return feature
109+
})
110+
} else {
111+
data.features = data.features.map((feature) => {
112+
delete feature.properties.percentDiff
113+
return feature
114+
})
93115
}
94116

95117
if (format === 'geojson') {
96-
let str = JSON.stringify(obj, null, 2)
118+
let str = JSON.stringify(data, null, 2)
97119
blob = new Blob([str], {type: 'application/json;charset=utf-8'})
98120
} else if (format === 'csv') {
99-
let str = prepareCsvForExport(obj, analysisMode, route)
121+
let str = prepareCsvForExport(data, analysisMode, refSpeedComparisonEnabled, route)
100122
blob = new Blob([str], {type: 'text/csv;charset=utf-8'})
101123
} else {
102124
throw new Error('exportData() only supports GeoJSON or CSV formats')

0 commit comments

Comments
 (0)