From e696761f8ea3a11d5bc2dcf1f5febd3b72d3b52b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Sun, 23 May 2021 14:59:08 +0200 Subject: [PATCH] Implement iterative graph compression --- src/tam/network.js | 443 +++++--- src/tam/network.json | 2422 ++++++++++++++++-------------------------- 2 files changed, 1174 insertions(+), 1691 deletions(-) diff --git a/src/tam/network.js b/src/tam/network.js index 128ec37..3478af9 100644 --- a/src/tam/network.js +++ b/src/tam/network.js @@ -340,7 +340,7 @@ different sequence of nodes in two or more lines.`); * Create a graph for navigating between stops. * @param {Array.} elementsList List of nodes retrieved from OSM. * @param {Object.} elementsById OSM nodes indexed by their ID. - * @return {Object.} Resulting graph. + * @return {Object} Resulting graph and reverse arcs. */ const createNavigationGraph = (elementsList, elementsById) => { const navigation = {}; @@ -350,7 +350,7 @@ const createNavigationGraph = (elementsList, elementsById) => { for (const obj of elementsList) { if (obj.type === "node") { navigation[obj.id] = {}; - navigationReverse[obj.id] = {}; + navigationReverse[obj.id] = new Set(); } } @@ -360,27 +360,27 @@ const createNavigationGraph = (elementsList, elementsById) => { const oneWay = osm.isOneWay(obj); for (let i = 0; i + 1 < obj.nodes.length; ++i) { - const from = obj.nodes[i]; - let to = obj.nodes[i + 1]; - let path = [from.toString(), to.toString()]; + const from = obj.nodes[i].toString(); + let to = obj.nodes[i + 1].toString(); + let path = [from, to]; // Make sure we can’t jump between rails at railway crossings if (i + 2 < obj.nodes.length && osm.isRailwayCrossing(elementsById[to])) { - const next = obj.nodes[i + 2]; - path = [from.toString(), to.toString(), next.toString()]; + const next = obj.nodes[i + 2].toString(); + path = [from, to, next]; to = next; i += 1; } navigation[from][to] = path; - navigationReverse[to][from] = true; + navigationReverse[to].add(from); if (!oneWay) { const reversePath = [...path]; reversePath.reverse(); navigation[to][from] = reversePath; - navigationReverse[from][to] = true; + navigationReverse[from].add(to); } } } @@ -390,158 +390,99 @@ const createNavigationGraph = (elementsList, elementsById) => { }; /** - * Remove and relink nodes that connect only two nodes or less. - * @param {Object.} stops List of stops. + * Identify intermediate nodes of the navigation graph that can be simplified. + * @param {Set.} stopsSet OSM IDs of stop nodes. * @param {Navigation} navigation Input navigation graph. - * @param {Object.>} navigationReverse - * Backward edges of the navigation graph. + * @param {Object.>} navigationReverse Reverse arcs. + * @return {Set.} Set of compressible nodes. */ -const compressNavigationGraph = (stops, navigation, navigationReverse) => { - const stopsReverse = Object.fromEntries( - Object.entries(stops).map(([id, stop]) => [stop.properties.node, id]) - ); +const findCompressibleNodes = (stopsSet, navigation, navigationReverse) => { + const compressible = new Set(); - let removedDeadEnds = true; - const nodesToCompress = {}; - - while (removedDeadEnds) { - // Identify nodes to be compressed - for (const nodeId in navigation) { - if (nodeId in stopsReverse) { - // Keep stop nodes - continue; - } - - const entries = new Set(Object.keys(navigationReverse[nodeId])); - const exits = new Set(Object.keys(navigation[nodeId])); - - // Keep split nodes, i.e. nodes with at least two exit nodes - // and one entry node that are all distinct from each other - if (entries.size >= 1) { - if (exits.size >= 3) { - continue; - } - - let isSplit = false; - - if (exits.size === 2) { - for (const entry of entries) { - if (!exits.has(entry)) { - isSplit = true; - break; - } - } - } - - if (isSplit) { - continue; - } - } - - // Keep junction nodes, i.e. nodes with at least two entry nodes - // and one exit node that are all distinct from each other - if (exits.size >= 1) { - if (entries.size >= 3) { - continue; - } - - let isJunction = false; - - if (entries.size === 2) { - for (const exit of exits) { - if (!entries.has(exit)) { - isJunction = true; - break; - } - } - } - - if (isJunction) { - continue; - } - } - - // Compress all other nodes - nodesToCompress[nodeId] = true; - } - - // Find nodes that cannot be used to directly link up two kept nodes - const usedNodes = {}; - - for (const beginId in navigation) { - if (beginId in nodesToCompress) { - continue; - } - - usedNodes[beginId] = true; - - // Start a DFS from each node to be kept - const begin = navigation[beginId]; - const stack = []; - const parent = {[beginId]: beginId}; - - for (const succId in begin) { - if (succId in nodesToCompress) { - stack.push(succId); - parent[succId] = beginId; - } - } - - while (stack.length > 0) { - const endId = stack.pop(); - const end = navigation[endId]; - - if (!(endId in nodesToCompress)) { - let trackback = parent[endId]; - - while (trackback !== beginId) { - usedNodes[trackback] = true; - trackback = parent[trackback]; - } - } else { - for (const succId in end) { - if (succId !== parent[endId]) { - parent[succId] = endId; - stack.push(succId); - } - } - } - } - } - - // Remove dead-end nodes - removedDeadEnds = false; - - for (const beginId in navigation) { - if (!(beginId in usedNodes)) { - for (const neighborId in navigation[beginId]) { - delete navigationReverse[neighborId][beginId]; - } - - for (const neighborId in navigationReverse[beginId]) { - delete navigation[neighborId][beginId]; - } - - delete navigation[beginId]; - delete navigationReverse[beginId]; - removedDeadEnds = true; - } - } - } - - // Perform node compression - for (const beginId in navigation) { - if (beginId in nodesToCompress) { + for (const nodeId in navigation) { + if (stopsSet.has(nodeId)) { + // Keep stop nodes + continue; + } + + const entries = navigationReverse[nodeId]; + const exits = new Set(Object.keys(navigation[nodeId])); + + // Keep split nodes, i.e. nodes with at least two exit nodes + // and one entry node that are all distinct from each other + if (entries.size >= 1) { + if (exits.size >= 3) { + continue; + } + + let isSplit = false; + + if (exits.size === 2) { + for (const entry of entries) { + if (!exits.has(entry)) { + isSplit = true; + break; + } + } + } + + if (isSplit) { + continue; + } + } + + // Keep junction nodes, i.e. nodes with at least two entry nodes + // and one exit node that are all distinct from each other + if (exits.size >= 1) { + if (entries.size >= 3) { + continue; + } + + let isJunction = false; + + if (entries.size === 2) { + for (const exit of exits) { + if (!entries.has(exit)) { + isJunction = true; + break; + } + } + } + + if (isJunction) { + continue; + } + } + + // Compress all other nodes + compressible.add(nodeId); + } + + return compressible; +}; + +/** + * Remove nodes that are not used to link up two kept nodes. + * @param {Navigation} navigation Input navigation graph. + * @param {Object.>} navigationReverse Reverse arcs. + * @param {Set.} compressible Set of nodes that will not be kept. + * @return {boolean} True if some dead-ends were removed. + */ +const removeDeadEnds = (navigation, navigationReverse, compressible) => { + let didRemove = false; + + // Find dead-ends starting from kept nodes + for (const beginId in navigation) { + if (compressible.has(beginId)) { continue; } - // Start a DFS from each node to be kept const begin = navigation[beginId]; const stack = []; const parent = {[beginId]: beginId}; for (const succId in begin) { - if (succId in nodesToCompress) { + if (compressible.has(succId)) { stack.push(succId); parent[succId] = beginId; } @@ -551,44 +492,141 @@ const compressNavigationGraph = (stops, navigation, navigationReverse) => { const endId = stack.pop(); const end = navigation[endId]; - if (!(endId in nodesToCompress)) { - // Found another kept node - // Collect and remove intermediate nodes - const reversePath = [endId]; - let trackback = parent[endId]; - let oneWay = !(trackback in end); + if (compressible.has(endId)) { + let hasSuccessor = false; + + for (const succId in end) { + if (succId !== parent[endId]) { + parent[succId] = endId; + stack.push(succId); + hasSuccessor = true; + } + } + + if (!hasSuccessor) { + // Remove the dead-end path + let trackback = endId; + + while (trackback !== beginId) { + navigationReverse[trackback].delete(parent[trackback]); + delete navigation[parent[trackback]][trackback]; + trackback = parent[trackback]; + } + + didRemove = true; + } + } + } + } + + // Find dead-ends starting from compressible source nodes + for (const beginId in navigation) { + if (!compressible.has(beginId)) { + continue; + } + + if (navigationReverse[beginId].size > 0) { + continue; + } + + const begin = navigation[beginId]; + const stack = []; + const parent = {[beginId]: beginId}; + + for (const succId in begin) { + stack.push(succId); + parent[succId] = beginId; + } + + while (stack.length > 0) { + const endId = stack.pop(); + const end = navigation[endId]; + + if (compressible.has(endId)) { + for (const succId in end) { + if (succId !== parent[endId]) { + parent[succId] = endId; + stack.push(succId); + } + } + } else { + // Remove the dead-end path + let trackback = endId; while (trackback !== beginId) { - reversePath.push(trackback); - oneWay = oneWay || !(parent[trackback] in navigation[trackback]); - - delete navigation[trackback]; - delete navigationReverse[trackback]; + navigationReverse[trackback].delete(parent[trackback]); + delete navigation[parent[trackback]][trackback]; trackback = parent[trackback]; } - reversePath.push(beginId); - const forwardPath = [...reversePath]; - forwardPath.reverse(); + didRemove = true; + } + } + } - // Create edges to link both nodes directly - delete begin[forwardPath[1]]; - delete navigationReverse[endId][reversePath[1]]; + return didRemove; +}; - delete end[reversePath[1]]; - delete navigationReverse[beginId][forwardPath[1]]; +/** + * Compress the given set of nodes. + * @param {Navigation} navigation Input navigation graph. + * @param {Object.>} navigationReverse Reverse arcs. + * @param {Set.} compressible Set of nodes to compress. + * @return {boolean} True if some nodes were compressed. + */ +const removeCompressibleNodes = (navigation, navigationReverse, compressible) => { + let didCompress = false; - if (!(endId in begin)) { - begin[endId] = forwardPath; - navigationReverse[endId][beginId] = true; + for (const beginId in navigation) { + if (compressible.has(beginId)) { + continue; + } + + // Start a DFS from each kept node + const begin = navigation[beginId]; + const stack = []; + const parent = {[beginId]: beginId}; + + for (const succId in begin) { + if (compressible.has(succId)) { + stack.push(succId); + parent[succId] = beginId; + } + } + + while (stack.length > 0) { + const endId = stack.pop(); + const end = navigation[endId]; + + if (!compressible.has(endId)) { + // Found another kept node + // Collect and remove intermediate path + let path = []; + let trackback = endId; + + do { + const segment = [...navigation[parent[trackback]][trackback]]; + segment.reverse(); + path = path.concat(segment.slice(0, -1)); + + navigationReverse[trackback].delete(parent[trackback]); + delete navigation[parent[trackback]][trackback]; + + trackback = parent[trackback]; + } while (trackback !== beginId); + + // Make sure not to add loops if we’re compressing a cycle + if (endId !== beginId) { + path.push(beginId); + path.reverse(); + + begin[endId] = path; + navigationReverse[endId].add(beginId); } - if (!oneWay && !(beginId in end)) { - end[beginId] = reversePath; - navigationReverse[beginId][endId] = true; - } + didCompress = true; } else { - // Continue the traversal down unused nodes + // Continue the traversal down compressible nodes let isFirst = true; for (const succId in end) { @@ -606,6 +644,57 @@ non-junction node ${endId}`); } } } + + return didCompress; +}; + +/** + * Find nodes in the graph that have no exits nor entries and remove them. + * @param {Navigation} navigation Input navigation graph. + * @param {Object.>} navigationReverse Reverse arcs. + */ +const cleanUpIsolatedNodes = (navigation, navigationReverse) => { + for (const nodeId in navigation) { + if ( + Object.keys(navigation[nodeId]).length === 0 + && navigationReverse[nodeId].size === 0 + ) { + delete navigation[nodeId]; + delete navigationReverse[nodeId]; + } + } +}; + +/** + * Remove and relink nodes that connect only two nodes or less. + * @param {Object.} stops List of stops. + * @param {Navigation} navigation Input navigation graph. + * @param {Object.>} navigationReverse Reverse arcs. + */ +const compressNavigationGraph = (stops, navigation, navigationReverse) => { + const stopsSet = new Set( + Object.values(stops).map(stop => stop.properties.node) + ); + let compressible = null; + let didCompress = true; + + while (didCompress) { + let didRemove = true; + + while (didRemove) { + compressible = findCompressibleNodes( + stopsSet, navigation, navigationReverse + ); + didRemove = removeDeadEnds( + navigation, navigationReverse, compressible + ); + } + + didCompress = removeCompressibleNodes( + navigation, navigationReverse, compressible + ); + cleanUpIsolatedNodes(navigation, navigationReverse); + } }; /** diff --git a/src/tam/network.json b/src/tam/network.json index f2c6f8f..fed76a0 100644 --- a/src/tam/network.json +++ b/src/tam/network.json @@ -872,7 +872,7 @@ "properties": { "begin": "60722461", "end": "3118402852", - "length": 23.633127162916953 + "length": 23.64041166537001 }, "geometry": { "type": "LineString", @@ -885,6 +885,10 @@ 3.8823554, 43.6144002 ], + [ + 3.8825078, + 43.6144592 + ], [ 3.8825891, 43.6144866 @@ -899,7 +903,7 @@ "properties": { "begin": "60722751", "end": "1605459462", - "length": 51.098666028605145 + "length": 51.11897351299434 }, "geometry": { "type": "LineString", @@ -920,6 +924,10 @@ 3.8949327, 43.6039585 ], + [ + 3.8949443, + 43.603884 + ], [ 3.8949455, 43.6038129 @@ -1036,7 +1044,7 @@ "properties": { "begin": "60722796", "end": "60722793", - "length": 54.110132486627116 + "length": 54.16366674551255 }, "geometry": { "type": "LineString", @@ -1053,6 +1061,10 @@ 3.8804059, 43.6052005 ], + [ + 3.8804328, + 43.6051818 + ], [ 3.8804691, 43.6051641 @@ -1077,6 +1089,10 @@ 3.8807296, 43.6051254 ], + [ + 3.8807621, + 43.6051298 + ], [ 3.880829, 43.6051483 @@ -1093,7 +1109,7 @@ "properties": { "begin": "60722796", "end": "2305432923", - "length": 48.42568291093884 + "length": 48.44162103758403 }, "geometry": { "type": "LineString", @@ -1118,10 +1134,18 @@ 3.8804355, 43.605012 ], + [ + 3.8804365, + 43.6050015 + ], [ 3.8804346, 43.6049741 ], + [ + 3.8804333, + 43.6049598 + ], [ 3.8804242, 43.6049272 @@ -1195,7 +1219,7 @@ "properties": { "begin": "60732075", "end": "60732074", - "length": 39.26644151633421 + "length": 39.33442667360594 }, "geometry": { "type": "LineString", @@ -1212,6 +1236,10 @@ 3.8958793, 43.6002539 ], + [ + 3.8959281, + 43.6002271 + ], [ 3.8959742, 43.6002102 @@ -1220,6 +1248,10 @@ 3.896034, 43.6001983 ], + [ + 3.8960947, + 43.6001962 + ], [ 3.8961582, 43.6002013 @@ -3103,7 +3135,7 @@ "properties": { "begin": "231529652", "end": "2565049829", - "length": 258.1478336800581 + "length": 258.210083334162 }, "geometry": { "type": "LineString", @@ -3180,6 +3212,10 @@ 3.8761363, 43.596956 ], + [ + 3.8761441, + 43.597015 + ], [ 3.8761354, 43.5970829 @@ -3586,12 +3622,12 @@ } }, "231578487": { - "291356213": { + "1540210702": { "type": "Feature", "properties": { "begin": "231578487", - "end": "291356213", - "length": 534.6693615234615 + "end": "1540210702", + "length": 1205.7744959288311 }, "geometry": { "type": "LineString", @@ -3623,6 +3659,110 @@ [ 3.856278, 43.5791408 + ], + [ + 3.8567925, + 43.5794528 + ], + [ + 3.8574671, + 43.579848 + ], + [ + 3.8581473, + 43.5802168 + ], + [ + 3.8586074, + 43.5804549 + ], + [ + 3.8590173, + 43.5806497 + ], + [ + 3.859216, + 43.5807614 + ], + [ + 3.8594552, + 43.5808971 + ], + [ + 3.859643, + 43.580995 + ], + [ + 3.8605081, + 43.5813453 + ], + [ + 3.8608392, + 43.5814806 + ], + [ + 3.8609009, + 43.5815063 + ], + [ + 3.8609613, + 43.5815315 + ], + [ + 3.8611488, + 43.581614 + ], + [ + 3.8613212, + 43.581709 + ], + [ + 3.8614421, + 43.5817834 + ], + [ + 3.8615137, + 43.5818528 + ], + [ + 3.8615591, + 43.5819251 + ], + [ + 3.8615869, + 43.5820142 + ], + [ + 3.8615904, + 43.5820946 + ], + [ + 3.8615697, + 43.58217 + ], + [ + 3.8615219, + 43.582265 + ], + [ + 3.8614693, + 43.5823398 + ], + [ + 3.8614084, + 43.5824341 + ], + [ + 3.8613369, + 43.5825132 + ], + [ + 3.8612516, + 43.5826075 + ], + [ + 3.8608487, + 43.583054 ] ] } @@ -3938,7 +4078,7 @@ "properties": { "begin": "256089087", "end": "2305432957", - "length": 53.57121084944373 + "length": 53.58270588573625 }, "geometry": { "type": "LineString", @@ -3955,6 +4095,10 @@ 3.8804801, 43.6049179 ], + [ + 3.8804838, + 43.6049301 + ], [ 3.8804914, 43.6049643 @@ -3963,6 +4107,10 @@ 3.8804912, 43.6050031 ], + [ + 3.8804911, + 43.6050084 + ], [ 3.8804841, 43.6050329 @@ -3971,6 +4119,10 @@ 3.8804467, 43.6051433 ], + [ + 3.8804328, + 43.6051818 + ], [ 3.8803987, 43.605267 @@ -4207,7 +4359,7 @@ "properties": { "begin": "279197046", "end": "3118564775", - "length": 204.776785404856 + "length": 204.84495718621778 }, "geometry": { "type": "LineString", @@ -4216,6 +4368,10 @@ 3.882001, 43.6057233 ], + [ + 3.8821352, + 43.6057137 + ], [ 3.8821611, 43.6057171 @@ -4817,98 +4973,6 @@ } } }, - "291356213": { - "231578487": { - "type": "Feature", - "properties": { - "begin": "291356213", - "end": "231578487", - "length": 534.6693615234616 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.856278, - 43.5791408 - ], - [ - 3.8540252, - 43.5777494 - ], - [ - 3.8533194, - 43.5773128 - ], - [ - 3.8531673, - 43.5772211 - ], - [ - 3.8525127, - 43.5768152 - ], - [ - 3.8523404, - 43.5767074 - ], - [ - 3.851232, - 43.5760171 - ] - ] - } - }, - "3124581442": { - "type": "Feature", - "properties": { - "begin": "291356213", - "end": "3124581442", - "length": 340.7758464084975 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.856278, - 43.5791408 - ], - [ - 3.8567925, - 43.5794528 - ], - [ - 3.8574671, - 43.579848 - ], - [ - 3.8581473, - 43.5802168 - ], - [ - 3.8586074, - 43.5804549 - ], - [ - 3.8590173, - 43.5806497 - ], - [ - 3.859216, - 43.5807614 - ], - [ - 3.8594552, - 43.5808971 - ], - [ - 3.859643, - 43.580995 - ] - ] - } - } - }, "308531347": { "979209825": { "type": "Feature", @@ -6681,7 +6745,7 @@ "properties": { "begin": "943983815", "end": "2575586335", - "length": 93.42973282634095 + "length": 93.51545708279545 }, "geometry": { "type": "LineString", @@ -6694,6 +6758,10 @@ 3.8945043, 43.6040375 ], + [ + 3.8945734, + 43.6040663 + ], [ 3.8946008, 43.6040867 @@ -6742,6 +6810,10 @@ 3.8947939, 43.6045886 ], + [ + 3.8947993, + 43.6046256 + ], [ 3.894803, 43.6046847 @@ -7163,7 +7235,7 @@ "properties": { "begin": "977674929", "end": "60722759", - "length": 373.7685368505851 + "length": 373.77248691606394 }, "geometry": { "type": "LineString", @@ -7232,6 +7304,10 @@ 3.894054, 43.6086215 ], + [ + 3.894036, + 43.6085377 + ], [ 3.8940186, 43.6084293 @@ -7261,186 +7337,6 @@ } } }, - "979209099": { - "1547411695": { - "type": "Feature", - "properties": { - "begin": "979209099", - "end": "1547411695", - "length": 709.0261070189143 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.9293232, - 43.6400166 - ], - [ - 3.9295287, - 43.6400492 - ], - [ - 3.9297072, - 43.6400776 - ], - [ - 3.9297742, - 43.6400968 - ], - [ - 3.9298492, - 43.6401295 - ], - [ - 3.9299008, - 43.6401636 - ], - [ - 3.9299362, - 43.6401905 - ], - [ - 3.9299697, - 43.6402363 - ], - [ - 3.9300051, - 43.6403052 - ], - [ - 3.9301424, - 43.6406184 - ], - [ - 3.9303754, - 43.6411162 - ], - [ - 3.930493, - 43.6413869 - ], - [ - 3.9306414, - 43.6417655 - ], - [ - 3.9308582, - 43.6423347 - ], - [ - 3.9309266, - 43.6425374 - ], - [ - 3.9309782, - 43.6427295 - ], - [ - 3.9310185, - 43.6429501 - ], - [ - 3.9310375, - 43.6431479 - ], - [ - 3.931042, - 43.6433595 - ], - [ - 3.9310252, - 43.6435574 - ], - [ - 3.9309972, - 43.6437447 - ], - [ - 3.9309591, - 43.6439118 - ], - [ - 3.9308997, - 43.6441153 - ], - [ - 3.9308022, - 43.644365 - ], - [ - 3.9306322, - 43.6447654 - ], - [ - 3.9305171, - 43.6450345 - ], - [ - 3.9304297, - 43.6452186 - ], - [ - 3.93009, - 43.645859 - ] - ] - } - }, - "1547417303": { - "type": "Feature", - "properties": { - "begin": "979209099", - "end": "1547417303", - "length": 152.37844888957954 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.9293232, - 43.6400166 - ], - [ - 3.9291538, - 43.6400022 - ], - [ - 3.929055, - 43.6399995 - ], - [ - 3.9289592, - 43.6399909 - ], - [ - 3.9285324, - 43.6399209 - ], - [ - 3.9283329, - 43.6398801 - ], - [ - 3.9279589, - 43.6397941 - ], - [ - 3.9276776, - 43.639727 - ], - [ - 3.9275707, - 43.6397023 - ], - [ - 3.9274929, - 43.6396839 - ] - ] - } - } - }, "979209239": { "308531607": { "type": "Feature", @@ -8055,12 +7951,12 @@ } }, "979210260": { - "1547417303": { + "1547411695": { "type": "Feature", "properties": { "begin": "979210260", - "end": "1547417303", - "length": 270.3480163912447 + "end": "1547411695", + "length": 1131.434856912754 }, "geometry": { "type": "LineString", @@ -8140,6 +8036,142 @@ [ 3.9274929, 43.6396839 + ], + [ + 3.9277665, + 43.6397178 + ], + [ + 3.9278735, + 43.6397373 + ], + [ + 3.9283394, + 43.639848 + ], + [ + 3.9285421, + 43.6398902 + ], + [ + 3.9288362, + 43.6399392 + ], + [ + 3.9291143, + 43.6399816 + ], + [ + 3.9293232, + 43.6400166 + ], + [ + 3.9295287, + 43.6400492 + ], + [ + 3.9297072, + 43.6400776 + ], + [ + 3.9297742, + 43.6400968 + ], + [ + 3.9298492, + 43.6401295 + ], + [ + 3.9299008, + 43.6401636 + ], + [ + 3.9299362, + 43.6401905 + ], + [ + 3.9299697, + 43.6402363 + ], + [ + 3.9300051, + 43.6403052 + ], + [ + 3.9301424, + 43.6406184 + ], + [ + 3.9303754, + 43.6411162 + ], + [ + 3.930493, + 43.6413869 + ], + [ + 3.9306414, + 43.6417655 + ], + [ + 3.9308582, + 43.6423347 + ], + [ + 3.9309266, + 43.6425374 + ], + [ + 3.9309782, + 43.6427295 + ], + [ + 3.9310185, + 43.6429501 + ], + [ + 3.9310375, + 43.6431479 + ], + [ + 3.931042, + 43.6433595 + ], + [ + 3.9310252, + 43.6435574 + ], + [ + 3.9309972, + 43.6437447 + ], + [ + 3.9309591, + 43.6439118 + ], + [ + 3.9308997, + 43.6441153 + ], + [ + 3.9308022, + 43.644365 + ], + [ + 3.9306322, + 43.6447654 + ], + [ + 3.9305171, + 43.6450345 + ], + [ + 3.9304297, + 43.6452186 + ], + [ + 3.93009, + 43.645859 ] ] } @@ -8891,7 +8923,7 @@ "properties": { "begin": "1325390513", "end": "1503629547", - "length": 78.0460756276657 + "length": 78.04945560311866 }, "geometry": { "type": "LineString", @@ -8908,6 +8940,10 @@ 3.8187907, 43.6175869 ], + [ + 3.8189138, + 43.6174354 + ], [ 3.8190229, 43.6172925 @@ -9071,263 +9107,6 @@ } } }, - "1357946483": { - "1540210632": { - "type": "Feature", - "properties": { - "begin": "1357946483", - "end": "1540210632", - "length": 605.3688197451162 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.8677845, - 43.5803799 - ], - [ - 3.8664635, - 43.5809487 - ], - [ - 3.866265, - 43.5810441 - ], - [ - 3.8661234, - 43.5811201 - ], - [ - 3.8657625, - 43.5813466 - ], - [ - 3.8656172, - 43.5814307 - ], - [ - 3.8654136, - 43.5815341 - ], - [ - 3.8644326, - 43.5819605 - ], - [ - 3.8638361, - 43.5822216 - ], - [ - 3.8636939, - 43.5822635 - ], - [ - 3.8636, - 43.5822769 - ], - [ - 3.8635131, - 43.5822839 - ], - [ - 3.8634377, - 43.5822862 - ], - [ - 3.8632514, - 43.582286 - ], - [ - 3.8631203, - 43.5822839 - ], - [ - 3.8630983, - 43.5822821 - ], - [ - 3.8628058, - 43.5822581 - ], - [ - 3.862712, - 43.5822337 - ], - [ - 3.8626057, - 43.5822013 - ], - [ - 3.862397, - 43.5821152 - ], - [ - 3.8622801, - 43.5820738 - ], - [ - 3.8620727, - 43.5820183 - ], - [ - 3.8619834, - 43.5820038 - ], - [ - 3.8619125, - 43.5820082 - ], - [ - 3.8618385, - 43.5820228 - ], - [ - 3.8617831, - 43.5820484 - ], - [ - 3.861723, - 43.5820864 - ], - [ - 3.8616706, - 43.5821455 - ], - [ - 3.8614084, - 43.5824341 - ] - ] - } - }, - "1540229848": { - "type": "Feature", - "properties": { - "begin": "1357946483", - "end": "1540229848", - "length": 291.2612386632062 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.8677845, - 43.5803799 - ], - [ - 3.8683119, - 43.580149 - ], - [ - 3.8685708, - 43.5800382 - ], - [ - 3.8686499, - 43.5800168 - ], - [ - 3.8687143, - 43.5800057 - ], - [ - 3.8688039, - 43.5799914 - ], - [ - 3.8689245, - 43.579974 - ], - [ - 3.8690945, - 43.579947 - ], - [ - 3.8691971, - 43.5799262 - ], - [ - 3.8692519, - 43.5799078 - ], - [ - 3.8693028, - 43.5798867 - ], - [ - 3.8698981, - 43.5796581 - ], - [ - 3.8702426, - 43.5795263 - ], - [ - 3.8704342, - 43.57944 - ], - [ - 3.8706159, - 43.5793479 - ], - [ - 3.870784, - 43.5792751 - ], - [ - 3.8706355, - 43.5793998 - ] - ] - } - }, - "1540229987": { - "type": "Feature", - "properties": { - "begin": "1357946483", - "end": "1540229987", - "length": 101.49478640134987 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.8677845, - 43.5803799 - ], - [ - 3.867923, - 43.5803365 - ], - [ - 3.8680947, - 43.5802792 - ], - [ - 3.8685522, - 43.5800824 - ], - [ - 3.8686346, - 43.580057 - ], - [ - 3.8687529, - 43.5800332 - ], - [ - 3.8689198, - 43.5800145 - ], - [ - 3.8689265, - 43.5800138 - ] - ] - } - } - }, "1433104540": { "1504387689": { "type": "Feature", @@ -9573,126 +9352,6 @@ } } }, - "1503509355": { - "1503509414": { - "type": "Feature", - "properties": { - "begin": "1503509355", - "end": "1503509414", - "length": 165.8445096875907 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.9230109, - 43.5767787 - ], - [ - 3.9229185, - 43.5766135 - ], - [ - 3.9228751, - 43.5765114 - ], - [ - 3.9228547, - 43.5764435 - ], - [ - 3.9228406, - 43.5763531 - ], - [ - 3.9227706, - 43.5753084 - ] - ] - } - }, - "1503509431": { - "type": "Feature", - "properties": { - "begin": "1503509355", - "end": "1503509431", - "length": 605.7466750384144 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.9230109, - 43.5767787 - ], - [ - 3.9230856, - 43.5769282 - ], - [ - 3.9233287, - 43.5773927 - ], - [ - 3.9238678, - 43.5784031 - ], - [ - 3.9241561, - 43.5789372 - ], - [ - 3.9242254, - 43.5790292 - ], - [ - 3.9243094, - 43.5791212 - ], - [ - 3.9252896, - 43.580013 - ], - [ - 3.9254858, - 43.5801848 - ], - [ - 3.9256212, - 43.5802853 - ], - [ - 3.925707, - 43.5803397 - ], - [ - 3.9259002, - 43.5804329 - ], - [ - 3.9265171, - 43.5806836 - ], - [ - 3.9266324, - 43.5807438 - ], - [ - 3.9267179, - 43.580796 - ], - [ - 3.926805, - 43.5808622 - ], - [ - 3.927134, - 43.5811557 - ] - ] - } - } - }, "1503509359": { "1503509409": { "type": "Feature", @@ -9871,12 +9530,12 @@ } }, "1503509365": { - "1503509414": { + "1503509431": { "type": "Feature", "properties": { "begin": "1503509365", - "end": "1503509414", - "length": 821.0861959918013 + "end": "1503509431", + "length": 1591.9335637708791 }, "geometry": { "type": "LineString", @@ -9972,6 +9631,102 @@ [ 3.9227706, 43.5753084 + ], + [ + 3.9227937, + 43.5754248 + ], + [ + 3.922822, + 43.5755295 + ], + [ + 3.9228272, + 43.575574 + ], + [ + 3.9228755, + 43.5762812 + ], + [ + 3.9228904, + 43.5763827 + ], + [ + 3.9229129, + 43.5764668 + ], + [ + 3.9229733, + 43.5766802 + ], + [ + 3.9230109, + 43.5767787 + ], + [ + 3.9230856, + 43.5769282 + ], + [ + 3.9233287, + 43.5773927 + ], + [ + 3.9238678, + 43.5784031 + ], + [ + 3.9241561, + 43.5789372 + ], + [ + 3.9242254, + 43.5790292 + ], + [ + 3.9243094, + 43.5791212 + ], + [ + 3.9252896, + 43.580013 + ], + [ + 3.9254858, + 43.5801848 + ], + [ + 3.9256212, + 43.5802853 + ], + [ + 3.925707, + 43.5803397 + ], + [ + 3.9259002, + 43.5804329 + ], + [ + 3.9265171, + 43.5806836 + ], + [ + 3.9266324, + 43.5807438 + ], + [ + 3.9267179, + 43.580796 + ], + [ + 3.926805, + 43.5808622 + ], + [ + 3.927134, + 43.5811557 ] ] } @@ -10138,66 +9893,128 @@ } } }, - "1503509414": { - "1503509355": { + "1503509427": { + "1508371563": { "type": "Feature", "properties": { - "begin": "1503509414", - "end": "1503509355", - "length": 165.10069274066348 + "begin": "1503509427", + "end": "1508371563", + "length": 136.73547905169602 }, "geometry": { "type": "LineString", "coordinates": [ [ - 3.9227706, - 43.5753084 + 3.9270241, + 43.5820507 ], [ - 3.9227937, - 43.5754248 + 3.9266273, + 43.5822434 ], [ - 3.922822, - 43.5755295 + 3.9256144, + 43.5827358 + ] + ] + } + } + }, + "1503509431": { + "1503509365": { + "type": "Feature", + "properties": { + "begin": "1503509431", + "end": "1503509365", + "length": 1592.677380717806 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 3.927134, + 43.5811557 ], [ - 3.9228272, - 43.575574 + 3.926805, + 43.5808622 ], [ - 3.9228755, - 43.5762812 + 3.9267179, + 43.580796 ], [ - 3.9228904, - 43.5763827 + 3.9266324, + 43.5807438 ], [ - 3.9229129, - 43.5764668 + 3.9265171, + 43.5806836 ], [ - 3.9229733, - 43.5766802 + 3.9259002, + 43.5804329 + ], + [ + 3.925707, + 43.5803397 + ], + [ + 3.9256212, + 43.5802853 + ], + [ + 3.9254858, + 43.5801848 + ], + [ + 3.9252896, + 43.580013 + ], + [ + 3.9243094, + 43.5791212 + ], + [ + 3.9242254, + 43.5790292 + ], + [ + 3.9241561, + 43.5789372 + ], + [ + 3.9238678, + 43.5784031 + ], + [ + 3.9233287, + 43.5773927 + ], + [ + 3.9230856, + 43.5769282 ], [ 3.9230109, 43.5767787 - ] - ] - } - }, - "1503509365": { - "type": "Feature", - "properties": { - "begin": "1503509414", - "end": "1503509365", - "length": 821.0861959918012 - }, - "geometry": { - "type": "LineString", - "coordinates": [ + ], + [ + 3.9229185, + 43.5766135 + ], + [ + 3.9228751, + 43.5765114 + ], + [ + 3.9228547, + 43.5764435 + ], + [ + 3.9228406, + 43.5763531 + ], [ 3.9227706, 43.5753084 @@ -10292,123 +10109,13 @@ ] ] } - } - }, - "1503509427": { - "1508371563": { - "type": "Feature", - "properties": { - "begin": "1503509427", - "end": "1508371563", - "length": 136.73547905169602 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.9270241, - 43.5820507 - ], - [ - 3.9266273, - 43.5822434 - ], - [ - 3.9256144, - 43.5827358 - ] - ] - } - } - }, - "1503509431": { - "1503509355": { - "type": "Feature", - "properties": { - "begin": "1503509431", - "end": "1503509355", - "length": 605.7466750384143 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.927134, - 43.5811557 - ], - [ - 3.926805, - 43.5808622 - ], - [ - 3.9267179, - 43.580796 - ], - [ - 3.9266324, - 43.5807438 - ], - [ - 3.9265171, - 43.5806836 - ], - [ - 3.9259002, - 43.5804329 - ], - [ - 3.925707, - 43.5803397 - ], - [ - 3.9256212, - 43.5802853 - ], - [ - 3.9254858, - 43.5801848 - ], - [ - 3.9252896, - 43.580013 - ], - [ - 3.9243094, - 43.5791212 - ], - [ - 3.9242254, - 43.5790292 - ], - [ - 3.9241561, - 43.5789372 - ], - [ - 3.9238678, - 43.5784031 - ], - [ - 3.9233287, - 43.5773927 - ], - [ - 3.9230856, - 43.5769282 - ], - [ - 3.9230109, - 43.5767787 - ] - ] - } }, "1503509427": { "type": "Feature", "properties": { "begin": "1503509431", "end": "1503509427", - "length": 108.09115817199468 + "length": 108.26737967050285 }, "geometry": { "type": "LineString", @@ -10437,6 +10144,10 @@ 3.9271985, 43.5818483 ], + [ + 3.9271562, + 43.5819422 + ], [ 3.9271058, 43.5819955 @@ -11910,7 +11621,7 @@ "properties": { "begin": "1505206368", "end": "3119065617", - "length": 290.11929639137065 + "length": 290.1537608679097 }, "geometry": { "type": "LineString", @@ -11959,6 +11670,10 @@ 3.9009482, 43.6019964 ], + [ + 3.9009124, + 43.6020039 + ], [ 3.9008697, 43.6020062 @@ -12014,7 +11729,7 @@ "properties": { "begin": "1505206380", "end": "317827455", - "length": 308.6013085987301 + "length": 308.6069233191395 }, "geometry": { "type": "LineString", @@ -12023,6 +11738,10 @@ 3.9004904, 43.6018738 ], + [ + 3.9009124, + 43.6020039 + ], [ 3.9009401, 43.6020108 @@ -13163,175 +12882,29 @@ } } }, - "1540210632": { - "1357946483": { + "1540210702": { + "231578487": { "type": "Feature", "properties": { - "begin": "1540210632", - "end": "1357946483", - "length": 605.3688197451163 + "begin": "1540210702", + "end": "231578487", + "length": 1206.914022190135 }, "geometry": { "type": "LineString", "coordinates": [ [ - 3.8614084, - 43.5824341 - ], - [ - 3.8616706, - 43.5821455 - ], - [ - 3.861723, - 43.5820864 - ], - [ - 3.8617831, - 43.5820484 - ], - [ - 3.8618385, - 43.5820228 - ], - [ - 3.8619125, - 43.5820082 - ], - [ - 3.8619834, - 43.5820038 - ], - [ - 3.8620727, - 43.5820183 - ], - [ - 3.8622801, - 43.5820738 - ], - [ - 3.862397, - 43.5821152 - ], - [ - 3.8626057, - 43.5822013 - ], - [ - 3.862712, - 43.5822337 - ], - [ - 3.8628058, - 43.5822581 - ], - [ - 3.8630983, - 43.5822821 - ], - [ - 3.8631203, - 43.5822839 - ], - [ - 3.8632514, - 43.582286 - ], - [ - 3.8634377, - 43.5822862 - ], - [ - 3.8635131, - 43.5822839 - ], - [ - 3.8636, - 43.5822769 - ], - [ - 3.8636939, - 43.5822635 - ], - [ - 3.8638361, - 43.5822216 - ], - [ - 3.8644326, - 43.5819605 - ], - [ - 3.8654136, - 43.5815341 - ], - [ - 3.8656172, - 43.5814307 - ], - [ - 3.8657625, - 43.5813466 - ], - [ - 3.8661234, - 43.5811201 - ], - [ - 3.866265, - 43.5810441 - ], - [ - 3.8664635, - 43.5809487 - ], - [ - 3.8677845, - 43.5803799 - ] - ] - } - }, - "1540210702": { - "type": "Feature", - "properties": { - "begin": "1540210632", - "end": "1540210702", - "length": 82.36349797361592 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.8614084, - 43.5824341 - ], - [ - 3.8613369, - 43.5825132 + 3.8608487, + 43.583054 ], [ 3.8612516, 43.5826075 ], [ - 3.8608487, - 43.583054 - ] - ] - } - }, - "3124581442": { - "type": "Feature", - "properties": { - "begin": "1540210632", - "end": "3124581442", - "length": 247.9657900232562 - }, - "geometry": { - "type": "LineString", - "coordinates": [ + 3.8613369, + 43.5825132 + ], [ 3.8614084, 43.5824341 @@ -13395,37 +12968,62 @@ [ 3.859643, 43.580995 - ] - ] - } - } - }, - "1540210702": { - "1540210632": { - "type": "Feature", - "properties": { - "begin": "1540210702", - "end": "1540210632", - "length": 82.36349797361592 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.8608487, - 43.583054 ], [ - 3.8612516, - 43.5826075 + 3.8590845, + 43.5807723 ], [ - 3.8613369, - 43.5825132 + 3.8588133, + 43.580643 ], [ - 3.8614084, - 43.5824341 + 3.8580896, + 43.5802477 + ], + [ + 3.8578526, + 43.5801201 + ], + [ + 3.8573838, + 43.5798718 + ], + [ + 3.857039, + 43.5796826 + ], + [ + 3.8566134, + 43.5793972 + ], + [ + 3.856278, + 43.5791408 + ], + [ + 3.8540252, + 43.5777494 + ], + [ + 3.8533194, + 43.5773128 + ], + [ + 3.8531673, + 43.5772211 + ], + [ + 3.8525127, + 43.5768152 + ], + [ + 3.8523404, + 43.5767074 + ], + [ + 3.851232, + 43.5760171 ] ] } @@ -13668,242 +13266,6 @@ } } }, - "1540229848": { - "1357946483": { - "type": "Feature", - "properties": { - "begin": "1540229848", - "end": "1357946483", - "length": 291.2612386632062 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.8706355, - 43.5793998 - ], - [ - 3.870784, - 43.5792751 - ], - [ - 3.8706159, - 43.5793479 - ], - [ - 3.8704342, - 43.57944 - ], - [ - 3.8702426, - 43.5795263 - ], - [ - 3.8698981, - 43.5796581 - ], - [ - 3.8693028, - 43.5798867 - ], - [ - 3.8692519, - 43.5799078 - ], - [ - 3.8691971, - 43.5799262 - ], - [ - 3.8690945, - 43.579947 - ], - [ - 3.8689245, - 43.579974 - ], - [ - 3.8688039, - 43.5799914 - ], - [ - 3.8687143, - 43.5800057 - ], - [ - 3.8686499, - 43.5800168 - ], - [ - 3.8685708, - 43.5800382 - ], - [ - 3.8683119, - 43.580149 - ], - [ - 3.8677845, - 43.5803799 - ] - ] - } - }, - "1540229987": { - "type": "Feature", - "properties": { - "begin": "1540229848", - "end": "1540229987", - "length": 155.01925971762748 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.8706355, - 43.5793998 - ], - [ - 3.8705184, - 43.5794706 - ], - [ - 3.8704148, - 43.5795146 - ], - [ - 3.8700715, - 43.5796516 - ], - [ - 3.8693317, - 43.579937 - ], - [ - 3.869254, - 43.579965 - ], - [ - 3.8691961, - 43.5799784 - ], - [ - 3.8691762, - 43.579983 - ], - [ - 3.8690961, - 43.579993 - ], - [ - 3.8689265, - 43.5800138 - ] - ] - } - } - }, - "1540229987": { - "1357946483": { - "type": "Feature", - "properties": { - "begin": "1540229987", - "end": "1357946483", - "length": 101.49478640134987 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.8689265, - 43.5800138 - ], - [ - 3.8689198, - 43.5800145 - ], - [ - 3.8687529, - 43.5800332 - ], - [ - 3.8686346, - 43.580057 - ], - [ - 3.8685522, - 43.5800824 - ], - [ - 3.8680947, - 43.5802792 - ], - [ - 3.867923, - 43.5803365 - ], - [ - 3.8677845, - 43.5803799 - ] - ] - } - }, - "1540229848": { - "type": "Feature", - "properties": { - "begin": "1540229987", - "end": "1540229848", - "length": 155.01925971762748 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.8689265, - 43.5800138 - ], - [ - 3.8690961, - 43.579993 - ], - [ - 3.8691762, - 43.579983 - ], - [ - 3.8691961, - 43.5799784 - ], - [ - 3.869254, - 43.579965 - ], - [ - 3.8693317, - 43.579937 - ], - [ - 3.8700715, - 43.5796516 - ], - [ - 3.8704148, - 43.5795146 - ], - [ - 3.8705184, - 43.5794706 - ], - [ - 3.8706355, - 43.5793998 - ] - ] - } - } - }, "1540234595": { "1540234613": { "type": "Feature", @@ -16253,7 +15615,7 @@ "properties": { "begin": "1547396417", "end": "1623916618", - "length": 686.7055080371025 + "length": 686.7070694109742 }, "geometry": { "type": "LineString", @@ -16262,6 +15624,10 @@ 3.8760606, 43.597175 ], + [ + 3.8761441, + 43.597015 + ], [ 3.8761736, 43.596954 @@ -16843,12 +16209,12 @@ ] } }, - "979209099": { + "979210260": { "type": "Feature", "properties": { "begin": "1547411695", - "end": "979209099", - "length": 709.0261070189141 + "end": "979210260", + "length": 1131.7525722997384 }, "geometry": { "type": "LineString", @@ -16964,67 +16330,39 @@ [ 3.9293232, 43.6400166 - ] - ] - } - } - }, - "1547417303": { - "979209099": { - "type": "Feature", - "properties": { - "begin": "1547417303", - "end": "979209099", - "length": 152.06073350259481 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.9274929, - 43.6396839 ], [ - 3.9277665, - 43.6397178 + 3.9291538, + 43.6400022 ], [ - 3.9278735, - 43.6397373 + 3.929055, + 43.6399995 ], [ - 3.9283394, - 43.639848 + 3.9289592, + 43.6399909 ], [ - 3.9285421, - 43.6398902 + 3.9285324, + 43.6399209 ], [ - 3.9288362, - 43.6399392 + 3.9283329, + 43.6398801 ], [ - 3.9291143, - 43.6399816 + 3.9279589, + 43.6397941 ], [ - 3.9293232, - 43.6400166 - ] - ] - } - }, - "979210260": { - "type": "Feature", - "properties": { - "begin": "1547417303", - "end": "979210260", - "length": 270.34801639124464 - }, - "geometry": { - "type": "LineString", - "coordinates": [ + 3.9276776, + 43.639727 + ], + [ + 3.9275707, + 43.6397023 + ], [ 3.9274929, 43.6396839 @@ -17990,7 +17328,7 @@ "properties": { "begin": "1616132598", "end": "3123033214", - "length": 56.71514953905118 + "length": 56.753404803655194 }, "geometry": { "type": "LineString", @@ -18023,10 +17361,18 @@ 3.8745254, 43.6073442 ], + [ + 3.8744605, + 43.6073528 + ], [ 3.8744119, 43.6073528 ], + [ + 3.8743677, + 43.6073459 + ], [ 3.874342, 43.607341 @@ -18059,7 +17405,7 @@ "properties": { "begin": "1616132598", "end": "4345616053", - "length": 149.85297853028456 + "length": 149.8565999637526 }, "geometry": { "type": "LineString", @@ -18072,6 +17418,10 @@ 3.8745307, 43.6073209 ], + [ + 3.8744605, + 43.6073528 + ], [ 3.8743725, 43.6073968 @@ -21412,7 +20762,7 @@ "properties": { "begin": "2305432923", "end": "2575586461", - "length": 33.14467256459247 + "length": 33.14586177097243 }, "geometry": { "type": "LineString", @@ -21425,6 +20775,10 @@ 3.8803182, 43.6048189 ], + [ + 3.8802052, + 43.6047359 + ], [ 3.8800759, 43.6046444 @@ -21439,7 +20793,7 @@ "properties": { "begin": "2305432939", "end": "2305432923", - "length": 33.108396205183645 + "length": 33.108429422056275 }, "geometry": { "type": "LineString", @@ -21448,6 +20802,10 @@ 3.8806647, 43.6050605 ], + [ + 3.8805419, + 43.6049722 + ], [ 3.8804838, 43.6049301 @@ -21464,7 +20822,7 @@ "properties": { "begin": "2305432939", "end": "2575586472", - "length": 43.962260682159766 + "length": 43.97167492494534 }, "geometry": { "type": "LineString", @@ -21485,6 +20843,10 @@ 3.8805231, 43.6050134 ], + [ + 3.8804911, + 43.6050084 + ], [ 3.8804877, 43.605008 @@ -21493,6 +20855,10 @@ 3.8804464, 43.6050027 ], + [ + 3.8804365, + 43.6050015 + ], [ 3.8804103, 43.6050017 @@ -21527,7 +20893,7 @@ "properties": { "begin": "2305432951", "end": "2305432939", - "length": 23.841015623561756 + "length": 23.841016477600988 }, "geometry": { "type": "LineString", @@ -21536,6 +20902,10 @@ 3.880876, 43.6052107 ], + [ + 3.8807621, + 43.6051298 + ], [ 3.8807195, 43.6050995 @@ -21708,7 +21078,7 @@ "properties": { "begin": "2564254133", "end": "2564254141", - "length": 70.84341363556706 + "length": 70.84455648580521 }, "geometry": { "type": "LineString", @@ -21717,6 +21087,10 @@ 3.8195965, 43.6165756 ], + [ + 3.8195488, + 43.6167593 + ], [ 3.8195226, 43.616851 @@ -21789,7 +21163,7 @@ "properties": { "begin": "2564254134", "end": "2564254158", - "length": 35.82005819405158 + "length": 35.82032725373908 }, "geometry": { "type": "LineString", @@ -21802,6 +21176,10 @@ 3.8194893, 43.616824 ], + [ + 3.8195488, + 43.6167593 + ], [ 3.8196529, 43.6166485 @@ -22107,7 +21485,7 @@ "properties": { "begin": "2564254196", "end": "2564254179", - "length": 62.30603249981665 + "length": 62.398177385605834 }, "geometry": { "type": "LineString", @@ -22124,6 +21502,10 @@ 3.8189889, 43.6174049 ], + [ + 3.8189138, + 43.6174354 + ], [ 3.8188447, 43.6174492 @@ -22152,7 +21534,7 @@ "properties": { "begin": "2564254196", "end": "2564254206", - "length": 57.86702500554329 + "length": 57.87886103223278 }, "geometry": { "type": "LineString", @@ -22173,6 +21555,10 @@ 3.8188842, 43.6176336 ], + [ + 3.8188775, + 43.6176476 + ], [ 3.8188313, 43.6177143 @@ -22838,7 +22224,7 @@ "properties": { "begin": "2565144146", "end": "2565144090", - "length": 47.323863546843256 + "length": 47.4074929760105 }, "geometry": { "type": "LineString", @@ -22855,6 +22241,10 @@ 3.8959009, 43.600054 ], + [ + 3.8959215, + 43.6000943 + ], [ 3.8959367, 43.6001383 @@ -22863,6 +22253,10 @@ 3.8959365, 43.6001839 ], + [ + 3.8959281, + 43.6002271 + ], [ 3.895902, 43.6002761 @@ -22885,7 +22279,7 @@ "properties": { "begin": "2565144156", "end": "1445507886", - "length": 49.53290475019497 + "length": 49.55349390479748 }, "geometry": { "type": "LineString", @@ -22898,6 +22292,10 @@ 3.8962385, 43.600269 ], + [ + 3.8960947, + 43.6001962 + ], [ 3.8959215, 43.6000943 @@ -23686,7 +23084,7 @@ "properties": { "begin": "2575586346", "end": "2575586472", - "length": 55.76344968649716 + "length": 55.792937484412064 }, "geometry": { "type": "LineString", @@ -23695,6 +23093,10 @@ 3.8801175, 43.6046259 ], + [ + 3.8802052, + 43.6047359 + ], [ 3.8802598, 43.6048112 @@ -23719,6 +23121,10 @@ 3.8802557, 43.6049733 ], + [ + 3.8802392, + 43.6050025 + ], [ 3.8802174, 43.6050277 @@ -23888,7 +23294,7 @@ "properties": { "begin": "2575586437", "end": "2305432975", - "length": 126.39419593353531 + "length": 126.42737373525736 }, "geometry": { "type": "LineString", @@ -23913,6 +23319,10 @@ 3.8821781, 43.6056762 ], + [ + 3.8821352, + 43.6057137 + ], [ 3.8821075, 43.6057303 @@ -23997,7 +23407,7 @@ "properties": { "begin": "2575586441", "end": "2575586542", - "length": 68.8491186741644 + "length": 68.87747871770013 }, "geometry": { "type": "LineString", @@ -24010,6 +23420,10 @@ 3.8949762, 43.603819 ], + [ + 3.8949443, + 43.603884 + ], [ 3.894928, 43.6039078 @@ -24042,6 +23456,10 @@ 3.8946518, 43.6040632 ], + [ + 3.8945734, + 43.6040663 + ], [ 3.8945054, 43.6040643 @@ -24107,7 +23525,7 @@ "properties": { "begin": "2575586466", "end": "60722751", - "length": 68.2058930844827 + "length": 68.21260420366407 }, "geometry": { "type": "LineString", @@ -24116,6 +23534,10 @@ 3.8947428, 43.6047895 ], + [ + 3.8947993, + 43.6046256 + ], [ 3.8948111, 43.6045804 @@ -24238,7 +23660,7 @@ "properties": { "begin": "2575586478", "end": "1119886398", - "length": 50.82157314212101 + "length": 50.831909243952566 }, "geometry": { "type": "LineString", @@ -24251,6 +23673,10 @@ 3.8802096, 43.6050129 ], + [ + 3.8802392, + 43.6050025 + ], [ 3.8802751, 43.6049887 @@ -24263,10 +23689,18 @@ 3.8803927, 43.6049617 ], + [ + 3.8804333, + 43.6049598 + ], [ 3.8804593, 43.6049606 ], + [ + 3.8804914, + 43.6049643 + ], [ 3.8805164, 43.6049678 @@ -24275,6 +23709,10 @@ 3.880538, 43.6049712 ], + [ + 3.8805419, + 43.6049722 + ], [ 3.8805787, 43.6049788 @@ -24486,12 +23924,12 @@ } }, "2575611364": { - "4592566663": { + "947038576": { "type": "Feature", "properties": { "begin": "2575611364", - "end": "4592566663", - "length": 31.211886732820602 + "end": "947038576", + "length": 82.23025629078522 }, "geometry": { "type": "LineString", @@ -24511,6 +23949,34 @@ [ 3.9204883, 43.603569 + ], + [ + 3.9205372, + 43.6034611 + ], + [ + 3.9205336, + 43.6034936 + ], + [ + 3.9205349, + 43.6035354 + ], + [ + 3.9205301, + 43.6035773 + ], + [ + 3.9205042, + 43.6036368 + ], + [ + 3.920478, + 43.6036946 + ], + [ + 3.9204329, + 43.603795 ] ] } @@ -25264,7 +24730,7 @@ "properties": { "begin": "2597102271", "end": "3119066088", - "length": 257.22457941204794 + "length": 257.26692940749444 }, "geometry": { "type": "LineString", @@ -25277,6 +24743,10 @@ 3.8940585, 43.6084942 ], + [ + 3.894036, + 43.6085377 + ], [ 3.8939947, 43.6085888 @@ -25321,6 +24791,52 @@ } } }, + "2996811306": { + "2996811307": { + "type": "Feature", + "properties": { + "begin": "2996811306", + "end": "2996811307", + "length": 54.01056022638459 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 3.9296237, + 43.6465008 + ], + [ + 3.9293171, + 43.6469329 + ] + ] + } + } + }, + "2996811307": { + "2996811306": { + "type": "Feature", + "properties": { + "begin": "2996811307", + "end": "2996811306", + "length": 54.01056022638459 + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 3.9293171, + 43.6469329 + ], + [ + 3.9296237, + 43.6465008 + ] + ] + } + } + }, "2998606177": { "3471270551": { "type": "Feature", @@ -26370,7 +25886,7 @@ "properties": { "begin": "3118402841", "end": "3118402842", - "length": 45.82072010565318 + "length": 45.92459584483118 }, "geometry": { "type": "LineString", @@ -26387,10 +25903,18 @@ 3.8826939, 43.6144472 ], + [ + 3.8826316, + 43.6144602 + ], [ 3.8825859, 43.6144632 ], + [ + 3.8825078, + 43.6144592 + ], [ 3.8823868, 43.6144365 @@ -26411,7 +25935,7 @@ "properties": { "begin": "3118402841", "end": "3118402857", - "length": 23.56710816238991 + "length": 23.59480111285199 }, "geometry": { "type": "LineString", @@ -26428,6 +25952,10 @@ 3.8826908, 43.6144929 ], + [ + 3.8826525, + 43.6145101 + ], [ 3.8825891, 43.6145293 @@ -26475,7 +26003,7 @@ "properties": { "begin": "3118402842", "end": "3118402841", - "length": 45.82072010565318 + "length": 45.92459584483119 }, "geometry": { "type": "LineString", @@ -26492,10 +26020,18 @@ 3.8823868, 43.6144365 ], + [ + 3.8825078, + 43.6144592 + ], [ 3.8825859, 43.6144632 ], + [ + 3.8826316, + 43.6144602 + ], [ 3.8826939, 43.6144472 @@ -26543,7 +26079,7 @@ "properties": { "begin": "3118402852", "end": "70969011", - "length": 28.180727447701052 + "length": 28.194106232632333 }, "geometry": { "type": "LineString", @@ -26552,6 +26088,10 @@ 3.8825891, 43.6144866 ], + [ + 3.8826525, + 43.6145101 + ], [ 3.8828135, 43.6145821 @@ -26570,7 +26110,7 @@ "properties": { "begin": "3118402854", "end": "70969011", - "length": 41.963139528194155 + "length": 41.96314148986902 }, "geometry": { "type": "LineString", @@ -26579,6 +26119,10 @@ 3.8823935, 43.6145048 ], + [ + 3.8825448, + 43.6145371 + ], [ 3.8826765, 43.6145653 @@ -26595,7 +26139,7 @@ "properties": { "begin": "3118402854", "end": "3118402852", - "length": 15.999683658517355 + "length": 16.084043650014635 }, "geometry": { "type": "LineString", @@ -26608,6 +26152,10 @@ 3.8824646, 43.6145068 ], + [ + 3.8825248, + 43.6145031 + ], [ 3.8825891, 43.6144866 @@ -26622,7 +26170,7 @@ "properties": { "begin": "3118402857", "end": "1445506087", - "length": 15.321451262878663 + "length": 15.326247659035573 }, "geometry": { "type": "LineString", @@ -26631,6 +26179,10 @@ 3.8825891, 43.6145293 ], + [ + 3.8825448, + 43.6145371 + ], [ 3.8824745, 43.614546 @@ -26647,7 +26199,7 @@ "properties": { "begin": "3118402857", "end": "3118402842", - "length": 28.944990972276273 + "length": 28.947482385914583 }, "geometry": { "type": "LineString", @@ -26656,6 +26208,10 @@ 3.8825891, 43.6145293 ], + [ + 3.8825248, + 43.6145031 + ], [ 3.8823415, 43.6144342 @@ -26695,7 +26251,7 @@ "properties": { "begin": "3118402866", "end": "3118402857", - "length": 25.35253147841704 + "length": 25.353150982432663 }, "geometry": { "type": "LineString", @@ -26708,6 +26264,10 @@ 3.8827993, 43.6146178 ], + [ + 3.8826765, + 43.6145653 + ], [ 3.8825891, 43.6145293 @@ -26814,7 +26374,7 @@ "properties": { "begin": "3118402879", "end": "4205213580", - "length": 86.75133416225816 + "length": 86.87394376674503 }, "geometry": { "type": "LineString", @@ -26823,6 +26383,10 @@ 3.8749606, 43.6153018 ], + [ + 3.8746809, + 43.6153602 + ], [ 3.8744987, 43.6153995 @@ -26843,6 +26407,10 @@ 3.8741639, 43.6154316 ], + [ + 3.8740933, + 43.6154053 + ], [ 3.8740305, 43.6153632 @@ -26912,7 +26480,7 @@ "properties": { "begin": "3118402894", "end": "3118402878", - "length": 100.71936270832319 + "length": 100.72083773190646 }, "geometry": { "type": "LineString", @@ -26921,6 +26489,10 @@ 3.8745401, 43.6160159 ], + [ + 3.8744955, + 43.6158326 + ], [ 3.8744912, 43.6158102 @@ -30047,7 +29619,7 @@ "properties": { "begin": "3123039780", "end": "2564254134", - "length": 167.57185584257186 + "length": 167.59125023231488 }, "geometry": { "type": "LineString", @@ -30060,6 +29632,10 @@ 3.8183694, 43.6181067 ], + [ + 3.8188775, + 43.6176476 + ], [ 3.8188956, 43.6176353 @@ -31549,134 +31125,6 @@ } } }, - "3124581442": { - "291356213": { - "type": "Feature", - "properties": { - "begin": "3124581442", - "end": "291356213", - "length": 341.91537266980157 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.859643, - 43.580995 - ], - [ - 3.8590845, - 43.5807723 - ], - [ - 3.8588133, - 43.580643 - ], - [ - 3.8580896, - 43.5802477 - ], - [ - 3.8578526, - 43.5801201 - ], - [ - 3.8573838, - 43.5798718 - ], - [ - 3.857039, - 43.5796826 - ], - [ - 3.8566134, - 43.5793972 - ], - [ - 3.856278, - 43.5791408 - ] - ] - } - }, - "1540210632": { - "type": "Feature", - "properties": { - "begin": "3124581442", - "end": "1540210632", - "length": 247.96579002325623 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.859643, - 43.580995 - ], - [ - 3.8605081, - 43.5813453 - ], - [ - 3.8608392, - 43.5814806 - ], - [ - 3.8609009, - 43.5815063 - ], - [ - 3.8609613, - 43.5815315 - ], - [ - 3.8611488, - 43.581614 - ], - [ - 3.8613212, - 43.581709 - ], - [ - 3.8614421, - 43.5817834 - ], - [ - 3.8615137, - 43.5818528 - ], - [ - 3.8615591, - 43.5819251 - ], - [ - 3.8615869, - 43.5820142 - ], - [ - 3.8615904, - 43.5820946 - ], - [ - 3.8615697, - 43.58217 - ], - [ - 3.8615219, - 43.582265 - ], - [ - 3.8614693, - 43.5823398 - ], - [ - 3.8614084, - 43.5824341 - ] - ] - } - } - }, "3124581458": { "1547396438": { "type": "Feature", @@ -32735,7 +32183,7 @@ "properties": { "begin": "3728561638", "end": "4278861077", - "length": 151.59095884532542 + "length": 151.65471482180178 }, "geometry": { "type": "LineString", @@ -32748,6 +32196,10 @@ 3.8743138, 43.6073797 ], + [ + 3.8743677, + 43.6073459 + ], [ 3.8748444, 43.6071317 @@ -33062,7 +32514,7 @@ "properties": { "begin": "4205213587", "end": "3118402893", - "length": 87.49259969131644 + "length": 87.59502372357352 }, "geometry": { "type": "LineString", @@ -33079,6 +32531,10 @@ 3.8740766, 43.6153759 ], + [ + 3.8740933, + 43.6154053 + ], [ 3.8742124, 43.6155273 @@ -33091,6 +32547,10 @@ 3.8744367, 43.6157636 ], + [ + 3.8744955, + 43.6158326 + ], [ 3.8745354, 43.6158948 @@ -34246,72 +33706,6 @@ ] } } - }, - "4592566659": { - "947038576": { - "type": "Feature", - "properties": { - "begin": "4592566659", - "end": "947038576", - "length": 25.44120342939932 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.9205301, - 43.6035773 - ], - [ - 3.9205042, - 43.6036368 - ], - [ - 3.920478, - 43.6036946 - ], - [ - 3.9204329, - 43.603795 - ] - ] - } - } - }, - "4592566663": { - "4592566659": { - "type": "Feature", - "properties": { - "begin": "4592566663", - "end": "4592566659", - "length": 25.310446338539617 - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [ - 3.9204883, - 43.603569 - ], - [ - 3.920512, - 43.6035422 - ], - [ - 3.9205504, - 43.6034996 - ], - [ - 3.9205763, - 43.6034714 - ], - [ - 3.9205301, - 43.6035773 - ] - ] - } - } } }, "lines": {