gtfs-utils
Version:
Utilities to process GTFS data sets.
1,271 lines (1,244 loc) • 76.6 kB
JavaScript
/* eslint-disable no-mixed-spaces-and-tabs */
'use strict'
const test = require('tape')
const inMemoryStore = require('../lib/in-memory-store')
const buildTrajectory = require('../lib/build-trajectory')
// just for debugging
const printTrajectorForDebugging = (tr, stopLocs) => {
console.error(JSON.stringify({
type: 'FeatureCollection',
features: [
{
...tr,
geometry: {
type: 'LineString',
coordinates: tr.geometry.coordinates.map(c => c.slice(0, 2)),
},
},
...Array.from(stopLocs.raw.entries()).map(([stopId, coordinates]) => ({
type: 'Feature',
properties: {
stopId,
'marker-color': '#ff0000',
},
geometry: {type: 'Point', coordinates},
})),
...tr.geometry.coordinates.map(([lon, lat, _, arr, dep]) => ({
type: 'Feature',
properties: {
arr, dep,
'marker-size': 'small',
},
geometry: {type: 'Point', coordinates: [lon, lat]},
})),
],
}, '\t'))
}
test('buildTrajectory works with imaginary shape & schedule', async (t) => {
const stopLocs = inMemoryStore()
stopLocs.raw.set('airport', [ 1.1, 1.1])
stopLocs.raw.set('train', [ 1.102, 1.102])
stopLocs.raw.set('museum', [ 1.11, 1.11])
stopLocs.raw.set('mall', [ 1.12, 1.12])
stopLocs.raw.set('center', [ 1.13, 1.13])
stopLocs.raw.set('foo', [-1, -1])
const schedule = {
id: '12',
trips: [{tripId: 'A', start: 1234}],
stops: ['airport', 'train', 'museum', 'mall', 'center'],
arrivals: [0, 60, 210, 510, 600],
departures: [30, 80, 240, 540, 720],
headwayBasedStarts: [],
headwayBasedEnds: [],
headwayBasedHeadways: []
}
const shapeId = 's0'
const shapePoints = [
// <-- airport is here, at 1.10 | 1.10
[1.101, 1.101, 0],
// <-- train is here, at 1.102 | 1.102
[1.104, 1.104, 1],
[1.105, 1.105, 2],
[1.108, 1.108, 4],
// <-- museum is here, at 1.11 | 1.11
[1.111, 1.111, 5],
[1.12, 1.12, 6], // <-- mall is right here, at 1.12 | 1.12
[1.129, 1.129, 7],
// <-- center is here, at 1.13 | 1.13
].map(([shape_pt_lon, shape_pt_lat, shape_pt_sequence]) => ({
shape_pt_lat,
shape_pt_lon,
shape_pt_sequence,
shape_dist_traveled: null,
}))
const tOffset = 123
const trajectory = await buildTrajectory(shapeId, shapePoints, schedule, stopLocs, tOffset)
// printTrajectorForDebugging(trajectory, stopLocs)
t.deepEqual(trajectory.properties, {
shapeId,
scheduleId: '12',
})
const coords = trajectory.geometry.coordinates
.map(([lon, lat, ...r]) => [
parseFloat(lon.toFixed(7)),
parseFloat(lat.toFixed(7)),
...r,
])
t.deepEqual(coords, [
// [1.1, 1.1, null, tOffset + 0, tOffset + 30],
[1.101, 1.101, null, tOffset + 45, tOffset + 45],
// [1.102, 1.102, null, tOffset + 60, tOffset + 80],
[1.104, 1.104, null, tOffset + 113, tOffset + 113],
[1.105, 1.105, null, tOffset + 129, tOffset + 129],
[1.108, 1.108, null, tOffset + 178, tOffset + 178],
// [1.11, 1.11, null, tOffset + 210, tOffset + 240],
[1.111, 1.111, null, tOffset + 267, tOffset + 267],
[1.12, 1.12, null, tOffset + 510, tOffset + 540],
[1.129, 1.129, null, tOffset + 594, tOffset + 594],
// [1.13, 1.13, null, tOffset + 600, tOffset + 720],
])
})
test('buildTrajectory extrapolates correctly', async (t) => {
const stopLocs = inMemoryStore()
stopLocs.raw.set('foo', [1.11, 1.11])
stopLocs.raw.set('bar', [1.12, 1.12])
const schedule = {
id: '12',
trips: [{tripId: 'A', start: 1234}],
stops: ['foo', 'bar'],
arrivals: [0, 590],
departures: [10, 600],
headwayBasedStarts: [],
headwayBasedEnds: [],
headwayBasedHeadways: []
}
const shapeId = 's0'
const shapePoints = [
[1.05, 1.05],
[1.10, 1.10],
[1.11, 1.11], // <-- foo is right here, at 1.11 | 1.11
[1.12, 1.12], // <-- bar is right here, at 1.12 | 1.12
[1.14, 1.14],
[1.20, 1.20],
[1.30, 1.30],
].map(([shape_pt_lon, shape_pt_lat], shape_pt_sequence) => ({
shape_pt_lat,
shape_pt_lon,
shape_pt_sequence,
shape_dist_traveled: null,
}))
const trajectory = await buildTrajectory(shapeId, shapePoints, schedule, stopLocs)
// printTrajectorForDebugging(trajectory, stopLocs)
const coords = trajectory.geometry.coordinates
.map(([lon, lat, ...r]) => [
parseFloat(lon.toFixed(7)),
parseFloat(lat.toFixed(7)),
...r,
])
t.deepEqual(coords, [
[1.05, 1.05, null, -3470, -3470],
[1.10, 1.10, null, -570, -570],
[1.11, 1.11, null, 0, 10],
[1.12, 1.12, null, 590, 600],
[1.14, 1.14, null, 1170, 1170],
[1.20, 1.20, null, 4650, 4650],
[1.30, 1.30, null, 10450, 10450],
])
})
test('buildTrajectory works with shape `190067` & schedule `ZimPNw` from DELFI feed', async (t) => {
const stopLocs = inMemoryStore()
stopLocs.raw.set('de:03255:43633::7', [9.453118, 51.820517])
stopLocs.raw.set('de:03255:43651::2', [9.450299, 51.827289])
stopLocs.raw.set('de:03255:43693::2', [9.461404, 51.827777])
stopLocs.raw.set('de:03255:43643::2', [9.482121, 51.825886])
stopLocs.raw.set('de:03255:43669::3', [9.470128, 51.827976])
stopLocs.raw.set('de:03255:43678::1', [9.474612, 51.827568])
stopLocs.raw.set('de:03255:43680::2', [9.487562, 51.819148])
stopLocs.raw.set('de:03255:43681::1', [9.484809, 51.823526])
stopLocs.raw.set('de:03255:65768::2', [9.521271, 51.75306])
stopLocs.raw.set('de:03255:84673::2', [9.542856, 51.765074])
stopLocs.raw.set('de:03255:84670::2', [9.544986, 51.767456])
stopLocs.raw.set('de:03255:84674::2', [9.541251, 51.770171])
stopLocs.raw.set('de:03255:84672::2', [9.535901, 51.772434])
stopLocs.raw.set('de:03255:84671::2', [9.529166, 51.772851])
stopLocs.raw.set('de:03255:63479::2', [9.513741, 51.795416])
const schedule = {
id: 'ZimPNw',
trips: [
{tripId: '1062817478', start: 35580},
],
stops: [
'de:03255:65768::2',
'de:03255:84673::2',
'de:03255:84670::2',
'de:03255:84674::2',
'de:03255:84672::2',
'de:03255:84671::2',
'de:03255:63479::2',
'de:03255:43680::2',
'de:03255:43681::1',
'de:03255:43643::2',
'de:03255:43678::1',
'de:03255:43669::3',
'de:03255:43693::2',
'de:03255:43651::2',
'de:03255:43633::7'
],
arrivals: [0, 180, 240, 300, 360, 420, 600, 840, 900, 960, 1020, 1080, 1140, 1260, 1500],
departures: [0, 180, 240, 300, 360, 420, 600, 840, 900, 960, 1020, 1080, 1140, 1260, 1500],
headwayBasedStarts: [],
headwayBasedEnds: [],
headwayBasedHeadways: []
}
const shapeId = '190067'
const shapePoints = [
[9.521271, 51.75306, 0],
[9.542856, 51.765074, 1],
[9.544986, 51.767456, 3],
[9.541251, 51.770171, 5],
[9.535901, 51.772434, 7],
[9.529166, 51.772851, 9],
[9.513741, 51.795416, 11],
[9.487562, 51.819148, 13],
[9.484809, 51.823526, 15],
[9.482121, 51.825886, 17],
[9.474612, 51.827568, 19],
[9.470128, 51.827976, 21],
[9.461404, 51.827777, 23],
[9.450299, 51.827289, 25],
[9.453118, 51.820517, 27],
].map(([shape_pt_lon, shape_pt_lat, shape_pt_sequence]) => ({
shape_pt_lat,
shape_pt_lon,
shape_pt_sequence,
shape_dist_traveled: null,
}))
const trajectory = await buildTrajectory(shapeId, shapePoints, schedule, stopLocs)
// printTrajectorForDebugging(trajectory, stopLocs)
t.deepEqual(trajectory.properties, {
shapeId,
scheduleId: 'ZimPNw',
})
const coords = trajectory.geometry.coordinates
.map(([lon, lat, ...r]) => [
parseFloat(lon.toFixed(7)),
parseFloat(lat.toFixed(7)),
...r,
])
t.deepEqual(coords, [
[9.521271, 51.75306, null, 0, 0],
[9.542856, 51.765074, null, 180, 180],
[9.544986, 51.767456, null, 240, 240],
[9.541251, 51.770171, null, 300, 300],
[9.535901, 51.772434, null, 360, 360],
[9.529166, 51.772851, null, 420, 420],
[9.513741, 51.795416, null, 600, 600],
[9.487562, 51.819148, null, 840, 840],
[9.484809, 51.823526, null, 900, 900],
[9.482121, 51.825886, null, 960, 960],
[9.474612, 51.827568, null, 1020, 1020],
[9.470128, 51.827976, null, 1080, 1080],
[9.461404, 51.827777, null, 1140, 1140],
[9.450299, 51.827289, null, 1260, 1260],
[9.453118, 51.820517, null, 1500, 1500],
])
})
// `31-779-j21-2.1.H` has a circular/loop route: It starts and ends at
// `de:08115:4512:5:F`. We check if the stop -> shape matching algorithm
// matches properly.
test('buildTrajectory works with shape `31-779-j21-2.1.H` & schedule `ZVU8cE` from VVS feed', async (t) => {
const stopLocs = inMemoryStore()
stopLocs.raw.set('de:08115:4512:5:F', [8.8647526, 48.5943370])
stopLocs.raw.set('de:08115:3237:0:3', [8.8608930, 48.5928306])
stopLocs.raw.set('de:08115:7055:0:3', [8.8597890, 48.5900775])
stopLocs.raw.set('de:08115:7056:0:3', [8.8579596, 48.5898775])
stopLocs.raw.set('de:08115:7057:0:3', [8.8557810, 48.5884989])
stopLocs.raw.set('de:08115:7042:0:3', [8.8554886, 48.5864752])
stopLocs.raw.set('de:08115:7059:0:3', [8.8603502, 48.5881178])
stopLocs.raw.set('de:08115:7040:0:3', [8.8614449, 48.5893062])
stopLocs.raw.set('de:08115:4512:5:F', [8.8647526, 48.5943370])
const shapeId = '31-779-j21-2.1.H'
const shapePoints = [
[8.86477834270177, 48.5943037905581, 1, 0.00],
[8.86377026621193, 48.5939490162386, 2, 83.98],
[8.8637804491298, 48.5937912969797, 3, 101.53],
[8.86090805475374, 48.5928092068706, 4, 339.34],
[8.86090805475374, 48.5928092068706, 5, 339.34],
[8.86066535367219, 48.5927259124475, 6, 359.45],
[8.86135449249283, 48.5918533733072, 7, 468.91],
[8.86161936843633, 48.591607561355, 8, 502.47],
[8.86099347284096, 48.5912161694282, 9, 565.82],
[8.86084888396262, 48.5910978319371, 10, 582.74],
[8.86076702924912, 48.5909409013504, 11, 601.20],
[8.86075865937038, 48.5908786620345, 12, 608.15],
[8.86092978926045, 48.5905606175429, 13, 645.69],
[8.86111829704448, 48.5900829738342, 14, 700.58],
[8.85978458165628, 48.5900762386263, 15, 798.67],
[8.85978458165628, 48.5900762386263, 16, 798.67],
[8.85926693995909, 48.5900596028839, 17, 836.79],
[8.85796312688962, 48.5898787849496, 18, 934.77],
[8.85796312688962, 48.5898787849496, 19, 934.77],
[8.85760887512488, 48.5898466950899, 20, 961.07],
[8.85762282690398, 48.5896566072989, 21, 982.23],
[8.85751263640893, 48.5892637618058, 22, 1026.66],
[8.85743854844347, 48.5890972162153, 23, 1045.96],
[8.85724129446941, 48.5889608238704, 24, 1066.95],
[8.85671044383442, 48.5887292355562, 25, 1113.72],
[8.85579044095832, 48.5884935630313, 26, 1186.29],
[8.85579044095832, 48.5884935630313, 27, 1186.29],
[8.85510385259979, 48.5884052060187, 28, 1237.73],
[8.85407361285452, 48.58842243527, 29, 1313.53],
[8.85397128161815, 48.588182741372, 30, 1341.23],
[8.85361496574432, 48.5877422794815, 31, 1396.78],
[8.85363915111485, 48.5876280132644, 32, 1409.61],
[8.85377554091393, 48.5874770190497, 33, 1429.16],
[8.85444084021872, 48.5869468413189, 34, 1505.78],
[8.8549393407577, 48.5866766085486, 35, 1553.19],
[8.85549349996355, 48.5864701112995, 36, 1599.97],
[8.85549349996355, 48.5864701112995, 37, 1599.97],
[8.85559213354871, 48.5864378609082, 38, 1608.06],
[8.8557413567994, 48.5866337277136, 39, 1632.45],
[8.85592167295924, 48.5867635369326, 40, 1652.05],
[8.85934166399869, 48.5877915631428, 41, 1928.36],
[8.86033335430432, 48.5881342167597, 42, 2010.65],
[8.86033335430432, 48.5881342167597, 43, 2010.65],
[8.86171032217549, 48.588666618826, 44, 2127.96],
[8.86144614249089, 48.589309817913, 45, 2202.08],
[8.86144614249089, 48.589309817913, 46, 2202.08],
[8.86092978926045, 48.5905606175429, 47, 2346.25],
[8.86075865937038, 48.5908786620345, 48, 2383.79],
[8.86084888396262, 48.5910978319371, 49, 2409.05],
[8.86099347284096, 48.5912161694282, 50, 2425.97],
[8.86181539388917, 48.5917052762119, 51, 2507.28],
[8.86215707737929, 48.5919790609188, 52, 2546.75],
[8.86287844635044, 48.5928664150682, 53, 2658.78],
[8.86302102899034, 48.5929782728798, 54, 2675.05],
[8.86355681561948, 48.5931658636236, 55, 2719.64],
[8.86363553151238, 48.5932339409746, 56, 2729.17],
[8.86376864076299, 48.5932394934337, 57, 2738.97],
[8.86424337519592, 48.5933963440731, 58, 2778.00],
[8.86450755287211, 48.5934105924721, 59, 2797.50],
[8.8647457159111, 48.5935727391088, 60, 2822.63],
[8.86574037764176, 48.5939248814712, 61, 2905.60],
[8.86594718452105, 48.5940532667335, 62, 2926.46],
[8.86636784605579, 48.5944667863207, 63, 2981.88],
[8.86618479791561, 48.5944273667084, 64, 2996.04],
[8.86579203907502, 48.5944349151284, 65, 3024.94],
[8.86561275626872, 48.5944072793585, 66, 3038.48],
[8.86523109401469, 48.5942687979757, 67, 3070.49],
[8.86502635667213, 48.5943827660098, 68, 3090.17],
[8.86477834270177, 48.5943037905581, 69, 3110.42],
].map(([shape_pt_lon, shape_pt_lat, shape_pt_sequence]) => ({
shape_pt_lat,
shape_pt_lon,
shape_pt_sequence,
shape_dist_traveled: null,
}))
const schedule = {
id: 'ZVU8cE',
trips: [
{tripId: '1.T0.31-779-j21-2.1.H', start: 33000},
],
stops: [
'de:08115:4512:5:F',
'de:08115:3237:0:3',
'de:08115:7055:0:3',
'de:08115:7056:0:3',
'de:08115:7057:0:3',
'de:08115:7042:0:3',
'de:08115:7059:0:3',
'de:08115:7040:0:3',
'de:08115:4512:5:F',
],
arrivals: [0, 60, 120, 180, 240, 300, 360, 420, 600],
departures: [0, 60, 120, 180, 240, 300, 360, 420, 600],
headwayBasedStarts: [],
headwayBasedEnds: [],
headwayBasedHeadways: [],
}
const trajectory = await buildTrajectory(shapeId, shapePoints, schedule, stopLocs)
// printTrajectorForDebugging(trajectory, stopLocs)
t.deepEqual(trajectory.properties, {
shapeId,
scheduleId: 'ZVU8cE',
})
const coords = trajectory.geometry.coordinates.map(([lon, lat, ...r]) => [
parseFloat(lon.toFixed(7)),
parseFloat(lat.toFixed(7)),
...r,
])
t.deepEqual(coords, [
[8.8647783, 48.5943038, null, 1, 1],
[8.8637703, 48.593949, null, 15, 15],
[8.8637804, 48.5937913, null, 18, 18],
[8.8609081, 48.5928092, null, 60, 60],
[8.8609081, 48.5928092, null, 60, 60],
[8.8606654, 48.5927259, null, 63, 63],
[8.8613545, 48.5918534, null, 77, 77],
[8.8616194, 48.5916076, null, 81, 81],
[8.8609935, 48.5912162, null, 90, 90],
[8.8608489, 48.5910978, null, 92, 92],
[8.860767, 48.5909409, null, 94, 94],
[8.8607587, 48.5908787, null, 95, 95],
[8.8609298, 48.5905606, null, 100, 100],
[8.8611183, 48.590083, null, 107, 107],
[8.8597846, 48.5900762, null, 120, 120],
[8.8597846, 48.5900762, null, 120, 120],
[8.8592669, 48.5900596, null, 137, 137],
[8.8579631, 48.5898788, null, 180, 180],
[8.8579631, 48.5898788, null, 180, 180],
[8.8576089, 48.5898467, null, 186, 186],
[8.8576228, 48.5896566, null, 191, 191],
[8.8575126, 48.5892638, null, 202, 202],
[8.8574385, 48.5890972, null, 207, 207],
[8.8572413, 48.5889608, null, 212, 212],
[8.8567104, 48.5887292, null, 223, 223],
[8.8557904, 48.5884936, null, 240, 240],
[8.8557904, 48.5884936, null, 240, 240],
[8.8551039, 48.5884052, null, 300, 300],
[8.8540736, 48.5884224, null, 306, 306],
[8.8539713, 48.5881827, null, 308, 308],
[8.853615, 48.5877423, null, 312, 312],
[8.8536392, 48.587628, null, 313, 313],
[8.8537755, 48.587477, null, 315, 315],
[8.8544408, 48.5869468, null, 321, 321],
[8.8549393, 48.5866766, null, 324, 324],
[8.8554935, 48.5864701, null, 328, 328],
[8.8554935, 48.5864701, null, 328, 328],
[8.8555921, 48.5864379, null, 329, 329],
[8.8557414, 48.5866337, null, 331, 331],
[8.8559217, 48.5867635, null, 332, 332],
[8.8593417, 48.5877916, null, 354, 354],
[8.8603334, 48.5881342, null, 360, 360],
[8.8603334, 48.5881342, null, 360, 360],
[8.8617103, 48.5886666, null, 397, 397],
[8.8614461, 48.5893098, null, 420, 420],
[8.8614461, 48.5893098, null, 420, 420],
[8.8609298, 48.5905606, null, 449, 449],
[8.8607587, 48.5908787, null, 456, 456],
[8.8608489, 48.5910978, null, 461, 461],
[8.8609935, 48.5912162, null, 464, 464],
[8.8618154, 48.5917053, null, 480, 480],
[8.8621571, 48.5919791, null, 488, 488],
[8.8628784, 48.5928664, null, 510, 510],
[8.863021, 48.5929783, null, 513, 513],
[8.8635568, 48.5931659, null, 522, 522],
[8.8636355, 48.5932339, null, 524, 524],
[8.8637686, 48.5932395, null, 526, 526],
[8.8642434, 48.5933963, null, 534, 534],
[8.8645076, 48.5934106, null, 537, 537],
[8.8647457, 48.5935727, null, 542, 542],
[8.8657404, 48.5939249, null, 559, 559],
[8.8659472, 48.5940533, null, 563, 563],
[8.8663678, 48.5944668, null, 574, 574],
[8.8661848, 48.5944274, null, 577, 577],
[8.865792, 48.5944349, null, 582, 582],
[8.8656128, 48.5944073, null, 585, 585],
[8.8652311, 48.5942688, null, 591, 591],
[8.8650264, 48.5943828, null, 595, 595],
[8.8647783, 48.5943038, null, 599, 599],
])
})
test('buildTrajectory works with shape `11-16-j21-2.52.R` & schedule `yYcf1` from VVS feed', async (t) => {
const stopLocs = inMemoryStore()
stopLocs.raw.set('de:08425:2551:3:3', [9.873295, 48.577827])
stopLocs.raw.set('de:08425:2460:3:2', [9.976767, 48.48134])
stopLocs.raw.set('de:08117:155:20:1', [9.704689, 48.69659])
stopLocs.raw.set('de:08117:161:21:3', [9.841878, 48.619247])
stopLocs.raw.set('de:08117:160:20:1', [9.821774, 48.630714])
stopLocs.raw.set('de:08117:158:20:1', [9.788013, 48.66077])
stopLocs.raw.set('de:08117:154:20:1', [9.652165, 48.700245])
stopLocs.raw.set('de:08117:159:20:1', [9.803625, 48.64034])
stopLocs.raw.set('de:08425:2510:2:1', [9.917342, 48.544975])
stopLocs.raw.set('de:08117:156:21:2', [9.73705, 48.68938])
stopLocs.raw.set('de:08117:157:21:2', [9.759716, 48.68374])
stopLocs.raw.set('de:08421:1008:32:3', [9.982932, 48.399277])
stopLocs.raw.set('de:08425:2540:1:1', [9.894758, 48.54998])
stopLocs.raw.set('de:08425:2470:2:2', [9.949404, 48.519833])
const shapeId = '11-16-j21-2.52.R'
const shapePoints = [
[9.652152, 48.700245, 1, 0],
[9.654804, 48.699455, 2, 213.49],
[9.655821, 48.69928, 3, 290.65],
[9.65639, 48.699142, 4, 335.14],
[9.657394, 48.699062, 5, 409.33],
[9.658807, 48.69908, 6, 513.05],
[9.659746, 48.69921, 7, 583.44],
[9.66085, 48.699486, 8, 669.96],
[9.661819, 48.69982, 9, 750.3],
[9.663185, 48.700405, 10, 869.86],
[9.664331, 48.700787, 11, 963.98],
[9.665054, 48.70097, 12, 1020.85],
[9.666865, 48.70131, 13, 1159.02],
[9.668606, 48.701427, 14, 1287.44],
[9.66976, 48.701427, 15, 1372.13],
[9.670575, 48.70137, 16, 1432.3],
[9.693498, 48.698742, 17, 3139.76],
[9.695342, 48.69847, 18, 3278.43],
[9.698391, 48.697903, 19, 3510.92],
[9.704689, 48.696598, 20, 3995.42],
[9.704694, 48.69659, 21, 3995.42],
[9.709678, 48.695457, 22, 4382.26],
[9.727793, 48.691612, 23, 5778.85],
[9.7370405, 48.689384, 24, 6501.49],
[9.7370405, 48.689384, 25, 6501.49],
[9.758222, 48.684185, 26, 8160.44],
[9.759707, 48.68373, 27, 8280.52],
[9.759707, 48.68373, 28, 8280.52],
[9.760837, 48.683296, 29, 8376.55],
[9.761615, 48.682945, 30, 8445.75],
[9.762107, 48.68269, 31, 8491.77],
[9.762889, 48.682224, 32, 8569.06],
[9.763425, 48.68186, 33, 8625.16],
[9.772136, 48.675232, 34, 9601.2],
[9.781043, 48.668358, 35, 10607.23],
[9.782118, 48.6674, 36, 10739.81],
[9.782695, 48.666798, 37, 10819.14],
[9.78801, 48.66077, 38, 11594.65],
[9.78801, 48.66077, 39, 11594.65],
[9.790031, 48.658466, 40, 11890.63],
[9.791389, 48.656742, 41, 12107.03],
[9.799609, 48.645306, 42, 13514.56],
[9.80114, 48.643135, 43, 13781.1],
[9.802377, 48.641468, 44, 13987.38],
[9.803128, 48.640736, 45, 14085.82],
[9.803609, 48.64035, 46, 14141.17],
[9.803609, 48.64035, 47, 14141.17],
[9.804003, 48.64003, 48, 14187.1],
[9.804924, 48.639385, 49, 14285.74],
[9.805417, 48.639095, 50, 14334.28],
[9.806362, 48.638638, 51, 14420.46],
[9.807559, 48.638138, 52, 14524.41],
[9.809795, 48.637386, 53, 14708.74],
[9.810881, 48.636944, 54, 14802.53],
[9.814856, 48.635098, 55, 15159.58],
[9.815983, 48.63452, 56, 15264.32],
[9.817036, 48.633923, 57, 15366.18],
[9.817857, 48.633392, 58, 15450.61],
[9.821248, 48.631046, 59, 15811.52],
[9.8217745, 48.630714, 60, 15864.85],
[9.8217745, 48.630714, 61, 15864.85],
[9.822364, 48.630424, 62, 15918.96],
[9.823965, 48.62982, 63, 16054.2],
[9.82467, 48.629627, 64, 16110.39],
[9.825469, 48.62946, 65, 16172.04],
[9.832053, 48.628536, 66, 16666.67],
[9.833895, 48.62839, 67, 16803],
[9.834692, 48.628395, 68, 16861.55],
[9.835675, 48.62849, 69, 16934.66],
[9.836833, 48.628723, 70, 17023.62],
[9.837443, 48.62889, 71, 17072.15],
[9.837997, 48.629086, 72, 17118.22],
[9.838504, 48.629322, 73, 17163.76],
[9.840591, 48.63049, 74, 17364.66],
[9.841389, 48.6308, 75, 17432.73],
[9.842033, 48.630947, 76, 17482.9],
[9.843039, 48.631046, 77, 17557.53],
[9.843488, 48.631046, 78, 17590.58],
[9.843907, 48.631023, 79, 17621.54],
[9.844565, 48.630924, 80, 17671.1],
[9.845152, 48.63079, 81, 17716.64],
[9.845789, 48.630577, 82, 17769.24],
[9.846463, 48.630226, 83, 17832.36],
[9.84671, 48.630054, 84, 17858.47],
[9.847247, 48.62954, 85, 17928.2],
[9.847474, 48.62925, 86, 17964.52],
[9.847727, 48.628765, 87, 18021.44],
[9.847872, 48.62819, 88, 18086.41],
[9.847867, 48.62781, 89, 18128.3],
[9.847695, 48.627186, 90, 18199.18],
[9.846603, 48.624626, 91, 18494.62],
[9.846271, 48.623917, 92, 18577.51],
[9.846093, 48.62362, 93, 18612.85],
[9.845506, 48.62294, 94, 18699.77],
[9.84527, 48.62272, 95, 18730.07],
[9.844801, 48.622387, 96, 18780.6],
[9.843577, 48.62174, 97, 18895.82],
[9.842846, 48.62123, 98, 18973.89],
[9.842495, 48.620937, 99, 19015.35],
[9.842198, 48.62052, 100, 19066.37],
[9.841988, 48.620056, 101, 19120.58],
[9.841889, 48.61953, 102, 19179.61],
[9.841888, 48.619247, 103, 19210.8],
[9.841888, 48.619247, 104, 19210.8],
[9.841949, 48.618866, 105, 19253.58],
[9.84205, 48.61851, 106, 19293.69],
[9.842367, 48.617767, 107, 19379.53],
[9.842713, 48.6172, 108, 19447.74],
[9.843173, 48.616573, 109, 19524.95],
[9.844981, 48.61435, 110, 19805.83],
[9.845165, 48.614067, 111, 19839.86],
[9.845468, 48.61356, 112, 19900.6],
[9.8455715, 48.613285, 113, 19932.25],
[9.845633, 48.61278, 114, 19988.45],
[9.845585, 48.61234, 115, 20037.44],
[9.845477, 48.612057, 116, 20069.98],
[9.844785, 48.610874, 117, 20211.09],
[9.844646, 48.61061, 118, 20242.08],
[9.8445425, 48.61031, 119, 20276.3],
[9.844473, 48.609818, 120, 20331.27],
[9.8444, 48.608555, 121, 20471.62],
[9.844029, 48.606773, 122, 20671.54],
[9.843974, 48.604996, 123, 20869.64],
[9.843876, 48.604446, 124, 20930.82],
[9.843627, 48.603863, 125, 20998.39],
[9.842783, 48.60239, 126, 21173.33],
[9.842583, 48.602013, 127, 21217.94],
[9.842499, 48.601772, 128, 21245.22],
[9.842441, 48.601368, 129, 21290.75],
[9.842446, 48.601128, 130, 21317.5],
[9.842586, 48.60062, 131, 21374.51],
[9.842873, 48.600117, 132, 21434.63],
[9.843068, 48.59989, 133, 21463.26],
[9.843665, 48.599438, 134, 21530.16],
[9.844416, 48.599075, 135, 21598.57],
[9.844863, 48.598927, 136, 21635.41],
[9.84579, 48.598766, 137, 21705.82],
[9.847786, 48.598545, 138, 21854.73],
[9.848639, 48.598392, 139, 21919.57],
[9.849321, 48.5982, 140, 21974.09],
[9.850297, 48.597824, 141, 22057.27],
[9.85065, 48.59764, 142, 22090.24],
[9.851246, 48.597263, 143, 22150.85],
[9.851868, 48.596786, 144, 22220.98],
[9.852677, 48.59601, 145, 22326.11],
[9.8535795, 48.59495, 146, 22461.07],
[9.853849, 48.59468, 147, 22497.12],
[9.854275, 48.59434, 148, 22545.97],
[9.854804, 48.59404, 149, 22597.36],
[9.855147, 48.593903, 150, 22626.92],
[9.856709, 48.593422, 151, 22753.46],
[9.857222, 48.5932, 152, 22798.69],
[9.8575115, 48.593025, 153, 22827.45],
[9.857981, 48.592663, 154, 22880.41],
[9.858217, 48.592426, 155, 22912.06],
[9.858715, 48.591763, 156, 22994.6],
[9.858908, 48.59156, 157, 23020.92],
[9.859715, 48.59099, 158, 23108.03],
[9.860321, 48.590702, 159, 23162.81],
[9.862882, 48.589836, 160, 23374.28],
[9.8644085, 48.589222, 161, 23505.73],
[9.864782, 48.589058, 162, 23538.84],
[9.865459, 48.588646, 163, 23606.28],
[9.866059, 48.588116, 164, 23680.14],
[9.866771, 48.587204, 165, 23794.18],
[9.867704, 48.585785, 166, 23966.09],
[9.871284, 48.58056, 167, 24604.23],
[9.872414, 48.57894, 168, 24802.48],
[9.873302, 48.577827, 169, 24942.2],
[9.873295, 48.577827, 170, 24942.2],
[9.874704, 48.576206, 171, 25150.04],
[9.875486, 48.575203, 172, 25275.63],
[9.87642, 48.57356, 173, 25470.92],
[9.876733, 48.572872, 174, 25550.6],
[9.877041, 48.57188, 175, 25663.1],
[9.877567, 48.569393, 176, 25942.23],
[9.878025, 48.568455, 177, 26051.94],
[9.878236, 48.56811, 178, 26093.12],
[9.878542, 48.56777, 179, 26137.51],
[9.878875, 48.56746, 180, 26179.71],
[9.879812, 48.56676, 181, 26283.61],
[9.880402, 48.566406, 182, 26342.36],
[9.88102, 48.56612, 183, 26397.66],
[9.88172, 48.565857, 184, 26457.06],
[9.882313, 48.565662, 185, 26505.73],
[9.883014, 48.565495, 186, 26560.56],
[9.887294, 48.56459, 187, 26891.19],
[9.887914, 48.564404, 188, 26941.24],
[9.888465, 48.564194, 189, 26988.08],
[9.889057, 48.56392, 190, 27041.24],
[9.890022, 48.563328, 191, 27138.07],
[9.890661, 48.56271, 192, 27221.25],
[9.89094, 48.562386, 193, 27262.91],
[9.891336, 48.56178, 194, 27336.22],
[9.891518, 48.561348, 195, 27386.2],
[9.89162, 48.560993, 196, 27426.05],
[9.891703, 48.56031, 197, 27502.35],
[9.891607, 48.559486, 198, 27594.47],
[9.891479, 48.559116, 199, 27636.46],
[9.891311, 48.558792, 200, 27674.44],
[9.89017, 48.557087, 201, 27882.1],
[9.889945, 48.556637, 202, 27934.6],
[9.889733, 48.556118, 203, 27994.49],
[9.889641, 48.555527, 204, 28060.77],
[9.889605, 48.55503, 205, 28115.77],
[9.889626, 48.554672, 206, 28155.83],
[9.889699, 48.554222, 207, 28206.15],
[9.889931, 48.553535, 208, 28284.32],
[9.890392, 48.552757, 209, 28377.14],
[9.890763, 48.552334, 210, 28431.72],
[9.891391, 48.55179, 211, 28507.94],
[9.89265, 48.551006, 212, 28635.09],
[9.894745, 48.54998, 213, 28826.71],
[9.894722, 48.549995, 214, 28826.71],
[9.897675, 48.54861, 215, 29093.08],
[9.898239, 48.54841, 216, 29140.23],
[9.899261, 48.548138, 217, 29221.36],
[9.89993, 48.54801, 218, 29272.52],
[9.900568, 48.54794, 219, 29320.13],
[9.9020195, 48.547855, 220, 29427.38],
[9.902909, 48.54788, 221, 29492.92],
[9.9039135, 48.547993, 222, 29567.9],
[9.907638, 48.548553, 223, 29849.09],
[9.908585, 48.548607, 224, 29919.02],
[9.909755, 48.548588, 225, 30005.2],
[9.9102125, 48.54855, 226, 30039.16],
[9.911492, 48.54836, 227, 30135.76],
[9.911982, 48.54825, 228, 30173.78],
[9.912993, 48.547943, 229, 30255.71],
[9.914078, 48.54749, 230, 30350.11],
[9.914553, 48.547226, 231, 30395.51],
[9.915002, 48.54695, 232, 30440.72],
[9.915371, 48.546665, 233, 30482.53],
[9.917326, 48.544994, 234, 30717.4],
[9.917326, 48.544994, 235, 30717.4],
[9.91908, 48.543457, 236, 30931.59],
[9.919677, 48.542866, 237, 31010.65],
[9.9206505, 48.541725, 238, 31156.35],
[9.92121, 48.540943, 239, 31252.78],
[9.921709, 48.54011, 240, 31352.32],
[9.922271, 48.538902, 241, 31493.04],
[9.92367, 48.535194, 242, 31917.99],
[9.924095, 48.534443, 243, 32006.97],
[9.9244585, 48.533978, 244, 32065.17],
[9.9249, 48.533554, 245, 32122.58],
[9.925408, 48.533154, 246, 32180.57],
[9.9263525, 48.53257, 247, 32275.68],
[9.938187, 48.52741, 248, 33319.22],
[9.941524, 48.525814, 249, 33622.09],
[9.94422, 48.52458, 250, 33863.72],
[9.945025, 48.52411, 251, 33942.67],
[9.945749, 48.523636, 252, 34017.45],
[9.947844, 48.521896, 253, 34264.87],
[9.948261, 48.521473, 254, 34321.27],
[9.948622, 48.52105, 255, 34375.26],
[9.949395, 48.51986, 256, 34519.55],
[9.949395, 48.51986, 257, 34519.55],
[9.9498625, 48.518997, 258, 34621.36],
[9.950074, 48.518394, 259, 34690.14],
[9.950363, 48.517235, 260, 34820.85],
[9.950439, 48.51667, 261, 34883.77],
[9.950484, 48.516075, 262, 34950.05],
[9.950481, 48.514187, 263, 35160.11],
[9.950301, 48.51216, 264, 35385.55],
[9.949995, 48.507015, 265, 35958.37],
[9.950042, 48.506386, 266, 36028.44],
[9.950195, 48.50573, 267, 36102.04],
[9.950349, 48.50537, 268, 36143.65],
[9.950738, 48.504726, 269, 36220.76],
[9.951203, 48.504135, 270, 36295.07],
[9.951442, 48.503906, 271, 36326.04],
[9.952161, 48.50336, 272, 36406.44],
[9.952601, 48.50311, 273, 36449.39],
[9.957093, 48.500782, 274, 36869.29],
[9.96638, 48.496128, 275, 37727.25],
[9.9675045, 48.495686, 276, 37823.63],
[9.968728, 48.49532, 277, 37922.56],
[9.972316, 48.49459, 278, 38199.04],
[9.973238, 48.494316, 279, 38273.6],
[9.9740925, 48.493958, 280, 38348.17],
[9.974933, 48.49352, 281, 38427.04],
[9.975609, 48.493042, 282, 38499.7],
[9.975881, 48.492805, 283, 38532.74],
[9.976443, 48.492214, 284, 38610.55],
[9.97676, 48.4918, 285, 38662.06],
[9.976947, 48.49149, 286, 38699.12],
[9.977197, 48.490868, 287, 38770.84],
[9.977353, 48.490124, 288, 38854.21],
[9.977374, 48.489735, 289, 38897.67],
[9.977336, 48.489082, 290, 38970.16],
[9.977028, 48.485302, 291, 39391.08],
[9.97678, 48.481342, 292, 39832.07],
[9.97678, 48.481342, 293, 39832.07],
[9.975266, 48.45941, 294, 42272.95],
[9.975235, 48.458557, 295, 42368.15],
[9.975347, 48.457672, 296, 42466.94],
[9.975505, 48.457127, 297, 42528.48],
[9.97566, 48.45673, 298, 42574.05],
[9.976079, 48.45588, 299, 42673.54],
[9.976582, 48.455166, 300, 42761.08],
[9.976846, 48.454857, 301, 42800.55],
[9.977405, 48.4543, 302, 42875.15],
[9.9780245, 48.45378, 303, 42948.87],
[9.978484, 48.453434, 304, 43000.01],
[9.979547, 48.452778, 305, 43107.07],
[9.980126, 48.452484, 306, 43160.91],
[9.981229, 48.452023, 307, 43257.09],
[9.982564, 48.4516, 308, 43366.19],
[9.983235, 48.451435, 309, 43418.97],
[9.984474, 48.45121, 310, 43513.68],
[9.985596, 48.451084, 311, 43597.53],
[9.99456, 48.450523, 312, 44261.64],
[9.995968, 48.450367, 313, 44366.94],
[9.997399, 48.450123, 314, 44475.87],
[9.999547, 48.449627, 315, 44643.67],
[10.001879, 48.448837, 316, 44836.76],
[10.003179, 48.44828, 317, 44950.9],
[10.008791, 48.445667, 318, 45456.51],
[10.009842, 48.44513, 319, 45554.4],
[10.0102215, 48.44489, 320, 45593.27],
[10.010632, 48.44458, 321, 45638.89],
[10.011215, 48.44403, 322, 45713.56],
[10.011436, 48.443783, 323, 45745.86],
[10.011794, 48.443287, 324, 45806.69],
[10.01202, 48.442894, 325, 45853.6],
[10.012195, 48.44246, 326, 45903.6],
[10.012305, 48.442078, 327, 45946.7],
[10.012375, 48.441666, 328, 45993],
[10.012353, 48.44083, 329, 46085.77],
[10.012276, 48.440445, 330, 46129.25],
[10.012164, 48.4401, 331, 46168.31],
[10.011831, 48.439407, 332, 46249.35],
[10.011579, 48.439014, 333, 46296.47],
[10.011246, 48.43862, 334, 46346.86],
[10.006305, 48.433735, 335, 47001.01],
[10.003376, 48.430912, 336, 47382.07],
[10.0007105, 48.428288, 337, 47734.1],
[10.000165, 48.427795, 338, 47802],
[9.999731, 48.427464, 339, 47850.88],
[9.9986925, 48.4268, 340, 47957.31],
[9.997458, 48.426205, 341, 48069.93],
[9.995261, 48.425327, 342, 48259],
[9.994696, 48.42505, 343, 48310.97],
[9.993958, 48.424606, 344, 48384.46],
[9.993669, 48.424393, 345, 48416.26],
[9.99319, 48.423954, 346, 48476.71],
[9.992758, 48.423473, 347, 48538.88],
[9.992575, 48.423218, 348, 48570.27],
[9.99222, 48.422585, 349, 48645.3],
[9.992062, 48.42218, 350, 48691.85],
[9.991832, 48.42108, 351, 48815.4],
[9.991906, 48.42007, 352, 48927.57],
[9.991993, 48.41948, 353, 48993.59],
[9.992083, 48.419098, 354, 49036.81],
[9.992377, 48.418316, 355, 49126.24],
[9.992623, 48.41788, 356, 49178.06],
[9.992885, 48.417538, 357, 49220.85],
[9.993562, 48.416843, 358, 49312.65],
[9.994334, 48.416214, 359, 49402.94],
[9.994943, 48.415672, 360, 49478.26],
[9.995559, 48.414997, 361, 49565.86],
[9.995814, 48.414646, 362, 49609.28],
[9.996149, 48.414013, 363, 49683.92],
[9.996284, 48.413685, 364, 49721.6],
[9.996386, 48.41333, 365, 49761.68],
[9.996471, 48.412575, 366, 49846.22],
[9.996469, 48.41227, 367, 49880.04],
[9.996427, 48.411945, 368, 49915.97],
[9.996243, 48.411343, 369, 49984.45],
[9.995841, 48.410526, 370, 50079.87],
[9.995218, 48.40976, 371, 50176.94],
[9.99491, 48.409485, 372, 50215],
[9.994324, 48.409042, 373, 50280.63],
[9.993966, 48.408806, 374, 50317.77],
[9.993248, 48.408432, 375, 50385.19],
[9.99252, 48.408142, 376, 50447.71],
[9.9915695, 48.407864, 377, 50524.42],
[9.988042, 48.407066, 378, 50799.56],
[9.987142, 48.40678, 379, 50873.11],
[9.9854555, 48.40601, 380, 51024.35],
[9.984551, 48.405415, 381, 51118.33],
[9.984128, 48.405083, 382, 51166.76],
[9.983853, 48.40482, 383, 51202.15],
[9.983457, 48.40436, 384, 51261.05],
[9.983289, 48.404007, 385, 51302.41],
[9.98325, 48.403316, 386, 51378.96],
[9.983185, 48.402893, 387, 51426.33],
[9.982919, 48.40184, 388, 51545.27],
[9.982861, 48.40148, 389, 51585.14],
[9.982831, 48.400723, 390, 51669.59],
[9.982943, 48.39928, 391, 51830.27],
].map(([shape_pt_lon, shape_pt_lat, shape_pt_sequence]) => ({
shape_pt_lat,
shape_pt_lon,
shape_pt_sequence,
shape_dist_traveled: null,
}))
const schedule = {
id: 'yYcf1',
trips: [
{tripId: '1.T0.11-16-j21-1.52.R', start: 16260},
{tripId: '1.T0.11-16-j21-17.48.R', start: 16260},
{tripId: '1.T0.11-16-j21-2.52.R', start: 16260},
{tripId: '1.T0.11-16-j21-22.48.R', start: 16260},
{tripId: '1.T0.11-16-j21-23.52.R', start: 16260},
],
stops: [
'de:08117:154:20:1',
'de:08117:155:20:1',
'de:08117:156:21:2',
'de:08117:157:21:2',
'de:08117:158:20:1',
'de:08117:159:20:1',
'de:08117:160:20:1',
'de:08117:161:21:3',
'de:08425:2551:3:3',
'de:08425:2540:1:1',
'de:08425:2510:2:1',
'de:08425:2470:2:2',
'de:08425:2460:3:2',
'de:08421:1008:32:3',
],
arrivals: [
0, 180, 360, 540,
720, 900, 1020, 1320,
2280, 2520, 2700, 2880,
3180, 3840,
],
departures: [
0, 240, 420, 540,
720, 900, 1080, 1920,
2340, 2580, 2700, 2880,
3180, 3840,
],
headwayBasedStarts: [],
headwayBasedEnds: [],
headwayBasedHeadways: [],
}
const trajectory = await buildTrajectory(shapeId, shapePoints, schedule, stopLocs)
// printTrajectorForDebugging(trajectory, stopLocs)
t.deepEqual(trajectory.properties, {
shapeId,
scheduleId: 'yYcf1',
})
const coords = trajectory.geometry.coordinates.map(([lon, lat, ...r]) => [
parseFloat(lon.toFixed(7)),
parseFloat(lat.toFixed(7)),
...r,
])
t.deepEqual(coords, [
[9.652152, 48.700245, null, -0 , -0],
[9.654804, 48.699455, null, 10, 10],
[9.655821, 48.69928, null, 13, 13],
[9.65639, 48.699142, null, 15, 15],
[9.657394, 48.699062, null, 18, 18],
[9.658807, 48.69908, null, 23, 23],
[9.659746, 48.69921, null, 26, 26],
[9.66085, 48.699486, null, 30, 30],
[9.661819, 48.69982, null, 34, 34],
[9.663185, 48.700405, null, 39, 39],
[9.664331, 48.700787, null, 43, 43],
[9.665054, 48.70097, null, 46, 46],
[9.666865, 48.70131, null, 52, 52],
[9.668606, 48.701427, null, 58, 58],
[9.66976, 48.701427, null, 62, 62],
[9.670575, 48.70137, null, 64, 64],
[9.693498, 48.698742, null, 141, 141],
[9.695342, 48.69847, null, 148, 148],
[9.698391, 48.697903, null, 158, 158],
[9.704689, 48.696598, null, 180, 180],
[9.704694, 48.69659, null, 240, 240],
[9.709678, 48.695457, null, 259, 259],
[9.727793, 48.691612, null, 325, 325],
[9.7370405, 48.689384, null, 360, 420],
[9.7370405, 48.689384, null, 420, 420],
[9.758222, 48.684185, null, 532, 532],
[9.759707, 48.68373, null, 540, 540],
[9.759707, 48.68373, null, 540, 540],
[9.760837, 48.683296, null, 545, 545],
[9.761615, 48.682945, null, 549, 549],
[9.762107, 48.68269, null, 551, 551],
[9.762889, 48.682224, null, 556, 556],
[9.763425, 48.68186, null, 559, 559],
[9.772136, 48.675232, null, 612, 612],
[9.781043, 48.668358, null, 666, 666],
[9.782118, 48.6674, null, 674, 674],
[9.782695, 48.666798, null, 678, 678],
[9.78801, 48.66077, null, 720, 720],
[9.78801, 48.66077, null, 720, 720],
[9.790031, 48.658466, null, 741, 741],
[9.791389, 48.656742, null, 756, 756],
[9.799609, 48.645306, null, 856, 856],
[9.80114, 48.643135, null, 875, 875],
[9.802377, 48.641468, null, 889, 889],
[9.803128, 48.640736, null, 896, 896],
[9.803609, 48.64035, null, 900, 900],
[9.803609, 48.64035, null, 900, 900],
[9.804003, 48.64003, null, 903, 903],
[9.804924, 48.639385, null, 910, 910],
[9.805417, 48.639095, null, 913, 913],
[9.806362, 48.638638, null, 919, 919],
[9.807559, 48.638138, null, 927, 927],
[9.809795, 48.637386, null, 940, 940],
[9.810881, 48.636944, null, 946, 946],
[9.814856, 48.635098, null, 971, 971],
[9.815983, 48.63452, null, 978, 978],
[9.817036, 48.633923, null, 985, 985],
[9.817857, 48.633392, null, 991, 991],
[9.821248, 48.631046, null, 1016, 1016],
[9.8217745, 48.630714, null, 1080, 1080],
[9.8217745, 48.630714, null, 1080, 1080],
[9.822364, 48.630424, null, 1084, 1084],
[9.823965, 48.62982, null, 1094, 1094],
[9.82467, 48.629627, null, 1098, 1098],
[9.825469, 48.62946, null, 1102, 1102],
[9.832053, 48.628536, null, 1138, 1138],
[9.833895, 48.62839, null, 1147, 1147],
[9.834692, 48.628395, null, 1151, 1151],
[9.835675, 48.62849, null, 1157, 1157],
[9.836833, 48.628723, null, 1163, 1163],
[9.837443, 48.62889, null, 1167, 1167],
[9.837997, 48.629086, null, 1170, 1170],
[9.838504, 48.629322, null, 1173, 1173],
[9.840591, 48.63049, null, 1188, 1188],
[9.841389, 48.6308, null, 1192, 1192],
[9.842033, 48.630947, null, 1196, 1196],
[9.843039, 48.631046, null, 1201, 1201],
[9.843488, 48.631046, null, 1204, 1204],
[9.843907, 48.631023, null, 1206, 1206],
[9.844565, 48.630924, null, 1210, 1210],
[9.845152, 48.63079, null, 1213, 1213],
[9.845789, 48.630577, null, 1217, 1217],
[9.846463, 48.630226, null, 1221, 1221],
[9.84671, 48.630054, null, 1223, 1223],
[9.847247, 48.62954, null, 1228, 1228],
[9.847474, 48.62925, null, 1231, 1231],
[9.847727, 48.628765, null, 1235, 1235],
[9.847872, 48.62819, null, 1239, 1239],
[9.847867, 48.62781, null, 1242, 1242],
[9.847695, 48.627186, null, 1247, 1247],
[9.846603, 48.624626, null, 1269, 1269],
[9.846271, 48.623917, null, 1275, 1275],
[9.846093, 48.62362, null, 1277, 1277],
[9.845506, 48.62294, null, 1283, 1283],
[9.84527, 48.62272, null, 1286, 1286],
[9.844801, 48.622387, null, 1289, 1289],
[9.843577, 48.62174, null, 1297, 1297],
[9.842846, 48.62123, null, 1303, 1303],
[9.842495, 48.620937, null, 1306, 1306],
[9.842198, 48.62052, null, 1310, 1310],
[9.841988, 48.620056, null, 1314, 1314],
[9.841889, 48.61953, null, 1318, 1318],
[9.841888, 48.619247, null, 1320, 1920],
[9.841888, 48.619247, null, 1920, 1920],
[9.841949, 48.618866, null, 1923, 1923],
[9.84205, 48.61851, null, 1925, 1925],
[9.842367, 48.617767, null, 1931, 1931],
[9.842713, 48.6172, null, 1935, 1935],
[9.843173, 48.616573, null, 1940, 1940],
[9.844981, 48.61435, null, 1957, 1957],
[9.845165, 48.614067, null, 1960, 1960],
[9.845468, 48.61356, null, 1963, 1963],
[9.8455715, 48.613285, null, 1965, 1965],
[9.845633, 48.61278, null, 1969, 1969],
[9.845585, 48.61234, null, 1972, 1972],
[9.845477, 48.612057, null, 1974, 1974],
[9.844785, 48.610874, null, 1983, 1983],
[9.844646, 48.61061, null, 1985, 1985],
[9.8445425, 48.61031, null, 1987, 1987],
[9.844473, 48.609818, null, 1990, 1990],
[9.8444, 48.608555, null, 1999, 1999],
[9.844029, 48.606773, null, 2012, 2012],
[9.843974, 48.604996, null, 2024, 2024],
[9.843876, 48.604446, null, 2028, 2028],
[9.843627, 48.603863, null, 2032, 2032],
[9.842783, 48.60239, null, 2043, 2043],
[9.842583, 48.602013, null, 2046, 2046],
[9.842499, 48.601772, null, 2048, 2048],
[9.842441, 48.601368, null, 2051, 2051],
[9.842446, 48.601128, null, 2052, 2052],
[9.842586, 48.60062, null, 2056, 2056],
[9.842873, 48.600117, null, 2060, 2060],
[9.843068, 48.59989, null, 2061, 2061],
[9.843665, 48.599438, null, 2066, 2066],
[9.844416, 48.599075, null, 2070, 2070],
[9.844863, 48.598927, null, 2072, 2072],
[9.84579, 48.598766, null, 2077, 2077],
[9.847786, 48.598545, null, 2086, 2086],
[9.848639, 48.598392, null, 2090, 2090],
[9.849321, 48.5982, null, 2094, 2094],
[9.850297, 48.597824, null, 2099, 2099],
[9.85065, 48.59764, null, 2101, 2101],
[9.851246, 48.597263, null, 2105, 2105],
[9.851868, 48.596786, null, 2109, 2109],
[9.852677, 48.59601, null, 2116, 2116],
[9.8535795, 48.59495, null, 2124, 2124],
[9.853849, 48.59468, null, 2126, 2126],
[9.854275, 48.59434, null, 2129, 2129],
[9.854804, 48.59404, null, 2133, 2133],
[9.855147, 48.593903, null, 2135, 2135],
[9.856709, 48.593422, null, 2142, 2142],
[9.857222, 48.5932, null, 2145, 2145],
[9.8575115, 48.593025, null, 2147, 2147],
[9.857981, 48.592663, null, 2150, 2150],
[9.858217, 48.592426, null, 2152, 2152],
[9.858715, 48.591763, null, 2158, 2158],
[9.858908, 48.59156, null, 2159, 2159],
[9.859715, 48.59099, null, 2165, 2165],
[9.860321, 48.590702, null, 2168, 2168],
[9.862882, 48.589836, null, 2181, 2181],
[9.8644085, 48.589222, null, 2190, 2190],
[9.864782, 48.589058, null, 2192, 2192],
[9.865459, 48.588646, null, 2196, 2196],
[9.866059, 48.588116, null, 2201, 2201],
[9.866771, 48.587204, null, 2208, 2208],
[9.867704, 48.585785, null, 2219, 2219],
[9.871284, 48.58056, null, 2259, 2259],
[9.872414, 48.57894, null, 2271, 2271],
[9.873302, 48.577827, null, 2280, 2280],
[9.873295, 48.577827, null, 2280, 2340],
[9.874704, 48.576206, null, 2350, 2350],
[9.875486, 48.575203, null, 2355, 2355],
[9.87642, 48.57356, null, 2364, 2364],
[9.876733, 48.572872, null, 2368, 2368],
[9.877041, 48.57188, null, 2373, 2373],
[9.877567, 48.569393, null, 2386, 2386],
[9.878025, 48.568455, null, 2391, 2391],
[9.878236, 48.56811, null, 2393, 2393],
[9.878542, 48.56777, null, 2395, 2395],
[9.878875, 48.56746, null, 2397, 2397],
[9.879812, 48.56676, null, 2402, 2402],
[9.880402, 48.566406, null, 2405, 2405],
[9.88102, 48.56612, null, 2407, 2407],
[9.88172, 48.565857, null, 2410, 2410],
[9.882313, 48.565662, null, 2412, 2412],
[9.883014, 48.565495, null, 2415, 2415],
[9.887294, 48.56459, null, 2430, 2430],
[9.887914, 48.564404, null, 2433, 2433],
[9.888465, 48.564194, null, 2435, 2435],
[9.889057, 48.56392, null, 2437, 2437],
[9.890022, 48.563328, null, 2442, 2442],
[9.890661, 48.56271, null, 2446, 2446],
[9.89094, 48.562386, null, 2448, 2448],
[9.891336, 48.56178, null, 2451, 2451],
[9.891518, 48.561348, null, 2453, 2453],
[9.89162, 48.560993, null, 2455, 2455],
[9.891703, 48.56031, null, 2459, 2459],
[9.891607, 48.559486, null, 2463, 2463],
[9.891479, 48.559116, null, 2465, 2465],
[9.891311, 48.558792, null, 2467, 2467],
[9.89017, 48.557087, null, 2476, 2476],
[9.889945, 48.556637, null, 2479, 2479],
[9.889733, 48.556118, null, 2481, 2481],
[9.889641, 48.555527, null, 2484, 2484],
[9.889605, 48.55503, null, 2487, 2487],
[9.889626, 48.554672, null, 2489, 2489],
[9.889699, 48.554222, null, 2491, 2491],
[9.889931, 48.553535, null, 2495, 2495],
[9.890392, 48.552757, null, 2499, 2499],
[9.890763, 48.552334, null, 2502, 2502],
[9.891391, 48.55179, null, 2505, 2505],
[9.89265, 48.551006, null, 2511, 2511],
[9.894745, 48.54998, null, 2520, 2580],
[9.894722, 48.549995, null, 2580, 2580],
[9.897675, 48.54861, null, 2597, 2597],
[9.898239, 48.54841, null, 2600, 2600],
[9.899261, 48.548138, null, 2605, 2605],
[9.89993, 48.54801, null, 2608, 2608],
[9.900568, 48.54794, null, 2611, 2611],
[9.9020195, 48.547855, null, 2618, 2618],
[9.902909, 48.54788, null, 2622, 2622],
[9.9039135, 48.547993, null, 2627, 2627],
[9.907638, 48.548553, null, 2645, 2645],
[9.908585, 48.548607, null, 2649, 2649],
[9.909755, 48.548588, null, 2655, 2655],
[9.9102125, 48.54855, null, 2657, 2657],
[9.911492, 48.54836, null, 2663, 2663],
[9.911982, 48.54825, null, 2666, 2666],
[9.912993, 48.547943, null, 2671, 2671],
[9.914078, 48.54749, null, 2677, 2677],
[9.914553, 48.547226, null, 2680, 2680],
[9.915002, 48.54695, null, 2682, 2682],
[9.915371, 48.546665, null, 2685, 2685],
[9.917326, 48.544994, null, 2700, 2700],
[9.917326, 48.544994, null, 2700, 2700],
[9.91908, 48.543457, null, 2710, 2710],
[9.919677, 48.542866, null, 2714, 2714],
[9.9206505, 48.541725, null, 2721, 2721],
[9.92121, 48.540943, null, 2725, 2725],
[9.921709, 48.54011, null, 2730, 2730],
[9.922271, 48.538902, null, 2737, 2737],
[9.92367, 48.535194, null, 2757, 2757],
[9.924095, 48.534443, null, 2761, 2761],
[9.9244585, 48.533978, null, 2764, 2764],
[9.9249, 48.533554, null, 2767, 2767],
[9.925408, 48.533154, null, 2769, 2769],
[9.9263525, 48.53257, null, 2774, 2774],
[9.938187, 48.52741, null, 2823, 2823],
[9.941524, 48.525814, null, 2838, 2838],
[9.94422, 48.52458, null, 2849, 2849],
[9.945025, 48.52411, null, 2853, 2853],
[9.945749, 48.523636, null, 2856, 2856],
[9.947844, 48.521896, null, 2868, 2868],
[9.948261, 48.521473, null, 2871, 2871],
[9.948622, 48.52105, null, 2873, 2873],
[9.949395, 48.51986, null, 2880, 2880],
[9.949395, 48.51986, null, 2880, 2880],
[9.9498625, 48.518997, null, 2886, 2886],
[9.950074, 48.518394, null, 2890, 2890],
[9.950363, 48.517235, null, 2897, 2897],
[9.950439, 48.51667, null, 2901, 2901],
[9.950484, 48.516075, null, 2904, 2904],
[9.950481, 48.514187, null, 2916, 2916],
[9.950301, 48.51216, null, 2929, 2929],
[9.949995, 48.507015, null, 2961, 2961],
[9.950042, 48.506386, null, 2965, 2965],
[9.950195, 48.50573, null, 2969, 2969],
[9.950349, 48.50537, null, 2972, 2972],
[9.950738, 48.504726, null, 2976, 2976],
[9.951203, 48.504135, null, 2980, 2980],
[9.951442, 48.503906, null, 2982, 2982],
[9.952161, 48.50336, null, 2987, 2987],
[9.952601, 48.50311, null, 2989, 2989],
[9.957093, 48.500782, null, 3013, 3013],
[9.96638, 48.496128, null, 3061, 3061],
[9.9675045, 48.495686, null, 3067, 3067],
[9.968728, 48.49532, null, 3072, 3072],
[9.972316, 48.49459, null, 3088, 3088],
[9.973238, 48.494316, null, 3092, 3092],
[9.9740925, 48.493958, null, 3096, 3096],
[9.974933, 48.49352, null, 3101, 3101],
[9.975609, 48.493042, null, 3105, 3105],
[9.975881, 48.492805, null, 3107, 3107],
[9.976443, 48.492214, null, 3111, 3111],
[9.97676, 48.4918, null, 3114, 3114],
[9.976947, 48.49149, null, 3116, 3116],
[9.977197, 48.490868, null, 3120, 3120],
[9.977353, 48.490124, null, 3125, 3125],
[9.977374, 48.489735, null, 3127, 3127],
[9.977336, 48.489082, null, 3131, 3131],
[9.977028, 48.485302, null, 3155, 3155],
[9.97678, 48.481342, null, 3180, 3180],
[9.97678, 48.481342, null, 3180, 3180],
[9.975266, 48.45941, null, 3314, 3314],
[9.975235, 48.458557, null, 3319, 3319],
[9.975347, 48.457672, null, 3325, 3325],
[9.975505, 48.457127, null, 3328, 3328],
[9.97566, 48.45673, null, 3331, 3331],
[9.976079, 48.45588, null, 3336, 3336],
[9.976582, 48.455166, null, 3341, 3341],
[9.976846, 48.454857, null, 3343, 3343],
[9.977405, 48.4543, null, 3347, 3347],
[9.9780245, 48.45378, null, 3351, 3351],
[9.978484, 48.453434, null, 3354, 3354],
[9.979547, 48.452778, null, 3360, 3360],
[9.980126, 48.452484, null, 3363, 3363],
[9.981229, 48.452023, null, 3368, 3368],
[9.982564, 48.4516, null, 3374, 3374],
[9.983235, 48.451435, null, 3377, 3377],
[9.984474, 48.45121, null, 3383, 3383],
[9.985596, 48.451084, null, 3387, 3387],
[9.99456, 48.450523, null, 3424, 3424],
[9.995968, 48.450367, null, 3429, 3429],
[9.997399, 48.450123, null, 3435, 3435],
[9.999547, 48.449627, null, 3445, 3445],
[10.001879, 48.448837, null, 3455, 3455],
[10.003179, 48.44828, null, 3462, 3462],
[10.008791, 48.445667, null, 3489, 3489],
[10.009842, 48.44513, null, 3495, 3495],
[10.0102215, 48.44489, null, 3497, 3497],
[10.010632, 48.44458, null, 3499, 3499],
[10.011215, 48.44403, null, 3504, 3504],
[10.011436, 48.443783, null, 3505, 3505],
[10.011794, 48.443287, null, 3509, 3509],
[10.01202, 48.442894, null, 3511, 3511],
[10.012195, 48.44246, null, 3514, 3514],
[10.012305, 48.442078, null, 3516, 3516],
[10.012375, 48.441666, null, 3519, 3519],
[10.012353, 48.44083, null, 3524, 3524],
[10.012276, 48.440445, null, 3526, 3526],
[10.012164, 48.4401, null, 3529, 3529],
[10.011831, 48.439407, null, 3533, 3533],
[10.011579, 48.439014, null, 3536, 3536],
[10.011246, 48.43862, null, 3538, 3538],
[10.006305, 48.433735, null, 3574,