UNPKG

gtfs-utils

Version:
1,271 lines (1,244 loc) 76.6 kB
/* 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,