Skip to content

Commit 658f694

Browse files
Merge pull request #67 from linkedconnections/development
v2.0.4
2 parents 8379e40 + a531a8d commit 658f694

File tree

9 files changed

+244
-223
lines changed

9 files changed

+244
-223
lines changed

bin/gtfsrt2lc.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,16 @@ if (!program.static) {
3030
process.exit();
3131
}
3232

33-
if (!program.urisTemplate) {
34-
console.error('Please provide path to a template file');
35-
console.error("GTFS-RT to linked connections converter use --help to discover how to use it");
36-
process.exit();
37-
}
38-
3933
if (!program.store) {
4034
program.store = 'MemStore';
4135
}
4236

4337
// Load URIs template
4438
let template = null;
4539
try {
46-
template = JSON.parse(fs.readFileSync(program.urisTemplate, 'utf8'));
40+
if (program.urisTemplate) {
41+
template = JSON.parse(fs.readFileSync(program.urisTemplate, 'utf8'));
42+
}
4743
} catch (err) {
4844
console.error('Please provide a valid path to a template file');
4945
console.error("GTFS-RT to linked connections converter use --help to discover how to use it");

lib/Connections2CSV.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ class Connections2CSV extends Transform {
66
this._headerStreamed = false;
77
}
88

9-
_transform(lc, encoding, done) {
9+
_transform(conn, encoding, done) {
1010
if (!this.headerStreamed) {
1111
this.headerStreamed = true;
12-
done(null, '"id","type",departureStop","departureTime","departureDelay",arrivalStop","arrivalTime","arrivalDelay","direction",trip","route"\n');
12+
done(null, '"type",departureStop","departureTime","departureDelay",arrivalStop","arrivalTime","arrivalDelay","headsign",trip","route"\n');
1313
} else {
14-
let csv = lc['@id'] + ',' + 'http://semweb.mmlab.be/ns/linkedconnections#' + lc['@type'] + ',' + lc['departureStop'] + ',' + lc['departureTime'] + ',' + lc['departureDelay'] + ',' + lc['arrivalStop']
15-
+ ',' + lc['arrivalTime'] + ',' + lc['arrivalDelay'] + ',' + lc['direction'] + ',' + lc['trip'] + ',' + lc['route'] + '\n';
14+
const csv = conn['type'] + ',' + conn['departureStop']['stop_name'] + ','
15+
+ conn['departureTime'].toISOString() + ',' + conn['departureDelay'] + ',' + conn['arrivalStop']['stop_name'] + ','
16+
+ conn['arrivalTime'].toISOString() + ',' + conn['arrivalDelay'] + ',' + conn['headsign'] + ','
17+
+ conn['trip']['trip_id'] + ',' + conn['route']['route_long_name'] + '\n';
1618
done(null, csv);
1719
}
1820
}

lib/Connections2JSONLD.js

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
const { Transform } = require('stream');
2+
const uri_templates = require('uri-templates');
3+
const Utils = require('./Utils');
24

35
class Connections2JSONLD extends Transform {
4-
constructor(streamContext) {
6+
constructor(streamContext, templates) {
57
super({ objectMode: true });
68
this._streamContext = streamContext || false;
79
this._contextStreamed = false;
10+
this._templates = templates;
811
this._context = {
912
"@context": {
1013
"xsd": "http://www.w3.org/2001/XMLSchema#",
@@ -50,29 +53,46 @@ class Connections2JSONLD extends Transform {
5053
}
5154
}
5255

53-
_transform(lc, encoding, done) {
56+
_transform(conn, encoding, done) {
5457
if (this._streamContext && !this.contextStreamed) {
5558
this.contextStreamed = true;
5659
this.push(this.context);
5760
}
5861

59-
let temp = {
60-
"@id": lc['@id'],
61-
"@type": lc['@type'],
62-
"departureStop": lc['departureStop'],
63-
"arrivalStop": lc['arrivalStop'],
64-
"departureTime": lc['departureTime'],
65-
"arrivalTime": lc['arrivalTime'],
66-
"departureDelay": lc['departureDelay'],
67-
"arrivalDelay": lc['arrivalDelay'],
68-
"direction": lc['direction'],
69-
"gtfs:trip": lc['trip'],
70-
"gtfs:route": lc['route'],
71-
"gtfs:pickupType": lc['gtfs:pickupType'],
72-
"gtfs:dropOffType": lc['gtfs:dropOffType']
62+
// Predefined URI templates
63+
const stopTemplate = uri_templates(this.templates['stop']);
64+
const routeTemplate = uri_templates(this.templates['route']);
65+
const tripTemplate = uri_templates(this.templates['trip']);
66+
const connectionTemplate = uri_templates(this.templates['connection']);
67+
68+
// Resolve values for URIs
69+
const departureStopURI = Utils.resolveURI(stopTemplate, conn, this.templates['resolve'], "departureStop");
70+
const arrivalStopURI = Utils.resolveURI(stopTemplate, conn, this.templates['resolve'], "arrivalStop");
71+
const routeURI = Utils.resolveURI(routeTemplate, conn, this.templates['resolve']);
72+
const tripURI = Utils.resolveURI(tripTemplate, conn, this.templates['resolve']);
73+
const connectionURI = Utils.resolveURI(connectionTemplate, conn, this.templates['resolve']);
74+
// Determine Pick Up & Drop Off types
75+
const pickupType = Utils.resolveScheduleRelationship(conn['pickup_type']);
76+
const dropOffType = Utils.resolveScheduleRelationship(conn['drop_off_type']);
77+
78+
// Build LC
79+
const lc = {
80+
"@id": connectionURI,
81+
"@type": conn.type,
82+
"departureStop": departureStopURI,
83+
"arrivalStop": arrivalStopURI,
84+
"departureTime": conn.departureTime.toISOString(),
85+
"arrivalTime": conn.arrivalTime.toISOString(),
86+
"departureDelay": conn.departureDelay,
87+
"arrivalDelay": conn.arrivalDelay,
88+
"gtfs:trip": tripURI,
89+
"gtfs:route": routeURI,
90+
"direction": conn.trip['trip_headsign'],
91+
"gtfs:pickupType": pickupType,
92+
"gtfs:dropOffType": dropOffType
7393
}
7494

75-
done(null, temp);
95+
done(null, lc);
7696
}
7797

7898
get contextStreamed() {
@@ -86,6 +106,10 @@ class Connections2JSONLD extends Transform {
86106
get context() {
87107
return this._context;
88108
}
109+
110+
get templates() {
111+
return this._templates;
112+
}
89113
}
90114

91115
module.exports = Connections2JSONLD;

lib/Connections2Triples.js

Lines changed: 58 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,93 +2,110 @@ const { Transform } = require('stream');
22
const N3 = require('n3');
33
const { DataFactory } = N3;
44
const { namedNode, literal, quad } = DataFactory;
5+
const uri_templates = require('uri-templates');
6+
const Utils = require('./Utils');
57

68
class Connections2Triples extends Transform {
7-
constructor() {
9+
constructor(templates) {
810
super({ objectMode: true });
11+
this._templates = templates;
912
}
1013

11-
_transform(lc, encoding, done) {
12-
if (lc['@type'] === 'Connection') {
14+
_transform(conn, encoding, done) {
15+
// Predefined URI templates
16+
const stopTemplate = uri_templates(this.templates['stop']);
17+
const routeTemplate = uri_templates(this.templates['route']);
18+
const tripTemplate = uri_templates(this.templates['trip']);
19+
const connectionTemplate = uri_templates(this.templates['connection']);
20+
21+
// Resolve values for URIs
22+
const departureStopURI = Utils.resolveURI(stopTemplate, conn, this.templates['resolve'], "departureStop");
23+
const arrivalStopURI = Utils.resolveURI(stopTemplate, conn, this.templates['resolve'], "arrivalStop");
24+
const routeURI = Utils.resolveURI(routeTemplate, conn, this.templates['resolve']);
25+
const tripURI = Utils.resolveURI(tripTemplate, conn, this.templates['resolve']);
26+
const connectionURI = Utils.resolveURI(connectionTemplate, conn, this.templates['resolve']);
27+
// Determine Pick Up & Drop Off types
28+
const pickupType = Utils.resolveScheduleRelationship(conn['pickup_type']);
29+
const dropOffType = Utils.resolveScheduleRelationship(conn['drop_off_type']);
30+
31+
if (conn['type'] === 'Connection') {
1332
this.push(
1433
quad(
15-
namedNode(lc['@id']),
34+
namedNode(connectionURI),
1635
namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
1736
namedNode('http://semweb.mmlab.be/ns/linkedconnections#Connection')));
1837
} else {
1938
this.push(
2039
quad(
21-
namedNode(lc['@id']),
40+
namedNode(connectionURI),
2241
namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
2342
namedNode('http://semweb.mmlab.be/ns/linkedconnections#CancelledConnection')));
2443
}
2544

2645
this.push(
2746
quad(
28-
namedNode(lc['@id']),
47+
namedNode(connectionURI),
2948
namedNode('http://semweb.mmlab.be/ns/linkedconnections#departureStop'),
30-
namedNode(lc['departureStop'])));
49+
namedNode(departureStopURI)));
3150
this.push(
3251
quad(
33-
namedNode(lc['@id']),
52+
namedNode(connectionURI),
3453
namedNode('http://semweb.mmlab.be/ns/linkedconnections#arrivalStop'),
35-
namedNode(lc['arrivalStop'])));
54+
namedNode(arrivalStopURI)));
3655
this.push(
3756
quad(
38-
namedNode(lc['@id']),
57+
namedNode(connectionURI),
3958
namedNode('http://semweb.mmlab.be/ns/linkedconnections#departureTime'),
40-
literal(lc['departureTime'], namedNode('http://www.w3.org/2001/XMLSchema#dateTime'))));
59+
literal(conn['departureTime'].toISOString(), namedNode('http://www.w3.org/2001/XMLSchema#dateTime'))));
4160
this.push(
4261
quad(
43-
namedNode(lc['@id']),
62+
namedNode(connectionURI),
4463
namedNode('http://semweb.mmlab.be/ns/linkedconnections#arrivalTime'),
45-
literal(lc['arrivalTime'], namedNode('http://www.w3.org/2001/XMLSchema#dateTime'))));
64+
literal(conn['arrivalTime'].toISOString(), namedNode('http://www.w3.org/2001/XMLSchema#dateTime'))));
4665
this.push(
4766
quad(
48-
namedNode(lc['@id']),
67+
namedNode(connectionURI),
4968
namedNode('http://semweb.mmlab.be/ns/linkedconnections#departureDelay'),
50-
literal(lc['departureDelay'], namedNode('http://www.w3.org/2001/XMLSchema#integer'))));
69+
literal(conn['departureDelay'], namedNode('http://www.w3.org/2001/XMLSchema#integer'))));
5170
this.push(
5271
quad(
53-
namedNode(lc['@id']),
72+
namedNode(connectionURI),
5473
namedNode('http://semweb.mmlab.be/ns/linkedconnections#arrivalDelay'),
55-
literal(lc['arrivalDelay'], namedNode('http://www.w3.org/2001/XMLSchema#integer'))));
74+
literal(conn['arrivalDelay'], namedNode('http://www.w3.org/2001/XMLSchema#integer'))));
5675
this.push(
5776
quad(
58-
namedNode(lc['@id']),
77+
namedNode(connectionURI),
5978
namedNode('http://vocab.gtfs.org/terms#headsign'),
60-
literal(lc['direction'], namedNode('http://www.w3.org/2001/XMLSchema#string'))));
79+
literal(conn['headsign'], namedNode('http://www.w3.org/2001/XMLSchema#string'))));
6180
this.push(
6281
quad(
63-
namedNode(lc['@id']),
82+
namedNode(connectionURI),
6483
namedNode('http://vocab.gtfs.org/terms#trip'),
65-
namedNode(lc['trip'])));
84+
namedNode(tripURI)));
6685
this.push(
6786
quad(
68-
namedNode(lc['@id']),
87+
namedNode(connectionURI),
6988
namedNode('http://vocab.gtfs.org/terms#route'),
70-
namedNode(lc['route'])));
71-
72-
if (lc['gtfs:dropOffType'] && lc['gtfs:dropOffType'] !== null) {
73-
this.push(
74-
quad(
75-
namedNode(lc['@id']),
76-
namedNode('http://vocab.gtfs.org/terms#dropOffType'),
77-
namedNode(lc['gtfs:dropOffType'])
78-
));
79-
}
80-
81-
if (lc['gtfs:pickupType'] && lc['gtfs:pickupType'] !== null) {
82-
this.push(
83-
quad(
84-
namedNode(lc['@id']),
85-
namedNode('http://vocab.gtfs.org/terms#pickupType'),
86-
namedNode(lc['gtfs:pickupType'])
87-
));
88-
}
89+
namedNode(routeURI)));
90+
this.push(
91+
quad(
92+
namedNode(connectionURI),
93+
namedNode('http://vocab.gtfs.org/terms#dropOffType'),
94+
namedNode(dropOffType)
95+
));
96+
this.push(
97+
quad(
98+
namedNode(connectionURI),
99+
namedNode('http://vocab.gtfs.org/terms#pickupType'),
100+
namedNode(pickupType)
101+
));
89102

90103
done(null);
91104
}
105+
106+
get templates() {
107+
return this._templates;
108+
}
92109
}
93110

94111
module.exports = Connections2Triples;

0 commit comments

Comments
 (0)