From b7abf8a40ebd1a1b0c5563949104e5adf679eb66 Mon Sep 17 00:00:00 2001 From: Alex de Mulder Date: Fri, 27 Feb 2015 18:52:37 +0100 Subject: [PATCH 1/2] added bridge demo mockup --- showcase/projects/bridge/css/vis.css | 808 + showcase/projects/bridge/data.json | 82713 +++++++++++++++++++++++ showcase/projects/bridge/demo.html | 68 + showcase/projects/bridge/js/vis.js | 35361 ++++++++++ showcase/projects/bridge/parseData.js | 53 + showcase/projects/bridge/timeline.json | 1 + 6 files changed, 119004 insertions(+) create mode 100644 showcase/projects/bridge/css/vis.css create mode 100644 showcase/projects/bridge/data.json create mode 100644 showcase/projects/bridge/demo.html create mode 100644 showcase/projects/bridge/js/vis.js create mode 100644 showcase/projects/bridge/parseData.js create mode 100644 showcase/projects/bridge/timeline.json diff --git a/showcase/projects/bridge/css/vis.css b/showcase/projects/bridge/css/vis.css new file mode 100644 index 00000000..19e61cad --- /dev/null +++ b/showcase/projects/bridge/css/vis.css @@ -0,0 +1,808 @@ +.vis .overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + + /* Must be displayed above for example selected Timeline items */ + z-index: 10; +} + +.vis-active { + box-shadow: 0 0 10px #86d5f8; +} + +/* override some bootstrap styles screwing up the timelines css */ + +.vis [class*="span"] { + min-height: 0; + width: auto; +} + +.vis.timeline { +} + + +.vis.timeline.root { + position: relative; + border: 1px solid #bfbfbf; + + overflow: hidden; + padding: 0; + margin: 0; + + box-sizing: border-box; +} + +.vis.timeline .vispanel { + position: absolute; + + padding: 0; + margin: 0; + + box-sizing: border-box; +} + +.vis.timeline .vispanel.center, +.vis.timeline .vispanel.left, +.vis.timeline .vispanel.right, +.vis.timeline .vispanel.top, +.vis.timeline .vispanel.bottom { + border: 1px #bfbfbf; +} + +.vis.timeline .vispanel.center, +.vis.timeline .vispanel.left, +.vis.timeline .vispanel.right { + border-top-style: solid; + border-bottom-style: solid; + overflow: hidden; +} + +.vis.timeline .vispanel.center, +.vis.timeline .vispanel.top, +.vis.timeline .vispanel.bottom { + border-left-style: solid; + border-right-style: solid; +} + +.vis.timeline .background { + overflow: hidden; +} + +.vis.timeline .vispanel > .content { + position: relative; +} + +.vis.timeline .vispanel .shadow { + position: absolute; + width: 100%; + height: 1px; + box-shadow: 0 0 10px rgba(0,0,0,0.8); + /* TODO: find a nice way to ensure shadows are drawn on top of items + z-index: 1; + */ +} + +.vis.timeline .vispanel .shadow.top { + top: -1px; + left: 0; +} + +.vis.timeline .vispanel .shadow.bottom { + bottom: -1px; + left: 0; +} + +.vis.timeline .labelset { + position: relative; + + overflow: hidden; + + box-sizing: border-box; +} + +.vis.timeline .labelset .vlabel { + position: relative; + left: 0; + top: 0; + width: 100%; + color: #4d4d4d; + + box-sizing: border-box; +} + +.vis.timeline .labelset .vlabel { + border-bottom: 1px solid #bfbfbf; +} + +.vis.timeline .labelset .vlabel:last-child { + border-bottom: none; +} + +.vis.timeline .labelset .vlabel .inner { + display: inline-block; + padding: 5px; +} + +.vis.timeline .labelset .vlabel .inner.hidden { + padding: 0; +} + + +.vis.timeline .itemset { + position: relative; + padding: 0; + margin: 0; + + box-sizing: border-box; +} + +.vis.timeline .itemset .background, +.vis.timeline .itemset .foreground { + position: absolute; + width: 100%; + height: 100%; + overflow: visible; +} + +.vis.timeline .axis { + position: absolute; + width: 100%; + height: 0; + left: 0; + z-index: 1; +} + +.vis.timeline .foreground .group { + position: relative; + box-sizing: border-box; + border-bottom: 1px solid #bfbfbf; +} + +.vis.timeline .foreground .group:last-child { + border-bottom: none; +} + + +.vis.timeline .item { + position: absolute; + color: #1A1A1A; + border-color: #97B0F8; + border-width: 1px; + background-color: #D5DDF6; + display: inline-block; + padding: 5px; +} + +.vis.timeline .item.selected { + border-color: #FFC200; + background-color: #FFF785; + + /* z-index must be higher than the z-index of custom time bar and current time bar */ + z-index: 2; +} + +.vis.timeline .editable .item.selected { + cursor: move; +} + +.vis.timeline .item.point.selected { + background-color: #FFF785; +} + +.vis.timeline .item.box { + text-align: center; + border-style: solid; + border-radius: 2px; +} + +.vis.timeline .item.point { + background: none; +} + +.vis.timeline .item.dot { + position: absolute; + padding: 0; + border-width: 4px; + border-style: solid; + border-radius: 4px; +} + +.vis.timeline .item.range { + border-style: solid; + border-radius: 2px; + box-sizing: border-box; +} + +.vis.timeline .item.background { + overflow: hidden; + border: none; + background-color: rgba(213, 221, 246, 0.4); + box-sizing: border-box; + padding: 0; + margin: 0; +} + +.vis.timeline .item.range .content { + position: relative; + display: inline-block; + max-width: 100%; + overflow: hidden; +} + +.vis.timeline .item.background .content { + position: absolute; + display: inline-block; + overflow: hidden; + max-width: 100%; + margin: 5px; +} + +.vis.timeline .item.line { + padding: 0; + position: absolute; + width: 0; + border-left-width: 1px; + border-left-style: solid; +} + +.vis.timeline .item .content { + white-space: nowrap; + overflow: hidden; +} + +.vis.timeline .item .delete { + background: url('img/timeline/delete.png') no-repeat top center; + position: absolute; + width: 24px; + height: 24px; + top: 0; + right: -24px; + cursor: pointer; +} + +.vis.timeline .item.range .drag-left { + position: absolute; + width: 24px; + height: 100%; + top: 0; + left: -4px; + + cursor: w-resize; +} + +.vis.timeline .item.range .drag-right { + position: absolute; + width: 24px; + height: 100%; + top: 0; + right: -4px; + + cursor: e-resize; +} + +.vis.timeline .timeaxis { + position: relative; + overflow: hidden; +} + +.vis.timeline .timeaxis.foreground { + top: 0; + left: 0; + width: 100%; +} + +.vis.timeline .timeaxis.background { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.vis.timeline .timeaxis .text { + position: absolute; + color: #4d4d4d; + padding: 3px; + white-space: nowrap; +} + +.vis.timeline .timeaxis .text.measure { + position: absolute; + padding-left: 0; + padding-right: 0; + margin-left: 0; + margin-right: 0; + visibility: hidden; +} + +.vis.timeline .timeaxis .grid.vertical { + position: absolute; + border-left: 1px solid; +} + +.vis.timeline .timeaxis .grid.minor { + border-color: #e5e5e5; +} + +.vis.timeline .timeaxis .grid.major { + border-color: #bfbfbf; +} + +.vis.timeline .currenttime { + background-color: #FF7F6E; + width: 2px; + z-index: 1; +} +.vis.timeline .customtime { + background-color: #6E94FF; + width: 2px; + cursor: move; + z-index: 1; +} +.vis.timeline.root { + /* + -webkit-transition: height .4s ease-in-out; + transition: height .4s ease-in-out; + */ +} + +.vis.timeline .vispanel { + /* + -webkit-transition: height .4s ease-in-out, top .4s ease-in-out; + transition: height .4s ease-in-out, top .4s ease-in-out; + */ +} + +.vis.timeline .axis { + /* + -webkit-transition: top .4s ease-in-out; + transition: top .4s ease-in-out; + */ +} + +/* TODO: get animation working nicely + +.vis.timeline .item { + -webkit-transition: top .4s ease-in-out; + transition: top .4s ease-in-out; +} + +.vis.timeline .item.line { + -webkit-transition: height .4s ease-in-out, top .4s ease-in-out; + transition: height .4s ease-in-out, top .4s ease-in-out; +} +/**/ + +.vis.timeline .vispanel.background.horizontal .grid.horizontal { + position: absolute; + width: 100%; + height: 0; + border-bottom: 1px solid; +} + +.vis.timeline .vispanel.background.horizontal .grid.minor { + border-color: #e5e5e5; +} + +.vis.timeline .vispanel.background.horizontal .grid.major { + border-color: #bfbfbf; +} + + +.vis.timeline .dataaxis .yAxis.major { + width: 100%; + position: absolute; + color: #4d4d4d; + white-space: nowrap; +} + +.vis.timeline .dataaxis .yAxis.major.measure{ + padding: 0px 0px 0px 0px; + margin: 0px 0px 0px 0px; + border: 0px; + visibility: hidden; + width: auto; +} + + +.vis.timeline .dataaxis .yAxis.minor{ + position: absolute; + width: 100%; + color: #bebebe; + white-space: nowrap; +} + +.vis.timeline .dataaxis .yAxis.minor.measure{ + padding: 0px 0px 0px 0px; + margin: 0px 0px 0px 0px; + border: 0px; + visibility: hidden; + width: auto; +} + +.vis.timeline .dataaxis .yAxis.title{ + position: absolute; + color: #4d4d4d; + white-space: nowrap; + bottom: 20px; + text-align: center; +} + +.vis.timeline .dataaxis .yAxis.title.measure{ + padding: 0px 0px 0px 0px; + margin: 0px 0px 0px 0px; + visibility: hidden; + width: auto; +} + +.vis.timeline .dataaxis .yAxis.title.left { + bottom: 0px; + -webkit-transform-origin: left top; + -moz-transform-origin: left top; + -ms-transform-origin: left top; + -o-transform-origin: left top; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} + +.vis.timeline .dataaxis .yAxis.title.right { + bottom: 0px; + -webkit-transform-origin: right bottom; + -moz-transform-origin: right bottom; + -ms-transform-origin: right bottom; + -o-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} + +.vis.timeline .legend { + background-color: rgba(247, 252, 255, 0.65); + padding: 5px; + border-color: #b3b3b3; + border-style:solid; + border-width: 1px; + box-shadow: 2px 2px 10px rgba(154, 154, 154, 0.55); +} + +.vis.timeline .legendText { + /*font-size: 10px;*/ + white-space: nowrap; + display: inline-block +} +.vis.timeline .graphGroup0 { + fill:#4f81bd; + fill-opacity:0; + stroke-width:2px; + stroke: #4f81bd; +} + +.vis.timeline .graphGroup1 { + fill:#f79646; + fill-opacity:0; + stroke-width:2px; + stroke: #f79646; +} + +.vis.timeline .graphGroup2 { + fill: #8c51cf; + fill-opacity:0; + stroke-width:2px; + stroke: #8c51cf; +} + +.vis.timeline .graphGroup3 { + fill: #75c841; + fill-opacity:0; + stroke-width:2px; + stroke: #75c841; +} + +.vis.timeline .graphGroup4 { + fill: #ff0100; + fill-opacity:0; + stroke-width:2px; + stroke: #ff0100; +} + +.vis.timeline .graphGroup5 { + fill: #37d8e6; + fill-opacity:0; + stroke-width:2px; + stroke: #37d8e6; +} + +.vis.timeline .graphGroup6 { + fill: #042662; + fill-opacity:0; + stroke-width:2px; + stroke: #042662; +} + +.vis.timeline .graphGroup7 { + fill:#00ff26; + fill-opacity:0; + stroke-width:2px; + stroke: #00ff26; +} + +.vis.timeline .graphGroup8 { + fill:#ff00ff; + fill-opacity:0; + stroke-width:2px; + stroke: #ff00ff; +} + +.vis.timeline .graphGroup9 { + fill: #8f3938; + fill-opacity:0; + stroke-width:2px; + stroke: #8f3938; +} + +.vis.timeline .fill { + fill-opacity:0.1; + stroke: none; +} + + +.vis.timeline .bar { + fill-opacity:0.5; + stroke-width:1px; +} + +.vis.timeline .point { + stroke-width:2px; + fill-opacity:1.0; +} + + +.vis.timeline .legendBackground { + stroke-width:1px; + fill-opacity:0.9; + fill: #ffffff; + stroke: #c2c2c2; +} + + +.vis.timeline .outline { + stroke-width:1px; + fill-opacity:1; + fill: #ffffff; + stroke: #e5e5e5; +} + +.vis.timeline .iconFill { + fill-opacity:0.3; + stroke: none; +} + + + +div.network-manipulationDiv { + border-width: 0; + border-bottom: 1px; + border-style:solid; + border-color: #d6d9d8; + background: #ffffff; /* Old browsers */ + background: -moz-linear-gradient(top, #ffffff 0%, #fcfcfc 48%, #fafafa 50%, #fcfcfc 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(48%,#fcfcfc), color-stop(50%,#fafafa), color-stop(100%,#fcfcfc)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* IE10+ */ + background: linear-gradient(to bottom, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fcfcfc',GradientType=0 ); /* IE6-9 */ + + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 30px; +} + +div.network-manipulation-editMode { + position:absolute; + left: 0; + top: 15px; + height: 30px; +} + +div.network-manipulation-closeDiv { + position:absolute; + right: 0; + top: 0; + width: 30px; + height: 30px; + + background-position: 20px 3px; + background-repeat: no-repeat; + background-image: url("img/network/cross.png"); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.network-manipulation-closeDiv:hover { + opacity: 0.6; +} + +div.network-manipulationUI { + position:relative; + top:-7px; + font-family: verdana; + font-size: 12px; + -moz-border-radius: 15px; + border-radius: 15px; + display:inline-block; + background-position: 0px 0px; + background-repeat:no-repeat; + height:24px; + margin: 0px 0px 0px 10px; + vertical-align:middle; + cursor: pointer; + padding: 0px 8px 0px 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.network-manipulationUI:hover { + box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.20); +} + +div.network-manipulationUI:active { + box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.50); +} + +div.network-manipulationUI.back { + background-image: url("img/network/backIcon.png"); +} + +div.network-manipulationUI.none:hover { + box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.0); + cursor: default; +} +div.network-manipulationUI.none:active { + box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.0); +} +div.network-manipulationUI.none { + padding: 0; +} +div.network-manipulationUI.notification{ + margin: 2px; + font-weight: bold; +} + +div.network-manipulationUI.add { + background-image: url("img/network/addNodeIcon.png"); +} + +div.network-manipulationUI.edit { + background-image: url("img/network/editIcon.png"); +} + +div.network-manipulationUI.edit.editmode { + background-color: #fcfcfc; + border-style:solid; + border-width:1px; + border-color: #cccccc; +} + +div.network-manipulationUI.connect { + background-image: url("img/network/connectIcon.png"); +} + +div.network-manipulationUI.delete { + background-image: url("img/network/deleteIcon.png"); +} +/* top right bottom left */ +div.network-manipulationLabel { + margin: 0px 0px 0px 23px; + line-height: 25px; +} +div.network-seperatorLine { + display:inline-block; + width:1px; + height:20px; + background-color: #bdbdbd; + margin: 5px 7px 0px 15px; +} + +div.network-navigation_wrapper { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} +div.network-navigation { + width:34px; + height:34px; + -moz-border-radius: 17px; + border-radius: 17px; + position:absolute; + display:inline-block; + background-position: 2px 2px; + background-repeat:no-repeat; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.network-navigation:hover { + box-shadow: 0px 0px 3px 3px rgba(56, 207, 21, 0.30); +} + +div.network-navigation:active { + box-shadow: 0px 0px 1px 3px rgba(56, 207, 21, 0.95); +} + +div.network-navigation.up { + background-image: url("img/network/upArrow.png"); + bottom:50px; + left:55px; +} +div.network-navigation.down { + background-image: url("img/network/downArrow.png"); + bottom:10px; + left:55px; +} +div.network-navigation.left { + background-image: url("img/network/leftArrow.png"); + bottom:10px; + left:15px; +} +div.network-navigation.right { + background-image: url("img/network/rightArrow.png"); + bottom:10px; + left:95px; +} +div.network-navigation.zoomIn { + background-image: url("img/network/plus.png"); + bottom:10px; + right:15px; +} +div.network-navigation.zoomOut { + background-image: url("img/network/minus.png"); + bottom:10px; + right:55px; +} +div.network-navigation.zoomExtends { + background-image: url("img/network/zoomExtends.png"); + bottom:50px; + right:15px; +} +div.network-tooltip { + position: absolute; + visibility: hidden; + padding: 5px; + white-space: nowrap; + + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + border: 1px solid; + + box-shadow: 3px 3px 10px rgba(128, 128, 128, 0.5); +} \ No newline at end of file diff --git a/showcase/projects/bridge/data.json b/showcase/projects/bridge/data.json new file mode 100644 index 00000000..5748920c --- /dev/null +++ b/showcase/projects/bridge/data.json @@ -0,0 +1,82713 @@ +{ + "things": { + "tweet:570490634471145500": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.910095, + "lng": 10.725025 + }, + "type": "LatLng" + }, + "author": { + "value": "Hans-Petter N-Hansen", + "type": "String" + }, + "description": { + "value": "#KI15 Folks definisjon av #teknologi iht @guff_se : Alt som har blitt oppfunnet etter at vi ble født 😉 http://t.co/I9IztAUW7X", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:49:01Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rKMv7UUAAz7LC.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562329672713662464/vNeJqE4g_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "d5579c8246ecc2e6670dbd9d2c280615f15eb0ef.jpeg", + "type": "String" + } + } + }, + "tweet:570496321297240060": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.912678, + "lng": 10.739379 + }, + "type": "LatLng" + }, + "author": { + "value": "Luciana Z. Ponce", + "type": "String" + }, + "description": { + "value": "¡¿Qué?! Que ella hace vino 🎶", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:11:36Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/551499505506320384/4KFzjHEQ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FF2499", + "type": "String" + }, + "streetview": { + "value": "1bba10f87781214559474e1904b854aa496eb9da.jpeg", + "type": "String" + } + } + }, + "tweet:570502299942031360": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.818116, + "lng": 10.376134 + }, + "type": "LatLng" + }, + "author": { + "value": "Monsen", + "type": "String" + }, + "description": { + "value": "når læreren bestemmer seg for å ditche halve skoledagen for og ta med klassen på bowling", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:35:22Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/539382932046381056/AFYFODij_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "tweet:570488105725259800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 63.435519, + "lng": 10.410337 + }, + "type": "LatLng" + }, + "author": { + "value": "TT MEDIAlab", + "type": "String" + }, + "description": { + "value": "#frokostseminar med #trondheim markedsforening #thinkingtargeting tmf @ DNB https://t.co/FRmyI8mjjf", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:38:58Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-d-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10990576_1573864506195899_1950939739_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/528125562334633984/bWkSVgHD_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "691F6B", + "type": "String" + }, + "streetview": { + "value": "90cafb9b8cbfe9d8b27416a2d8d6299596bfceef.jpeg", + "type": "String" + } + } + }, + "tweet:570501576751771650": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "APTminer1 | Alex ", + "type": "String" + }, + "description": { + "value": "@a7x4lif3 hehe, okay. shit I don't know what too say xD", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:32:29Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/547809812226928640/TyNAzwor_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "000011", + "type": "String" + } + } + }, + "tweet:570521513620860900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Mathias J. Johansen", + "type": "String" + }, + "description": { + "value": "@karo133ne You should check out the curriculum for the UNIK crypto course (UNIK4220). It's not focused on quantum only, but might be helpful", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:51:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/481922604861648896/MNLPNYUg_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FA320F", + "type": "String" + } + } + }, + "tweet:570484964950745100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Jens Frede Rasmussen", + "type": "String" + }, + "description": { + "value": "@Linsedaugaard @olsson78 Hold dig væk fra Straffe Hendrik, det er en rigtig Belgierbasker. https://t.co/mWtZv0DplI", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:26:29Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/518826561404141568/IdZhEPb0_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570521494956216300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.952063, + "lng": 5.683756 + }, + "type": "LatLng" + }, + "author": { + "value": "John Chugchilán A.", + "type": "String" + }, + "description": { + "value": "@f_ronchetti thanks for following me! It's an honor!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:51:38Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565276516637233152/oK4CPopu_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "8db5895034cd8c337a3bf0424bb870d9739eb8ca.jpeg", + "type": "String" + } + } + }, + "tweet:570508517787901950": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.351667, + "lng": 6.221111 + }, + "type": "LatLng" + }, + "author": { + "value": "tor kjell erfjord", + "type": "String" + }, + "description": { + "value": "Wind 1,4 m/s SSE. Barometer 1001,0 mb, Raks økende. Temperature 3,9 °C. Rain today 6,3 mm. Humidity 90%", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:00:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1883393028/M0g1NcmW_normal", + "type": "String" + }, + "_profile_color": { + "value": "990000", + "type": "String" + } + } + }, + "tweet:570522167575773200": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 58.890422, + "lng": 5.745568 + }, + "type": "LatLng" + }, + "author": { + "value": "Tom Erik", + "type": "String" + }, + "description": { + "value": "#djommy43 #jobb @ Attende As https://t.co/IHG0nSDNzB", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:54:19Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-h-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/11015531_351122308415711_1896472688_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3478927778/00018b039849c32e4db967ac5dfdb0d1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "3fd8582a235b974287021ee72c51faf38a5a4d83.jpeg", + "type": "String" + } + } + }, + "tweet:570513089424195600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.380732, + "lng": 5.330978 + }, + "type": "LatLng" + }, + "author": { + "value": "K. Marthinussen", + "type": "String" + }, + "description": { + "value": "@Glimt selger Ibba til kinesiske Hibei Zhongji FC @nordnorgeunited #nnunited @2sporten #glimt", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:18:14Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1771535974/image_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570493401977790460": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.434415, + "lng": 10.655871 + }, + "type": "LatLng" + }, + "author": { + "value": "MRKS", + "type": "String" + }, + "description": { + "value": "@IndemFam how is that possible", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:00:00Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567443616751419392/-EXhABsY_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FFCC4D", + "type": "String" + } + } + }, + "tweet:570490709561765900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.774985, + "lng": 5.629657 + }, + "type": "LatLng" + }, + "author": { + "value": "Arnfinn Ingebrigtsen", + "type": "String" + }, + "description": { + "value": "Dette var en annerledes men bra Power Rangers: http://t.co/HFW3AGTDp9", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:49:19Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/525334423508893696/emGPRa8w_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "3975af784727a9c28d5e0bc90c938eb910180f4d.jpeg", + "type": "String" + } + } + }, + "tweet:570488019540701200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.41833, + "lng": 10.434371 + }, + "type": "LatLng" + }, + "author": { + "value": "Bendik Hugstmyr Woie", + "type": "String" + }, + "description": { + "value": "(Melodi: Crack A Bottle)\n\nKrenk debatten", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:38:37Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565670764238893056/jmZgrP_s_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + }, + "streetview": { + "value": "037a4a68e354649520f1794bb9ecfa943637981b.jpeg", + "type": "String" + } + } + }, + "tweet:570493305324245000": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.910102, + "lng": 10.724981 + }, + "type": "LatLng" + }, + "author": { + "value": "Ulf Rasmussen", + "type": "String" + }, + "description": { + "value": "Hører på @guf_se snakke om utvikling på #ki15 - interessante perspektiver http://t.co/pk5rYO7b42", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:59:37Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rMh5ZUUAAx2to.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/449912823443767296/_n4LIHya_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "7688E3", + "type": "String" + }, + "streetview": { + "value": "820a3165a3cbe53ba35856cff5ebb923a1f98a64.jpeg", + "type": "String" + } + } + }, + "tweet:570512157818929150": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.609239, + "lng": 5.826832 + }, + "type": "LatLng" + }, + "author": { + "value": "Norunn Helland", + "type": "String" + }, + "description": { + "value": "Fytti http://t.co/pPBD1tkk1z", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:14:32Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rdwOHXAAAWcj-.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565270240943439872/E7bEP6wC_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "89C9FA", + "type": "String" + } + } + }, + "tweet:570493283576774660": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.434415, + "lng": 10.655871 + }, + "type": "LatLng" + }, + "author": { + "value": "MRKS", + "type": "String" + }, + "description": { + "value": "@ZyBaCKK yep, more tactic and team based", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:59:32Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567443616751419392/-EXhABsY_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FFCC4D", + "type": "String" + }, + "streetview": { + "value": "edc08ce9151216e7efb81d59ec29844723d1d241.jpeg", + "type": "String" + } + } + }, + "tweet:570492769304760300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.780349, + "lng": 5.487574 + }, + "type": "LatLng" + }, + "author": { + "value": "Roger Sagvåg", + "type": "String" + }, + "description": { + "value": "#SpursAtWembley what a sunday #coysnor", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:57:30Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/499066511676690432/Q1sTxaA9_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "9d7a779cd1912b025b39feb7c89e20432e7e4e58.jpeg", + "type": "String" + } + } + }, + "17e21e66-4660-4a56-a8ec-64079f57c79c": { + "type": "master:imageoverlay:drawing", + "properties": { + "url": { + "value": "https://master-bridge.eu/medias/b4c04d4ebb2a943749a40184800e30e71558f079.png", + "type": "String" + }, + "timestamp": { + "value": "2015-02-02T09:52:21.166Z", + "type": "DateTime" + }, + "topleft": { + "value": { + "lat": 59.92323748, + "lng": 10.81140518 + }, + "type": "LatLng" + }, + "bottomright": { + "value": { + "lat": 59.91405253, + "lng": 10.82638264 + }, + "type": "LatLng" + } + } + }, + "b55e3628-1544-4b76-89a8-ed9f99278270": { + "properties": { + "name": { + "value": "Control point", + "type": "String" + }, + "description": { + "value": "", + "type": "String" + }, + "location": { + "value": { + "lat": 59.887964788295648, + "lng": 10.762690330055863 + }, + "type": "LatLng" + }, + "_type": { + "value": "response point control", + "type": "String" + } + } + }, + "tweet:570490629718994940": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.355885, + "lng": 5.292505 + }, + "type": "LatLng" + }, + "author": { + "value": "Chris Black", + "type": "String" + }, + "description": { + "value": "Norwegian scooter license achieved! http://t.co/E7lx9XA3Gd", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:48:59Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rKMbJUUAARd8b.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000698040413/d329c203e35da209776a4d7398f91b59_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "335ECC", + "type": "String" + }, + "streetview": { + "value": "7db84725889f415b6638ce2706d0af096befa52a.jpeg", + "type": "String" + } + } + }, + "tweet:570486932620357600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.97842, + "lng": 8.72469 + }, + "type": "LatLng" + }, + "author": { + "value": "Bjørn Ove Strand", + "type": "String" + }, + "description": { + "value": "Klarte å komme for sent til bussen! Nå må jeg gå 7,8km igjen. Håper bilen blir ferdig i dag!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:34:18Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3540899476/fd88b29057dcecf9b345c379f7f5ff35_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "1C2224", + "type": "String" + } + } + }, + "tweet:570494988771061760": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 58.881185, + "lng": 5.670438 + }, + "type": "LatLng" + }, + "author": { + "value": "Reidar Humlestøl", + "type": "String" + }, + "description": { + "value": "A new nice 4 axled Broshuis. @truckeradamuk @jack_kyte @ESlibrarian @LongHaulLife @gluttnous http://t.co/pueTAZWxzy", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:06:19Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rOKoaUMAAuw3C.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/519111905324322816/uxZXoPlI_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "ee8722e41133efe6ed70b6d2820db484fd36a7b5.jpeg", + "type": "String" + } + } + }, + "tweet:570486346655121400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.930093, + "lng": 10.877574 + }, + "type": "LatLng" + }, + "author": { + "value": "Morten Christensen", + "type": "String" + }, + "description": { + "value": "@jasnoen Og det er dilemmaet for Frp. Så lenge partiet sitter i en koalisjonsregjering minsker muligheten for partipolitiske markeringer.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:31:58Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/491622864798220288/ksDl6snV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570510784071143400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.958561, + "lng": 5.757614 + }, + "type": "LatLng" + }, + "author": { + "value": "Ingri", + "type": "String" + }, + "description": { + "value": "@CecilieMadland Dette er min kampsak. Fader, så mye stygge bryn det er der ute!!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:09:05Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566899331035168769/P740og3o_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B40B43", + "type": "String" + } + } + }, + "tweet:570494513384427500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Cath Murphy", + "type": "String" + }, + "description": { + "value": "@LaReyneDEpee There's money to be made here. But remember, not everyone can draw a turd in a thong. That takes skillz #megagod", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:04:25Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000443054458/a9ea13e155aa77caaf1da56ee74cc10d_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FF3300", + "type": "String" + } + } + }, + "tweet:570504108223930400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "ojciec pierdoli że w środe może na korepetycje będę chodziła z tej majzy no dobra już wyjebane mam i tak nic nie wiem to może olśni mnie", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:42:33Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + }, + "streetview": { + "value": "30deae915343243873a947b894375ac5ffc236f2.jpeg", + "type": "String" + } + } + }, + "tweet:570496550117486600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Captain Redbeard", + "type": "String" + }, + "description": { + "value": "Tea from the NESCup, lovely emo music that reminds me of Burnout 3 on my headset and code pouring from my fingers. Today is a good day.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:12:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562146030938890240/EyInFFie_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570487982597263360": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Gisle G. Stokland", + "type": "String" + }, + "description": { + "value": "#np Nitimen", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:38:28Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/563646708022652928/x2LSlJFH_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "tweet:570494452520914940": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 68.803853, + "lng": 16.548138 + }, + "type": "LatLng" + }, + "author": { + "value": "Frank Acheampong Gh", + "type": "String" + }, + "description": { + "value": "Photo by my amazing mate Thomas Braun. 😎😎😎\n\n#hat #longcoat #boots #trousers #skinny #watch #blue… https://t.co/d1RlCHrpyv", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:04:11Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-a-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/11007770_334480153411992_468997776_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506051224529952768/no0RYMs__normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F505D9", + "type": "String" + }, + "streetview": { + "value": "9065b68e3a01ffb81719c9185e11ce9bda609d57.jpeg", + "type": "String" + } + } + }, + "tweet:570504555714248700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "znaczy nie mam jeszcze 17 lat ale to brzmi fajnie jak se mówie że mam 17 lat a tak to musze jeszcze czekać na urodziny do 9 października", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:44:20Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570495804508672000": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.266667, + "lng": 9.483333 + }, + "type": "LatLng" + }, + "author": { + "value": "Tina Price", + "type": "String" + }, + "description": { + "value": "God morgen fra fine Norefjell😊 @ Norefjell https://t.co/cY4bs0cPcs", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:09:33Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-a-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10986397_739070132878232_1843295417_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562012362262470656/24h2jTzN_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B40B43", + "type": "String" + } + } + }, + "tweet:570512152735440900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.28324, + "lng": 11.10659 + }, + "type": "LatLng" + }, + "author": { + "value": "Madeléne Leidland", + "type": "String" + }, + "description": { + "value": "@ghveem Dette var 10 ganger over mitt OneNote-nivå!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:14:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568869434434260992/XlsH5VwZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "990000", + "type": "String" + } + } + }, + "tweet:570510779730022400": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.780904, + "lng": 10.444346 + }, + "type": "LatLng" + }, + "author": { + "value": "youtubelena", + "type": "String" + }, + "description": { + "value": "Can't waaaiiiit😍😍😍\n@macbby11 \n\nBc. Have the same lipstick😏💄 #twins http://t.co/RRo1ijiaon", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:09:04Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rchATUYAA3gd-.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568435192894095360/1W8Er_tm_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570518858341195800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.90916, + "lng": 10.76805 + }, + "type": "LatLng" + }, + "author": { + "value": "Dave McInnes", + "type": "String" + }, + "description": { + "value": "it ended up being a red wine & Junior spesh kinda night... @ 50C https://t.co/yXA35fmpJS", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:41:10Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-h-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10979512_1404178596555871_2133476512_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/427401110320861184/n2FJYu37_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "tweet:570504205552750600": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.345158, + "lng": 5.354968 + }, + "type": "LatLng" + }, + "author": { + "value": "Anna", + "type": "String" + }, + "description": { + "value": "@nicoladeak http://t.co/b5WSNRKXZC", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:42:56Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rWi9vXEAAxiZP.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566725655531114496/3PROrBAP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "ABB8C2", + "type": "String" + } + } + }, + "tweet:570494433763958800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.876811, + "lng": 5.718856 + }, + "type": "LatLng" + }, + "author": { + "value": "Erlend Aasland", + "type": "String" + }, + "description": { + "value": "Ute på tour med Tønes igjen. I kveld spelar me i Kongsberg: https://t.co/vU3HlAsQYS", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:04:06Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/62937256/n677086927_1083237_3512_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "088253", + "type": "String" + }, + "streetview": { + "value": "4e1d18544e77e0bfd619c9c2c7605e202fa75946.jpeg", + "type": "String" + } + } + }, + "tweet:570510800227586050": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.921708, + "lng": 10.75084 + }, + "type": "LatLng" + }, + "author": { + "value": "Fredfades $taxHigher", + "type": "String" + }, + "description": { + "value": "Sjefen slår på stortromma! @ Apps AS https://t.co/dqSeeD8cBz", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:09:09Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-e-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10919125_407653422749428_1593092938_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/543354854509260800/n0qDwInb_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "4e3ba0f5a20886fa78199e4042c282fdbbd78ba6.jpeg", + "type": "String" + } + } + }, + "tweet:570492178843246600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Lasse Hamre", + "type": "String" + }, + "description": { + "value": "@hildesteria @landsnes @YvonneFosser Vi jobber med å utvikle et digitalt samtaletreningskurs nå. Neste år har du noe heftig du kan bruke!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:55:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/522722778353393665/QRrIgSGA_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570512172545155100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.89404, + "lng": 10.5248 + }, + "type": "LatLng" + }, + "author": { + "value": "Runar Dankel", + "type": "String" + }, + "description": { + "value": "@trzewik ha ha :) Enjoy the cheap beer in Denmark, cause you have to pay though your nose for it in Norway", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:14:36Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/198589510/IMG_0111_crop_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570510751976316900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Tove Kjellerød", + "type": "String" + }, + "description": { + "value": "@GdnChildrensBks Never mind why adults read what they read.The fact that they actually read is good news in my book.#books #read", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:08:57Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565036118471872512/SfN7_kQn_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570486145416597500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.132668, + "lng": 7.96275 + }, + "type": "LatLng" + }, + "author": { + "value": "Irish Joy Dellosa ♉️", + "type": "String" + }, + "description": { + "value": "More", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:31:10Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565796698493313024/cZNfjdSG_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F508D5", + "type": "String" + }, + "streetview": { + "value": "bfff5a5949d456b6ab7c6153842a3f721aa2ce93.jpeg", + "type": "String" + } + } + }, + "tweet:570521121138839550": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "@KonradPiasecki @pafelwoo @szacki po to żeby wyrazić oczywiste poparcie. Ośmieszenie nie grozi bo standardów obiektywizmu już nie ma.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:50:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "tweet:570495745947791360": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Aleksander Dye", + "type": "String" + }, + "description": { + "value": "Ny dag med #Excel! Jeg er på kurs med @ConfexNorge og får mange nyttige tips, tar noen notater som kommer ut senere", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:09:19Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/524869950322638851/p9cTai3e_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "tweet:570516899177611260": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.911942, + "lng": 10.748059 + }, + "type": "LatLng" + }, + "author": { + "value": "Jon Albert Risahagen", + "type": "String" + }, + "description": { + "value": "@GroMonicaRoos gratulerer. Hvilken?", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:33:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2694041404/cf4a9efeb0cf772691cd77bcf3d59894_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "c2799c3d17cb290098e02dc09033c598a4f12b15.jpeg", + "type": "String" + } + } + }, + "tweet:570503561139785700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "1. #NashsNewVideo\n2. #viasatfotball\n3. Norway\n4. Barca\n5. Norge\n\n2015/2/25 09:32 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:40:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570521572374667260": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "@toppertje I mean 16 'Seksten', pronounced 'Seisen'. It's almost like Welsh when vowels are swallowed.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:51:57Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570502785302695940": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "tylko w piątek jak mi będzie padać to możliwe że się wkurwie no bo halo jade ze stadem do krakowa w piątek musi panowac susza", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:37:18Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570520429963681800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 67.26423, + "lng": 15.38742 + }, + "type": "LatLng" + }, + "author": { + "value": "Tor Håkon Bjørnli", + "type": "String" + }, + "description": { + "value": "@Meteorologene @wunderground @nrknyheter Sunrise here in Fauske Northern Norway. http://t.co/LhDXibL8OO", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:47:24Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rlTmyW0AAmlrO.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506720265141637120/F59AU3OW_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570486308851851260": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.132653, + "lng": 7.962727 + }, + "type": "LatLng" + }, + "author": { + "value": "Irish Joy Dellosa ♉️", + "type": "String" + }, + "description": { + "value": "Winter holiday!!! 🎉🎉🎉🎉🎉", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:31:49Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565796698493313024/cZNfjdSG_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F508D5", + "type": "String" + }, + "streetview": { + "value": "a82f3121da1fb1b30bbc61004e43e5bd01a2f4f6.jpeg", + "type": "String" + } + } + }, + "tweet:570504182983237600": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Julie Eilén", + "type": "String" + }, + "description": { + "value": "@James_Phelps @OliverPhelps Happy birthday! Hope you like the collage we’ve made for you! #iheartphelps http://t.co/b0s5O8RPLu", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:42:51Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rWh-ZXIAAXuUe.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567469486593568769/TtQezC8U_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "DD2E44", + "type": "String" + } + } + }, + "tweet:570487541490688000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "GAFFA.no", + "type": "String" + }, + "description": { + "value": "Godspeed You! Black Emperor bekrefter nytt album ~ http://t.co/IxQZzas0oL", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:36:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561092082480078848/HmfDxO1J_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570510403211558900": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 69.648508, + "lng": 18.95324 + }, + "type": "LatLng" + }, + "author": { + "value": "LLewie13", + "type": "String" + }, + "description": { + "value": "❄️Norway❄️ @ Tromso - Above the Arctic Circle https://t.co/5wr33PukZP", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:07:34Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-e-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10963843_727286807389660_1951987526_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/550275132456194048/lFjcQttE_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B40B43", + "type": "String" + } + } + }, + "tweet:570493831927500800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.411659, + "lng": 10.402739 + }, + "type": "LatLng" + }, + "author": { + "value": "Kjetil Nerlandsrem", + "type": "String" + }, + "description": { + "value": "I was out walking 2.42 km with #Endomondo #endorphins http://t.co/zcR5BB8wqT", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:01:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2283490828/image_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570513295930761200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.47151, + "lng": 6.17293 + }, + "type": "LatLng" + }, + "author": { + "value": "Cecilie Helle", + "type": "String" + }, + "description": { + "value": "@BruceVH @emarjmanere SO True!!!!!!!!!!!!!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:19:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570231728506040320/Xwo0MRGZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "tweet:570501105051930600": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 61.119264, + "lng": 10.459516 + }, + "type": "LatLng" + }, + "author": { + "value": "martynj", + "type": "String" + }, + "description": { + "value": "Dude, where's my car? #lillehammer #snow http://t.co/EbsW5BJiEM", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:30:37Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rTuyeXAAAFxrC.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/471385749737046016/CpKWOQrT_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "6daa902607b9021e4e69ab59ddcc41ea0508c333.jpeg", + "type": "String" + } + } + }, + "tweet:570513482568888300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.47151, + "lng": 6.17293 + }, + "type": "LatLng" + }, + "author": { + "value": "Cecilie Helle", + "type": "String" + }, + "description": { + "value": "@emarjmanere @lyricsfreak Thanks for your support! #Lovecommingyourway", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:19:48Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570231728506040320/Xwo0MRGZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "tweet:570512259371425800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.427479, + "lng": 10.369291 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas", + "type": "String" + }, + "description": { + "value": "@MatsDawg hm, interessant. Det er vel en forsvarsmekanisme, må kødde bort alt. Køddeforsvar :P", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:14:56Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/563686666012205056/LYV3CVfF_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + }, + "streetview": { + "value": "e789c161682e6012339fab4771842070b022864e.jpeg", + "type": "String" + } + } + }, + "tweet:570501605067522050": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.951672, + "lng": 5.652862 + }, + "type": "LatLng" + }, + "author": { + "value": "Nisfa Bahri", + "type": "String" + }, + "description": { + "value": "So Nervous and so scared 😔", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:32:36Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/564403555394936833/I-VmTWGM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F5ABB5", + "type": "String" + }, + "streetview": { + "value": "67c86803ea18e0f5e5ce9c235011f7b7d935e2dd.jpeg", + "type": "String" + } + } + }, + "tweet:570521433882923000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.132612, + "lng": 7.962636 + }, + "type": "LatLng" + }, + "author": { + "value": "Irish Joy Dellosa ♉️", + "type": "String" + }, + "description": { + "value": "#IWantYouToKnow that I'm all yours... 💙", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:51:24Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565796698493313024/cZNfjdSG_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F508D5", + "type": "String" + }, + "streetview": { + "value": "22cad648cbf8472058ef6dfc8f4f6ba6cbdeca7d.jpeg", + "type": "String" + } + } + }, + "tweet:570522122579251200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.271401, + "lng": 11.160526 + }, + "type": "LatLng" + }, + "author": { + "value": "ALISE", + "type": "String" + }, + "description": { + "value": "Elsker musikken til Lars Vaular!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:54:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/528645960449417216/86iDPgNc_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "D02B55", + "type": "String" + } + } + }, + "tweet:570518819224948740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 61.45225, + "lng": 5.852988 + }, + "type": "LatLng" + }, + "author": { + "value": "❀ daddy suho ❀", + "type": "String" + }, + "description": { + "value": "remember that one picture ??? the one that saved me", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:41:00Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567842117334999040/Zd_pkgPT_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "F5ABB5", + "type": "String" + } + } + }, + "tweet:570502465617047550": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "matka do mnie przyszła i się mnie pyta kiedy biathlon będzie jezu udało mi się sprawić żeby moja mamusia pokochała ten sport no supciio", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:36:01Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570496149381111800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Cath Murphy", + "type": "String" + }, + "description": { + "value": "@KngHnryVIII Saw you on telly the other night. Amazed at how much you look like Damian Lewis. Spooky.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:10:55Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000443054458/a9ea13e155aa77caaf1da56ee74cc10d_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FF3300", + "type": "String" + } + } + }, + "tweet:570519376274661400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "'Tusen' appeared on Tuesday 24 at the 5th place in the Top20 of Norway's Trends: http://t.co/HPpeAZ2ODq #trndnl", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:43:13Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570502395484082200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.767789, + "lng": 10.669577 + }, + "type": "LatLng" + }, + "author": { + "value": "Jennifer Marki", + "type": "String" + }, + "description": { + "value": "I just finished walking 2.68 km in 39m:28s with #Endomondo #endorphins http://t.co/zCxC9Ybc8x", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:35:45Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1281563689/jennifer_marki_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "D02B55", + "type": "String" + }, + "streetview": { + "value": "f765f9c62180763dd2818ce8dc26ee8d57c77bbc.jpeg", + "type": "String" + } + } + }, + "tweet:570512008589778940": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Vesle Nusse", + "type": "String" + }, + "description": { + "value": "@Stereolife @JarlWaage @msoffie Det hadde sikkert vore godt nok med fast kontakt med @Meteorologene.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:13:57Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/553287492867088384/he6cUbMB_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570490599889100800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.935273, + "lng": 10.717596 + }, + "type": "LatLng" + }, + "author": { + "value": "Pia Skevik", + "type": "String" + }, + "description": { + "value": "Saklig start på dagen! Min #trøffelhelt jornhoel disker opp pimientos padrón til frokost 👌 -… https://t.co/ev45gUsP2b", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:48:52Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-c-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/10986128_631431510292122_358683137_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3702597638/71e5b4209e9ce46e03be13e80da579c8_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + }, + "streetview": { + "value": "fac201de9727fc2312236cbdfc1e009992f56b9e.jpeg", + "type": "String" + } + } + }, + "tweet:570522035501330400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "@krzysiekcl Don't get me started on the Danish counting system. Once I pass 25, I am screwed. @toppertje", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:53:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570514362160562200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "@D_Tarczynski jak to było dzisiaj w Gazecie Polskiej, to już nie jest groteska to groza!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:23:18Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "tweet:570521367927517200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Roar Ulvestad", + "type": "String" + }, + "description": { + "value": "@valset @Falun2015 Krigs- og destruksjonsmetaforikk har desverre solid posisjon i sportsjournalistikk. Og sportsmetaforikk i krig. Ekkelt.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:51:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/530792117593833472/uazVs1az_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570502347643887600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.749066, + "lng": 5.446445 + }, + "type": "LatLng" + }, + "author": { + "value": "ANNA LUNDEN", + "type": "String" + }, + "description": { + "value": "@VGlista2015 isac elliot til VG-lista i bergen🙏#vglista", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:35:33Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570339980041703424/yEry0mX3_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "9200ee099a80ae1b2d314b19e81d5944de2a2ca0.jpeg", + "type": "String" + } + } + }, + "tweet:570493650360246300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.405935, + "lng": 8.469799 + }, + "type": "LatLng" + }, + "author": { + "value": "Martin Årseth", + "type": "String" + }, + "description": { + "value": "Eg synest tidlegare kartografar bør ta litt sjølvkritikk når nye, relativt store stadar vert sett på kartet så seint som i 2015.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:01:00Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565844346734673920/wAWqrg0P_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570520355749691400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "@gilescoren You drank your coffee yet? ;-)", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:47:07Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570522044456149000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.21339, + "lng": 8.105739 + }, + "type": "LatLng" + }, + "author": { + "value": "Malin Berås", + "type": "String" + }, + "description": { + "value": "@TheSarojin Yes it will I :)", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:53:49Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/442207858109976576/kZavgZDF_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "tweet:570490592481976300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Alistair MacRae", + "type": "String" + }, + "description": { + "value": "@andybearz @AMcKellar89 How much did companies he is involved in manage to get out of the club...??", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:48:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/564911515036180480/vx2PbeBT_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570521472185323500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Aleksander Nordengen", + "type": "String" + }, + "description": { + "value": "Vil du lese en interessant artikkel?\nNei, den må du betale for.\nDagens nettaviser.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:51:33Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000447155096/7bca6718078675d564a065a031e52dd2_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570497690892693500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Hr. Haukedal", + "type": "String" + }, + "description": { + "value": "@GeorgeGooding framstillingen om at \"kun 20\" muslimer møtte opp.. Du vet, bevisst feilinformasjon er også løgn.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:17:03Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/502558630336421888/FX5B5J9O_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570490411619364860": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "@GrenadeJay Eggs and cheese? Very vegan! ;-)", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:48:07Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570519827917512700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "Norwegian does not sound like it looks! :-/", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:45:01Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570492556372529150": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.780359, + "lng": 5.487573 + }, + "type": "LatLng" + }, + "author": { + "value": "Roger Sagvåg", + "type": "String" + }, + "description": { + "value": "Looking forward to see #SpursAtWembley", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:56:39Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/499066511676690432/Q1sTxaA9_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "b396864e3e4291b64a180b87301206db0d814395.jpeg", + "type": "String" + } + } + }, + "tweet:570502218606112800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "APTminer1 | Alex ", + "type": "String" + }, + "description": { + "value": "merica!", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:35:02Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/547809812226928640/TyNAzwor_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "000011", + "type": "String" + } + } + }, + "tweet:570513003797454850": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 67.26423, + "lng": 15.38742 + }, + "type": "LatLng" + }, + "author": { + "value": "Tor Håkon Bjørnli", + "type": "String" + }, + "description": { + "value": "@TorBjornli wow must have been tired, it's before SUNRISE here. Trøtt og for lite kaffe, er like før solopgang dette .....", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:17:54Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506720265141637120/F59AU3OW_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570495609708392450": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Ingeborg Senneset", + "type": "String" + }, + "description": { + "value": "@Doremus42 @kjetilhope @soepstad @iveerik @CiViX Homygod.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:08:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/472523292625342464/imx4OcPq_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "6CA1CF", + "type": "String" + } + } + }, + "tweet:570521110216904700": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.919736, + "lng": 10.760597 + }, + "type": "LatLng" + }, + "author": { + "value": "Anna Höglund", + "type": "String" + }, + "description": { + "value": "@piamia2 om #agilhr på @AgilePeopleNor #agile http://t.co/oQexhPrtvZ", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:50:07Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rltdIWoAAwaSq.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/520551183954354176/pwGN0DyO_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "CC3366", + "type": "String" + } + } + }, + "tweet:570510377169129500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.941533, + "lng": 10.768752 + }, + "type": "LatLng" + }, + "author": { + "value": "Sætre Hanssen", + "type": "String" + }, + "description": { + "value": "@baardamundsen Ja, selv om subsidiert privatbil til tider fremstilles som rene frelsen her hjemme. @Rotevatn", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:07:28Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000529008550/7550f1aeffb4214cb56195f0f385dcdd_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "ba988c14ba2e93360bb6f965d5e986e0a89848aa.jpeg", + "type": "String" + } + } + }, + "tweet:570520999520833540": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.892554, + "lng": 5.716966 + }, + "type": "LatLng" + }, + "author": { + "value": "Ole-Gunnar Rasmussen", + "type": "String" + }, + "description": { + "value": "Holdt på å bli syklet ned av en med en \"boomblaster\" på bagasjebæreren.Michael Jackson \"Black or white\" på full styrke.Dette skjedde i 2015.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:49:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/527196646493659136/GRhoRVaZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570520795367280640": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "hass", + "type": "String" + }, + "description": { + "value": "I've said it before and say it again, I love Iraq's new defence minister. lrt", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:48:52Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567054277253013504/1b_hEZPO_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570487488554397700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.373173, + "lng": 6.716469 + }, + "type": "LatLng" + }, + "author": { + "value": "Sheymah", + "type": "String" + }, + "description": { + "value": "@iAhmedYaseen yaaaa rab", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:36:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/564153150933057536/BafZPVc2_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "E80936", + "type": "String" + } + } + }, + "tweet:570500347745185800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Sebastian Zurawski", + "type": "String" + }, + "description": { + "value": "@WikiHouseGER Cool, how can we get in touch to discuss the details?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:27:36Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/845250014/bilde_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570501219111850000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "APTminer1 | Alex ", + "type": "String" + }, + "description": { + "value": "@a7x4lif3 haha, I am just bored mkay?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:31:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/547809812226928640/TyNAzwor_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "000011", + "type": "String" + } + } + }, + "tweet:570494778695155700": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.822918, + "lng": 6.738508 + }, + "type": "LatLng" + }, + "author": { + "value": "Petter Dalen", + "type": "String" + }, + "description": { + "value": "#hardwork #motivation #fighting #hunting #hungry #learning #decide @ Røldal https://t.co/3KBBf8iAPP", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:05:29Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-g-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/11005185_1622265228006166_1640860097_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/387484048/biopic_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + } + } + }, + "tweet:570520307095765000": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 61.328414, + "lng": 12.222178 + }, + "type": "LatLng" + }, + "author": { + "value": "Mats Strandberg", + "type": "String" + }, + "description": { + "value": "Ingen snöbrist i #trysil @ Høgegga https://t.co/LZ7MAQAsBi", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:46:55Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-a-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10954777_1404039623240936_2102768114_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/73362751/MatsStrandberg_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "10ed3b653c661c12adb795525a807de48252ec0e.jpeg", + "type": "String" + } + } + }, + "tweet:570501964007657500": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 63.720965, + "lng": 9.554957 + }, + "type": "LatLng" + }, + "author": { + "value": "Tanja Vean", + "type": "String" + }, + "description": { + "value": "Etter at sola har gått ned, er det så godt å bare ligge sånn og se på fargene som forandrer seg, blir… https://t.co/nyZQ788izt", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:34:02Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-a-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10963894_367443993441104_1408275488_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/552424581710233600/Kch6WF4b_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B40B43", + "type": "String" + } + } + }, + "tweet:570505332981665800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.484683, + "lng": 6.390032 + }, + "type": "LatLng" + }, + "author": { + "value": "PERFECT TUNE©", + "type": "String" + }, + "description": { + "value": "@SafetyMentalst @PoleOfficial welcome thx", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:47:25Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566919243615051776/cK3ro78r_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570514207273300000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "@prezydentpl takie jak w Polsce? Np. reformy służby zdrowia i wyprzedaż majątku dla odmiany rosyjskim nie niemieckim inwestorom?", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:22:41Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "tweet:570501082033590300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.925552, + "lng": 5.717354 + }, + "type": "LatLng" + }, + "author": { + "value": "Stella A. Peartree", + "type": "String" + }, + "description": { + "value": "Merkelig opplegg om VGS. Vanligvis må en gå 1 år forkurs før sitt studievalg, motsatt til privatskole som starter rett på studievalget?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:30:32Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568748841995108352/XdxIBbEp_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0B778A", + "type": "String" + } + } + }, + "tweet:570520257267413000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "\"Do not give him a double-thumbs-up and say ‘good luck with everything!‘ To my eternal horror I actually did this.\" http://t.co/in2JAqwEm2", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:46:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "tweet:570520255719727100": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.910107, + "lng": 10.724989 + }, + "type": "LatLng" + }, + "author": { + "value": "EMCnorge", + "type": "String" + }, + "description": { + "value": "EMCnorge gratulerer: “@O_Jacobsen: Yes, I got VCE certified today 😊 http://t.co/4l9yEUYWo6”", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:46:43Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-o3LVtW4AANnnF.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3779840771/5428e97e160e4395c81503b33b74b4a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570510364863021060": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 67.26423, + "lng": 15.38742 + }, + "type": "LatLng" + }, + "author": { + "value": "Tor Håkon Bjørnli", + "type": "String" + }, + "description": { + "value": "@TorBjornli SUNRISE, sorry folks, tired in the mortning, it's sunrise of course lol ... ;-)", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:07:25Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506720265141637120/F59AU3OW_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570501948937527300": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 58.925552, + "lng": 5.717353 + }, + "type": "LatLng" + }, + "author": { + "value": "Stella A. Peartree", + "type": "String" + }, + "description": { + "value": "\"@BBAnimals: You'll Never Guess What Cuteness Lies Underneath All This Mud http://t.co/jKsR6coLj4 http://t.co/KWZ39iqtcx\" 😢", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:33:58Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-ahfRXIcAAc8ES.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568748841995108352/XdxIBbEp_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0B778A", + "type": "String" + } + } + }, + "tweet:570503559566921700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "6. Suarez\n7. #2hockey\n8. Messi\n9. Takk\n10. #vglista\n\n2015/2/25 09:32 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:40:22Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570495253444218900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.739602, + "lng": 10.770887 + }, + "type": "LatLng" + }, + "author": { + "value": "Kenneth", + "type": "String" + }, + "description": { + "value": "@HaraldNatvik Copa-kampen mot Alcorcon glemmes aldri.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:07:22Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560128350354935809/7s3tLWjq_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "5F9DC7", + "type": "String" + } + } + }, + "tweet:570514114352701440": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 67.26423, + "lng": 15.38742 + }, + "type": "LatLng" + }, + "author": { + "value": "Tor Håkon Bjørnli", + "type": "String" + }, + "description": { + "value": "Sunrise here today @NatGeo @NRKNordland http://t.co/YELbzgNV9P", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:22:19Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rfj-CUsAAaMyx.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506720265141637120/F59AU3OW_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570500647847649300": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.919421, + "lng": 10.701155 + }, + "type": "LatLng" + }, + "author": { + "value": "Emily Victoria", + "type": "String" + }, + "description": { + "value": "@jizziemcguire here's a photo of what it would look like if a cute, Australian possum was to end up in your house http://t.co/PkuAPIeZpH", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:28:48Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rTTu7WoAAy55-.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/505345041158897664/pHU0gz6S_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "d964a2bba1dbb17fc59582eb87b61a368ca1523c.jpeg", + "type": "String" + } + } + }, + "tweet:570501158323818500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.925552, + "lng": 5.717353 + }, + "type": "LatLng" + }, + "author": { + "value": "Stella A. Peartree", + "type": "String" + }, + "description": { + "value": "Merkelig opplegg om VGS. Vanligvis må en gå 1 år forkurs før sitt studievalg, motsatt til privatskole som starter rett på studievalget? #VGS", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:30:50Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568748841995108352/XdxIBbEp_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0B778A", + "type": "String" + } + } + }, + "tweet:570520277110685700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.91703, + "lng": 10.740653 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas Tallaksen", + "type": "String" + }, + "description": { + "value": "@sigvei utdøende rase.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:46:48Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3315994639/cb821519961e3002669e1a8f942cce04_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "639b220c6267bb4461019e476b404e3d692fcb43.jpeg", + "type": "String" + } + } + }, + "tweet:570492387061076000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.97101, + "lng": 5.73064 + }, + "type": "LatLng" + }, + "author": { + "value": "Thor Bjarne Bore", + "type": "String" + }, + "description": { + "value": "\"Kommentatorer som nøyer seg med å konstatere at «trøbbelsaker» skaper bråk, gjør ikke noen særlig klokere\" http://t.co/SpCIOLagkZ", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:55:58Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/459261419964231680/0Eiu1Kzl_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570511414311452700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Vesle Nusse", + "type": "String" + }, + "description": { + "value": "@streng1 @JarlWaage Enklare før, då Erling Fossen var elefanten i rommet.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:11:35Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/553287492867088384/he6cUbMB_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570510263021150200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.61028, + "lng": 5.47602 + }, + "type": "LatLng" + }, + "author": { + "value": "GRISETRYNET", + "type": "String" + }, + "description": { + "value": "@tumblrpenguin Hvorfor er det slik at du er er så heldig at nesten alle følger deg? Laurent? Luke? R5? Alex? åhh! jeg er så missunnelig <3", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:07:00Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568821902530330624/h_DaibgP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F5ABB5", + "type": "String" + } + } + }, + "tweet:570500551340904450": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Erlend Aasland", + "type": "String" + }, + "description": { + "value": "Meget bra svar frå Christian Orderud til teologist Øivin Berg: http://t.co/3if8fdQxck @nrkytring #vitskap #rasjonalitet", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:28:25Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/62937256/n677086927_1083237_3512_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "088253", + "type": "String" + } + } + }, + "tweet:570485747389730800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Jorgen Knutsen", + "type": "String" + }, + "description": { + "value": "På denne dagen i 2012 vant @LSKKvinner 1-0 mot @KolbotnKvinner . Mål: Synne Jensen som i 2013 meldte overgang nettopp til @KolbotnKvinner", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:29:35Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1546561925/JK_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570502226407493600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "jezu ludzie wstałam i mnie tak kość w głowie napierdala że dochodze do wniosku że chyba mi mózg rośnie bo innego wyjaśnienia nie ma", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:35:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570487225747697660": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Kulturbyrået Mesén", + "type": "String" + }, + "description": { + "value": "Hvorfor har kulturell og kreativ sektor blitt en av Europas viktigste økonomier? http://t.co/Sd8qqdtWoR #Kopinorseminaret @Kopinor @_TONO_", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:35:28Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000473311440/f07411ad741944caeb3f4060d600c0f1_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "44A2F0", + "type": "String" + } + } + }, + "tweet:570499789202321400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Flåten", + "type": "String" + }, + "description": { + "value": "St.Clause:\"The true sign of intelligence is not knowledge, but Imagination!\"- Albert Einstein I am waiting for equal justice for all!", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:25:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/254817315/St_Clause_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "9D582E", + "type": "String" + } + } + }, + "tweet:570519822624264200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.43101, + "lng": 10.39211 + }, + "type": "LatLng" + }, + "author": { + "value": "Håvard Wigtil", + "type": "String" + }, + "description": { + "value": "Med nok sukker innabords kan også søvnmangel oppleves som en slags rus. Hilsen våken siden 03:00, smilende og lett svimmel.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:45:00Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/146917432/n563565845_27899_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570511247835324400": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.8769, + "lng": 11.563057 + }, + "type": "LatLng" + }, + "author": { + "value": "Tulla Myrvold", + "type": "String" + }, + "description": { + "value": "My horse is indefineable! #MyHorseIs http://t.co/9pZcvIFB9S", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:10:55Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rc6I9XAAAlPxi.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/490415882662051840/gb2DHgtP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570496537408761860": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.930077, + "lng": 10.877546 + }, + "type": "LatLng" + }, + "author": { + "value": "Morten Christensen", + "type": "String" + }, + "description": { + "value": "@Sigvald Ok. Da er det oppklart. Jeg leste nettopp en kronikk som kunne tolkes dit hen. Takker for svar.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:12:28Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/491622864798220288/ksDl6snV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570515974811725800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.397897, + "lng": 5.325747 + }, + "type": "LatLng" + }, + "author": { + "value": "Kong Mathias", + "type": "String" + }, + "description": { + "value": "Max Hermansen fornekter seg ikke. Fortsetter å bidra til egen latterliggjøring. http://t.co/VGjiNTwo8k", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:29:42Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rhQNcWoAAqbJQ.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1802216880/Follomatch_3_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "255e6de88ed9760d3e7fc845088a67e60922c63d.jpeg", + "type": "String" + } + } + }, + "tweet:570512988291137540": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.2167, + "lng": 10.95 + }, + "type": "LatLng" + }, + "author": { + "value": "Marita ", + "type": "String" + }, + "description": { + "value": "Que aunque a veces no podamos ver el sol, siempre esta ahi ☀️ #sunnyday #me #love #cute #live @… https://t.co/IzhsR1TXP6", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:17:50Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-f-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/10983665_636974963068653_1449906565_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/543322664811921408/anPKr5U5_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570503373830684700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 68.707422, + "lng": 15.407069 + }, + "type": "LatLng" + }, + "author": { + "value": "Håvard H- Wallstad", + "type": "String" + }, + "description": { + "value": "I was out running 5.26 km with #Endomondo #endorphins http://t.co/YakWtsqVDQ", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:39:38Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2263192154/webhavard_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "tweet:570516812212908000": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 69.375944, + "lng": 20.269105 + }, + "type": "LatLng" + }, + "author": { + "value": "Terje Bergli", + "type": "String" + }, + "description": { + "value": "Våkna opp til ferdig frokost...Daltons på sterodier :) @ Bjørnstua, Skibotn https://t.co/10MiMO0q2P", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:33:02Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-h-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10932612_1699788410248255_1920572845_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1180985520/41638_716340778_3859_n_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570502121587646460": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 61.12479, + "lng": 9.09373 + }, + "type": "LatLng" + }, + "author": { + "value": "Beitostölen Resort", + "type": "String" + }, + "description": { + "value": "Jadda, og i morra snør det igjen. Blir helga si det, minusgr og strålende forhold. Sees:) http://t.co/mnTMaOKoYy http://t.co/aodWL8HxK3", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:34:39Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rUp_FXIAANJe_.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/543770782552174592/xveHrtEP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570514904253403140": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 63.430216, + "lng": 10.39044 + }, + "type": "LatLng" + }, + "author": { + "value": "Ketil Granheim", + "type": "String" + }, + "description": { + "value": "@KroghL ser man det, ser man det 😂 http://t.co/D4wHK0iVPu", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:25:27Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rgSFxWsAA9Sxt.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/481539393367576576/LPLWo5Ch_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "1F98C7", + "type": "String" + }, + "streetview": { + "value": "13ad949ed854eef4cf26034729a12138adeb6c72.jpeg", + "type": "String" + } + } + }, + "tweet:570502674652770300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "ale najlepsze jest to że pada deszcz ile mi dane było czekać na taką pogode czuje się spełniona w dniu dzisiejszym", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:36:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570519769335636000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Mathias J. Johansen", + "type": "String" + }, + "description": { + "value": "Doing calf exercises make me feel like a hoarder. People don't like it when you take all the discs from 4 lifting stations. #gymproblems", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:44:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/481922604861648896/MNLPNYUg_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FA320F", + "type": "String" + } + } + }, + "tweet:570519954950393860": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.854659, + "lng": 5.725982 + }, + "type": "LatLng" + }, + "author": { + "value": "Victor Friberg", + "type": "String" + }, + "description": { + "value": "@OllGum Inte direkt att jag tröttnade, men mycket annat som gör att det blir hemåt mot vardagen. :)", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:45:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/529302375325257729/iNFyclND_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "89C9FA", + "type": "String" + }, + "streetview": { + "value": "5040caa201006b1d7c1ee551e2c7c4f937f98225.jpeg", + "type": "String" + } + } + }, + "tweet:570484921841655800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.962592, + "lng": 10.906224 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas Indrebø", + "type": "String" + }, + "description": { + "value": "@FratlandGallery @MrJDPhoenix @cockyboys @RAFAELALENCAR 2 of the hottest men in the industry!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:26:19Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000099358157/65173a420efa617dc05edfa5fbcd4360_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570510864194904060": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.92878, + "lng": 10.707937 + }, + "type": "LatLng" + }, + "author": { + "value": "Elise Husum", + "type": "String" + }, + "description": { + "value": "Ny mulighet i @Horisont2020 Fast track to innovation- kortere vei fra innovativ ide til marked, raskere behandlingstid @forskningsradet", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:09:24Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3337855398/35822c6e4eabf7872f6fcef995f9d821_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "9b7e7edb594966d50f724ba25ff8d951930a2f4f.jpeg", + "type": "String" + } + } + }, + "tweet:570510190723907600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.45864, + "lng": 5.270589 + }, + "type": "LatLng" + }, + "author": { + "value": "Marthe", + "type": "String" + }, + "description": { + "value": "But nvm", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:06:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/559161024088403970/3UAWrxZc_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570501669777244160": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "APTminer1 | Alex ", + "type": "String" + }, + "description": { + "value": "@a7x4lif3 I know, that's why I blocked her!", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:32:52Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/547809812226928640/TyNAzwor_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "000011", + "type": "String" + } + } + }, + "tweet:570499637221728260": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.934266, + "lng": 5.641012 + }, + "type": "LatLng" + }, + "author": { + "value": "Bharti", + "type": "String" + }, + "description": { + "value": "@TheRahulMahajan Don't be afraid of Change. You may end up losing something Good, but you will probably end up Gaining something much better", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:24:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568360445074210816/c0Gw0g8a_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "eb0cf0a9-796a-46e5-9353-b43d83a970fa": { + "type": "master:utmost:orange", + "properties": { + "location": { + "value": { + "lat": 59.95533256, + "lng": 10.79857349 + }, + "type": "LatLng" + }, + "description": { + "value": "This is a test", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + }, + "streetview": { + "value": "5ce2aaa6f3078cf94d4e699dc8c1204c9ee86bab.jpeg", + "type": "String" + } + } + }, + "tweet:570506212946653200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.074088, + "lng": 11.139967 + }, + "type": "LatLng" + }, + "author": { + "value": "Ingunn Ringvold", + "type": "String" + }, + "description": { + "value": "@kebabmedris 👌", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:50:55Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565069370934964224/mzHDF8Ey_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FF0000", + "type": "String" + }, + "streetview": { + "value": "ac0f61650215ecd47c08137e46fa3a1bab0bff05.jpeg", + "type": "String" + } + } + }, + "tweet:570496212912238600": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.912178, + "lng": 10.771691 + }, + "type": "LatLng" + }, + "author": { + "value": "Therese F. Mathisen", + "type": "String" + }, + "description": { + "value": "Sykt pen -hva er god helse? @vigdishvaal @Melk_no #frokostdebatt #kunnskapformidling #sosialemedier #påvirkningskraft http://t.co/OwOmf545MV", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:11:11Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rPRqbWkAAMlIe.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561231096973508609/1whKwTkV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "bd917a1a34ac59209401141637a73320c47f6a63.jpeg", + "type": "String" + } + } + }, + "tweet:570511280357957600": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.914363, + "lng": 10.74889 + }, + "type": "LatLng" + }, + "author": { + "value": "MartinePetra", + "type": "String" + }, + "description": { + "value": "#Kulturhuset 50s #dance night #Oslo #Tuesday #February #2015 #Norge #Norway #youngstorget @ Youngstorget https://t.co/PYCAqYc0qr", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:11:03Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-b-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10986226_1450927021864353_1048125910_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2441996400/5utbcafh715kwlyx1j72_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "E60E44", + "type": "String" + }, + "streetview": { + "value": "e25715304ec445a0075daa9960c33cf1d77e665d.jpeg", + "type": "String" + } + } + }, + "tweet:570494210991910900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.806981, + "lng": 5.672991 + }, + "type": "LatLng" + }, + "author": { + "value": "Ian Robinson", + "type": "String" + }, + "description": { + "value": "@IrelandsFarmers or the weekend 😉", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:03:13Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3267704515/7ec1d39325c308bd71c1fb0ce1bc1015_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "C8A86F", + "type": "String" + } + } + }, + "tweet:570493620773625860": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.193863, + "lng": 11.099088 + }, + "type": "LatLng" + }, + "author": { + "value": "marinov.ivan.miklos", + "type": "String" + }, + "description": { + "value": "I'm at Oslo Lufthavn (OSL) - @osloairport in Gardermoen, Akershus https://t.co/U9JFZeeTAk", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:00:53Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000055593472/dd05d8bb0ca5559b46a4590cec808856_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570522040651919360": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.836381, + "lng": 10.435193 + }, + "type": "LatLng" + }, + "author": { + "value": "Maya", + "type": "String" + }, + "description": { + "value": "@xitsmike you have the best taste in music. Can you please rec me some good bands?", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:53:48Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/548745829045895168/BQUlfyo7_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "61aacbd87fba125800917fee4ac0aa7deef13c61.jpeg", + "type": "String" + } + } + }, + "tweet:570511273051463700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.83588, + "lng": 10.435325 + }, + "type": "LatLng" + }, + "author": { + "value": "Iara Heidempergher", + "type": "String" + }, + "description": { + "value": "Grazie ai creatori di Stereomood che mi hanno permesso tramite sito e app di viaggiare nel musica. Buona fortuna! #ciaostereomood", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:11:01Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/515421144430563328/vvcr-7NM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + }, + "streetview": { + "value": "76638fda364cbab2190884834238d87d71165112.jpeg", + "type": "String" + } + } + }, + "tweet:570504525662048260": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.946227, + "lng": 10.710732 + }, + "type": "LatLng" + }, + "author": { + "value": "Juni", + "type": "String" + }, + "description": { + "value": "http://t.co/RFhHAa2OgX", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:44:13Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rW15sXIAANXyc.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/461199906666192896/veZstvG2_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + }, + "streetview": { + "value": "1cbe348aba2bb6add7c825291ba092f2859f9359.jpeg", + "type": "String" + } + } + }, + "tweet:570503287390273540": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "APTminer1 | Alex ", + "type": "String" + }, + "description": { + "value": "@a7x4lif3 yup :D. I freaking love it :D. I have even played thru the game ^^", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:39:17Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/547809812226928640/TyNAzwor_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "000011", + "type": "String" + } + } + }, + "tweet:570503013049233400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "chce tak bardzo już biegi dawać szatany mi 13:20 musze kogoś hejtować a jak na razie to mam taką możliwość włączając ukrytą prawde", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:38:12Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570522224601501700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Roar Ulvestad", + "type": "String" + }, + "description": { + "value": "http://t.co/2fu8WOK4ym\n\nHelsing avalfabetisert skjermape", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:54:32Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/530792117593833472/uazVs1az_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + }, + "streetview": { + "value": "2a2cc3a3875237ee8f2bb41e54b6362f4dd60ca2.jpeg", + "type": "String" + } + } + }, + "tweet:570485683892174850": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 67.286171, + "lng": 14.728843 + }, + "type": "LatLng" + }, + "author": { + "value": "Anders Haukland", + "type": "String" + }, + "description": { + "value": "Smøresjefen må ikke gjenta tabben fra i går! Løperne vil IKKE ha brie på matpakken, kun ekte geitost som gir kraftigere fraspark…", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:29:20Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1872042258/image_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "512aac8d72514e6759b795ae27a75c163ba29821.jpeg", + "type": "String" + } + } + }, + "tweet:570521985677180900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "APTminer1 | Alex ", + "type": "String" + }, + "description": { + "value": "O_o. my twitter just followed a spam user! me feed was spammed too the max!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:53:35Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/547809812226928640/TyNAzwor_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "000011", + "type": "String" + } + } + }, + "tweet:570519750557757440": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "Na pytanie o to czy pójdzie do rolników #PBK mówi \"byłem na Śląsku\" rozmawiałem z górnikami i dalej o tym jak to rozmawiał ze związkami #PR1", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:44:42Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "tweet:570511255645126660": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.427479, + "lng": 10.369286 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas", + "type": "String" + }, + "description": { + "value": "@MatsDawg haha, synger det med melodien fra Intro på Daogen seff! Passer perfekt!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:10:57Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/563686666012205056/LYV3CVfF_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + }, + "streetview": { + "value": "ca173c13e817e02dc7f0aa3d93e48b34c4d79821.jpeg", + "type": "String" + } + } + }, + "tweet:570497626115698700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Flåten", + "type": "String" + }, + "description": { + "value": "St.Clause:Alltid vær klar for å takle psykiske skrullinger fra både naboer eller kommunalt ansatte.Noen som ikke er i fengsel,kan gå fri???", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:16:48Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/254817315/St_Clause_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "9D582E", + "type": "String" + } + } + }, + "tweet:570511230940491800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.356038, + "lng": 5.292505 + }, + "type": "LatLng" + }, + "author": { + "value": "Lise Arnesen", + "type": "String" + }, + "description": { + "value": "Spontaneous getaways... Pure happiness!✈️🇫🇷\n#paris #France #spontaneous #EiffelTower #frenchmacaroons http://t.co/Z3wegckuAS", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:10:51Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rc74BWwAAvcML.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570510181198667777/3vKCx3mi_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "d1075e9661e050bfdff11fb0ddf31e7e906e5f20.jpeg", + "type": "String" + } + } + }, + "tweet:570487223000424450": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.47151, + "lng": 6.17293 + }, + "type": "LatLng" + }, + "author": { + "value": "Elias Øvregård", + "type": "String" + }, + "description": { + "value": "Liten trøst dem som får barn ødelagt utgjør bare ca.(usikkert) 0,005 prosent av de vaksinerte @CiViX. Derfor bør #vaksine-program fritt valg", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:35:27Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000747862053/8fbe3389568119fd8131910e8758cfb3_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "DD2E44", + "type": "String" + } + } + }, + "tweet:570519662095687700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "@JasonCopland Point! I'm Norwegian so I don't have enemies either, just bots....", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:44:21Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "tweet:570499466190577660": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Veronica S", + "type": "String" + }, + "description": { + "value": "@charleskfan83 my favorite line EVER", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:24:06Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565543155916103681/vVe7YYS1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "8A0B8A", + "type": "String" + } + } + }, + "tweet:570496629456834560": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.97101, + "lng": 5.73064 + }, + "type": "LatLng" + }, + "author": { + "value": "Thor Bjarne Bore", + "type": "String" + }, + "description": { + "value": "\"Oljefondet til fattige\" ? Jesus sa knapt noe om homofili og kvinnelige prester, men mye om forbruk og eiendom http://t.co/LdpM5sYogP", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:12:50Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/459261419964231680/0Eiu1Kzl_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570501743538270200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Vesle Nusse", + "type": "String" + }, + "description": { + "value": "@Stereolife @JarlWaage Tenk om meisterskapen er fiksa på førehand, at det var bestemt at Kalla skulle få dette eine gullet.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:33:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/553287492867088384/he6cUbMB_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570504280081199100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "Did you know that 'Rune Velta' was Trending Topic on Tuesday 24 for 6 hours in Norway? http://t.co/HPpeAZ2ODq #trndnl", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:43:14Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "8f6d9265-1659-4fd5-bcb8-c3fb4513a0ba": { + "type": "master:utmost:almost", + "properties": { + "location": { + "value": { + "lat": 59.90314344, + "lng": 10.77347875 + }, + "type": "LatLng" + }, + "description": { + "value": "Il faut faire attention", + "type": "String" + }, + "name": { + "value": "Bike near miss", + "type": "String" + }, + "_utmostIcon": { + "value": "almost-bike", + "type": "String" + }, + "streetview": { + "value": "c405b63a50660a313adad16851988ccb4aa05494.jpeg", + "type": "String" + } + } + }, + "tweet:570500151565000700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.910779, + "lng": 10.732104 + }, + "type": "LatLng" + }, + "author": { + "value": "Бандурка Елена", + "type": "String" + }, + "description": { + "value": "I'm at Oya International - Fjord Cruise in Oslo https://t.co/dqpakwMfGh", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:26:50Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/462734289604739072/QO5PtV8J_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570511225752330240": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Jarl Wåge", + "type": "String" + }, + "description": { + "value": "@arnulfgrut Håper nokon har tenkt å spørre han. Viktig med kunnskap om det lille under.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:10:50Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/412930209826877441/9Ko7z0_p_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570513411236343800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.374527, + "lng": 10.338317 + }, + "type": "LatLng" + }, + "author": { + "value": "Linnsky", + "type": "String" + }, + "description": { + "value": "\"Trondhjemmere får færre barn\" \n\n-skråvvå kjærring,det e det indre som tælle!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:19:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569190525820219392/qLJNWJ1o_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "020F14", + "type": "String" + }, + "streetview": { + "value": "e91e69f9c12c881976a87ea1d41b232a755f79a6.jpeg", + "type": "String" + } + } + }, + "tweet:570492096009924600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.437972, + "lng": 10.639525 + }, + "type": "LatLng" + }, + "author": { + "value": "Marte Skei Jacobsen", + "type": "String" + }, + "description": { + "value": "Er så jævlig skummelt hvordan noe kan gå fra å være helt fantastisk til å bli så sinnsykt vanskelig på bare noen minutter", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:54:49Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/555294061570314240/QX5MmeeM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "038543", + "type": "String" + }, + "streetview": { + "value": "64b7411e183521bae5c73057e55ebdbc027ee917.jpeg", + "type": "String" + } + } + }, + "tweet:570490340924391400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Alistair MacRae", + "type": "String" + }, + "description": { + "value": "@JenTheJudge Woop Woop... My day is getting better already", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:47:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/564911515036180480/vx2PbeBT_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570518213248868350": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.91442, + "lng": 10.757633 + }, + "type": "LatLng" + }, + "author": { + "value": "Andrei Pavlov", + "type": "String" + }, + "description": { + "value": "@PetruchoGrek 1:1, ничья.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:38:36Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/509374891804471297/pEJ6kPyI_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "c1389e5d958d284c9f65ed236bad5baa0288e76a.jpeg", + "type": "String" + } + } + }, + "tweet:570494732645871600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "Zgadzanie się z kimś w 100 proc. zawsze wydaje mi się podejrzane, ale dzisiaj muszę zgodzić się z @tterlikowski i jego tekstem w Gazecie P.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:05:18Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "tweet:570508376766943200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.913869, + "lng": 10.752245 + }, + "type": "LatLng" + }, + "author": { + "value": "VMware Jobs", + "type": "String" + }, + "description": { + "value": "#Oslo #Sales #Job: Account Executive, SDDC Network & Security at VMware http://t.co/Rfpr0svuAb #salesjobs #Jobs #TweetMyJobs", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:59:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000772289935/b3ae6194419e750db17c91100e848c1f_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570491879307026400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.910106, + "lng": 10.724989 + }, + "type": "LatLng" + }, + "author": { + "value": "Hans-Petter N-Hansen", + "type": "String" + }, + "description": { + "value": "@urke Den litt lengre er: Samling av IT-komponenter i en enkelt, optimalisert og pakketert løsning.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:53:57Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562329672713662464/vNeJqE4g_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "419c4f114c66ad4026a6e755ba1555935f1cc7c6.jpeg", + "type": "String" + } + } + }, + "tweet:570510172168294400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.835879, + "lng": 10.435328 + }, + "type": "LatLng" + }, + "author": { + "value": "Iara Heidempergher", + "type": "String" + }, + "description": { + "value": "@Stereomood i Just received your email. Please do not close please.. #ciaostereomood", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:06:39Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/515421144430563328/vvcr-7NM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + }, + "streetview": { + "value": "6be9f2940397adaa014d0a678bab19ec132cb761.jpeg", + "type": "String" + } + } + }, + "be729662-3bda-426c-9583-3b7960b92b57": { + "type": "master:utmost:risk", + "properties": { + "location": { + "value": { + "lat": 59.77787394, + "lng": 10.63734055 + }, + "type": "LatLng" + }, + "description": { + "value": "auirsetauinrest", + "type": "String" + }, + "date": { + "value": "2015-02-05T08:28:35.783Z", + "type": "DateTime" + }, + "url": { + "value": "https://master-bridge.eu/medias/7d15f71b4128dcedb8f8170178ca08be39d13c05.png", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570521831079346200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.3201, + "lng": 9.09323 + }, + "type": "LatLng" + }, + "author": { + "value": "Frode Fredriksen", + "type": "String" + }, + "description": { + "value": "Interessant fra @utdanningno: Hvor gode jobbmuligheter gir utdanningene? http://t.co/MZHO3g5fma", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:52:58Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/472677614264389632/bLBXM_nr_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570487138481004540": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.925371, + "lng": 10.727719 + }, + "type": "LatLng" + }, + "author": { + "value": "Ivens Solstad", + "type": "String" + }, + "description": { + "value": "Hei guys, what should i call this deliciousness I made today?🙈😍\nI wanna hear what your suggestions… https://t.co/P9ettzC5Jh", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:35:07Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-h-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/10983659_345021992375431_688266780_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/533193979081150464/TMGOHGOn_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "ABB8C2", + "type": "String" + }, + "streetview": { + "value": "25d6edfa4e58d149841ef3aa55724e2d0f9dfea7.jpeg", + "type": "String" + } + } + }, + "tweet:570487112132366340": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.962576, + "lng": 10.906236 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas Indrebø", + "type": "String" + }, + "description": { + "value": "@MrJDPhoenix looks hot!!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:35:01Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000099358157/65173a420efa617dc05edfa5fbcd4360_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "6cb6468ecede15ddc82e4b01d76a0c3e5af73479.jpeg", + "type": "String" + } + } + }, + "tweet:570500521745911800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.119551, + "lng": 11.387884 + }, + "type": "LatLng" + }, + "author": { + "value": "Simon Aulén", + "type": "String" + }, + "description": { + "value": "Utmana mig i #quizkampen ! Lägg till simonaulen", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:28:18Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/557488186830897152/AMff8cqs_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "74bc9435cc1beaa92245bc60e7d036962ac8743a.jpeg", + "type": "String" + } + } + }, + "tweet:570496690660216800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.925265, + "lng": 10.716653 + }, + "type": "LatLng" + }, + "author": { + "value": "RuddyMental", + "type": "String" + }, + "description": { + "value": "It took me years to become fully aware of this. It also requires a big continuous effort to let go… https://t.co/0dc6KQvfc2", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:13:05Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-g-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/10932557_1618517521716342_1045383502_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562185385623949312/J-dKSemN_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + }, + "streetview": { + "value": "283cac3081c10e20492e50d72b20a8f4132dacf8.jpeg", + "type": "String" + } + } + }, + "tweet:570493567241756700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.97101, + "lng": 5.73064 + }, + "type": "LatLng" + }, + "author": { + "value": "Thor Bjarne Bore", + "type": "String" + }, + "description": { + "value": "\"Venstresiden går lengst i å foreslå nye forbud, påbud og økte avgifter for å regulere folks livsstil\" http://t.co/P6HpVsgvq6", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:00:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/459261419964231680/0Eiu1Kzl_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570521755753848800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.931023, + "lng": 10.843653 + }, + "type": "LatLng" + }, + "author": { + "value": "Emily Victoria", + "type": "String" + }, + "description": { + "value": "@babyhaim @edwarddroste that's what my Chinese teacher makes us do when we do a good job", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:52:41Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/505345041158897664/pHU0gz6S_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + } + } + }, + "tweet:570502969361375200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Vesle Nusse", + "type": "String" + }, + "description": { + "value": "@Stereolife @JarlWaage Stemmer. Ein av dei styggare til no i år.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:38:01Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/553287492867088384/he6cUbMB_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570502630620979200": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 67.26423, + "lng": 15.38742 + }, + "type": "LatLng" + }, + "author": { + "value": "Tor Håkon Bjørnli", + "type": "String" + }, + "description": { + "value": "@NatGeo @NRKNordland here's a pic of the sunset at my home this morning, just above the Arctic Circle http://t.co/jpS74OrSvD", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:36:41Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rVHnJUAAA4kHb.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506720265141637120/F59AU3OW_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570502589806194700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "nie kontrolowałam rano swoich czynności i tak szybko weszłam do łazienki jebłam głowe do wanny i sobie włosy umyłam to było piękne", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:36:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-2500": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93757447, + "lng": 10.78485131 + }, + "type": "LatLng" + }, + "description": { + "value": "Under ring 3 tvinges syklister til å kjøre mot rødt lys. Når man kommer fra Hans Nielsen Hauges gate og skal under brua og til venstre opp Kjelsåsveien, gis det ikke grønt lys for syklist, samme hvor lenge man venter. Antakelig er det en sensor som styrer lysene, og som bare slår ut om det kommer biler.", + "type": "String" + }, + "date": { + "value": "2014-12-01T10:25:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "dde3bcd1e6e71e4ab57cd09446eab7348a213364.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2499": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92547417, + "lng": 10.72261333 + }, + "type": "LatLng" + }, + "description": { + "value": "Inget sykkelfelt!? Bogstadveien er nettopp bygget om men man gjorde parkeringsplasser istedet for sykkelvei???? Otroligt! Var morgon er det en nesten olykke da man som syklist blir klemt mellom høy holdplass kant til trikken og trikkeskinner og stressade bilister.", + "type": "String" + }, + "date": { + "value": "2014-12-01T07:49:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "fadb926ef677a83f999759c046a348dfbbd7c0e3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2498": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93467746, + "lng": 10.69690704 + }, + "type": "LatLng" + }, + "description": { + "value": "Her på sørkedalsveien må syklister og fotgjenger (mange barn som ska med t-banen til skole) få plass på fortauet. Jeg kom ut fra Tuengen alle, på fortauet og syklisten kom nedifra majorstuen. Jag såg åt andre hållet da jag gikk rett inn i honom og han fallt ut i sørkedalsveien. Han hade hell da ingen bil kom akkurat da.", + "type": "String" + }, + "date": { + "value": "2014-12-01T07:44:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "33b7c50ec803faa8ef75654bcfa180fd9e5d6567.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2497": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92880744, + "lng": 10.71523189 + }, + "type": "LatLng" + }, + "description": { + "value": "Inget sykkelfelt. Var morgon må jag ligge mitt i veien for å ikke bli klemt mellom bil og fortaukant.", + "type": "String" + }, + "date": { + "value": "2014-12-01T07:37:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "393a0a7754086d99cb38f53fbf630fde87ed32dd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2496": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91672546, + "lng": 10.74851274 + }, + "type": "LatLng" + }, + "description": { + "value": "På grunn av dårlig synlig skilting kommer stadig biler og sykler mot kjøreretningen over Hammersborg torg. Særlig gjelder det trafikanter som kommer ned Grubbegata og tar første til venstre, uten å se skilt om påbudt kjørefelt.", + "type": "String" + }, + "date": { + "value": "2014-11-27T13:06:29Z", + "type": "DateTime" + }, + "bilde": { + "value": "0a5d9bc9aeeb0346e5186b431c72ac3b.jpg", + "type": "String" + }, + "streetview": { + "value": "7be19393f3d1faa50c2902727dae3363404a40ab.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2495": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91955412, + "lng": 10.76521754 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av taxi som mente at jeg burde ha syklet på fortauet! Lag sykkelvel i Trondheimsveien nå!", + "type": "String" + }, + "date": { + "value": "2014-11-21T11:48:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "16a4befbd98eff25f48a3dba59062cba9d5a411c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2494": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91865069, + "lng": 10.75738549 + }, + "type": "LatLng" + }, + "description": { + "value": "For å bruke sykkelveien fra Ankerbrua til Olav Ryes plass må man sykle mot innkjøring forbudt fem forskjellige steder. Det er ikke skiltet unntak for sykkel, selv om merking av sykkelvei med piler tydelig viser at det skal gå trafikk i denne retingen. Motstridende skilting og merking som dette lærer opp syklister til at det er ok å bryte trafikkreglene.", + "type": "String" + }, + "date": { + "value": "2014-11-18T10:02:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "63827d1c627ea4065e6a6616f51dd7379a0e4824.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2493": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91827964, + "lng": 10.74762225 + }, + "type": "LatLng" + }, + "description": { + "value": "Når det regner samler det seg en stor og dyp dam på den ene siden av veien. Syklister som kommer fra krysset Fredensborgveien / Thor Olsens gate tvinges over i feil kjørefelt.", + "type": "String" + }, + "date": { + "value": "2014-11-18T09:29:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "ee2c6e5bdc9492f9168bcd5e4b379da4eb1c6cf1.jpeg", + "type": "String" + } + } + }, + "aftenposten-2492": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91171824, + "lng": 10.82408666 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset Fyrstikkbakken-Nils Hansens vei er en utfordring for bilister som kommer østover når det kommer syklister i mot fra Fyrstikkbakken. Gang på gang ser ikke bilister meg når de skal til venstre og jeg kommer i mot. Omtrent alle biler skal til venstre her (som vist på vedlage bilde). Veien har for stor trafikk til å være lagt gjennom et industriområde på denne måten. Bedre merking hadde hjulpet, og å gjøre om Nils Hansens vei til en forkjørsvei ville vært bedre for alle. Syklister må uansett stoppe nesten helt opp for å se til høyre når de kommer nedover Fyrstikkbakken", + "type": "String" + }, + "date": { + "value": "2014-11-17T17:03:43Z", + "type": "DateTime" + }, + "bilde": { + "value": "16eb6456c87fc1e6472c9a4838980363.jpg", + "type": "String" + }, + "streetview": { + "value": "d191e96d0fd5f1483cd018b5bb4255a7efae52ba.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2491": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91773111, + "lng": 10.75486421 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye løv som samler seg i sykkelfeltet, gir glatt og farlig underlag.", + "type": "String" + }, + "date": { + "value": "2014-11-17T10:06:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "509e7d6d06080655bc69ed74d8a47b21f97c43ff.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2490": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91301449, + "lng": 10.74126005 + }, + "type": "LatLng" + }, + "description": { + "value": "Bommen som sperrer Akersgata forbi Stortinget gir ikke plass til passering med sykkel og man må opp på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-11-17T10:05:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "68285310a8c697b0c72bd00046844038cbf4d86f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2489": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91477322, + "lng": 10.74345946 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelruta ned Ullevålsveien og Akersgata ender her i retning MOT enveiskjøring for syklister i retning sentrum.", + "type": "String" + }, + "date": { + "value": "2014-11-17T10:04:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "9da5a57b3e23d893094d2198dd6c457a592953f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2488": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91603708, + "lng": 10.74454307 + }, + "type": "LatLng" + }, + "description": { + "value": "Passasjen mellom betongblokkene foran regjeringskvartalet er for trang, vanskelig og farlig passasje, umulig med sykkelvogn.", + "type": "String" + }, + "date": { + "value": "2014-11-17T10:00:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "70cc136a86e0423d0866320be0bb62cfe0ac2ebf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2487": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90497263, + "lng": 10.59940338 + }, + "type": "LatLng" + }, + "description": { + "value": "12.11.14 på vei hjem fra arbeid filmet jeg (ja, jeg er en syklist med kamera på hjelmen) en kassebil som stoppet med nødblink hvor passasjer løp ut av bil og prøvde å slå ned passerende syklist på fortau. Så ikke forløpet til episoden.", + "type": "String" + }, + "date": { + "value": "2014-11-14T22:11:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "d5640675bc000ae591e18145489c083a68fcf63a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2486": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90732891, + "lng": 10.81907629 + }, + "type": "LatLng" + }, + "description": { + "value": "Innsnevring av sykkelfelt ( Hvis det er det det er ) mot rundkjøring. Biler og syklister må \"plutselig\" flette. Farlige situasjoner oppstår", + "type": "String" + }, + "date": { + "value": "2014-11-14T09:41:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "4559ccaacecf7112dfdfc0657897d190c3369ec0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2485": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92672687, + "lng": 10.75269699 + }, + "type": "LatLng" + }, + "description": { + "value": "Har sett mye aggressiv sykling her og observert tre ulykker: to hvor syklist kjørte på fotgjenger og en hvor syklist kjørte på hund.", + "type": "String" + }, + "date": { + "value": "2014-11-14T04:23:01Z", + "type": "DateTime" + } + } + }, + "aftenposten-2484": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92247395, + "lng": 10.75447797 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister på vei ned langs siloen kræsjer mot syklister som kommer inn der gangveiene møtes", + "type": "String" + }, + "date": { + "value": "2014-11-14T04:22:56Z", + "type": "DateTime" + } + } + }, + "aftenposten-2483": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92672687, + "lng": 10.75269699 + }, + "type": "LatLng" + }, + "description": { + "value": "Har sett mye aggressiv sykling her og observert tre ulykker: to hvor syklist kjørte på fotgjenger og en hvor syklist kjørte på hund.", + "type": "String" + }, + "date": { + "value": "2014-11-14T04:20:46Z", + "type": "DateTime" + } + } + }, + "aftenposten-2482": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92247395, + "lng": 10.75447797 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister på vei ned langs siloen kræsjer mot syklister som kommer inn der gangveiene møtes", + "type": "String" + }, + "date": { + "value": "2014-11-14T04:16:47Z", + "type": "DateTime" + } + } + }, + "aftenposten-2481": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92646343, + "lng": 10.77672958 + }, + "type": "LatLng" + }, + "description": { + "value": "Carl Berner gir umulig fremkomst for syklister.", + "type": "String" + }, + "date": { + "value": "2014-11-14T04:11:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "e32fd77f851fd8b342de0a4f8a2b145cf2da3728.jpeg", + "type": "String" + } + } + }, + "aftenposten-2480": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93095775, + "lng": 10.79114913 + }, + "type": "LatLng" + }, + "description": { + "value": "En rekke parkeringslommer inntil sykkelvei. Når parkert bilist åpner dør/ går ut og inn av bil /står /går i sykkelveier oppstart ofte nesten-ulykker hvor syklist er tvunget til å svinge brått ut i bilvei for å unngå å kræsje.", + "type": "String" + }, + "date": { + "value": "2014-11-14T04:09:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "6f22c77150baaba44d2798f5ddbe7d94fcbd0a0b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2479": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93173183, + "lng": 10.78844547 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei til stadighet blokkert av bilister, kryss hvor bilister kjører fort / mangler oversikt.", + "type": "String" + }, + "date": { + "value": "2014-11-14T04:05:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "4455a5008ad3dfcd9d886b6e36be40209b9faef0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2478": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93089324, + "lng": 10.74651718 + }, + "type": "LatLng" + }, + "description": { + "value": "Colletts gate mellom Geitmyrsveien og Uelands gate er skummel. Mørkt og uoversiktlig med mange gateparkerte biler og ingen tilrettelegging for sykkel. Høy hastighet og ekle forbikjøringer før lyskrysset ved Uelands gate.", + "type": "String" + }, + "date": { + "value": "2014-11-13T20:18:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "9500c06f6436e92c77cb13246c7ed6b9c80668a5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2477": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9110943, + "lng": 10.77209472 + }, + "type": "LatLng" + }, + "description": { + "value": "Mørk og våt vei. Veien er også smal når to biler skal passere. Holdt på å bli påkjørt av bil som kom bakfra i stor fart.", + "type": "String" + }, + "date": { + "value": "2014-11-10T20:49:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "be5a041c156159166c19816e78b36eec1405836e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2476": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91293381, + "lng": 10.8198595 + }, + "type": "LatLng" + }, + "description": { + "value": "Mellom rundkjøringen i Ole Deviksvei og avkjøringen til Ring3 er det smalt og jeg opplever daglig at bilister som skal ned på Ring3 presser meg mot kanten og nærmest kaster bilen inn foran meg og ned påkjørselen til Ring3. Her bør det etableres et skikkelig markert sykkelfelt hele veien og videre langs Østre Gravlund og frem til Helsfyr.", + "type": "String" + }, + "date": { + "value": "2014-11-10T12:10:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "cf868aa71d322409a99685e623d6b97983aeca2e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2475": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91179354, + "lng": 10.73992967 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelsti noe sted, mye trikkespor og mye fotgjengere som kjefter hvis man sykler på fortauet. I tilegg er det mye trafikk (buss og trikk), og vanskelig å manøvrere unna.", + "type": "String" + }, + "date": { + "value": "2014-11-07T19:18:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "c1c0ba6067ccfb126df520cce702614cfe47bc30.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2474": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89850545, + "lng": 10.83097457 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei inn i rundkjøringen kommer ofte biler raskt bakfra, passerer syklisten, og bremser kraftig umiddelbart før og i rundkjøringen. Legg deg midt i veien på vei inn i rundkjøringa, men vær oppmerksom på at du da kan bli meid ned bakfra.", + "type": "String" + }, + "date": { + "value": "2014-11-07T07:45:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "1d55eef97caf73d12c6b8988b590e3c11552a9de.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2473": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.86181997, + "lng": 10.82213401 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei ned bakken til E6/E18 kommer tre veier inn fra høyre. De har syklisten vikeplikt for samtidig med at trillefart er 40-50 km/t. Sykkelfelt plasserer syklisten til venstre på veien, slik at både syklistens og bilistens oversikt og tilgjengelige tid for reaksjon blir minimal. Veien bør gjøres til forkjørsvei.", + "type": "String" + }, + "date": { + "value": "2014-11-07T07:38:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "e2dfcd13baa7fdc84dc78bcc2a5ab1e02de7b1d8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2472": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91564448, + "lng": 10.73724746 + }, + "type": "LatLng" + }, + "description": { + "value": "I krysset Universitetsgata og Kristian IVs gate sykler svært mange syklister på rødt, særlig de som skal rett frem i Kristian IV gate. Må bremse ned og se meg ekstra godt for her, kan ikke stole på at det er trygt å sykle selv om det er grønt lys.", + "type": "String" + }, + "date": { + "value": "2014-11-06T23:16:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "17de73640fe221e4df2155d60b6d78a38c72d98d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2471": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91975846, + "lng": 10.75738549 + }, + "type": "LatLng" + }, + "description": { + "value": "Markveien har sykkelvei mellom Ankerbrua og Olaf Ryes plass, men manglende merking gjør at gående tar den for en del av fortauet. Til tider er sykkelveien så full av gående at syklister må bruke veien.", + "type": "String" + }, + "date": { + "value": "2014-11-06T12:20:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "017bd3d851e10e941efd6cf38ef1a2ed688252bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2470": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92724837, + "lng": 10.76493859 + }, + "type": "LatLng" + }, + "description": { + "value": "Østgående sykkelfelt i Schleppegrells gate er i elendig forfatning. Merkingen er dessuten nesten helt slitt bort.", + "type": "String" + }, + "date": { + "value": "2014-11-06T11:43:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "c9c8cbf5501bcd237eb5db2d4f38b3880a551556.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2469": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91306289, + "lng": 10.7463026 + }, + "type": "LatLng" + }, + "description": { + "value": "I gågate er det i følge trafikkreglene ulovlig å holde hastighet over gangfart. Så lenge det ikke finnes egen tilrettelegging for sykkel, er nederste del av Torggata fullstendig uegnet som sykkeltrasé.", + "type": "String" + }, + "date": { + "value": "2014-11-06T11:41:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "7bac9551a98b5b4922d473e25c161796708bbca4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2468": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91188498, + "lng": 10.73438286 + }, + "type": "LatLng" + }, + "description": { + "value": "Skiltet sykkelrute går mot trafikken i enveiskjørt gate. Ingen skilt som varsler syklende om at Hieronymus Heyerdahls gate er enveiskjørt når man kommer inn fra Rådhusplassen.", + "type": "String" + }, + "date": { + "value": "2014-11-06T10:58:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "b47850aa4a94734d951cc3d300e8c68064ccd623.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2467": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91478397, + "lng": 10.75402736 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig trangt - skummelt å sykle med tanke på trikk etc og mange mennesker", + "type": "String" + }, + "date": { + "value": "2014-11-06T09:42:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "3e9228f3c760d5816f851001bb81019194414538.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2466": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93749385, + "lng": 10.68306684 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er lettere og nesten raskere å ta en omvei over Holmenkollen enn å prøve å overleve Smestad på sykkel. Vet aldri hvem jeg er når jeg sykler her. Er jeg fotgjenger, syklist eller t-bane? Forferdelig!!", + "type": "String" + }, + "date": { + "value": "2014-11-06T08:40:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "12fe39f6cd2dd86706bae190bb141e47f89213fd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2465": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9464359, + "lng": 10.72265625 + }, + "type": "LatLng" + }, + "description": { + "value": "Ny vei for bilister, ingen ny vei for syklister. Syklister sykler nedover (fra vest til øst), kommer i svingen og har ingen oversikt over bilister. Bilister kjører hardt uten å se til høyre eller venstre. Veldig farlig.", + "type": "String" + }, + "date": { + "value": "2014-11-06T08:37:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "79d43371bba7cdb77aa34f8719047efd8a849e0a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2464": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94550634, + "lng": 10.777148 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange som parkerer i sykkelfeltet. Spesielt trailere. Dette gjør at veien blir veldig lite oversiktlig for syklister. Alternativet er å svinge opp på et fortau fullt av fotgjengere eller ut i en høyt traffikert vei.", + "type": "String" + }, + "date": { + "value": "2014-11-06T07:26:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "eab8001dec01db950e31a875c48184ed9e3801bc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2463": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9331993, + "lng": 10.77792048 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sikt oppover gang/sykkelvei når man kommer fra fotgjengerfeltet og skal krysse inn til parken. Vanskeligt å se om noen kommer i full fart ovenfra. Dette kan løses ved å senke betongklossene som er utplasert mot rundkjøringen samt å trimme vegitasjonen.", + "type": "String" + }, + "date": { + "value": "2014-11-06T07:24:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "12daaa49b595bc3da5216cf0324298b7b98c2b98.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2462": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93757984, + "lng": 10.7507658 + }, + "type": "LatLng" + }, + "description": { + "value": "Lett å komme på innsiden av bussen her. Har flere ganger opplevd at bussen bare kjører rett ut, uten å se meg. Dette gjelder på begge sider av veien.", + "type": "String" + }, + "date": { + "value": "2014-11-06T05:04:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "eb4c100a0d25d9a3465b361ce52bd5166dea6224.jpeg", + "type": "String" + } + } + }, + "aftenposten-2461": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92507631, + "lng": 10.73090672 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig skummelt kryss. Kaos med trikk, buss, bil, fotgjengere og spesielt syklister!", + "type": "String" + }, + "date": { + "value": "2014-11-05T20:51:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "d9fa7561eef867cddd5b9100b4d67dad4c84af12.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2460": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.911019, + "lng": 10.70467472 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig skummelt kumlokk rett i en sving.", + "type": "String" + }, + "date": { + "value": "2014-11-05T20:49:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "20fc427d546d222c99827ba7f9417612ac7f12fa.jpeg", + "type": "String" + } + } + }, + "aftenposten-2459": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9148065, + "lng": 10.7174147 + }, + "type": "LatLng" + }, + "description": { + "value": "Fått kjeft av både fotgjengere og bilister", + "type": "String" + }, + "date": { + "value": "2014-11-05T20:48:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "8352c8d4317d956ae34625bd4a98ce1a29a388c6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2458": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9616168, + "lng": 10.89717149 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig drenering i gang/sykkelvei, som gjør at veien halveres når det regner. I tillegg blir det en enorm vanndam i bilfila som gjør at en som syklist risikerer å bli nedspruta av bilister som ikke senker farten.", + "type": "String" + }, + "date": { + "value": "2014-11-04T13:26:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "51b72a37d94b8f3fa53146eb0d4652ec1c4ec685.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2457": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94286796, + "lng": 10.80891609 + }, + "type": "LatLng" + }, + "description": { + "value": "De som bor akkurat i svingen ned i undergangen her har noe busker som gjør svingen uoversiktlig. Svingen er krapp, busken er stor og burde klippes ved veldig jevne mellomrom.", + "type": "String" + }, + "date": { + "value": "2014-11-04T13:25:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "63dfbb6a5ed44e097f1f12280ebf8b55d23307f2.jpeg", + "type": "String" + } + } + }, + "aftenposten-2456": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96031708, + "lng": 10.89461803 + }, + "type": "LatLng" + }, + "description": { + "value": "Nylig bygget om og byttet plass på busskur og sykkelvei. Veldig bra, men bare sånn halvveis. Når man kommer nordfra så blir svingen rett etter busskuret alt for skarp. Man ser ikke rundt svingen. Mange syklister tar også snarveien og sykler rett over bussholdeplassen når de kommer nordfra, noe som skaper farlige situasjoner for møtende syklister.", + "type": "String" + }, + "date": { + "value": "2014-11-04T13:22:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "0d951699ab8affd4072e610fcf5285aeafe013bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2455": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94374924, + "lng": 10.81494569 + }, + "type": "LatLng" + }, + "description": { + "value": "Skolevei for mange små barn, så her kunne man med fordel skilt sykkelvei og gangvei, økt i bredden og tegnet tydelig i asfalten. Det er masse plass i bredden mellom gang/sykkelvei og skilleveggen ut mot rv4.", + "type": "String" + }, + "date": { + "value": "2014-11-04T13:15:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "1a45f3ba03883867c7e948576982bb5cd0b883bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2454": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94969184, + "lng": 10.73177576 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er to grunner til at jeg ønsker meg et gjerde mellom parkeringsplassen på Ullevål stadion og gang/sykkelveien. 1. Biler parkerer ofte slik at snuta eller baken på bilen går inn i gang/sykkelvei og gjør den smalere. Om det kommer en bil som gjør slik akkurat når en sykler forbi, så blir det skummelt. 2. Er folk som spurter for å rekke en buss. De tenker nok ikke over at de løper ut i en vei hvor det kommer folk på sykkel. Jeg har flere ganger nesten blitt løpt ned av folk som ikke ser seg for når de løper ut i veien.", + "type": "String" + }, + "date": { + "value": "2014-11-04T13:10:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "524996dda531e04a60aef858987160be8d4ad300.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2453": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94006816, + "lng": 10.78401446 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister som frakter utstyr til fotballtreninger og -kamper, kjører bil på stiene ved Muselunden. Særlig mye bilkjøring og parkering her når det er fotballturnering.", + "type": "String" + }, + "date": { + "value": "2014-11-04T09:28:14Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2452": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90977108, + "lng": 10.74136734 + }, + "type": "LatLng" + }, + "description": { + "value": "Elendig asfaltdekke, og for dårlig merking av sykkeldelen av gang- og sykkelveien. Fotgjengere bruker hele feltet, og blir overrasket om en syklist kommer forbi. Det ender derfor med at de fleste sykler i veien istedenfor. Ellers svært mye byggearbeid og containere i hele området her - skaper dårlig fremkommelighet.", + "type": "String" + }, + "date": { + "value": "2014-11-03T12:28:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "a26f725c9ed503c848dcd16cbd43e00a0c28835e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2451": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91086839, + "lng": 10.72566032 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister legger seg ut i veibanen i rundkjøringen her, og sykler mot kjøreretningen. For oss som sykler gang - og sykkelstien, skaper det farlige situasjoner, for bilister vet ikke helt hvor syklistene kommer fra.", + "type": "String" + }, + "date": { + "value": "2014-11-03T12:26:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "63051447f9997b1fcf2d52e95967145ec8253768.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2450": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92048441, + "lng": 10.6744194 + }, + "type": "LatLng" + }, + "description": { + "value": "Veiarbeidet på motorveien sluttet i august. Sykkelveien har vært stengt siden juli og er det fortsatt. Omsykling via Karenslyst Alle, mørklagt sykkelsti (de har tatt strømmen) og stadig nye løp som legges for syklistene, skaper svært farlige situasjoner ved krysningen av E18.", + "type": "String" + }, + "date": { + "value": "2014-11-03T12:25:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "e2d3864fd2b95a9256f1b4921da36372196d5eae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2449": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91121263, + "lng": 10.72621822 + }, + "type": "LatLng" + }, + "description": { + "value": "Slutt på sykkelsti, og til tider veiarbeid på begge sider av veien, med null sikt for syklister.", + "type": "String" + }, + "date": { + "value": "2014-11-03T12:23:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "473672d0f66bbb296808b8518d7b10216339b118.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2448": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84236726, + "lng": 10.79023461 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien vise ikke på kartet, men det går en gang/sykkelvei her fra Hallagerbakken Skole og under bilveien og møter gang og sykkelvei fra Sloråsen, ned mot fiskevollen. Veiene I krysset er bratte og uoversiktelig. Nå på høsten er det glatt her pga mye våte blader på asfalten.", + "type": "String" + }, + "date": { + "value": "2014-11-03T12:05:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "d1a9c2b492e21599f3fbcbfaea5ce6ffec956bcb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2447": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92392571, + "lng": 10.71510314 + }, + "type": "LatLng" + }, + "description": { + "value": "trangt, mellom bil og trikk og ikke tatt hensyn til syklister", + "type": "String" + }, + "date": { + "value": "2014-11-03T10:16:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "c468b96a6d169f98aa9b5617fa677888925674ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2446": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9416098, + "lng": 10.79967041 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister får en vanvittig fart nedover nedover denne kombinerte gang- og sykkelveien. Det er livsfarlig å være fotgjenger her med den farten syklistene holder. Lenger ned er det separat sykkelvei og gangvei. Hvorfor er det ikke avgrensede felt også lenger ned hvor farten er høy? Trondeheimsveien er en motorvei for syklister, mange syklister med svært høy fart her. Fotgjengere må også få plass og føle seg trygge.", + "type": "String" + }, + "date": { + "value": "2014-11-02T20:31:33Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2445": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94486154, + "lng": 10.77723383 + }, + "type": "LatLng" + }, + "description": { + "value": "Meget dårlig vei. Ingen sykkelbane kombinert med trikk og mye trafikk gjør denne vei veldig farlig for alle som ferdes her.", + "type": "String" + }, + "date": { + "value": "2014-11-02T08:12:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "c639dbd4d9a97fd6c1d1a29da89f1dc7328a2868.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2444": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94868178, + "lng": 10.60614109 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist påkjørt ved krysning av vei. Syklisten hadde nesten krysset veien der gang-/sykkelsti slutter uten gangfelt eller annen mulighet for trygg krysning. Bakhjul påkjørt/klippet fra siden i høy hastighet. Syklist kastet i bakken med blåmerker på ankel ben og armer. Bil oppskrapet langs siden. Sykkelhjul bøyd hinsides reparasjon.", + "type": "String" + }, + "date": { + "value": "2014-10-31T17:54:13Z", + "type": "DateTime" + }, + "bilde": { + "value": "3441e68f7502fb4f9407dbe65f15bc1a.jpg", + "type": "String" + }, + "streetview": { + "value": "ed12c15c5d2323598af95c2e6f38ef4dd18c242c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2443": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9259258, + "lng": 10.67523479 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ofte farlig kjøring av bilier som skal forbi. Veien er her smal og oversikten er for dårlig til at det er forsvarlig å kjøre forbi på denne strekningen. Noen prøver seg likevel med alt for nære passeringer og nestenulykker som resultat.. Hoffsveien bør få nedsatt fartsgrense til 30 og fartsmodererende tiltak. Det bør også vurderes om det ikke bør stenges for gjennomkjøring i hoffsveien (Med unntak for buss) Det ville sannsynligvis hjulpet på trafikkavviklingen om bilene som kjører mellom skøyen/e18 og ring3 her heller hadde blitt tvunget til å velge en annen vei (ref: Braess paradoks)", + "type": "String" + }, + "date": { + "value": "2014-10-31T13:08:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "3b4289996785132984d05ca91216a092d9ee3fbc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2442": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91038967, + "lng": 10.73821306 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien nedover mot har ikke sykkelfelt, er smal, har en høy fortauskant som gjør det ubehagelig å sykle her. Bil og buss blir liggende bak deg helt ned til krysset Rådhusgata/Rosenkrantz\\\\' gate.", + "type": "String" + }, + "date": { + "value": "2014-10-31T07:28:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "8acf70cb302b964ba87ceb01d0e1bac38f2cbbb0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2441": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93007614, + "lng": 10.743438 + }, + "type": "LatLng" + }, + "description": { + "value": "GJelder syklister som kommer fra Geitmyrsveien og skal nedover Colletts Gate. Istedenfor å vente på grønt lys for å ta til høyre, sykler mange syklister opp på fortauet, tar til høyre og fortsetter nedover fortauet og ut på sykkelfeltet igjen lengre ned i Colletts Gate. Ekstra farlig med syklister på fortauet her pga mange skolebarn på fortauet som skal krysse veien for å gå inn i parken.", + "type": "String" + }, + "date": { + "value": "2014-10-31T07:14:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "93e6ee5025b2c2c96ada352ba12d81ab10fcf785.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2440": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91525725, + "lng": 10.75939178 + }, + "type": "LatLng" + }, + "description": { + "value": "Hausmannsgate og Nylandsveien er veldig trafikkerte gater. Begge veiene i seg selv, i tillegg til rundkjøringen som kobler disse to, er svart farlige for syklister. Det er to filer i begge retninger, men ingen sykkelskulder, og bilene gir ikke plass, presser syklister ut, og råkjører for å rekke lyskryss i begge veier. Jeg har vært utsatt for nesten-påkjørsler flere ganger - bare flaks at det ikke har gått galt så langt. I begge veiene er det midtrabatter med trær osv. Selv om det er hyggelig, må disse bort for å gjøre plass til sykkelfelt. Det er veldig mange som bruker denne traseen som inngangsårer til sentrumsjobber. Værsåsnill å hjelp oss å være trygge!", + "type": "String" + }, + "date": { + "value": "2014-10-30T08:01:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "ff267a874e923b4ae8d0c98c578afe0528b7d9ad.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2439": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92625376, + "lng": 10.73856711 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei ned mot sentrum stod en varebil parkert i sykkelfeltet. Signaliserte for å kunne kjøre forbi i bilfeltet, men bilen som lå i samme felt bak meg, økte farten for å komme forbi først. Ble da sperret inne og klarte ikke å stoppe grunnet noe glatt føre, og endte opp med å kjøre rett inn varebilen. Rakk å bremse ned noe, så skaden ble minimal på meg og varebilen. Skummelt når biler benytter sykkelfeltet til dobbeltparkering. Kunne vært unngått ved bedre merking.", + "type": "String" + }, + "date": { + "value": "2014-10-30T07:42:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "d8565a4a006433ae18020122e9dac479cf8a1b40.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2438": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93450546, + "lng": 10.74969291 + }, + "type": "LatLng" + }, + "description": { + "value": "Masse trafikk, magre sykkelfelt i ett med bilveien som spesielt bussene ikke respekterer, og sykkelveiene forsvinner når man kommer til en busstopp. Når man kommer til en busstopp samtidig som en buss virker det som bussjåførene omtrent er ute etter å kjøre deg ned. De viser ikke hensyn overhodet.", + "type": "String" + }, + "date": { + "value": "2014-10-30T06:49:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "cfa53ed977cbe47f3d52cc31f1fbd0e13214018b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2437": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92605483, + "lng": 10.72965145 + }, + "type": "LatLng" + }, + "description": { + "value": "Kirkeveien - Bislett", + "type": "String" + }, + "date": { + "value": "2014-10-29T18:51:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "2a7193b6ba7cdeef803fbb41f13184f9f06f782a.jpeg", + "type": "String" + } + } + }, + "aftenposten-2436": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94631231, + "lng": 10.76045393 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister tar ikke hensyn til sykkel i rundkjøring", + "type": "String" + }, + "date": { + "value": "2014-10-29T18:29:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "e76546d5045c8a0c3d03923c54924fb3a35b3614.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2435": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92476447, + "lng": 10.78119277 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er mange biler og busser som kjører her. Det burde bli sykelsti her. veldig mange sykelister sykler her hver dag.", + "type": "String" + }, + "date": { + "value": "2014-10-29T18:16:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "ffaa83396ef5037e5148ea9206a738fb16fa1bee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2434": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9467153, + "lng": 10.77321052 + }, + "type": "LatLng" + }, + "description": { + "value": "Generelt et meget kaotisk kryss, spesielt i rushtiden da både bilister, trikker, fotgjengere og syklister skal sluses igjennom den lille, rare rundkjøringen. Med kjøkkenvindu ut mot dette krysset, samt at jeg daglig ferdes her, ser jeg alt for ofte nestenulykker og farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-10-29T16:02:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "fb5c62ddb624c5afbe088bda5b33c65b288dcec4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2433": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90829719, + "lng": 10.75556159 + }, + "type": "LatLng" + }, + "description": { + "value": "Daglige nestenulykker. Busser kjører konsekvent tross rødt lys.", + "type": "String" + }, + "date": { + "value": "2014-10-29T15:05:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "654ebbb3d540c222e445b30f27dead4f94301178.jpeg", + "type": "String" + } + } + }, + "aftenposten-2432": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92048441, + "lng": 10.7284069 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjengere som krysser veier utenom fotgjenger overganger.", + "type": "String" + }, + "date": { + "value": "2014-10-26T10:36:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "39ea8775367f376f42de0c14f33e61a546d1baec.jpeg", + "type": "String" + } + } + }, + "aftenposten-2431": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94211564, + "lng": 10.75484275 + }, + "type": "LatLng" + }, + "description": { + "value": "Stavangergata . Fartsgrensa er 50 km/t, men midtrabatt og gateparkering gjør det for trangt til at en bil kan foreta en forsvarlig forbikjøring. Resultatet er utålmodige og aggressive bilister som tar sjanser. Legg til at Oslos største barnehage har inngang fra gata, med mange gående barn og foreldre som krysser veien og ferdes rundt parkerte biler, og du har oppskriften på en tragedie.", + "type": "String" + }, + "date": { + "value": "2014-10-24T13:28:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "d97f8e5e9391dd37a6b18a25aac0674b3c969f87.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2430": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92892571, + "lng": 10.71572542 + }, + "type": "LatLng" + }, + "description": { + "value": "skummelt å sykle i majorstuakrysset, da sykkelfeltet går inn i alle andre felt, og også inn i kollektivfeltet.", + "type": "String" + }, + "date": { + "value": "2014-10-24T08:43:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "1191cf5952ab45a48037e340d8557de84309f998.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2429": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90912559, + "lng": 10.82247734 + }, + "type": "LatLng" + }, + "description": { + "value": "Langs Jernbaneveien går det et fortau, men når veien nærmer seg Bryn er det brått stopp på fortauet. Her har fortauet nemlig blitt en parkeringsplass. Her må fotgjengere og syklister ut i en traffikert vei for å passere parkeringsplassen. Hvordan har noen funnet på å anlegge noe sånt?", + "type": "String" + }, + "date": { + "value": "2014-10-23T20:05:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "574d2e7248dfba7b37d80896d578b8d09bf1ca8a.jpeg", + "type": "String" + } + } + }, + "aftenposten-2428": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90807126, + "lng": 10.79295158 + }, + "type": "LatLng" + }, + "description": { + "value": "Ned fra Etterstadgata går det en sykkelvei forbi Vålerenga skole. Innkjøringen til sykkelveien er en parkeringsplass i Etterstadgata. Det gjør utkjøringen fra sykkelveien trang og farlig. Dette er en tåpelig løsning. Her har ingen tenkt!", + "type": "String" + }, + "date": { + "value": "2014-10-23T20:01:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "812c1c27ea062ca4fb77898d9a57732a2e491c8d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2427": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90669413, + "lng": 10.77788829 + }, + "type": "LatLng" + }, + "description": { + "value": "I dette krysset kjører mange busser ned i Schweigaardsgate. Syklistene sykler på innsiden av bussene i et sykkelfelt, men det er ikke sykkelfelt i Schweigaardsgate. Svingen er skarp og dersom en syklist sykler på innsiden av bussene i svingen, er det sto fare for å bli skadet. Her burde det plass til syklistene foran bussene i krysset.", + "type": "String" + }, + "date": { + "value": "2014-10-23T19:56:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "5ac136cbca7131fba44d8a31133c6e81580454e6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2426": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90871677, + "lng": 10.76776027 + }, + "type": "LatLng" + }, + "description": { + "value": "I Schweigaardsgate har det satt opp flere nye kontorbygg med mange arbeidsplasser - og potensielt mange som sykler til jobb. Jeg er en av dem som sykler her hver dag til jobb i Skatt øst. Schweigaardsgate er kaotisk med fire felt og trikkeskinner. I kaoset av biler og kollektivtransport er det ingen sykkelfelt. Det burde det vært tenkt på da det ble planlagt nye arbeidsplasser. I krysset Schweigaardsgate/Oslogate er det ubehagelig og sykle fordi det er et smalt felt mellom trikkeskinner, fortau og parkerte biler som syklistene må passere samtidig som vi blir forbikjørt av biler.", + "type": "String" + }, + "date": { + "value": "2014-10-23T19:49:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "83a759c8410c83a5e0e3622bcb7b9bf439e85b5e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2425": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93903631, + "lng": 10.78103184 + }, + "type": "LatLng" + }, + "description": { + "value": "I følge Bymiljøetaten er det gang- og sykkelvei i den østlige enden av Hans Nielsen Hauges gt. Hvor? Fortauet er eneste alternativ til kjørebanen, reell tilrettelegging for sykkel mangler.", + "type": "String" + }, + "date": { + "value": "2014-10-23T09:20:52Z", + "type": "DateTime" + }, + "bilde": { + "value": "f542036175f23f71ef7cdba02bfdcc9f.jpg", + "type": "String" + }, + "streetview": { + "value": "a4e7e3743d675bce6fea227b203f5fe2ac37d9c1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2424": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93212424, + "lng": 10.77265262 + }, + "type": "LatLng" + }, + "description": { + "value": "Store mengder dødt løv samler seg opp på gangveien om høsten. Gir glatt og farlig underlag på strekning der syklister som kommer ned bakkene holder høy fart.", + "type": "String" + }, + "date": { + "value": "2014-10-23T08:45:18Z", + "type": "DateTime" + } + } + }, + "aftenposten-2423": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.97438573, + "lng": 10.33272743 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler gang og sykkelsti. Mange sykler denne strekningen som treningsrunde i helgen og her er det mye trafikk, bla busser, trailere, campingbiler i stor fart som ikke tar hensyn", + "type": "String" + }, + "date": { + "value": "2014-10-22T18:53:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "aff4d0a682ad05d6b9f1f9938ab9024f523e6f5b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2422": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90785609, + "lng": 10.85075855 + }, + "type": "LatLng" + }, + "description": { + "value": "Hellerudveien er sperret med betongklosser her. Sykkelfelt i Hellerudveien slutter brått, fortsetter på fortauet og inn gjennom en åpning mellom klossene. Stor trafikk av syklende og gående skolebarn morgen/ettermiddag samt syklister som skal gjennom den trange passasjen på fortauet. I tillegg er det hyppig slurvete parkering som gjør det endra trangere i passasjen.", + "type": "String" + }, + "date": { + "value": "2014-10-21T18:15:45Z", + "type": "DateTime" + }, + "bilde": { + "value": "e365e4c014cbd14054a793a518c11608.jpg", + "type": "String" + }, + "streetview": { + "value": "a0f765ba64d62bb6ee9ad5b8e2af148969fac390.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2421": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9170804, + "lng": 10.75335144 + }, + "type": "LatLng" + }, + "description": { + "value": "Torggata som sykkelgata er en flott idé, men gjennomføringen står til stryk. Merking og skilting er alt for dårlig, og det er til tider håpløst å komme fram her med sykkel. Til tross for forbud mot motorkjøretøy kjører det alltid biler her. Samtidig tror fotgjengerne at det er gågate. Tydelig merking er nødvendig.", + "type": "String" + }, + "date": { + "value": "2014-10-21T13:54:43Z", + "type": "DateTime" + }, + "bilde": { + "value": "3042a254b8dde838ae4ddeae5590619f.jpg", + "type": "String" + }, + "streetview": { + "value": "b849cc08a34b0ebd2224d8cb7c279a076c691817.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2420": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91861305, + "lng": 10.7867074 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjenger(muligens hundeeier) dyttet til meg, da jeg passerte han på sykkel. Han hadde en provoserende fremtreden ved at han stilte seg i veien for meg uten noen spesiell grunn. Jeg var plassert til høyre for midten av gang-/sykkelveien. Heldigvis gikk det bra.", + "type": "String" + }, + "date": { + "value": "2014-10-21T08:41:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "743b8007acfb189d9e65e9a48e765dc928d71cbd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2419": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88816181, + "lng": 10.76994895 + }, + "type": "LatLng" + }, + "description": { + "value": "Problemet her er andre syklister som kjører veldig fort nedover Kongsveien. De sykler tett på meg og jeg skvetter. Kan ikke syklistene holde sin plass i køen bak meg og ikke ødelegge MIN sykkeltur? Trafikkreglene er til for å følges for at VI ALLE skal føle oss trygge på sykkel.", + "type": "String" + }, + "date": { + "value": "2014-10-21T06:00:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "45a1478480bd6ecdb3d194093ac5d3e96540d32c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2418": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91005079, + "lng": 10.74593782 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelen skled om vinteren på trikkeskinner som var dekket av snø. Pga. lav fart ble det ingen skade unntatt noen blåmerker. Etter hvert lærer en seg hvor trikkeskinnene går og kan sykle i vinkel over dem, selv om de er dekket av snø.", + "type": "String" + }, + "date": { + "value": "2014-10-20T15:41:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "3b6edf5969b7ba5960aacee1b518ccf6b7140460.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2417": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9204145, + "lng": 10.67579269 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet inn i gjerdet på høyre side for å unngå kollisjon med fotgjenger. Fotgjengeren lå litt til venstre i den 1.5 meter brede fortau/sykkelstien og endret til høyre side da jeg nærmet meg, så måtte kjøre inn i gjerdet for å unngå kollisjon. Dårlig skiltet gravearbeide. Heldigvis fikk jeg kun en liten skade i en finger på den ene hånden.", + "type": "String" + }, + "date": { + "value": "2014-10-20T15:27:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ede4bd3f6cb8d4ec4f7ab6059cee0866f48997d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2416": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9033156, + "lng": 10.62944412 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er 90 graders vinkel på sykkelveien langs sjøen fra Fornebu til/fra Oslo, ikke langt fra Umoe-porten. Dette skaper farlige situasjoner da en kommer lett ut i fotgjengerfeltet og om vinteren er det lett at sykkelen sklir på snøen og isen i den skarpe svingen.", + "type": "String" + }, + "date": { + "value": "2014-10-20T15:22:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "d5af4fa3b2a7e4dad9685db191968e16ab4567d4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2415": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90469288, + "lng": 10.63017368 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet på sykkelstien/gangveien ved Fornebuveien utenfor Radisson Blu Park hotell, som var humpete isvei, slik den er i perioder om vinteren. Trodde det skulle gå greit med piggdekk på sykkelen, men sykkelen skled og jeg falt på isen og fikk slått hofter, lår og bein, men heldigvis ingen brudd. Sykkelveien Fornebu-Oslo er vanligvis veldig godt ryddet på vinterstid av god innsatts fra brøyteberedskapen, unntatt akkurat dette strekket, derfor er det bedre å sykle hovedveien som er Fornebuveien.", + "type": "String" + }, + "date": { + "value": "2014-10-20T15:15:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "12719e9eb236b480980e2e750a8a3fdf0ae5bbb3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2414": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91418698, + "lng": 10.64670681 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet på sykkelstien ved E18 vei ut fra Oslo, god fart pga. nedoverbakke. Høye busker på høyre side dekket for utsikten til en bil i bilfeltet som kommer inn fra høyre og skal krysse sykkelstien. Ser bilen, hugger i bremsene og stopper i brostein-sonen før bilveien, tar en ufrivillig salto sammen med sykkelen, får slått lufta ut av meg, og må sitte i ro noen minutter. Ingen skader på bil eller sykkel, men Mac\\\\'en i sekken fikk en trøkk i chassisen.", + "type": "String" + }, + "date": { + "value": "2014-10-20T14:58:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "d2e34b4e5fc2a0243dd44e6f8bd0428e046dafb1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2413": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9320221, + "lng": 10.86118698 + }, + "type": "LatLng" + }, + "description": { + "value": "Når en sykler i tunellen under veien oppover mot Furuset Idrettspark, er det ikke sikt mot sykkelsti fra høyre rett etter tunellen og det vil lett komme til kollisjon mellom syklister.", + "type": "String" + }, + "date": { + "value": "2014-10-20T14:30:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "2c3d918b7e79ef29d0c626c7399bfe3ee7606572.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2412": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9111696, + "lng": 10.72790265 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler opp Dokkveien mellom skinnene i høyre trikkespor fra Aker brygge i 20-30 km/h for å komme til sykkelveien ved E18 som går bak Aker brygge. En hvit taxi kommer bak meg, legger seg i motgående felt og gir gass for å komme forbi, og kommer opp på siden av meg. En dame er på vei ut i fotgjengerfeltet fra midt i Dokkveien. Taxien er på kollisjonskurs med henne, men rekker akkurat å se henne og står på bremsen, rekker akkurat å stopper inne i fotgjengerfeltet.", + "type": "String" + }, + "date": { + "value": "2014-10-20T14:21:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "0e7cb7eec6aa34b09598043a5d4b04978443ebb5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2411": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95306564, + "lng": 10.76102256 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjengerovergang over kryss er ikke tilrettelegging for sykkel. Her blir det fort konflikt mellom bilister og syklister som trodde de bevegde seg på en sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-10-20T08:38:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "b91110370a83dc5482e0c39effa0efb6362957f3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2410": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91951648, + "lng": 10.76501369 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkeskinner, mange busser og annen trafikk gjør det umulig att sykle på den her gaten. Samtidig er det mange som jobber eller bor på trondheimsveien!", + "type": "String" + }, + "date": { + "value": "2014-10-20T07:33:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "d736e42c5da70ab7b6ff940b04cc0ad773527f0c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2409": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90580649, + "lng": 10.74380278 + }, + "type": "LatLng" + }, + "description": { + "value": "Området er sikkert blitt trygt for statsministeren med kraftige søyler i begge ender med minimal åpninger, sykkelstien har ennå ikke blitt rengjort, knust glass hestedritt (politihester luftes daglig) og stor trafikk av mer eller mindfre edru passasjerer til og fra Stenaline. Her er det sikkert brukt millioner på sikkerhet, men hva med vedlikeholdsrutiner?", + "type": "String" + }, + "date": { + "value": "2014-10-19T19:22:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "a7df317a5992f5ea8df75e0518b7e79db1fd8948.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2408": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92266215, + "lng": 10.67902207 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister svinger stadig inn i sykkelfeltet uten å se seg for! De skal jo tross alt svinge til høyer og kan fort tjene ett minutt med å kjøre forbi køa i sykkeltraséen. Ønsker at sykkeltraséen fra Hoff ti Skøyen blir markert med rød asfalt og at veien blir rengjort mer enn en gang hver vår.", + "type": "String" + }, + "date": { + "value": "2014-10-19T19:06:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "81cd5b1daedcb4d02a7e32501326016c34dab6c3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2407": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92166202, + "lng": 10.68852782 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg holdt ca 40 km/h i sykkelfeltet, bil kjører forbi meg på veien. Når den er kommet ca en billengde forbi svinger den brått til høyre foran meg, inn på en sidevei. Jeg rekker å forberede meg på en tur over panseret, men en blanding av rask bremsing fra bilen pluss skrensende svinging fra min side gjør at jeg bare stryker borti støtfangeren på bilen og kan syke uskadet videre.", + "type": "String" + }, + "date": { + "value": "2014-10-19T17:59:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "9aec01487822d287e21eb2d74872f134d422f589.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2406": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9493265, + "lng": 10.7311964 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister kommer i høy fart i avkjørselen fra Ringvei 3 østgående,biler kommer også i høy i høy fart fra sognsveien. Syklistene kommer også full fart ut i veien som utgjør fare for både bilister og syklister. Jeg har selv sett nesten ulykker flere ganger der. Det opptimale hadde vært bro eller undergang,men det er lite sannsynlig at det blir priortert med det første. Traffiklys eller stop skilt er billig mellom løsning som bør bli priortert så fort som mulig.", + "type": "String" + }, + "date": { + "value": "2014-10-19T17:27:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "1b38e2e8799534187b4b1bf7c023dfd7ea30a6de.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2405": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93098463, + "lng": 10.76564669 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står det et sykkelskilt på nordsiden av veien, men vendt mot øst, hvilket tilsier at det er OK å sykle mot kjøreretningen i dette sykkelfeltet?!?", + "type": "String" + }, + "date": { + "value": "2014-10-19T16:48:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "cb58738fe3e1966c0442afba2e4e23b017a569df.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2404": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91440749, + "lng": 10.7532227 + }, + "type": "LatLng" + }, + "description": { + "value": "Brugata er en naturlig sykkelvei til sentrum for mange som sykler fra østkanten - inkludert Kampen, Tøyen, Hasle og Lille tøyen. I enden av Brugata mot Storgata er det helt stopp i flyt for både gående og syklende - buss-skur på tvers, trappeavsatser og ofte reklamestands midt oppi det hele - snevrer inn passasje til kanskje en meter! Her skal gående og syklende og stående som venter på buss smyge seg forbi hverandre. Forstår at dette bidrar til at myke trafikanter ikke renner rett ut i en trafikkert Storgata, men det burde finnes en mellomting! I det hele tatt er dette krysset veldig dårlig løst, og burde tas grep om på en grundig måte. La oss håpe at nybygging på Gunerius-tomta også kan inkludere planlegging av området rundt - inkludert denne kommunikasjonsåren som stopper så brått.", + "type": "String" + }, + "date": { + "value": "2014-10-19T09:45:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "8566ee947eb43f4e4083a381915879d7b48f48a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2403": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91887118, + "lng": 10.69227218 + }, + "type": "LatLng" + }, + "description": { + "value": "høyt gjerde over jernbanen. folk går, løper og sykler på rødt lys", + "type": "String" + }, + "date": { + "value": "2014-10-17T14:04:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "be1b8c555796f36cad1c6d5f005ef8f733bb6e72.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2402": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90858767, + "lng": 10.75166702 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister og fotgjenger om hverandre i sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-10-17T13:50:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "35185d05598400f1e78c9dbe5d06ce0c20b40bdd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2401": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.914827, + "lng": 10.73222637 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av taxi mens jeg var i rundkjøringen. Taxien sa han ikke så meg, på tross av fargerik bekledning og mange reflekser. Mente han hadde solen i øynene.", + "type": "String" + }, + "date": { + "value": "2014-10-17T12:22:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "e0142460cf49fa29d37eb32d2a9e5cee2eb258d8.jpeg", + "type": "String" + } + } + }, + "aftenposten-2400": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90946985, + "lng": 10.76559305 + }, + "type": "LatLng" + }, + "description": { + "value": "Lyssignalet i kollektivfeltet reagerer ikke på syklister. Det er fullt lovlig (og mye tryggere) å sykle i kollektivfeltet her enn på fortau eller i bilkøen, likevel må man stoppe på S-signalet og vente på at man får en trikk i rompa før det er tillatt å sykle videre. Det samme problemet gjelder forøvrig for motorsykkel.", + "type": "String" + }, + "date": { + "value": "2014-10-17T11:23:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "1fac563c3f4ea8563d5505ddc5ec2bf6b8ddc0dd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2399": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91207323, + "lng": 10.75306177 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har noen lite kloke hoder i trafikketaten satt opp et stort skilt der står \"SYKKELTRAFIKK FORBUDT\". Skiltet er ikke et forbudskilt, men kan likevel tolkes veilledende. Problemet er at alternativet til å sykle i kollektivfeltet her er å sykle på et overfylt fortau eller en overfylt fire-felts bilvei. Det tryggeste alternativet er altså kollektivfeltet. Det virker som buss- og trikkefører tror at dette kollektivfeltet kun er for dem, men det er altså lov til å sykle her (i hvertfall fra krysset etter Nylandsbrua bort til Oslogate der det er tillat med både el-bil og motorsykkel). Det kan ikke være mange sekunder en trikk taper på å ligge bak en syklist i 15 km/t i stedet for 30-40 som de vanligvis holder. Her er det altså slik at Ruter deler veibanen med de relativt få syklistene som t", + "type": "String" + }, + "date": { + "value": "2014-10-17T11:21:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "f9cac4c4d130861741eb5cd115a686b0911a2bea.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2398": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93031267, + "lng": 10.7932949 + }, + "type": "LatLng" + }, + "description": { + "value": "Langs nye Lørenveien, hele strekningen fra krysset med Sinsenveien til der den nye parsellen slutter, veldig dårlig drift, mye grus og småsteiner i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-10-17T08:12:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "3b678f884648931b13c71229c17dc2a490ebbca8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2397": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93754222, + "lng": 10.78420758 + }, + "type": "LatLng" + }, + "description": { + "value": "Om sommerhalvåret sover romfolk på sykkelvegen under Sinsenkrysset, mørkt (særlig når du kommer inn fra sola), vanskelig å se dem og mye sykkeltrafikk i begge retninger.", + "type": "String" + }, + "date": { + "value": "2014-10-17T08:10:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "e639830577810e528569ff61cd93e9951681ae49.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2396": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91537557, + "lng": 10.80700635 + }, + "type": "LatLng" + }, + "description": { + "value": "90-graders sving med kumlokk, trafoskap m.m., hull i bakken. For smalt og mye sykkeltrafikk i begge retninger.", + "type": "String" + }, + "date": { + "value": "2014-10-17T08:07:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "21458ece74b498d5f4d056987217e57a153d3dd2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2395": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92676451, + "lng": 10.73848128 + }, + "type": "LatLng" + }, + "description": { + "value": "Vanskelig å få plassert seg riktig i lyskrysset hvis man kommer opp Colletts gate og skal til venstre opp Ullevålsveien. Kommer lett i klinsj med biler som skal rett fram eller til høyre når det blir grønt. Skulle vært sykkelboks her, så syklister kunne kjøre først ut i krysset.", + "type": "String" + }, + "date": { + "value": "2014-10-16T12:24:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "59529259629db117b8c7d6c5d18d07b8236a38d2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2394": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9233235, + "lng": 10.73520898 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange sykkister brukes Sofies gate som nord-sør-forbindelse. I denne sonen tvinges syklistene inn i uklare, farlige og unødvendige systemskifter. Det oppstår stadig ubehagelige situasjoner i møte med både biler og fotgjengere. Dette kan løses enkelt ved å føre sykkelfelt gjennom Bislettgata og Dalsbergstien og aller helst også gjennom grøntområdet på Lille Bislet. Det blir ryddigere for alle parter når syklistene forstår hvordan de skal oppføre seg.", + "type": "String" + }, + "date": { + "value": "2014-10-15T13:10:50Z", + "type": "DateTime" + }, + "bilde": { + "value": "09b62270be5a008464f406651b11fb47.jpg", + "type": "String" + }, + "streetview": { + "value": "1a22a265c65a39f30bfa023c7bc0074c463f29ae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2393": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9265387, + "lng": 10.7339859 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne gatestubben er enveiskjørt, men brukes begge retninger av en stor gruppe syklister fordi den inngår i den enkleste ruta å sykle nord-sør i dette området. Dette skaper en del rotete og potensielt farlige situasjoner i kryssene. I dette kvartalet bør det åpnes for sykling i begge retninger, f.eks. ved å etablere sykkelfelt på bekostning av gateparkering på vestsida av gata. Ellers fungerer Sofies gate godt uten eget sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-10-15T12:59:11Z", + "type": "DateTime" + }, + "bilde": { + "value": "912263692642298f44c83b6d01270538.jpg", + "type": "String" + }, + "streetview": { + "value": "5ab7b7dc8f6ed34d04544965f9ee3b8391131a90.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2392": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90507484, + "lng": 10.82170486 + }, + "type": "LatLng" + }, + "description": { + "value": "Her mangler det veimerking etter at det ble lagt ny asfalt etc.", + "type": "String" + }, + "date": { + "value": "2014-10-15T08:41:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "06121df22355e4944f5211e2cefa3580bfc7e212.jpeg", + "type": "String" + } + } + }, + "aftenposten-2391": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92865691, + "lng": 10.77093601 + }, + "type": "LatLng" + }, + "description": { + "value": "bare irriterende", + "type": "String" + }, + "date": { + "value": "2014-10-15T08:38:25Z", + "type": "DateTime" + }, + "bilde": { + "value": "07db96b30ef36734c88b2cdd87e15770.jpg", + "type": "String" + }, + "streetview": { + "value": "3f07153bb488dd409d3fa5160da39ccf2f1d2701.jpeg", + "type": "String" + } + } + }, + "aftenposten-2390": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91389655, + "lng": 10.78897118 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har jeg tre ganger på 6 mnd. dunket i biler som krysser sykkelfeltet og svinger til høyre. Mye mobiltelefon og veldig dårlig med blinking.", + "type": "String" + }, + "date": { + "value": "2014-10-15T08:36:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "956a212e3c5c9c72b193c17d3a005644f1805b21.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2389": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.98284552, + "lng": 10.70373058 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er altfor mye skog. Veldig vanskelig å sykle.", + "type": "String" + }, + "date": { + "value": "2014-10-15T06:19:22Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2388": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94672067, + "lng": 10.93931436 + }, + "type": "LatLng" + }, + "description": { + "value": "Blir du sett av en bli (som har vikeplikt) her er det et under. Svært vanskelig å se selv biler komme fra denne veien. Hele veien ligger i en blindsone for bilene i Stovnerveien", + "type": "String" + }, + "date": { + "value": "2014-10-14T20:46:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "1d6346cddd3f4ef4cf4d929f513f6678922312cd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2387": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9061992, + "lng": 10.77663302 + }, + "type": "LatLng" + }, + "description": { + "value": "Her skal syklisten krysse en forskjørsvei med svært dårlig sikt grunnet bakketopp. Også motbakke slik at det tar lang tid å komme over fra stillestående. Bilene kommer i stor hastighet.", + "type": "String" + }, + "date": { + "value": "2014-10-14T20:36:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "9d435b0f33d6777e0f0efb20f890d0ee6785337c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2386": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91530028, + "lng": 10.80694198 + }, + "type": "LatLng" + }, + "description": { + "value": "Følger man skiltingen her kommer det litt overraskende på at man på en tilrettelagt sykkelvei plutselig må ta en 180 graders sving med 2m radius (hvis feil side av veibanen benyttes, ellers umulig). Her må man vurdere å gå av sykkelen, iallefall løsne beina skulle det komme noen. Unngikk såvidt å velte første gang jeg var her...", + "type": "String" + }, + "date": { + "value": "2014-10-14T20:32:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "c791bdf4ace9f6a1ac125541505ebf74acb0bd0b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2385": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95268422, + "lng": 10.88617444 + }, + "type": "LatLng" + }, + "description": { + "value": "Spesielt farlig og uoversiktlig kryss", + "type": "String" + }, + "date": { + "value": "2014-10-14T20:21:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "84ae7ef263fba1e7da3b46c73f6f570c98080c29.jpeg", + "type": "String" + } + } + }, + "aftenposten-2384": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95097048, + "lng": 10.90870499 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det fint fortau for gående og vei til bliene, men hva med syklene? Det er mye trafikk grunnet tog, barnehage, skole og kjøpesenter. Blir svært ofte sykkel-slalåm mellom myke trafikanter. Stedet kan med enkle grep endres slik at syklistene kan kjøre sammen med veien for 2-3 eneboliger og videre veimerking av sykkelfelt under undergangen.", + "type": "String" + }, + "date": { + "value": "2014-10-14T20:18:11Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2383": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94793496, + "lng": 10.93129992 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er veien sperret av et annleggsområde. Varighet i ca ett år. Hvor skal man sykle da når sykkelvei-skiltene plutselig stopper?", + "type": "String" + }, + "date": { + "value": "2014-10-14T20:10:37Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2382": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94492065, + "lng": 10.94228625 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig kryss. Gjort spesielt ille ved at det er bakker inn fra 2 sider. Det er dessuten \"uklare\" vikepliktregler, da Høybråtenveien kan oppfattes som forkjørsvei. Iallefall kjører mange i så høy fart.", + "type": "String" + }, + "date": { + "value": "2014-10-14T20:07:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "78b4eda9ea123a3fb70c4737e537a1d7b1870022.jpeg", + "type": "String" + } + } + }, + "aftenposten-2381": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93774108, + "lng": 10.92667579 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er et busstopp rett etter en lang nedoverbakke på sykkelveien. \"Alle\" som venter på bussen blir stående å se etter bussen som kommer fra motsatt hold. De har dermed ingen mulighet til å se syklister. Hvis det regner \"gjemmer\" busspassasjer seg inne i skuret, helt ute av syne, og \"hopper ut\" når de ser er buss komme langt borte. Svært vanskelig å håndtere for syklister.", + "type": "String" + }, + "date": { + "value": "2014-10-14T20:01:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "33768254c66f61e8155cb60041a9d1b27ea998e2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2380": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91839795, + "lng": 10.5927515 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårligt vedlikehold av busker som vokser ved siden om veien. Er nesten umuligt å sykle på et av feltene sommertid. Vanskligt å se møtende syklister.", + "type": "String" + }, + "date": { + "value": "2014-10-14T18:36:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "2930946a48dc998f16e335b6ee207e9db9cfaca4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2379": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92036611, + "lng": 10.64944267 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig mange høye fortauskanter på sykelveien fra Bjørnsletta til slutten/E18. Må bromse kraftig vid var enester fortau for å unngå ulykke og skader på sykkelen. Kunne enkelt fikses med å senke/bygge myk overgang mellom vei og fortau der fortauskanten er høy og skarp.", + "type": "String" + }, + "date": { + "value": "2014-10-14T18:30:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "986626d8744794280c352c048148a48e9adec746.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2378": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91532179, + "lng": 10.65253257 + }, + "type": "LatLng" + }, + "description": { + "value": "Hardt traffikert vei særskilt under rushtid. Vanskelig \"krysning\" for di syklister som kommer fra Vækerøveien og ska til sentrum, skarp sving.", + "type": "String" + }, + "date": { + "value": "2014-10-14T18:23:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "0c16bd7a5bfeb24a5293d551f41b93fc243daa00.jpeg", + "type": "String" + } + } + }, + "aftenposten-2377": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91070702, + "lng": 10.72224855 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkel- og gangvei med mange fotgjengere som går til og fra busstopp. Vært nær ulykker flere ganger da spaserende ikke ser seg for når de går over sykkelfeltet til og fra busstoppet. Ikke sikkert de ser at de går midt i et sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-10-14T18:12:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "b0d21c194fa24627429d67d1bc8ff383c94b56fa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2376": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90926007, + "lng": 10.74350237 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele veien fra Rådhusplass til Operan er livsfarlig for oss syklister. Man må veksle mellom bilvei og fortau på en tungt traffikert vei.", + "type": "String" + }, + "date": { + "value": "2014-10-14T18:04:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "fabe2015b52e31ac0ba31f8a690eb7ce7ad186f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2375": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92304391, + "lng": 10.73529481 + }, + "type": "LatLng" + }, + "description": { + "value": "Et mareritt å kjøre fra Bislett Stadion til Pilestredet park. Særlig gjennom den lille parken med ballbingen ved Dalsbergstien, og forbi den trange passasjen ved kommunens resirkuleringsstasjon.", + "type": "String" + }, + "date": { + "value": "2014-10-14T16:54:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "4a5dbcc94fd6c9281ef361db55cf535e834cf56e.jpeg", + "type": "String" + } + } + }, + "aftenposten-2374": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94632843, + "lng": 10.76660156 + }, + "type": "LatLng" + }, + "description": { + "value": "Kristoffer Aamodts vei er et eksempel på et sted hvor det på papiret er tilrettelagt for sykling, men hvor det i realiteten er håpløst å sykle. Sykkelfeltene på begge sider av veien blir brukt som parkeringsplass for biler.", + "type": "String" + }, + "date": { + "value": "2014-10-14T16:27:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "d8e9a4c73cdedc5992383da90f14357ec61132e9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2373": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94713439, + "lng": 10.77116131 + }, + "type": "LatLng" + }, + "description": { + "value": "Vanskelig for syklister som kommer vestover i sykkelfeltet, og som skal til venstre ned Sandakerveien, å få skiftet til riktig felt før rundkjøringa.", + "type": "String" + }, + "date": { + "value": "2014-10-14T16:24:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "f852ed6c3f34400b3142a433840d1f45cb282fce.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2372": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90843167, + "lng": 10.7851088 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkering innenfor sykkelfelt. Dette fungerer til nøds i feltet oppover fordi syklistene har lav fart. Men parkeringsplassene brøytes ikke om vinteren og bilene kommer lengre og lengre ut i sykkelfeltet", + "type": "String" + }, + "date": { + "value": "2014-10-14T14:21:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d92989bd153a02f2bbdf548174841f4c29ef2ed.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2371": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91734391, + "lng": 10.81205964 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummelt kumlokk som må utbedres", + "type": "String" + }, + "date": { + "value": "2014-10-14T14:13:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "c85621800d44faa40b5637cbc7d5abb42b87aaf5.jpeg", + "type": "String" + } + } + }, + "aftenposten-2370": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93518809, + "lng": 10.74389934 + }, + "type": "LatLng" + }, + "description": { + "value": "Alle syklistene som skal vestover må opp på fortauet som er overbefolket av folk som skal av og på 20-bussen. Fotgjengere som skal krysse gata blir stående og vente på grønt lys med biler foran seg og travle syklister mellom seg - skummelt.", + "type": "String" + }, + "date": { + "value": "2014-10-14T09:41:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "551fd740ddd35e3afed9b9a01eedadb962603ad5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2369": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93274778, + "lng": 10.75888752 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummel strekning. Man har alternativene to-felts vei eller et fortau hvor det ofte går en del folk. Har flere ganger opplevd farlige forbikjøringer når jeg har syklet i veien - selv når forbikjøringsfeltet er tomt.", + "type": "String" + }, + "date": { + "value": "2014-10-14T09:34:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "6fe78a7f880fd7fbb88c8aef215e84b0964475aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2368": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93347344, + "lng": 10.71042537 + }, + "type": "LatLng" + }, + "description": { + "value": "På høyre side i svingen blir det pluselig for smalt for store biler og busser å passere (det skjedde etter omlegging av bomstasjonen). Om vinteren blir det enda trangere og farligere. Mange forsøker å kjøre forbi enten det er plass eller ikke. På fortauet er det også veldig trangt, og alltid fotgjengere på vei til jobb. De setter ikke pris på å dele denne lille plassen med en syklist.", + "type": "String" + }, + "date": { + "value": "2014-10-14T09:24:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "3f31e21c0e6b07ca1393dd8d524afa6c7c833248.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2367": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88390933, + "lng": 10.84524393 + }, + "type": "LatLng" + }, + "description": { + "value": "Lyskrysset. Her er det sykkelfelt på begge sider. Bilister nordfra (\"fra Oppsal\") og som skal videre mot Østensjø bruker gjerne sykkelfeltet for å komme forbi biler som skal til venstre i krysset. Mange ser ikke etter om det er klart før en slik manøver, og skviser syklister mot fortauskanten.", + "type": "String" + }, + "date": { + "value": "2014-10-14T08:39:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "dff80b60a3b3953cf34c07ce3b50c16d648f11f0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2366": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90730739, + "lng": 10.81891536 + }, + "type": "LatLng" + }, + "description": { + "value": "Trangt og mangler sykkelfelt i rundkjøring", + "type": "String" + }, + "date": { + "value": "2014-10-14T08:31:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "3303c1676bd5f9c637a48d1fee79458df69b7c36.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2365": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92219435, + "lng": 10.85506081 + }, + "type": "LatLng" + }, + "description": { + "value": "Buss-skuret og holdeplassen er plassert slik at passasjerene må krysse den nye sykkelveien når de skal på og av bussen. Unødvendig og kronglete løsning.", + "type": "String" + }, + "date": { + "value": "2014-10-14T08:05:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "37194814fc58a8efa4ba9b80e17bf871f20bafe3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2364": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92824833, + "lng": 10.86586475 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen naturlig måte å komme seg fra Tvetenveien til Lindebergveien på når man sykler langs den nye sykkelveien. Man må enten ta mange strafferunder under og over bruer, eller kjøre ut i veien og gjennom rundkjøringa. Det samme gjelder selvsagt hvis man kommer i motsatt retning.", + "type": "String" + }, + "date": { + "value": "2014-10-14T08:03:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "81012ce23f362f8585126c0e06db0ad6d7276c42.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2363": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93579545, + "lng": 10.88930726 + }, + "type": "LatLng" + }, + "description": { + "value": "Utkjøringen fra Rimi/bensinstasjonen. Det oppleves stadig at bilister som kjører ut fra Rimi/bensinstasjonen ikke tar hensyn til syklister som kommer langs veien. Det kan tenkes de tror de har forkjørsrett.", + "type": "String" + }, + "date": { + "value": "2014-10-14T07:55:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "522494f8f09b39a503451b07fa6a71cf59bd325a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2362": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91447203, + "lng": 10.7487595 + }, + "type": "LatLng" + }, + "description": { + "value": "Torget har nå store runde betongelementer som skal hindre biler i å kjøre inn på torget, men her er de satt så tett at de også hindrer alle andre i gå tå inn på torget. Dette var mye bedre før når det kun sto betonggriser der. Resultatet av \"oppgraderingen\" er at de tvinger fotgjengere og syklister til å passere gjennom et trangt punkt i aksen til Torggata. Dette er unødvendig og lett å ordne opp i gjennom å rydde litt i alle elementene på torget.", + "type": "String" + }, + "date": { + "value": "2014-10-14T07:39:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "e6902c7508c0e442b05af4beafe930413733f856.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2361": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93205973, + "lng": 10.93455076 + }, + "type": "LatLng" + }, + "description": { + "value": "Rastaveien har en liten avstikker som ender med bom mot Røykåsveien. Kommer man fra øst og vil krysse Røykåsveien, må man kjøre langt ut for å i det hele tatt se biler som kommer sørfra i Røykåsveien. Ubehagelig både for syklende, gående og bilister.", + "type": "String" + }, + "date": { + "value": "2014-10-14T07:33:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "0e78a97ec6136d979dace88211530452b3594e49.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2360": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96910263, + "lng": 10.76694488 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange rulleski- og sykkelbrukere på en meget smal vei. Nesten ulykker hele tiden.", + "type": "String" + }, + "date": { + "value": "2014-10-14T05:44:05Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2359": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90542453, + "lng": 10.60150623 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt retning Oslo opphører midt i svingen, uten at det varsles slik at folk som ikke er kjent på veien kan tilpasse seg.", + "type": "String" + }, + "date": { + "value": "2014-10-14T05:03:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "8b3107fdf26cd3a1f136a903ffe8cdd01bb0a20e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2358": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92982885, + "lng": 10.66333651 + }, + "type": "LatLng" + }, + "description": { + "value": "Trapp som kommer ned til tunnel, hvor sykkelveien gjør en 90 graders sving rundt hjørnet på tunnelen. Smalt og mørkt. For mange elementer på en gang.", + "type": "String" + }, + "date": { + "value": "2014-10-14T04:56:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "6389d35e753813a722ccc34ba4cf5c56dbb7ead8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2357": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93276928, + "lng": 10.74913501 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler afmærkning eller cykelsti. Jeg oplever tit at bilister ikke respekterer vigepligten, men skærer ind foran mig ofte uden at bruge blinklys.", + "type": "String" + }, + "date": { + "value": "2014-10-14T03:59:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "2124ef86a33e5125752b4b093c2db510d8aea011.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2356": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95996261, + "lng": 10.8857131 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig krysning hvor biler kommer i høy fart fra et veldig kort avkjøringsfelt fra Trondheimsveien. Vinkelen gjør at mange bilister ikke ser at man kommer nordfra.", + "type": "String" + }, + "date": { + "value": "2014-10-13T22:59:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "0cb8e7b85da383c0b45f222e66d46b745fc06e97.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2355": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93119428, + "lng": 10.72173357 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble nesten presset ut av sykkelfeltet av en buss. Han lå 10 cm over i sykkefeltet - og jeg hadde knappe under 10 cm klaring fra et tre/fortauskant på andre siden. Skremmende.", + "type": "String" + }, + "date": { + "value": "2014-10-13T20:56:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "8e3086aa0eead8213d80152d0e2fc7d1c9faa666.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2354": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9410946, + "lng": 10.7710433 + }, + "type": "LatLng" + }, + "description": { + "value": "Fullstendig utslitt veibane. Sprekker mellom asfalt og trikkeskinner på 10-15 cm, tidvis dype hull. Rett og slett livsfarlig for fotgjengere og motorsyklister. Slik er forresten hele Grefsenveien fra Hans Nielsen Hauges gate til Storokrysset.", + "type": "String" + }, + "date": { + "value": "2014-10-13T20:05:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "b72baf444ba4ca1c601cf33fd2da86dbf49c7895.jpeg", + "type": "String" + } + } + }, + "aftenposten-2353": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91162142, + "lng": 10.72656154 + }, + "type": "LatLng" + }, + "description": { + "value": "Det parkeres på og rett utenfor fortauet i buskene. Gjerne to varebiler helt på hjørnet i toppen av Dokkveien. Fjerner enhver frisikt!", + "type": "String" + }, + "date": { + "value": "2014-10-13T19:13:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "e70ee2c737038bb65a9f40c4f2d1e64d67f0259d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2352": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91042732, + "lng": 10.7207036 + }, + "type": "LatLng" + }, + "description": { + "value": "Kollisjon mellom bil og sykkel der sykkelvei krysser Filipstadveien. Dårlig frisikt pga trær...", + "type": "String" + }, + "date": { + "value": "2014-10-13T19:11:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "07d66553e44c48d1c9dd35b7790b45b02869420d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2351": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92911924, + "lng": 10.71630477 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet går oppover Kirkeveien, men slutter gjennom Majorstukrysset. Dette gir svært farlig situasjoner, bilene kommer helt klin inntil og gasser på for å komme forbi gjennom krysset. Lag rødt sykkelfelt gjennom Majorstukrysset !", + "type": "String" + }, + "date": { + "value": "2014-10-13T19:09:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "dda660f59986b1f94b00ffe7c20921c2b7d1c022.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2350": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94398567, + "lng": 10.70660591 + }, + "type": "LatLng" + }, + "description": { + "value": "Cyklar och bilar får inte plats. Vägen är väldigt smal ser nästolycker varje dag på slemdalsveien.", + "type": "String" + }, + "date": { + "value": "2014-10-13T18:04:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "ccbae3d3009005dc5938519b2ca582606ca801bc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2349": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88631017, + "lng": 10.8153963 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig tilrettelagt for syklister. Kan ikke sykle på fortauet (går for fort ift. fotgjengere) og er ikke tilrettelagt for å sykle i veibanen (for smalt og bilistene blir utålmodig. I tillegg går det også alt for fort langs veien (40-sone). Mange stygge forbikjøringer til tross for at det er mange barn som oppholder seg langs veien (skolevei og mange boliger lang veien).", + "type": "String" + }, + "date": { + "value": "2014-10-13T16:42:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "cf5deb18f7b072b645753aff3867e18d9334b42f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2348": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88516899, + "lng": 10.81698417 + }, + "type": "LatLng" + }, + "description": { + "value": "Kvinne påkjørt i fotgjengerfelt", + "type": "String" + }, + "date": { + "value": "2014-10-13T16:39:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "059d265012808980a5e873fb5b857c3fc181ffdc.jpeg", + "type": "String" + } + } + }, + "aftenposten-2347": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95443011, + "lng": 10.78557014 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt fortau med trær som henger utover gjerdet, og ofte barnevogner og spaserende på morgenen. Veien er dekket av rushtrafikk, trikkesporet er imidlertid innimellom åpent, men da risikerer du jo å ha den tutende i nakken. Asfalten er generelt i dårlig forfatning.", + "type": "String" + }, + "date": { + "value": "2014-10-13T15:53:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "0fb5318d9801c32536332c605f4487562ac4006e.jpeg", + "type": "String" + } + } + }, + "aftenposten-2346": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93905243, + "lng": 10.67993402 + }, + "type": "LatLng" + }, + "description": { + "value": "Traff på 2 ambulanser her i dag. Syklist mot skater. Vet ikke hva som skjedde men innbilder meg at skateren kom fra Jon Smestad veien og syklisten fra Røa-retning (og hadde litt fart). Men det er ren gjetning. Se også https://twitter.com/oslopolitiops/status/512480549576126464", + "type": "String" + }, + "date": { + "value": "2014-10-13T15:49:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "39bfa2ef2d5cb002542594474e3a4275710e4f95.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2345": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91981224, + "lng": 10.8204925 + }, + "type": "LatLng" + }, + "description": { + "value": "Masse løv samler seg nå som høsten er over oss - hvorfor kan man ikke sørge for å feie veiene med jevne mellomrom?", + "type": "String" + }, + "date": { + "value": "2014-10-13T15:01:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "9781e9eb097136a1c581f655a1080f867ba48f75.jpeg", + "type": "String" + } + } + }, + "aftenposten-2344": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93426896, + "lng": 10.87249517 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummel krysning - man får høy fart på strekningen og blir kastet rett ut i et kryss med dårlig oversiktlighet. Plenty med bilførere som har lastet bilen slik at de ikke har tilstrekklig sikt/utsyn. Burde vært plassert annerledes!", + "type": "String" + }, + "date": { + "value": "2014-10-13T15:00:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "f06db3bb1fafc20e0028361d1ee08427d3f9ee99.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2343": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93185546, + "lng": 10.86018919 + }, + "type": "LatLng" + }, + "description": { + "value": "Her burde skiltingen vært FØR krysset, ikke midt i krysset slik at man må stoppe opp for å vurdere veien videre.", + "type": "String" + }, + "date": { + "value": "2014-10-13T14:59:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "ce373bb3938d159c7efe1eea0f48be442177f76f.jpeg", + "type": "String" + } + } + }, + "aftenposten-2342": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.929173, + "lng": 10.84912776 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det \"sykkelvei\" - men den har mange av de gamle slukene som er lagt MED kjøreretningen slik at tynne dekk lett forsvinner ned i mellom. Det er for dårlig!", + "type": "String" + }, + "date": { + "value": "2014-10-13T14:58:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "722d581d6a2a0e39a5169a5bce09ef8db30121dd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2341": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92368913, + "lng": 10.84281921 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kunne man gjort relativt mye enklere, og strekningen er sågar nylig asfaltert! Men hvorfor ble ikke syklistene påtenkt eller fikk eget felt? Det er ikke så mange som går i området - man kunne med fordel redusert gangbredden langs broa til fordel for et bedre tilrettelagt sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-10-13T14:57:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "3484eef80be3812727f5940a3f97cfb4e23ad1e6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2340": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92294175, + "lng": 10.83073854 + }, + "type": "LatLng" + }, + "description": { + "value": "Fantastisk dårlig asfalt, masse småhull og \"lappeteppe\" av ny og agammel asfalt - og ved alle krysningene oppover er det brostein/kantstein som er effektive for å ta hull på sykkelslanger om man treffer for kjært.", + "type": "String" + }, + "date": { + "value": "2014-10-13T14:56:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "312d7ee9c10243c1b5975cbd2924e4babb16716a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2339": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9188174, + "lng": 10.81720948 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvorfor er det ikke bedre skiltet? Her kan man komme helt uvitende om retning eller hvor veien går videre. Man kan selvfølgelig gjette....", + "type": "String" + }, + "date": { + "value": "2014-10-13T14:55:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "6b3d7c2151cd2df8ba1a4bf1e13e9f29b7277c99.jpeg", + "type": "String" + } + } + }, + "aftenposten-2338": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92804404, + "lng": 10.74966073 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet nedenfra følger en rar halveisløsning og det er ingen tilrettelegging før rundkjøringa", + "type": "String" + }, + "date": { + "value": "2014-10-13T13:29:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "9263521f7e365af12a315c0eee67ce4d2232e482.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2337": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90732353, + "lng": 10.7804203 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som sniker seg gjennom bussbommen. Mange farlige situasjoner når de skal presse seg gjennom bommen etter at bussene har passert.", + "type": "String" + }, + "date": { + "value": "2014-10-13T13:26:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "cd228c484b5a60eeb59fd3c11a6bffc6d40c50c2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2336": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91111044, + "lng": 10.73510169 + }, + "type": "LatLng" + }, + "description": { + "value": "Etter at bussveien ble bygget må man krysse trikkeskinner og to paralelle veier.", + "type": "String" + }, + "date": { + "value": "2014-10-13T13:24:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "9f3f4af68702cc7d342abd72ec905b77c20b71cf.jpeg", + "type": "String" + } + } + }, + "aftenposten-2335": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90765705, + "lng": 10.757761 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne veien er livsfarlig. Alt for smale sykkelfelt innenfor et bussfelt.", + "type": "String" + }, + "date": { + "value": "2014-10-13T13:22:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "990987c4946ac6a1d61143f082af21b19f3c57e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2334": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93290904, + "lng": 10.77370405 + }, + "type": "LatLng" + }, + "description": { + "value": "Strekningen mellom Johan Selmers gate og Tverrbakken er skiltet som gang- og sykkelvei i den ene enden og ren gangvei i den andre. Hva er riktig? Hvilke regler gjelder egentlig her?", + "type": "String" + }, + "date": { + "value": "2014-10-10T12:53:57Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2333": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93276391, + "lng": 10.77346801 + }, + "type": "LatLng" + }, + "description": { + "value": "Om høsten ligger det store mengder dødt og vått løv på gang- og sykkelvei. Glatt underlag som gir fare for velt, dessuten økt risiko for påkjørsel pga dårlig bremseeffekt.", + "type": "String" + }, + "date": { + "value": "2014-10-10T12:49:50Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2332": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92889345, + "lng": 10.76906919 + }, + "type": "LatLng" + }, + "description": { + "value": "Her samler det seg en diger og svært dyp dam ved regnvær, på grunn av at sluk og avløp går tett av løv og rusk. Ikke mulig å komme rundt dammen når man kommer gjennom undergangen; syklister og fotgjengere må opp på ring 2 for å krysse.", + "type": "String" + }, + "date": { + "value": "2014-10-10T12:45:57Z", + "type": "DateTime" + }, + "bilde": { + "value": "ad9cb09ce2ac007a60a7ee54a92f8b73.jpg", + "type": "String" + }, + "streetview": { + "value": "d8238fea740f62a11040acabbaafc34f06517d1a.jpeg", + "type": "String" + } + } + }, + "aftenposten-2331": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90450996, + "lng": 10.55485725 + }, + "type": "LatLng" + }, + "description": { + "value": "Kræsja med bil rundt krapp sving med dårlig sikt i nedoverbakke. Lite kjent i området, men viste at det er turvei videre mot Gjønnes fra dette stedet. Vegens utforming ga inntrykk av at jeg allerede var på turveien, men skjønte etterpå at det var adkomst til ett hus innerst. Første bud å beskjære vegetasjon? Vurdere skilting?", + "type": "String" + }, + "date": { + "value": "2014-10-10T10:57:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "22af146cdf50ca92a795ea8cd0e4c01577ed64a4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2330": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91282624, + "lng": 10.64094543 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig å blande syklister, gående og mennesker som venter på buss ved Lysaker. Gjelder når syklister som kommer mot sentrum ned bakken fra lysaker locket.", + "type": "String" + }, + "date": { + "value": "2014-10-10T10:02:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "5e8a9b53fea86684e59f173fa8930f1f307e454a.jpeg", + "type": "String" + } + } + }, + "aftenposten-2329": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91368679, + "lng": 10.6445074 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilvei som krusser sykkeltrase I forkant og bakkant av Gjensidigebygget er svært uoversiktlig. Opplever nestenulykker her ofte.", + "type": "String" + }, + "date": { + "value": "2014-10-10T09:59:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "95d0e31990511b42679d05ecf88ec56a737dec47.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2328": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91747298, + "lng": 10.6612873 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet på sykkel og gangsti I retning sentrum. Bil krysset sykkelsti rett etter Maxbobygget. Sykklet I underkant av 50 km/t rett I siden på bilen. Skadeomfang begrenset av hjelm. Skade begrenset til kutt I haka (8 sting) og hjernerystelse. Bil så ikke syklister pga lovlig parkerte biler som hindrer sikt. Forslag til tilltak, flytte gateparkeringen til den siden av veien som vender ut mot E18 for å bedre oversikten til bilene.", + "type": "String" + }, + "date": { + "value": "2014-10-10T09:58:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "8d4f06d97347a699e7694e176d99d6dd66902bc3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2327": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92138778, + "lng": 10.75046539 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er en kant her som er akkurat for høy for sykler. Min vanlige sykkel klarer akkurat å komme over den, men i dag syklet jeg bysykkel. Da gikk det skikkelig galt. De har ikke demping og klarte ikke denne kanten. Kanten er til og med senket for syklister (tror jeg). Men kanten er alt for høy. Dette fører til at syklister må svinge hardt ut i bilveien for å kutte kanten 180 grader. Det er farlig for bilene og for syklistene. Det er mange mange mange syklister som sykler her hver eneste dag. Trengs bare bittelitt asfalt for å lage en liten \"rampe\" til kanten så er alt ok :)", + "type": "String" + }, + "date": { + "value": "2014-10-10T07:21:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "98f6b596da0a8e929f0c31ec6ca1b7e3952f7ed3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2326": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91021216, + "lng": 10.70720672 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom syklende på gang/sykkelvei vestover. Bil kjørte ut fra parkeringsplass fra venstre. Han var mm fra å kjøre på meg. Han hadde litt høy fart og ingen sikt pga hekken på sin høyre side. Dette er et farlig sted også fordi det kommer gang/sykkelvei ned fra broen på samme sted. Min vurdering er at det er mindre farlig å sykle i veien. Forslag til tiltak (dersom man skal ha den dårlige løsningen der i det hele tatt): 1) Fjerne hekken for bedre sikt. 2) Kant ved utkjøring slik at bilene må bremse opp.", + "type": "String" + }, + "date": { + "value": "2014-10-09T18:09:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "75d846ba84374fc0e4d4727a9f9641250b49a106.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2325": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93943938, + "lng": 10.7828021 + }, + "type": "LatLng" + }, + "description": { + "value": "Merkelig lyskryss. Her skifter det av og til fram og tilbake mellom rødt og grønt for biler som kommer ned fra Sinsenkrysset, flere ganger etter hverandre med svært kort varighet for hver farge. Det kan ta lang tid før det blir grønn man for kryssende fotgjengere. Har på det verste opplevd at det blir grønt lys for kryssende biler fem ganger før det blir grønn mann. Den lange ventetida og tvil om det i det hele tatt kommer til å bli grønn mann, gjør at folk blir utålmodige og \"tar sjansen\"", + "type": "String" + }, + "date": { + "value": "2014-10-08T17:28:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "6399f4194fa3574269dc724e9016707014ec6bc1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2324": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91589187, + "lng": 10.75129151 + }, + "type": "LatLng" + }, + "description": { + "value": "Håpløst å velge brostein som underlag når man skal lage \"sykkelgate\". Mulig det ser pent ut, men det er det aller dårligste underlaget å sykle på.", + "type": "String" + }, + "date": { + "value": "2014-10-08T17:22:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "2aa4278993e50db83bdcef70b242d1a6f89c7cf8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2323": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91622531, + "lng": 10.75183868 + }, + "type": "LatLng" + }, + "description": { + "value": "Tilrettelegging for sykkel i Torggata er et flott tiltak, men det krever bedre skilting/merking. Mange fotgjengere tror det er en gågate, og fremkommeligheten for sykkel blir deretter.", + "type": "String" + }, + "date": { + "value": "2014-10-08T17:18:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "f58a882265c3d01cf5f78c0d05f35ad0ae691e10.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2322": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92166739, + "lng": 10.75741767 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien i Markveien er tidvis uframkommelig, siden den blir brukt som utvidelse av fortauet av fotgjengere. Mange går med hodetelefoner og reagerer ikke på klokkesignal.", + "type": "String" + }, + "date": { + "value": "2014-10-08T17:16:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "37ec5d3f132318ec01f1bd35ab66adf993210f20.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2321": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93132329, + "lng": 10.77156901 + }, + "type": "LatLng" + }, + "description": { + "value": "Til tross for at det er tydelig skiltet forbud mot motorisert ferdsel fra Tverrbakken, er det vanlig å møte biler som kjører på den nederste delen av gang- og sykkelvegen i Torshovdalen.", + "type": "String" + }, + "date": { + "value": "2014-10-08T16:39:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "02111b33bd9d28ac552c571736023f363f6cbdee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2320": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94267451, + "lng": 10.78423976 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange biler feilparkerer alt for nært krysset, gjerne bilister som \"skal bare\" en snartur innom Rema.", + "type": "String" + }, + "date": { + "value": "2014-10-08T16:09:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "b3eff3cd7d662b49cf9febc99912d7a3269be43b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2319": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94172335, + "lng": 10.7826519 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står det så godt som alltid biler parkert for tett innpå krysset. Gjør krysset uoversiktlig. Det virker også som om mange bilister i Kjelsåsveien tror de er på forkjørsvei, det er vanligere at biler bryter vikeplikten enn at de overholder den.", + "type": "String" + }, + "date": { + "value": "2014-10-08T16:07:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "eef2a9a8cacd88fb68b044751d5dff4dca8c9607.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2318": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91055103, + "lng": 10.7439959 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det merket opp sykkelfelt, men fantastisk nok overlapper det med trikketraseen som svinger inn fra Tollbugata, slik at den ene skinnen er langt inne i sykkelfeltet. Utrolig at det er mulig å ende opp med et slikt resultat.", + "type": "String" + }, + "date": { + "value": "2014-10-06T16:17:59Z", + "type": "DateTime" + }, + "bilde": { + "value": "fcd4b1b34f725ee65d907ea0013b40c1.jpg", + "type": "String" + }, + "streetview": { + "value": "f7819b6bbce841dc54e68feb43879ac6e78bd8e6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2317": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91553692, + "lng": 10.74063777 + }, + "type": "LatLng" + }, + "description": { + "value": "En gatestubb som jeg finner særlig \"ekkel\" å sykle i er den biten av Rosenkrantzgate som går fra Tinghuset og ned til Kristian IVs gate. I tillegg til å være hullete og lappete, dekker ubenyttede trikkeskinner halve gata. Ved fotgjengerfeltet nærmest Tinghuset stikker armeringsjern rett opp av asfalten. Som i foregående år gruer jeg nå til vinter og snø når hindringene ikke lenger vil være like synlige. Gatestubben preges tidvis av stor trafikk av drosjer og varebiler, konsekvensene av unnamanøvre kan være uoversiktlige... Da fortauene er smale, og i tillegg til fotgjengere også skal gi plass til blomster- og kafevirksomhet, mm, er det heller ikke særlig aktuelt å ty til disse. Det ville hjulpet mye for sykkeltryggheten om f.eks de ubenyttede trikkeskinnene kunne fjernes eller dekkes ov", + "type": "String" + }, + "date": { + "value": "2014-10-05T12:50:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "7da353933babc7a226778dd994e449042d818ccb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2316": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88466298, + "lng": 10.81805706 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset er dårlig opplyst.", + "type": "String" + }, + "date": { + "value": "2014-10-04T19:15:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "c96937aa3db99e1229352387821cfd6b00f1f322.jpeg", + "type": "String" + } + } + }, + "aftenposten-2315": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8838878, + "lng": 10.83573818 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet slutter der man tar avopp Eterveien.Farlig for syklister når bilene svinger over isykkelfeltet for å svinge til høyre oppEterveien", + "type": "String" + }, + "date": { + "value": "2014-10-04T19:13:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "34498e35c411b88cec226284e7d20ab78a363ddd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2313": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93333024, + "lng": 10.67278947 + }, + "type": "LatLng" + }, + "description": { + "value": "Når blir det ryddet opp her mon tro? Denne innsnevring av en allerede trang GS-veg har nå hindret trafikken i snart 2 mdr. De som driver med etablering eller vedlikehold av annen infrastruktur i GS-vegene mangler åpenbart insentiver til å merke forsvarlig, skilte når ferdsel ikke er mulig, gjøre jobben ferdig hurtigst mulig og ikke påbegynne gravearbeider rett før vinteren med stor risiko for forsinket re-etablering", + "type": "String" + }, + "date": { + "value": "2014-10-02T20:00:12Z", + "type": "DateTime" + }, + "bilde": { + "value": "bdb7b13685be7d1114dee958b720a620.jpg", + "type": "String" + }, + "streetview": { + "value": "a7e4676595e64790340e14ae56588a12c98b87a1.jpeg", + "type": "String" + } + } + }, + "aftenposten-2312": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91452582, + "lng": 10.78773736 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man sykler ned ensjøveien østover har man naturlig grei fart. Når en bil i samme rettning som deg litt lenger fremme stopper for å kjøre inn gladengveien hender det at biler som er på vei i motsatt rettning kjører av til venstre inn på parkeringsplassen ved t-banen. Disse bilene ser man ikke når utsikten er sperret av biler som venter på å ta inn til gladengveien. Dermed er faren for å bli kjørt ned ekstremt stor og faren for å kjøre inn i siden på en bil er også enormt stor. I går opplevde jeg dette da en varebil ventet på å kjøre inn gladengveien, og en bil så sitt snitt til å kaste inn bilen for å ta av til venstre... krysser da motgående kjørebane og sykkelfelt, bilen holdt på å meie ned meg og en sykkelist som syklet på gangstien ... helt horibelt at man ikke legger opp til at sy", + "type": "String" + }, + "date": { + "value": "2014-10-02T13:25:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "26d4527c521a6486bba436cb30c36a051e492508.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2311": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96961809, + "lng": 10.78814506 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kommer ned fra bratt bakke så må man svinge 90 grader til venstre. Rett etter svingen er det et stort hull I bakken (i flere år) som reduserer veien til ca. 1m på innsiden (etter svingen vil man jo kjøre på utsiden). Hvis ikke du kjenner dette kan du dø her.", + "type": "String" + }, + "date": { + "value": "2014-10-02T10:11:48Z", + "type": "DateTime" + } + } + }, + "aftenposten-2310": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93785932, + "lng": 10.73012351 + }, + "type": "LatLng" + }, + "description": { + "value": "Nye fartsdempere i begge retninger ligger halvveis i sykkelfeltet. Det er en veldig uheldig løsning: Enten må de trekkes helt inn til fortauet, eller de må være smalere slik at de ikke stikker inn i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-10-02T09:53:50Z", + "type": "DateTime" + }, + "bilde": { + "value": "dd2253e3dd69fae2c594240e85da7382.png", + "type": "String" + }, + "streetview": { + "value": "8718b498501defc949a42c0dd46769b427646b2a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2309": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94919218, + "lng": 10.72430849 + }, + "type": "LatLng" + }, + "description": { + "value": "Av og pålessing av biler i sykkelfeltet utenfor Bertel O. Steen Autostern Klaus Torgårds vei 3. Det er parkeringsplass like ved men den ønsker de åpenbart ikkeå benytte.", + "type": "String" + }, + "date": { + "value": "2014-10-02T08:25:15Z", + "type": "DateTime" + }, + "bilde": { + "value": "df8b1a3ddbe89c93ca4b5dd3181ef6cf.jpg", + "type": "String" + }, + "streetview": { + "value": "7ddf1929263e9bf8dfe8b7f2f3fae339a4be9cb6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2308": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91583271, + "lng": 10.75012207 + }, + "type": "LatLng" + }, + "description": { + "value": "Altfor trangt for syklister i veibanen. Biler kommer i høy fart. Spesielt avkjøringen mot Akersgata er farlig.", + "type": "String" + }, + "date": { + "value": "2014-10-02T08:21:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "75885d6964513890508e693cc9cde89645553698.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2307": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93239301, + "lng": 10.72428703 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av sjåfør fra aftenposten(!?!) da han, uten å bruke blinklys, krysset sykkelfeltet. Jeg hadde stor fart da ulykken fant sted etter nedkjøringen i kirkeveien. Sjåføren nektet for at dette var hans feil og oppførte seg truende mot meg. Meldte aldri fra til aftenposten, noe jeg i grunnen angrer på.", + "type": "String" + }, + "date": { + "value": "2014-10-02T08:20:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "ddca18bbcadad2473d0f8300090dbc183d5aedd8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2306": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91822048, + "lng": 10.74759006 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står det svært ofte ulovlig parkerte biler. Dette gir dårlig oversikt foran krysset.", + "type": "String" + }, + "date": { + "value": "2014-10-01T10:31:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "96683cd180174f7cf278b35c230912a0b0822c8c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2305": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92726988, + "lng": 10.76441287 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet i vestlig retning ligger inntil parkeringsplasser for biler. For å forsikre seg om at man ikke sykler på en åpnende dør eller folk som kommer ut mellom bilene, må man sykle i veien utenfor sykkelfeltet. Er det biltrafikk i veien, blir man klemt inn mellom kjørende og parkerte biler på en smal stripe.", + "type": "String" + }, + "date": { + "value": "2014-10-01T09:02:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "1846b002320e5c57c0050693865b004270399a53.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2304": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93266177, + "lng": 10.77341437 + }, + "type": "LatLng" + }, + "description": { + "value": "Gangvei er en svært dårlig løsning som tilrettelegging for syklister på denne strekningen. Syklister får stor fart nedover bakkene i Torshovdalen, noe som lett skaper farlige situasjoner ved møte og passering av fotgjengere, hunder i bånd osv. Her burde det absolutt vært separate veier for fotgjengere og syklister.", + "type": "String" + }, + "date": { + "value": "2014-10-01T08:49:26Z", + "type": "DateTime" + } + } + }, + "aftenposten-2303": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.946135, + "lng": 10.82475185 + }, + "type": "LatLng" + }, + "description": { + "value": "Vegen ser brei ut, men er ganske uoversikteleg. Her møtast gjerne to bussar i svingen. Har fleire gongar blitt pressa ut i grøfta på veg oppover. Heldigvis er det nokre bussjåfører som tek omsyn på denne vegen.", + "type": "String" + }, + "date": { + "value": "2014-10-01T08:48:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "777b36d2d026ad8bcff81b59c95fd567bbb197be.jpeg", + "type": "String" + } + } + }, + "aftenposten-2302": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93549445, + "lng": 10.74480056 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset ikkje oversikteleg. Her skal syklisten krysse vegbana for å komme over i sykkelfeltet midt mellom to køyrebaner", + "type": "String" + }, + "date": { + "value": "2014-10-01T08:44:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "6ee1776a92663064f16359e405be1b04b2aa44bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2301": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93087174, + "lng": 10.77174067 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummelt sted på sykkelveien der skarp sving følger direkte etter undergang i nedoverbakke. Her må man redusere farten kraftig for å være sikker på at man ikke treffer hindringer rundt svingen. Skummelt hver gang jeg kommer opp motsatt vei også, siden jeg ser at mange syklister ikke reduserer farten nok før svingen.", + "type": "String" + }, + "date": { + "value": "2014-10-01T08:39:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "0c3480a2d749a57cd39c1510dc43a6928424448f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2300": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92263526, + "lng": 10.7377839 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister presser seg forbi når man sykler, selv om det kommer trafikk i mot. Bilene er ivrige på å forsere syklist like før svingen, men det er for trangt og uoversiktlig og det føles skummelt og farlig som syklist hver gang.", + "type": "String" + }, + "date": { + "value": "2014-10-01T08:22:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "80a400f5ee824443f97738ff4d833390ab964dc6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2299": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92102751, + "lng": 10.74205398 + }, + "type": "LatLng" + }, + "description": { + "value": "Opplever flere ganger i uken at biler ikke overholder vikeplikten ovenfor trafikant (syklist) når man kommer ned Ullevållsveien. Som syklist må man være obs og beredt til å \"vike\" for bilistene som kommer fra vikepliktsveg", + "type": "String" + }, + "date": { + "value": "2014-10-01T08:19:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "25b86d5e20bf52378eda4db856a36daab86e5a77.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2298": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91987139, + "lng": 10.7921791 + }, + "type": "LatLng" + }, + "description": { + "value": "På vestsiden av gang- og sykkelbrua over Grenseveien er det anlagt svært harde rumlefelt for at syklistene skal senke farten. Med så harde rumlefelt velger de fleste å sykle opp på fortauet. Det betyr at på de to strekkene med rumlefelt deler gående og syklende fortauet. Det er med andre ord sannsynlig at det vil skje en ulykke her.", + "type": "String" + }, + "date": { + "value": "2014-10-01T07:52:29Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2297": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93400021, + "lng": 10.74320197 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har syklister og kjørende i Geitmyrsveien vikeplikt for biler som kommer ut fra Linderngata. Som pliktoppfyllende syklist stopper jeg, men opplever at andre syklister, samt biler i Geitmyrsveien bare kjører forbi mens bilene fra Linderngata nøler og ikke tør å kjøre ut. Dette kan løses med skilting.", + "type": "String" + }, + "date": { + "value": "2014-10-01T07:44:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "8b6f9c3eb096110000f939d00990332dfd73681b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2296": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90879208, + "lng": 10.75850129 + }, + "type": "LatLng" + }, + "description": { + "value": "Dronning Eufemias gate: 43m var ikke bredt nok til å lage sykkelfelt iht normene, og det har vært skummelt å sykle der med busser helt inntil styret. Nå er sykkelfeltene borte. Er det måten Guri Melby og Bymiljøetaten \"løser\" dette problemet på?", + "type": "String" + }, + "date": { + "value": "2014-10-01T07:26:03Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2295": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94688723, + "lng": 10.77271699 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussholdeplass merket som sykkelfelt. Feilmerket.", + "type": "String" + }, + "date": { + "value": "2014-10-01T07:08:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "3ac54e08c2b0c4b9534126b75ee4d71ad4eb0980.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2294": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94256704, + "lng": 10.75589418 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvorfor benyttes Stavangergata og Bergensgata som ikke-tilrettelagt sykkelvei mellom Uelandsgate og Maridalsveien. Hadde det ikke vært bedre å henvise syklistene til Biskop Heuchs gate (andre siden av Voldsløkka), som har betydelig mindre trafikk, inntil det lages sykkelfelt i Stavangergata og Bergensgata Dette ville også passe bedre med sykkelveien som går i Tåsenveien fra Ring 2 til Voldsløkka.", + "type": "String" + }, + "date": { + "value": "2014-10-01T07:05:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "7bde70f91c6b0cedd54485c58724ed370e4ed155.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2293": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9354837, + "lng": 10.74474692 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som kommer fra Ring 2, og skal inn Tåsenveien blir stående å vente på møtende trafikk. Bilene som blir stående bak legger seg ut i sykkefeltet for å kjøre forbi.", + "type": "String" + }, + "date": { + "value": "2014-10-01T07:01:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "feded22a2bdaed3a9ca04850de3dde05c1d304eb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2292": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93606419, + "lng": 10.73586344 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister som har benyttet det brede fortauet langs Kirkeveien fra Kierschows gate, men ikke tør sykle på fortauet opp mot neste lyskryss, spretter plutselig ned i veibanen når de krysser innkjøringen til sykehuset, ute å titte seg over skulderen for å se etter buss, taxi, elbil eller andre syklister i kollektivfeltet.", + "type": "String" + }, + "date": { + "value": "2014-10-01T06:59:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "7427f6ea6391664f7cc60515d49848c433cb2d54.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2291": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91596716, + "lng": 10.65557956 + }, + "type": "LatLng" + }, + "description": { + "value": "Bro over gang og sykkelvei er for lav. Hvis man står på sykkelen og er over gjennomsnittet høy kan man slo hodet i underkant av broen og måkebilen som benyttes er for høy slik at bare halve veibredden blir måkt om vinteren.", + "type": "String" + }, + "date": { + "value": "2014-10-01T06:45:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "cddfecc2aef64bfa098fb068ea1470e8c52299e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2290": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92451714, + "lng": 10.68079233 + }, + "type": "LatLng" + }, + "description": { + "value": "Fin sykkelvei, men når du kommer fra vest så bråstopper sykkeltraseen i fortauet. Ingen skilting her. Har selv vært med i nestenulykker med fotgjengere på vei over fortauet og ut i veibanen.", + "type": "String" + }, + "date": { + "value": "2014-10-01T06:01:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "9d7a3f91670b246b6f2f81041cc5a57df96e4b10.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2289": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92247395, + "lng": 10.68630695 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kommer langs sykkel/gangveien vestfra så kommer man rett ut i rundkjøringen i feil rettning. Her må man gå av sykkelen og bli fotgjenger ett stykke før man kommer seg videre.", + "type": "String" + }, + "date": { + "value": "2014-10-01T05:59:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ecd3ccd4fedc9c6992d2f2250d95896e8dba0f1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2288": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94147615, + "lng": 10.74561595 + }, + "type": "LatLng" + }, + "description": { + "value": "Enveiskjørt gate hvor de i styre og stell viser at å beholde gratis gateparkering for noen få er viktigere enn alle de som går og sykler her på den eneste veien til Blindern. Det hjelper pent lite å ta en lang omvei for å komme inn på Jutulveien et lite stykke senere hvor det fortsatt er enveiskjøring uten (formelt) unntak for syklister. Nok et sted hvor oslopolitiet jobber for at folk skal miste respekten for \"innkjøring forbudt\".", + "type": "String" + }, + "date": { + "value": "2014-09-30T21:49:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "1fc3f73a74e55eecca5666c60de80642900b9031.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2287": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92525911, + "lng": 10.77518463 + }, + "type": "LatLng" + }, + "description": { + "value": "Valget står mellom en liten tur på fortau eller mot innkjøring forbudt i Dælenenggata vestover. (FÅ velger å sykle opp i Carl Berner-kaoset hvor det er håpløst å sykle.) Lurer på hvordan effekten av dét er på \"folks respekt for innkjøring forbudt-skiltet\" som politiet bruker som bortforklaring for å ikke sette opp underskilt med \"syklister unntatt\".", + "type": "String" + }, + "date": { + "value": "2014-09-30T21:06:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "c0a94f1a7c0958cfe0d6c587f6cd13ff818b462a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2286": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92518384, + "lng": 10.7753992 + }, + "type": "LatLng" + }, + "description": { + "value": "Leddbusser og trikker fra Trondheimsveien som venter på rødt blir stående og blokkere gangfeltet fordi avstanden mellom lyset og gangfeltet er for kort. Alltid en elv av fotgjengere og syklister på vei rundt den og over høye asfaltkantene som man valgte å forverre krysset med.", + "type": "String" + }, + "date": { + "value": "2014-09-30T20:57:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "2ae2e187584019863bb142e094733493f2731e7a.jpeg", + "type": "String" + } + } + }, + "aftenposten-2285": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91013685, + "lng": 10.70956707 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange farlige situasjoner oppstår når kjøretøy - og i særdeleshet tyngre kjøretøy - som kommer fra Fillipstadveien ikke overholder vikeplikten i rundkjøringen for syklister som kommer fra Kongens Marina.", + "type": "String" + }, + "date": { + "value": "2014-09-30T19:14:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "4a96b280d3d1780386b2e5ce312b0a3f4c5402db.jpeg", + "type": "String" + } + } + }, + "aftenposten-2284": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9168599, + "lng": 10.65907716 + }, + "type": "LatLng" + }, + "description": { + "value": "Varebil på tvers av gang- og sykkelvei ved utkjøring fra vareleveringen hos Maxbo Vækerø. Varebilen kjører ut i gang- og sykkelsti i blindsonen til en annen varebil som er parkert inne på området til Maxbo. Treffer fronten av varebilen, støtskader og skader på sykkel. Ikke engangstilfelle at farlige situasjoner oppstår her.", + "type": "String" + }, + "date": { + "value": "2014-09-30T19:09:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "15d80a2b1be5a65cb2f39c5b6803825ed847fb31.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2283": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93566645, + "lng": 10.73862075 + }, + "type": "LatLng" + }, + "description": { + "value": "Kirkeveien, ring 2 i området Ullevål sykehus, bare helt utrolig at de har asfaltert lange strekninger her uten å samtidig legge til rette for syklister, kanskje flytte på kansteiene og lage sykkelfelt. Her er det jo plass. Har ved flere anledninger i begge retninger holdt på å miste balansen når leddbussen kjører helt inntil meg. Gjerne når vi nærmer oss en hodeplass.", + "type": "String" + }, + "date": { + "value": "2014-09-30T18:13:27Z", + "type": "DateTime" + }, + "bilde": { + "value": "3e6318426b31150db3513ba8fe5eaf9b.JPG", + "type": "String" + }, + "streetview": { + "value": "abf76e3358c0f4399540002f0cf9657f6673629a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2282": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93461296, + "lng": 10.72892189 + }, + "type": "LatLng" + }, + "description": { + "value": "DETTE HATER JEG! Å konkurere med bussen om plassen når sykkelfeltet slutter. Bildet sier sitt, fra hjørnet Kirkeveien/Ullevålsveien.", + "type": "String" + }, + "date": { + "value": "2014-09-30T18:00:34Z", + "type": "DateTime" + }, + "bilde": { + "value": "5ed09150f7dde7a1831c52ea9e366592.JPG", + "type": "String" + }, + "streetview": { + "value": "116a2d076af31bd34840b4518f3606d0e5c2e039.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2281": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93584919, + "lng": 10.82606077 + }, + "type": "LatLng" + }, + "description": { + "value": "Masse tungtrafikk, og skumle påkjøringer om man sykler nedover på fortauet. Bilførerne som skal kjøre ut følger bare med til venstre når de skal oppover Brobekkveien.", + "type": "String" + }, + "date": { + "value": "2014-09-30T12:56:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "59f3b6ef66f19acf0e0920d0a8dbb550fe6be5ea.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2280": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92892571, + "lng": 10.80114841 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien ned Lørenveien føres opp på fortauet, og rundt en skarp sving. Midt i svingen står det nå to tilhengere parkert. Ingen merking eller advarsler.", + "type": "String" + }, + "date": { + "value": "2014-09-30T12:45:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "9d2599016180aeee1fc29483679637fe451dab5b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2279": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93965972, + "lng": 10.76550722 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister setter utfor den bratte bakken som går parallelt med Treschowsgate, uten å se seg for eller ta hensyn til mykere trafikanter enn dem selv.", + "type": "String" + }, + "date": { + "value": "2014-09-29T18:54:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "c5ff961aed69814a56d1c92dcef0d60401468801.jpeg", + "type": "String" + } + } + }, + "aftenposten-2277": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93940713, + "lng": 10.78285574 + }, + "type": "LatLng" + }, + "description": { + "value": "Bommene som er satt opp mellom trikketrasé og Kjelsåsveien gjør at det blir dårlig plass til syklister og fotgjengere som venter på grønn mann for å krysse veien. Når mange venter samtidig hender det at man ikke kommer forbi bommen med sykkel, slik at man må vente i trikketraséen.", + "type": "String" + }, + "date": { + "value": "2014-09-29T11:52:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "428f433616f1449220e0bd764d9ea47084b5419b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2276": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9271731, + "lng": 10.72005987 + }, + "type": "LatLng" + }, + "description": { + "value": "Opphøyd perrong for trikk er farlig for syklister. man blir \"presset\" ut i trikkeskinnen og veibanen.", + "type": "String" + }, + "date": { + "value": "2014-09-29T09:31:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "ca70a1c11ad9021f7d2b268df0f9d842635fd7b2.jpeg", + "type": "String" + } + } + }, + "aftenposten-2275": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9237429, + "lng": 10.75089454 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig krysningspunkt. Biler, gående og syklister kommer fra mange ulike retninger og skal krysse vei uten at dette er løst på en god måte. Bred vei gir også høy fart på biler. Her ser vi nestenulykker daglig.", + "type": "String" + }, + "date": { + "value": "2014-09-29T09:26:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "384d014708a895fd8c705a807018d32110f32a4a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2274": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92379666, + "lng": 10.73140025 + }, + "type": "LatLng" + }, + "description": { + "value": "Veilegemet er som regel i veldig dårlig forfatning og det er store hull i veien pga. trikkens rystelser. Som syklist må man velge å følge med på trafikken eller hull i bakken.", + "type": "String" + }, + "date": { + "value": "2014-09-29T09:24:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "ecceee13a92bc3f5cd73fb34e14a253759e94271.jpeg", + "type": "String" + } + } + }, + "aftenposten-2273": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9236945, + "lng": 10.73150753 + }, + "type": "LatLng" + }, + "description": { + "value": "De høye kantene ved de nye trikkestoppene er livsfarlige. Som syklist blir man presset ut i trikkeskinnen fordi kanten på trikkestopp er for høy. Det går normalt ikke å sykle mellom trikkeskinne og kant.", + "type": "String" + }, + "date": { + "value": "2014-09-29T09:22:07Z", + "type": "DateTime" + }, + "bilde": { + "value": "459279c865797b64ce147df30d163d26.JPG", + "type": "String" + }, + "streetview": { + "value": "d67e5a6679fed25cdabb9df47d9ec9765a3eddc2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2271": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93458071, + "lng": 10.72868585 + }, + "type": "LatLng" + }, + "description": { + "value": "Bildet (vedlagt) viser en nyasfaltert og nymalt Kirkevei opp mot krysset Ullevålsveien. Her forsvinner plutselig sykkelfeltet 30 meter før krysset, og biler/busser I høyre felt ledes inn mot fortauet slik at syklister enten må bråstoppe, eller prøve å komme seg opp på fortauet. Paradoksalt at man snakker om å tilrettelegge for sykling, og da (for 2 uker siden) maler opp nye felt hvor sykkelfeltet blir borte og ofres for totalt 3 bil-felt! Har ikke vei-vesenet forstått signalene fra politisk hold i kommunen om å prioritere sykkel-felt?", + "type": "String" + }, + "date": { + "value": "2014-09-29T08:18:43Z", + "type": "DateTime" + }, + "bilde": { + "value": "32f80c2fb5766445527dfecf300ad36e.jpg", + "type": "String" + }, + "streetview": { + "value": "4539b742fb229d8db4a7665a14f6887c37992e41.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2270": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9067264, + "lng": 10.79346656 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelistien fra Etterstad til Vålerenga skole ender opp i en dyp kum, et fortau på kun 90cm bredde og med en fortauskant på nesten 30 cm. 10 meter lengre bort må man klatre over panseret på to biler som sperrer resten av skoleveien inn gjennom Fritjofsgate. All gang- og sykkel-trafikk som kommer ned langs svartdalen på Etterstad-sida og skal videre nedover forbi Vålerenga kirke går gjennom her. Med tydelig merking og justert plassering av parkeringsskilt og betongblokker hadde mye vært løst her. Se forøvrig de to andre anmerkningene fra området. forbi Fritjofsgate og Vålerenga skole.", + "type": "String" + }, + "date": { + "value": "2014-09-29T08:00:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "7353febfa065d17a7294b36f0f0bb3578357c679.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2269": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91286927, + "lng": 10.64090251 + }, + "type": "LatLng" + }, + "description": { + "value": "Den såkalte sykkelbroen på Lysaker byr på mange feller. Tar man i betraktning alle mulige kombinasjoner av kryssende traffik, fra topp til bunn, er det nesten ikke til å tro at det ikke skjer kollisjoner daglig. Eller gjør det kanskje? Ved å lande broen på sjøsiden av veien, og trappen på andre siden av broen på toppen, ville det meste ha blitt løst. Nok et eksempel på ingienører som anlegger sykkelvei uten kunnskap om sykling.", + "type": "String" + }, + "date": { + "value": "2014-09-29T07:38:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "15f2290486630ec0b3dfb7dc09de21540a9a867e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2268": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92456016, + "lng": 10.78728675 + }, + "type": "LatLng" + }, + "description": { + "value": "Grenseveien fra Carl Berner, dette er ingen sykkeltrasse, men det sykles her, Ved krysset Einarsvei smalner veien i fotgjengerfeltet, forrige uke kom bussen og jeg samtidig til dette punktet. Han må ha sett meg. Se på bildet, er det plass til syklist ved siden av bussen her? Jeg fikk stoppet i siste liten, ellers hadde jeg havnet i lyktestolpen. Busser viker ikke for syklister!!", + "type": "String" + }, + "date": { + "value": "2014-09-28T20:03:06Z", + "type": "DateTime" + }, + "bilde": { + "value": "19a5b090ab5e727d2c1ad529db562845.JPG", + "type": "String" + }, + "streetview": { + "value": "e95a72505e3d72be7bccd56bdc7075d703498833.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2267": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91309516, + "lng": 10.82256317 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man sykler ned Tvetenbrua, rundt rundkjøringen for å komme inn på gs vei retning ring 3, må man sykle gjennom en bussholdeplass. (ikke akkurat et enestående tilfelle) Det er til å med skiltet både med bussholdeplass og sykkelvei. Bussen stopper og passasjerer velter ut akkurat når du skal passere.", + "type": "String" + }, + "date": { + "value": "2014-09-28T19:53:25Z", + "type": "DateTime" + }, + "bilde": { + "value": "47a1bf2eceb10d8d206bc18cac7d068e.JPG", + "type": "String" + }, + "streetview": { + "value": "554fa343c472e658ea5c8ae63050ea31f73cc741.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2266": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91366528, + "lng": 10.75662374 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet på en mann som gikk rett ut i sykkelfeltet/veibanen uten å se seg for. Rakk heldigvis å bremse litt.", + "type": "String" + }, + "date": { + "value": "2014-09-28T18:34:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "29930dfb6a8206ad911df99c18718ff6421d7be4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2265": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91991441, + "lng": 10.82116842 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil kom kjørende opp på sykkelsti mens jeg var på tur nordover og ned bakken. Jeg brenset, for over pansret, hodet traff trematerialer som bilisten hadde stikkende ut av høyre forvindu. Politi og sykebil kom til stede. Jeg brukte hjelm, og fikk lettere hjernerystelse, store hevelser rundt øye, panne, kinn, og blåmerker på lår og legg. Føreren mistet førerkort og fikk en form for straff. Det er skiltet innkjøring forbudt, og politiet var senere på ulykkesstedet for å skrive rapport. De informerte meg om at det var to bilister som hadde til å hensikt å kjøre inn på sykkelstien, men politiet hadde ikke bøteblokka med seg - så de slapp unna med tilsnakk. Ulykken skjedde 20 okt 2010, det var godt vær.", + "type": "String" + }, + "date": { + "value": "2014-09-28T16:28:00Z", + "type": "DateTime" + }, + "bilde": { + "value": "85d9aee0d041360717912f403431f419.jpg", + "type": "String" + }, + "streetview": { + "value": "059139211cd77f7ed294f0f64fae519a274a1a2a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2264": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94097637, + "lng": 10.85187435 + }, + "type": "LatLng" + }, + "description": { + "value": "Holdt nesten på å treffe en halvstor betongblokk lagt i sykkelvelen ved bilbommen, med andre ord begge sykkelfelt sperret. Så hvorfor så dum å nesten sykle på den? Vel for det første hadde jeg sola i øya, for det andre skiftet jeg felt for å sykle forbi bommen, og så ser jeg steinen som ligger rett innenfor skyggen (husk jeg hadde sola i øya, se bildet (som er tatt etter passering!)). Bilbommen er på sin plass pga mye villmanskjøring og bomsniking i veitvetparken, men blokkering må gjøres slik at det ikke øker risiko for skade.", + "type": "String" + }, + "date": { + "value": "2014-09-28T15:24:53Z", + "type": "DateTime" + }, + "bilde": { + "value": "6e3f571e1bee118e9bf03cea51037026.jpg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2263": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92659247, + "lng": 10.62425136 + }, + "type": "LatLng" + }, + "description": { + "value": "Frontkollisjon med annen syklist.Uoversiktelig veikryss: Stikkvei ned fra Ris skole til Ris skolevei. Den andre syklisten kom i stor fart ned stikkveien.Jeg syklet på fortau (Ris skolevei)og skulle opp den samme stikkveien. Han fikk meg på sin høyre side. Kraftig sammenstøt.Begge endte på legevakten med ribbensbrudd. Jeg fikk i tillegg en kraftig forslått hofte og hånd, samt forbigående smerter i nakken. Ble sykemeldt i 5 uker.", + "type": "String" + }, + "date": { + "value": "2014-09-28T15:06:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "c435d07d54315741e83ffd69d123ade1ad517505.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2262": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93673065, + "lng": 10.78241586 + }, + "type": "LatLng" + }, + "description": { + "value": "Kommer syklende fra Sinsenkrysset og skvises inn mellom bussholdeplass og tbaneutgang. Dette opplegget planlegges også for Storokrysset!! En info-post med sanntidsinformasjon er håpløst plassert slik at den skygger sikt fra vei og tbaneutgang (se bildet).", + "type": "String" + }, + "date": { + "value": "2014-09-28T14:58:32Z", + "type": "DateTime" + }, + "bilde": { + "value": "b2ef0894ba42454b56916072559f23bc.jpg", + "type": "String" + }, + "streetview": { + "value": "d8b0eea43b03f5e4284b051445628276a7e2ca1d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2261": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92458166, + "lng": 10.72425484 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble presset inn i trikkeskinnene med min datter i barnelege av en uoppmerksom bilist. Vi begge hadde på oss helm og var heldige at vi slapp unna med skrubbsår.", + "type": "String" + }, + "date": { + "value": "2014-09-28T10:09:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "05a19126e3c51d5b8d7fbbfa54b49538700ae237.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2260": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91904326, + "lng": 10.6821227 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet inn i annen sykkel bakfra pga bråstopp. Farlig punkt med kryssende gangvei.", + "type": "String" + }, + "date": { + "value": "2014-09-28T08:44:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "8da5ef4beaf786decaf8744172c3fc42d4efe803.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2259": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87726576, + "lng": 10.82800269 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig kryss med dårlig sikt når man kommer fra syd og ligger på fortauet. Biler som kommer fra høyre og skal ut på kjører gjerne langt forbi vikelinjen for å sjekke om det er klart (trafikk fra Langerudsvingen har vikeplikt). Da kan det fort smelle, noe det nesten gjorde denne uka. Glad jeg har gode bremser på sykkelen...", + "type": "String" + }, + "date": { + "value": "2014-09-28T08:43:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "192d5e1edd80c07b501bab229bce6bbca9616723.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2258": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91315903, + "lng": 10.64031913 + }, + "type": "LatLng" + }, + "description": { + "value": "Falt av sykkel i krapp sving på sykkelbro på Lysakerlokket. Uegnet for sykkel, særlig ved stor trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-28T08:40:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "700e2d2f2e33d9d01f96e2f77e79a5468068b5e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2257": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94617799, + "lng": 10.78711509 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Grefsenveien fra Disen til Sandaker er ekstremt farlig for syklister. Svært dårlig veidekke gjør at både syklister og bilister svinger fram og tilbake for å unngå hull og dette fører daglig til farlige situasjoner", + "type": "String" + }, + "date": { + "value": "2014-09-28T08:21:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "17b161bc542a009e5975b0e559cd4547504faf71.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2256": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94046047, + "lng": 10.77042102 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen plass til syklister, bilister blir irriterte og venter ikke når syklister er i ferd med å skifte felt for å svinge i krysset ved Sandaker senter", + "type": "String" + }, + "date": { + "value": "2014-09-28T08:19:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "b7d15fe63752c331ef8089a10ec8aabe23d29de7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2255": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92807092, + "lng": 10.77136516 + }, + "type": "LatLng" + }, + "description": { + "value": "Litt off topic, men jeg prøver: Her er en splitterny og påkostet sykkelvei fullstendig rasert av gravearbeider. Det står lastbiler, containere og gravemaskiner i hele feltet, det er oppgravde store hull på 4-5 plasser, fotgjengere og syklister sendes omtrent opp på trappa til boligene langs denne strekningen. Hva f.... er det de driver med når de graver opp en helt ny og meget kostbar og sykkelvennlig løsning. Aftenposten:HJELP!", + "type": "String" + }, + "date": { + "value": "2014-09-27T18:59:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "03f26d6cfc474a8fe8b534744775f92644eb4d92.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2253": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90099132, + "lng": 10.76402664 + }, + "type": "LatLng" + }, + "description": { + "value": "Som syklist tør jeg nesten ikke å bruke fortau oppover her fordi det ser ut som veien kan rase ut når som helst. For syklister og bilister er det krevende å dele kjørebanen pga. smal vei. En grundig oppgradering og tilrettelegging ville ikke bare øke sikkerheten, men også bedre trafikkflyten for bilene.", + "type": "String" + }, + "date": { + "value": "2014-09-27T17:44:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "fd09003d7f6ee298028cb0d6b34a1046a9c7f027.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2252": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92629139, + "lng": 10.776515 + }, + "type": "LatLng" + }, + "description": { + "value": "Trang veibane nord for Carl Berner, meterhøye kanter på begge sider og umulig å få plass til både bil og sykkel", + "type": "String" + }, + "date": { + "value": "2014-09-27T17:40:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "d9095003837e9f81122257ba93d8844f021c045f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2251": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.82864224, + "lng": 10.80870151 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det farlig kryss med bussholdeplass på begge sider av Prinsdalsveien. Høgåsveien treffer Prinsdalsveien bratt og det å svinge sørover er ren risikosport for bilister. Det er ingen tilrettelgging for syklister og fortauet gir ikke nok plass for både syklister og fotgjengere.", + "type": "String" + }, + "date": { + "value": "2014-09-27T17:35:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "9520bb9534a595cd6495270afaa546b59e1868cf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2250": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93491934, + "lng": 10.74948906 + }, + "type": "LatLng" + }, + "description": { + "value": "\"Smart\" bilist som skulle slippe av kona rett før krysset mens han ventet på grønt lys. Åpnet bildøren så den sperret sykkelfeltet. Fikk veltet meg til siden og skled på skinka på fortauet. Ett tiendedels sekund fra å kjøre rett i bildøren.", + "type": "String" + }, + "date": { + "value": "2014-09-27T17:00:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "9fceea5293a5ff2adedcd169abe0c1353b36549c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2249": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90632025, + "lng": 10.7743746 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien er av dårlig fatning, i tillegg er det brodsteinsskille mellom sykkelvei og bilvei. Pga dårlig sykkelvei og parkerte biler må man ut i veien. Å krysse brosteinene med landeveissykkel er farlig, Derfor sykler de aller fleste i bilveien lang hele denne veien. Veien driftes av Statens Vegvesen.", + "type": "String" + }, + "date": { + "value": "2014-09-27T16:14:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "d14f89ef095f0479a6f232bf5f0b0314685b93fa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2248": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90045327, + "lng": 10.7746911 + }, + "type": "LatLng" + }, + "description": { + "value": "Også her er det ikke mulig å sykle på fortauet pga. av/påstigning for buss. Så da må man ut i veien og her er det parkerte biler på høyre siden på vein ned og ganske mye busser som har sine stopp på høyre sidern", + "type": "String" + }, + "date": { + "value": "2014-09-27T16:05:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "caa4437e5c25aa4d3f17f5668ae8becf5f92fc7c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2247": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92687203, + "lng": 10.7385993 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien og bilveien skjærer over i hverandre.", + "type": "String" + }, + "date": { + "value": "2014-09-27T16:02:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "bef571b8f5f0469639594f409c6e30e22851e4c9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2246": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84528913, + "lng": 10.80372333 + }, + "type": "LatLng" + }, + "description": { + "value": "Er ikke enig i at det er tilrettelagt igjennom Haukteo krysset. Her egner det seg ikke å sykle på fortauet(de færreste gjør det) da det er mye trafikk til og fra stasjoenen(mensker)", + "type": "String" + }, + "date": { + "value": "2014-09-27T16:01:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "7fb3db26a65ead095f426c8da40ad7af53fad7a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2245": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88000088, + "lng": 10.78711509 + }, + "type": "LatLng" + }, + "description": { + "value": "Herfra og helt til Ekebergsletta er farlig. Trangt, ikke merket opp i veibanen. Heller ikke mulig å sykle på fortau", + "type": "String" + }, + "date": { + "value": "2014-09-27T15:58:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "8621e187fff7d7ff6cc6ef0133a47035a166a0f3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2244": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.946135, + "lng": 10.76050758 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg kom syklende ned Maridalsveien, rundt rundkjøringen for å sykle ned Kristoffer Aamots gate en regnversdag. To biler fra syd bryter vikeplikten, den andre var umulig å unngå å kollidere med. På det glatte føret veltet jeg pga. hard nedbremsing og skled inn i siden på bilen. Jeg slapp unna med relativt ubetydelige skader men mens jeg ligger i veibanen blir jeg forbikjørt av andre bilister samt overhøvlet av passasjeren i bilen jeg kolliderte med.", + "type": "String" + }, + "date": { + "value": "2014-09-27T14:44:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "d11cec0c381bd24eb2277c278ab3945d6d9ed523.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2243": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93167807, + "lng": 10.7224524 + }, + "type": "LatLng" + }, + "description": { + "value": "Alt for trangt når 20 tonn busser kjører forbi centimetere fra syklisten.Traseen blir bredere et kvartal nedenfor.", + "type": "String" + }, + "date": { + "value": "2014-09-27T12:46:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "7fd1e9ec0db74fef9e416aaa8f0f486ddb89fef7.jpeg", + "type": "String" + } + } + }, + "aftenposten-2242": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92402249, + "lng": 10.7753241 + }, + "type": "LatLng" + }, + "description": { + "value": "veldig lett å overse det ene røde lyset på den ene fotgjengerovergangen. når alle de andre lysene i lyskrysset lyser grønt. Gjelder når man sykler i retning tøyen. Trafikken man tror stopper kommer diagonalt bakfra", + "type": "String" + }, + "date": { + "value": "2014-09-27T12:44:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "e99f60e0a6fd974465fc0d35a5ffc7b4254abf74.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2241": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92358159, + "lng": 10.75080871 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien svinger til høyre etter fotgjengerovergangen. Det er ikke fysiske skille mellom kjørebane og sykkelfelt, og alle bilister kutter høyresvingen, dvs kommer inn i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-27T12:28:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "dcbe5ad9ec1cc154dea63cb00a5dd6a8255246c7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2240": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92562472, + "lng": 10.73827743 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilparkering på høyre side av sykkelfelt. Utforbakke for sykkel og bra fart. Det er bare et tidsspørsmål før syklist kolliderer med en bildør som brått åpnes eller at en bil kjører ut.", + "type": "String" + }, + "date": { + "value": "2014-09-27T12:08:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "b86522cf4653b2bb38329f8832b754ae68f30b33.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2239": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92848488, + "lng": 10.7387495 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelmerking i sving er slitt vekk. Dame med hund i høyre forsete kutter svingen rett foran meg, men jeg får bremset,", + "type": "String" + }, + "date": { + "value": "2014-09-27T12:05:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "761b0f2017c5e37a9c39cb9b2318541a9a5de22a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2237": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9437416, + "lng": 10.6960586 + }, + "type": "LatLng" + }, + "description": { + "value": "Meget smalt i Holmenveien med biler i kø, fotgjengere på vei til skole og syklister. Lag egen sykelstier.", + "type": "String" + }, + "date": { + "value": "2014-09-27T11:36:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "a542d1eff30863002ef31595564a0abd81fffe34.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2236": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93246289, + "lng": 10.72432994 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene tar ikke hensyn til syklistenes tilrettelagte vei, har opplevd mange nesten-ulykker da biler uten å se seg om svinger ut til høyre (mot Ullevål sykehus) eller venstre (fra Ullevål sykehus) og ikke ser seg om i speilet før de svinger.", + "type": "String" + }, + "date": { + "value": "2014-09-27T11:31:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "f602eb98044fefb90ef7ac227a089fa414f4757d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2235": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92900635, + "lng": 10.76926231 + }, + "type": "LatLng" + }, + "description": { + "value": "I den lille rundkjøringen etter undergangen syklende sørover er det veldig dårlig sikt til begge sider. Andre syklister har nedoverbakke fra høyre og venstre og den som kommer fra undergangen må stoppe helt opp for å få oversikt.", + "type": "String" + }, + "date": { + "value": "2014-09-27T11:22:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "efdb2139b9bc26941cf5dc433513831d4124305a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2234": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91428917, + "lng": 10.73716163 + }, + "type": "LatLng" + }, + "description": { + "value": "Karl Johans gate er fullstendig uegnet for å komme seg fram med sykkel. Gaten er lagt med brostein, som er et håpløst underlag for sykkel. Fortauet har et bedre underlag, men her kan man sjelden sykle lovlig, pga stor trafikk av fotgjengere.", + "type": "String" + }, + "date": { + "value": "2014-09-27T09:59:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "5aa366d17a16d174e47bfaa9b4af22606232deb8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2233": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93367232, + "lng": 10.77458381 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det skiltet sykkelrute samtidig som det er skiltet gangvei (ikke gang- og sykkelvei). Det er med andre ord bare når det er lite fotgjengere at det er lov å bruke sykkel i sykkelruten. Motstridende skilting som dette sender signal til syklister om at vi av og til bare må se bort fra trafikkreglene.", + "type": "String" + }, + "date": { + "value": "2014-09-27T09:53:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "1637b689db2d02ef208eed71cd06a565775675d4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2232": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91382663, + "lng": 10.80078363 + }, + "type": "LatLng" + }, + "description": { + "value": "Etter å ha kjørt mot vest over broen over motorveien ved Helsfyr er det en helt grusom kant som dekker hele fortauet. Den utgjør pendleturens verst enkelthump hver bidige dag.", + "type": "String" + }, + "date": { + "value": "2014-09-26T22:26:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "cfae949cc2c6ffb14bac882cc745448998c0bd98.jpeg", + "type": "String" + } + } + }, + "aftenposten-2231": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87644733, + "lng": 10.77578544 + }, + "type": "LatLng" + }, + "description": { + "value": "En fotgjenger (skoleelev ?) påkjørt av syklister i høy fart 23.09.14 ca. kl. 07:30 nederst ved Paddehavet. Mulig årsak: svingede vei, men mest sannsynlig meget høy fart på en uoversiktlig strekning", + "type": "String" + }, + "date": { + "value": "2014-09-26T06:33:02Z", + "type": "DateTime" + } + } + }, + "aftenposten-2230": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.82674413, + "lng": 10.77878952 + }, + "type": "LatLng" + }, + "description": { + "value": "Skilt med sykkelvei ble satt opp våren 2014 men veistumpen er farlig. Store steiner stikker opp av bakken, det gjør også røtter fra trær. Løse steiner og renner som nedbørsvann har gravd seg i stien utgjør en annen fare. Om vinteren måkes det ikke her, tvert i mot plasseres snømengder like før broen over Mosseveien.", + "type": "String" + }, + "date": { + "value": "2014-09-26T06:27:50Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2229": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.82674413, + "lng": 10.7787466 + }, + "type": "LatLng" + }, + "description": { + "value": "I uke 38 stupte en syklist på veien nedover den bakken som er i en elendig tilstand. Resultat: flere utslåtte tenner, sårskader med mye blod. Årsak: ukjent men som beskrevet annet sted: denne veistumpen holder ikke mål for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-26T06:21:56Z", + "type": "DateTime" + } + } + }, + "aftenposten-2228": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94123432, + "lng": 10.72173357 + }, + "type": "LatLng" + }, + "description": { + "value": "Det hadde vært fordelsaktig med et fotgjengerfelt, da det er stor fotgjengertrafikk mellom området forskningsparken og Blinderen.", + "type": "String" + }, + "date": { + "value": "2014-09-25T19:00:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "16f6bf5c03115fa0c984777918b47c77c216defe.jpeg", + "type": "String" + } + } + }, + "aftenposten-2227": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94299156, + "lng": 10.72264552 + }, + "type": "LatLng" + }, + "description": { + "value": "Gangveien krysses av adkomstvei til parkeringsplass langs trikketrasé. Adkomstvei er ikke skiltet med tanke på fotgjengere og sykkelister. Adkomstveien er knapt bred nok til bil og gående.", + "type": "String" + }, + "date": { + "value": "2014-09-25T18:57:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "59f87b299021b6975a9b568bdbcdb5b573f5b56a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2226": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90618307, + "lng": 10.82020282 + }, + "type": "LatLng" + }, + "description": { + "value": "Her mangler det vegoppmerking, veien er ferdig asfaltert og anleggsarbeidet har stått stille i flere måneder. Farlige situasjoner i begge retninger i rushtiden.", + "type": "String" + }, + "date": { + "value": "2014-09-25T13:34:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "4e12e58a69d8dae6a37a4e1b7bfca39e0cb248a6.jpeg", + "type": "String" + } + } + }, + "aftenposten-2225": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92626989, + "lng": 10.7212615 + }, + "type": "LatLng" + }, + "description": { + "value": "Dype groper i asfalten rundt trikkeskinnene: forhjulet på sykkelen satt seg fast og jeg stupte over rattet og landet på ansiktet. Hadde heldigvis liten fart, men ødla tenner, fikk kraftig hjernerystelse og måtte sy 10 sting.", + "type": "String" + }, + "date": { + "value": "2014-09-25T08:25:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "7f2a7b5801207c39d952b568e9199aa3c5e3c18d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2224": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91274018, + "lng": 10.76215982 + }, + "type": "LatLng" + }, + "description": { + "value": "Har nesten blitt påkjørt av taxi som skal inn på taxi holdeplassen. De bryr seg lite om at det kommer syklister rett bak eller på siden av bilen i sykkelfeltet, og flere ganger er holdeplassen overfylt og taxier står ute i sykkelfeltet midt i rush trafikken når det er mest trafikk og flest syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-25T07:55:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "d0d76df1f8aa387dcd5f2deee9fc480fbda25094.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2223": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92266752, + "lng": 10.70467472 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet blir brått borte i rundkjøringen noe som gir bilistene en form for \"forkjørsrett\".", + "type": "String" + }, + "date": { + "value": "2014-09-25T07:49:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "17eb3e3a91f76a3186f5c9a808866ef5270ad623.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2222": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9079765, + "lng": 10.7750789 + }, + "type": "LatLng" + }, + "description": { + "value": "Her går sykkel og gangveg i som går igjennom parken plutselig over i kjørevei med mange parkerte biler og ikke noe eget felt for syklister/gående. Sykkel og gangstien gjennom parken ned til Grønlandsleiret var bra helt til de fylte opp med 5-10 cm tykt lag med løs grus, noe som er svært tungt og vanskelig å sykle på.", + "type": "String" + }, + "date": { + "value": "2014-09-25T07:48:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "0f0b827e17f93c1037bac76205487db1d762cb83.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2221": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92701182, + "lng": 10.71229219 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet blir brått borte og bilene kutter inn rett foran.", + "type": "String" + }, + "date": { + "value": "2014-09-25T07:47:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "b1a743eb93a7d27e4ca4b53714032cd2cd7f030d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2220": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91347166, + "lng": 10.75432777 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet opphører plutselig helt i denne veien som fører til at syklister stadig blir presset/skviset av bilister før lyskryssene, noe som fører til farlige situasjoner og irritasjon.", + "type": "String" + }, + "date": { + "value": "2014-09-25T07:44:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "bbc22dd579ad4fdb0e1f75b630ce0f07ccd8c6de.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2219": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90079762, + "lng": 10.81676959 + }, + "type": "LatLng" + }, + "description": { + "value": "Fra Manglerud og ned mot broen som krysser E6 er det en lang og rett gangvei i slak utforbakke. Etter at fortauet langs E6 ble fjernet har alle jobbsyklistene blitt penset inn på denne gangstien. Kombinasjonen rett utforbakke, lav morgensol, morgentrette fotgjengere med nesa i smarttelefonen og manglende skille mellom syklende og gående er temmelig skummel. Her har Vegvesenet nok en gang startet et prosjekt uten å tenke på sykkeltrafikale konsekvenser.", + "type": "String" + }, + "date": { + "value": "2014-09-25T06:43:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "7732550cad24aebdcac96ddc04e6d02da3a4a878.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2218": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92103827, + "lng": 10.74210762 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg var på vei nedover Ullevålsveien i sykkelfeltet og aner fred og ingen fare da en bil som er på vei oppover, plutselig sviner til venstre, ned Frimanns gate. Jeg treffer bilens bakhjul og har flaks som ikke brekker noe. Bilisten hadde ikke sett meg...", + "type": "String" + }, + "date": { + "value": "2014-09-24T22:39:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "376797a0af9690f0e1907c13601c5a7a83f84570.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2217": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92334501, + "lng": 10.73518753 + }, + "type": "LatLng" + }, + "description": { + "value": "Den kombinerte gang- og sykkelveien i Sofies gate mellom Bislettgata og Dalsbergstien er et klassisk eksempel på hvordan syklister tvinges fra gaten og opp på fortau i konflikt med fotgjengere. Adskilte traseer for sykler og fotgjengere her vil gi syklistene mulighet til fortsette ned den mye brukte Sofies gate uten å skremme fotgjengerne.", + "type": "String" + }, + "date": { + "value": "2014-09-24T20:19:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "17f02967608bc195d3c9f5b407db464a70743c15.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2216": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9487164, + "lng": 10.6074532 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien er stort sett uten veiskuldre og smal, og det er 70 km/t. Det er stor trafikk av syklister, biler og mye tungtransport. Har opplevd mange ubehagelige episoder med biler som ikke kommer forbi når jeg sykler og jeg har ingen mulighet til å legge meg lenger ut av veien.", + "type": "String" + }, + "date": { + "value": "2014-09-24T20:15:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "c6f85e09185b2a900c4fe72fb5c8ac113bbb214b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2215": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93377445, + "lng": 10.63940048 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet nedover Vækerøveien fra Røa (som er forkjørsvei) i morgenrushet med stillestående kø. Det er trangt fortau pga skolebarn og svært dårlig asfalt. I tillegg er det mange biler som kommer raskt ut fra innkjørsler til husene. Velger å sykle på venstre siden av køen da det er svært liten trafikk oppover. Sykler forbi en trailer som sto stille. Han hadde stoppet for en bil som skulle svinge inn på veien fra høyre, og denne bilen møtte jeg på hjørnet av traileren. Det er overhodet ingen plass til syklister nedover Vækerøveien fra Røa, men det er en svært sentral vei å sykle fordi den bringer oss til Lysaker og innover mot Oslo. I tillegg står bussen i stille kø så sykling er svært tidsbesparende.", + "type": "String" + }, + "date": { + "value": "2014-09-24T20:11:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "a1d6e3de564eca0dce15fc73a5101adc6675b48a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2214": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92654946, + "lng": 10.7339859 + }, + "type": "LatLng" + }, + "description": { + "value": "Aldri et populært tiltak blant bileiere, men kommunen bør vurdere å fjerne gateparkeringen på vestsiden av Sofies gate mellom Wilhelms gate og Louises gate. Det vil gi plass til et sykkelfelt for de mange som i dag sykler mot kjøreretningen i denne enveiskjørte delen av Sofies gate.", + "type": "String" + }, + "date": { + "value": "2014-09-24T20:10:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "76c895057adfa123ff3775c3d79153da52280c76.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2213": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91034255, + "lng": 10.73912909 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvor er sykkelfeltet?", + "type": "String" + }, + "date": { + "value": "2014-09-24T19:53:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "95f0d29d907b97488109048a2301268938369a63.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2212": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92300089, + "lng": 10.73535919 + }, + "type": "LatLng" + }, + "description": { + "value": "I krysset Dalsbergstien/Sofies gate har kommunen plassert en resirkuleringsstasjon der gaten er åpen for sykkeltrafikk, men sperret for biltrafikk inn i Sofies gate. Resirkuleringscontaineren sperrer sikten for både syklister og bilførere, samtidig som den tvinger mange syklister til å ta i bruk fotgjengerovergangen.", + "type": "String" + }, + "date": { + "value": "2014-09-24T19:49:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "c813ece94df2741cc6b53b22af5c9b4dd137df12.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2211": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9080874, + "lng": 10.749017 + }, + "type": "LatLng" + }, + "description": { + "value": "Her svinger mange biler til høyre i rushtiden – når en skal sykle rett frem er ikke billistene oppmerksomme på syklistene i sykkelfeltet. Sykkelfelt bør stiples opp og rødmales igjennom krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-24T13:25:21Z", + "type": "DateTime" + }, + "bilde": { + "value": "6df85765c8cb8b0473881c180b419906.JPG", + "type": "String" + }, + "streetview": { + "value": "49e7dafc2396eba39019e4d8bc2c58c23315ba09.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2210": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95036877, + "lng": 10.73458671 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved kjøring vestover forbi Ullevål Stadion i mørke blendes man av det asymmetriske kjørelys til bilene på Ring-3. At GS-vegen ligger litt lavere forverrer blendingen. Det trengs 1-1,5m høy avskjerming mellom GS-veg og Ring-3. I tillegg burde de kraftige humper ved flere kumlokk ut mot Ring-3 jevnes.", + "type": "String" + }, + "date": { + "value": "2014-09-24T12:48:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "8d4c36bb041aef5e3fbb0dbc1cd54798b48a8f21.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2209": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92646343, + "lng": 10.72549939 + }, + "type": "LatLng" + }, + "description": { + "value": "Gata er enveiskjørt: Det hadde bedret framkommeligheten om det kunne åpnes for syklister i begge kjøreretninger", + "type": "String" + }, + "date": { + "value": "2014-09-24T12:34:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "aad3d1c3d51e04484f44a2aeb289bc585fcf4a93.jpeg", + "type": "String" + } + } + }, + "aftenposten-2208": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93045781, + "lng": 10.73232293 + }, + "type": "LatLng" + }, + "description": { + "value": "Ettersom Theresesgate er uframkommelig for syklister, burde nederste del av Stensgata åpnes for syklister i begge kjøreretninger. Gata er nå enveiskjørt.", + "type": "String" + }, + "date": { + "value": "2014-09-24T12:33:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "0212684dac2d55604280430f98baa4047ada5f76.jpeg", + "type": "String" + } + } + }, + "aftenposten-2207": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93652104, + "lng": 10.93126773 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er ingen trygg måte å komme seg over Karihaugveien på for de som skal sykle mot Lørenskog. Det føles veldig utrygt med mye tung lastebiltrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-24T11:46:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "937b7d7a70c4f5fe4e3c192d87e32b7fd4f7e6eb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2206": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90860919, + "lng": 10.75960636 + }, + "type": "LatLng" + }, + "description": { + "value": "veldig trangt mellom fortauskant og buss, og når bussen i tilegg stjeler av det fra før syltynne sykkelfeltet er det et under at man ikke blr skviset under bussen.dette skjer daglig...", + "type": "String" + }, + "date": { + "value": "2014-09-24T11:04:24Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2205": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93214036, + "lng": 10.80651283 + }, + "type": "LatLng" + }, + "description": { + "value": "Frem til 2009 var det ikke gateparkering i Økern torgvei. Av en eller annen merkelig grunn er det det nå, noe som blir brukt som innfartsparkering. Det er uforståelig da dette er en skolevei som er tjent med en mer oversiktlig gate. Gaten er også såpass bred at det enkelt kunne etableres sykkelfelt eller brede fortau her, slik at farten på bilene gikk ned og alle mye trafikanter fikk en bedre vei til og fra skolen.", + "type": "String" + }, + "date": { + "value": "2014-09-24T08:37:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "4f681bb4aaa2f3a061e0350e91ed43ad95dcd5da.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2204": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93736486, + "lng": 10.8069849 + }, + "type": "LatLng" + }, + "description": { + "value": "Utenfor Løren skole møtes gående, joggende, syklende, skolebarn, taxier, varebiler og livsfarlige stressa foreldre på en snuplass. Det kjøres gjerne mot kjøreretningen når foreldre skal slippe av barna til skolen. Det oppleves farlig å være både syklist med fare for å få en dør, et barn eller en bil rett foran seg, og som gående med fare for å få en syklist i rumpa eller en bildør i siden.", + "type": "String" + }, + "date": { + "value": "2014-09-24T08:35:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "6a52fd7c6d759e36ce4bcece39f4c52ddfa0a30a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2203": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.876492, + "lng": 10.77576729 + }, + "type": "LatLng" + }, + "description": { + "value": "Vedlig uoversiktlig \"omvei\" fra gangveien langs E18. Her er det hus langs hele \"omveien\" og båthavn som fører til en del trafikk. I tillegg er \"omveien svingete med bakker, og hekker og trær langs hele. I dag kom en person løpende ut fra et av husene og krasjet med en syklist som kom kjørende i god fart. Ambulanse tilkalt da fotgjengeren var bevisstløs et lite øyeblikk og hadde vondt i hodet.", + "type": "String" + }, + "date": { + "value": "2014-09-24T06:39:56Z", + "type": "DateTime" + } + } + }, + "aftenposten-2202": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91140627, + "lng": 10.74849128 + }, + "type": "LatLng" + }, + "description": { + "value": "Lastebil blokkerer sykkelsti.", + "type": "String" + }, + "date": { + "value": "2014-09-24T06:21:25Z", + "type": "DateTime" + }, + "bilde": { + "value": "e7ff0e1707f1ef9cfdaaf83c659d5504.jpg", + "type": "String" + }, + "streetview": { + "value": "cd9c56af75d0e01457512c0a1cd941beef963d56.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2201": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94003439, + "lng": 10.79031099 + }, + "type": "LatLng" + }, + "description": { + "value": "Eiendommen er den eneste som har utkjøring rett ut i hovedsykkelveien. Utkjøringen er bak en høy hekk i en S-sving. Syklister som kommer nedoverbakke mot Sinsen, har ingen mulighet til å se utkjøringen før de er rett utenfor den. Det finnes ikke noe trafikkspeil eller varsel (skilt, i asfalten el) på stedet. Unngikk så vidt å bli påkjørt av bil på vei ut av porten for et par uker siden. Det er en opplagt dødsfelle som jeg ikke kan skjønne at Statens Vegvesen kan være bekjent av.", + "type": "String" + }, + "date": { + "value": "2014-09-23T21:40:41Z", + "type": "DateTime" + }, + "bilde": { + "value": "861f449b7ccb46846c79cd6edaf2026b.JPG", + "type": "String" + }, + "streetview": { + "value": "b3fcf48b3aca41217d94c06343018fe12c33ac9e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2200": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94240582, + "lng": 10.73486566 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilistene tenderer til å kjøre fort og aggresivt i området, til tross for at det er mange syklende og gående i nærheten av Ullevål Skole. Det er parkert mange biler i gaten, som gjør at sykkelister må sykle veldig nærme parkerte biler ved møtende trafikk, med tilknyttet problematikk i forbindelse med at folk åpner bildørene sine når man sykler forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-23T20:43:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "dea3cfd2b2704a643b9016119854fdb27a36f62e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2199": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94299156, + "lng": 10.74089527 + }, + "type": "LatLng" + }, + "description": { + "value": "Gatekvaliteten i området er så dårlig at det nesten er påkrevet med terrengsykkel! Det er til tider veldig mange biler parkert i området.", + "type": "String" + }, + "date": { + "value": "2014-09-23T20:38:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "b955c911df62419675f8860621157ce58852b37b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2198": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94550096, + "lng": 10.72497367 + }, + "type": "LatLng" + }, + "description": { + "value": "Gangveg mellom boligblokker som til tider blir brukt av folk som bor i nabolaget. Større fysiske sperringer må på plass, da de lokale fjerner porten som står der, hvis den er ulåst. Har nesten blitt kjørt ned to ganger i mørket av sint og aggresiv mann i stor bil.", + "type": "String" + }, + "date": { + "value": "2014-09-23T20:35:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "546d81ca30b2b7a574a97981958fc4a4263ca0d5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2197": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90990018, + "lng": 10.7468605 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det plutselig opphør av sykkelvei rett før Prinsensgate. Byggearbeide i bygninger på begge sider av veien gjør det smalt og farlig. I tillegg er det parkering innenfor sykkelfelt. Kort sagt kaotisk.", + "type": "String" + }, + "date": { + "value": "2014-09-23T19:45:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "5fe8b06ae155098c920fce826fe4faf75ca1efdb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2196": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91185809, + "lng": 10.74887752 + }, + "type": "LatLng" + }, + "description": { + "value": "Lastebil står utenfor Ricahotellet og sperrer sykkelveien mot kryssetved Kirkeristen hver eneste morgen. Dette gjør det veldig smalt og farlig å sykle rundt.", + "type": "String" + }, + "date": { + "value": "2014-09-23T19:40:03Z", + "type": "DateTime" + }, + "bilde": { + "value": "ab10bee094d2c8d627d86b5b6d5537bc.jpg", + "type": "String" + }, + "streetview": { + "value": "7307670b884d491940b421ef05a967dd01ec5337.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2195": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89806422, + "lng": 10.75527191 + }, + "type": "LatLng" + }, + "description": { + "value": "Håpløst dårlig veidekke på sykkelvei; småhumpet asfalt som reduserer sykkelgleden. Unødvendig mange svinger ved avkjøringer til Sørenga. Her er alt på bilistenes premisser, på bekostning av syklister. Og dette på \"hovedveien fra syd.......", + "type": "String" + }, + "date": { + "value": "2014-09-23T19:09:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "cd8d44f6620d0cad333b0a22b68d0f5678fc89ce.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2194": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94804779, + "lng": 10.77797412 + }, + "type": "LatLng" + }, + "description": { + "value": "Inn-og utkjøring fre bilverksted/bensinstasjon. Her har biler vikeplikt. Behov for \"brå hump\" for utkjørende biler.", + "type": "String" + }, + "date": { + "value": "2014-09-23T19:04:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "4ed45f79af25841e23118aa5c728fddb161d7645.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2193": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92938803, + "lng": 10.79702854 + }, + "type": "LatLng" + }, + "description": { + "value": "Alltid parkerte biler i vestgående sykkelfelt. Syklister tvinges ut i veibanen. Behov for skilting \"parkering forbudt\"", + "type": "String" + }, + "date": { + "value": "2014-09-23T19:01:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "87628ad28512a2cfe5a25498ae1fdf915fc9571b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2192": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9173224, + "lng": 10.81209182 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye vegetasjon som reduserer oversikten for vestgående sykkeltrefikk. Behov for betydelig beskjæring.", + "type": "String" + }, + "date": { + "value": "2014-09-23T18:59:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "54a38ed6f7644cf29180208846f5cbef8151ff25.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2191": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93115127, + "lng": 10.80153465 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved ny sykkelvei på Økern er det satt opp et \"teknisk hus\" (ventilasjon for Lørentunnellen?) innersving (høyresving) når man kommer fre Sinsen mot Økern. Uoversiktlig; krever oppbremsing i nedoverbakke.", + "type": "String" + }, + "date": { + "value": "2014-09-23T18:57:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "b329dd4a8a8729a7efccfe668016a6c6f8d4c2bf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2190": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9267215, + "lng": 10.80222129 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei langs Ring 3. Skarp sving (110 grader) under lokalvei til Økern", + "type": "String" + }, + "date": { + "value": "2014-09-23T18:53:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "ffbcd32d19d79b40036ebc9be789b9444c762353.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2189": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92123722, + "lng": 10.75132369 + }, + "type": "LatLng" + }, + "description": { + "value": "Ofte farlige situasjoner i denne rundkjøringa. Syklister som kommer opp Mølleveien har lav fart inn mot rundkjøringa pga. motbakke. Det gjør at utålmodige bilister prøver forbikjøring på vei inn i eller ut av rundkjøringa, eller inne i selve rundkjøringa. Skaper uoveriktlige og farlige situasjoner hvor sykkel lett blir presset mellom biler.", + "type": "String" + }, + "date": { + "value": "2014-09-23T17:58:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "13d58ee0de3b11bd3cb23ffddc8972b12011082a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2188": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91778489, + "lng": 10.73593854 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble klemt mellom buss og fortau", + "type": "String" + }, + "date": { + "value": "2014-09-23T16:31:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "bfa3220c368b7a22a5d00d841e8f9f7e052a7a0b.jpeg", + "type": "String" + } + } + }, + "aftenposten-2187": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96085416, + "lng": 10.74798703 + }, + "type": "LatLng" + }, + "description": { + "value": "Høye graner ved rødt hus gir null sikt for de som kommer oppover Nilserudkleiva. Bare et spørsmål om tid før det smeller.", + "type": "String" + }, + "date": { + "value": "2014-09-23T13:16:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "ecf62f55ae20093f5d8b158eb5e957addcd366e5.jpeg", + "type": "String" + } + } + }, + "aftenposten-2186": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94119133, + "lng": 10.74982166 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt begynner og stopper brått i en innsnevring i rundkjøring. Det er rikelig plass til separat sykkelfelt utenom rundkjøring", + "type": "String" + }, + "date": { + "value": "2014-09-23T13:10:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "6fe7769cf120d01911311c993ed165783050dcca.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2185": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94090651, + "lng": 10.74989676 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist påkjørt av lastebil. Ble liggende på sykeshus 16 dager med dobbeltsidig komplisert ankelbrudd. Lastebilfører ga ikke tegn, hadde møkkete ruter, men slapp una med 3000 NOK i bot og en ukes inndraging av førerkort.", + "type": "String" + }, + "date": { + "value": "2014-09-23T13:07:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "d74739d163b83d36414c31ff79a59e3f9c4cda08.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2184": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90223957, + "lng": 10.7675457 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig trangt å sykle med motgående trafikk", + "type": "String" + }, + "date": { + "value": "2014-09-23T11:31:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "a2a6b859759fefc67ed8f9b5c11dab4d1d9e0d32.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2183": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9233024, + "lng": 10.7480898 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne bakken er altfor bratt. Man kan bli alvorlig utmattet av å sykle opp her.", + "type": "String" + }, + "date": { + "value": "2014-09-23T11:31:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "8594280c56254cc4057cecb1bb84166b1033c38a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2182": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91817208, + "lng": 10.75968146 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er et fryktelig kryss og det mest naturlige stedet å sykle når du kommer fra byen og skal mot tøyen. Det er ingen plass på fortauet på grunn av uteservering og veien er full av livsfarlige trikkeskinner. Det er ubehagelig å krysse over veien mellom trikk, buss og taxi for å komme inn på riktig kjøreretning.", + "type": "String" + }, + "date": { + "value": "2014-09-23T11:06:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "58248dac829053429c06dbc574b01ee689e8c62d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2181": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91123415, + "lng": 10.73047757 + }, + "type": "LatLng" + }, + "description": { + "value": "Trilker, trikkeskinner, ruglete steinheller og fotgjengere syklister som krysser i alle retninger. Få på plass en dedikert sykkelvei!", + "type": "String" + }, + "date": { + "value": "2014-09-23T08:44:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "804ab1e070cbccdcab8c8683a7c3c72107536085.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2180": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91701586, + "lng": 10.74433922 + }, + "type": "LatLng" + }, + "description": { + "value": "Filbytte på sykkel er aldri gøy. I sommer kjørte jeg her hver dag og i krysset keysers gate/Akersgata følte meg truet av både biler som skulle til høyre, samt andre syklister som kom bakfra. I øvrig var andre syklisters hastighet og bilisters uoppmerksomhet skremmende nedover hele Ullevålsveien. Jeg mener opphøyde sykkelstier, fartsmålere og egne sykkel-trafikklys er løsningen.", + "type": "String" + }, + "date": { + "value": "2014-09-23T08:14:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "b8b23f3d214ebe7f8c68cfa77b1c3c9c1b1b5d18.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2179": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92411927, + "lng": 10.70772171 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved trikkestoppet, for høye kanter på vei nedover mot frogner plass, til at jeg som syklist ser om noen er på vei over fotgjengerfeltet før de går ut i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-23T08:04:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "b23b7c7b351a1bf9d8c511cf6ddc2d843139f896.jpeg", + "type": "String" + } + } + }, + "aftenposten-2178": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92307617, + "lng": 10.70564031 + }, + "type": "LatLng" + }, + "description": { + "value": "sykkelfelt slutter, og begynner igjen på andre siden av rundkjøringen. gir farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-23T08:03:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "0a4bb3ac4b2734d1f90caa58550f7a9c2688279f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2177": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93706388, + "lng": 10.53335666 + }, + "type": "LatLng" + }, + "description": { + "value": "Vårproblematikk: Sykkelnett feies ikke i takt med at snøen går, gjør det farligere å sykle og tvinger syklister ut i veibanen.", + "type": "String" + }, + "date": { + "value": "2014-09-23T08:01:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "590c676ae32245da8d586e366fc4eeab5a8aff18.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2176": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92691504, + "lng": 10.63914299 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig kryss ved undergangen.", + "type": "String" + }, + "date": { + "value": "2014-09-23T07:58:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "6493812b522890dfb660bb4a4793a15b1d08d2b6.jpeg", + "type": "String" + } + } + }, + "aftenposten-2175": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91557994, + "lng": 10.65467834 + }, + "type": "LatLng" + }, + "description": { + "value": "overtraffikert i rushtid, syklister ligger fire i bredden i nedoverbakken - burde vært en midtdelingslinje.", + "type": "String" + }, + "date": { + "value": "2014-09-23T07:55:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "f04b5fdfcefb20d1190b8caec6c0f07466784c23.jpeg", + "type": "String" + } + } + }, + "aftenposten-2174": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91721484, + "lng": 10.66081523 + }, + "type": "LatLng" + }, + "description": { + "value": "Overtraffikkert i rushperioder, ubehagelig med barn. Har opplevd at syklister presser, skumle forbikjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-23T07:54:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "cdfe78db68f5533fcfd42b0e312d803ea1b7d3b1.jpeg", + "type": "String" + } + } + }, + "aftenposten-2173": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92383968, + "lng": 10.64463615 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært trafikkert kryss hvor overgangene ved rundkjøringen er uoversiktlige for sjåførene. Å gå trygt over, krever at alle fire sjåfører er klar over at det er fotgjengere/syklister i gangfeltet. Har opplevd flere farlige situasjoner i kryssing av fire felt ved fotgjengerovergangene.", + "type": "String" + }, + "date": { + "value": "2014-09-23T07:50:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "68aed0016738ac6cc787a0af94d389a1e210eb19.jpeg", + "type": "String" + } + } + }, + "aftenposten-2172": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91416009, + "lng": 10.71587562 + }, + "type": "LatLng" + }, + "description": { + "value": "Lå imellom fortau og trikkeskinnene, skvatt av bil som kjørte forbi - satte forhjulet i skinnene. Førte til kneskade m menisk, korsbånd etc.", + "type": "String" + }, + "date": { + "value": "2014-09-23T07:42:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "97fe3f952447aad9391f270b1501137bed98fe9d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2171": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91906477, + "lng": 10.70122003 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelfelt. Feildosering i bussfeltet innover mot veiskulder i sving er farlig glatt både på høsten (blader) og vinterstid. Har flere ganger opplevd å skli ut.", + "type": "String" + }, + "date": { + "value": "2014-09-23T07:33:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "fafc9f51593b6ee7c83ce5dc2234df4353f91c42.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2170": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91848399, + "lng": 10.70446014 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelvei. Buss og sykkel kommer i konflikt i svingen, de kutter svingen og legger seg inn i det som burde vært sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-23T07:30:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "7698d00eb25c9fbc33afed5fb51fb99a54aa4327.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2169": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91428917, + "lng": 10.75268626 + }, + "type": "LatLng" + }, + "description": { + "value": "Kaotisk kryss som ikke er tilrettelagt for verken myke eller harde trafikanter. Helt umulig å finne en klok vei feks fra Grønland/Brugata og til Stortorvet. Fins heller ingen gode alternative ruter om man feks vil ta omveien over Jernbanetorget. Det er rett og slett veldig vanskelig å krysse Oslo sentrum på sykkel. Området Brugata/Jernbanetorget burde absolutt hatt egne sykkelveier.", + "type": "String" + }, + "date": { + "value": "2014-09-23T07:25:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "b6f6fdec219bf699e7216349ce051d1c228e9058.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2168": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95205568, + "lng": 10.77042102 + }, + "type": "LatLng" + }, + "description": { + "value": "Daglig oppstår det farlige situasjoner når ett femtitalls mennesker går av toget og sykelister farer forbi i begge retninger med sinnssykt blikk på den delte gang og sykkelveien fra Nydalen stasjon frem til Sandakerveien. Det var mye tryggere her før gang og sykkelveien ble bygget. Da var det bare biler og ta hensyn til. Nå er det sykelistene som er udyret som ikke viser hensyn. Senk farten før du kjører inni en folkemasse er min oppfordring. Hilsen utrygg fotgjenger.", + "type": "String" + }, + "date": { + "value": "2014-09-22T23:36:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "5867063bec6dbcab2f92f657ad6cabfbe414341c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2167": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9180968, + "lng": 10.68935394 + }, + "type": "LatLng" + }, + "description": { + "value": "Gravearbeider i sykkelfeltet. Sykkelveien stopper plutselig i gjerdet. Det mangler skilting som opplyser syklistene om at sykkelveien er borte.", + "type": "String" + }, + "date": { + "value": "2014-09-22T17:55:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "a687f8bf70856feb8c9e232eaed052bfb3fb12e3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2166": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90745801, + "lng": 10.78081727 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler parkerer i sykkelfeltet for å handle på Rimi. For ikke å være i veien parkerer de helt opptil bommen, da er det ikke mulig for syklene å komme forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-22T17:00:22Z", + "type": "DateTime" + }, + "bilde": { + "value": "63f141dcd3b4b035e9b290c46577c328.JPG", + "type": "String" + }, + "streetview": { + "value": "d8dbc7a77a98542b62f0be1b0b71d82aad1ddcac.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2165": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91242091, + "lng": 10.76394982 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Grønland er utrolig skummel! Helt Texas og ingen trafikkregler synes å gjelde. Fotgjengere, syklister i alle varianter, biler, taxier - her er det med hjertet i halsen!", + "type": "String" + }, + "date": { + "value": "2014-09-22T16:22:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b50609f6ddf4d7bdafab8e5b3ee9199c0a13762.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2164": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91890968, + "lng": 10.81757597 + }, + "type": "LatLng" + }, + "description": { + "value": "Avkjøring fra motorvei og fotgjengerovergang kombinert med dårlig sikt. Skummel!", + "type": "String" + }, + "date": { + "value": "2014-09-22T16:20:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "11b845ed5f7f92ed8ec4fc3a6c29c21ff6292cb1.jpeg", + "type": "String" + } + } + }, + "aftenposten-2163": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92340953, + "lng": 10.83844185 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig uoversiktelig utkjøring fra Staples som er livsfarlig. Gjelder forresten hele Breivollveien, men denne utkjøringen er verst!", + "type": "String" + }, + "date": { + "value": "2014-09-22T16:13:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "be8dbe327eb2f42025aaa9e2b2edb610e0fd9cdf.jpeg", + "type": "String" + } + } + }, + "aftenposten-2162": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9278422, + "lng": 10.82425809 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg sykler til jobb hver dag, hele Harladrudveien er fylt med tungtrafikk som ikke tar hensyn til syklister i det hele tatt. Ikke noe sykkelfelt, kun fortau, Har vært mange nesten-ulykker. Dette gjelder hele Haraldrudveien fra Persveien til Brobekkveien.", + "type": "String" + }, + "date": { + "value": "2014-09-22T15:34:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "d5fd0b7fd67ab3bb72748906a2448d8d4aaf9398.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2161": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92854939, + "lng": 10.76192378 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt er ønsket syklene blir presset av biler her hver dag.", + "type": "String" + }, + "date": { + "value": "2014-09-22T14:05:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "9373070f19714263eddb58af84ab6417e956754e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2160": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91687066, + "lng": 10.77947616 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke farlig vei, men denne veien burde reguleres til sykkelvei... helt hodeløst å bare kalle det turvei, ALLE sykler her, veien er veldig mye brukt av syklister som skal fra øst til vest. beste rutevalg fra ensjø til carl berner.", + "type": "String" + }, + "date": { + "value": "2014-09-22T14:03:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "7dc5977c7fd52ea2e7c2b24b57a788a3026b8f9e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2159": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91463338, + "lng": 10.78780174 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler svinger til høyre inn gladengveien når sykelister ligger til høyre for bilen i sykkelfeltet. Bil og sykkel kan ikke konkurere om plassen i veibanen, da dør sykelisten eller i beste fall blir det bare skade på bilen. Her er det naturlig å holde 40 km/t på sykkel på vei mot en lang motbakke. det er ikke lagt til rette for sykkel når man må bremse ned og stoppe for biler og ikke ta farten man har med opp bakken. Dette er en av grunnene til at jeg heller ønsker å kjøre bil. De som lager sykkelveier tenker ikke på trafikkflyt for sykelister i det hele tatt. Fotgjengere og sykelister velger korteste vei som krever minst energi... Fotgjengere og sykelister bidrar sterkt til bedre miljø, derfor burde dere legge til rette for bedre trafikkflyt for sykelister og fotgjengere.", + "type": "String" + }, + "date": { + "value": "2014-09-22T14:01:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "a37415c0069ea7debb80dd991a44780a4b081a94.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2158": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85899717, + "lng": 10.78582763 + }, + "type": "LatLng" + }, + "description": { + "value": "For liten plass ved fotgjengerovergangen med lys fra Ljabruveien til gang/sykkelvei langsMosseveien. Bygg gangbro. Her det livsfarlig nå det glatt! Hilsen KENNET", + "type": "String" + }, + "date": { + "value": "2014-09-22T10:38:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "9d8ffb4ff618551d0a7aba67f985d50da6c907da.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2157": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95511769, + "lng": 10.72814941 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien møter vanlig vei og veikryss. I tillegg kommer avkjøring fra Østre Aker vei i høy fart på samme sted. Det finnes ikke fotgjengerfelt for gående noen veier. Det er ikke markert i vei at den krysser sykkelvei. Biler i fart fra hele 3 forskjellige retninger møter gangvei og sykkelvei og skaper mange farlige situasjoner. Dette kan enkelt løses ved å lage nødvendige fotgjengerfelt og sette opp skilt som varsler om kryssende sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-22T10:02:05Z", + "type": "DateTime" + }, + "bilde": { + "value": "66d97e58247d4f75ec5cd4f6ef350156.jpg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2156": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92599031, + "lng": 10.95285415 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig når man sykler gang- og sykkelveien i retning Visperud (nordover). Det er liten sikt mellom de som kommer derfra og som skal fra Industriveien og ut på Røykåsveien. Jeg velger i stedet kjørebanen på denne strekningen. Det føles tross alt sikrere.", + "type": "String" + }, + "date": { + "value": "2014-09-22T08:41:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "721dc9aba1151140c34948611515912f4a0a87af.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2155": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93012452, + "lng": 10.77127933 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det separert mellom gang- og sykkelvei med en liten opphøyet kant. Men hvilken del som er beregnet for sykkel og hvilken del som er beregnet for gående er dårlig merket, noe som resulterer i at syklister bruker gangdelen og visa versa.", + "type": "String" + }, + "date": { + "value": "2014-09-22T08:04:24Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2154": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92924289, + "lng": 10.76997041 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det en veldig krapp sving ned en bratt bakke før man kommer til undergangen. Kommer man syklende ovenfra har man gjerne god fart, og er man uforberedt kan man risikere å ikke klare svingen. Det er også umulig å se om det kommer noen ut fra undergangen.", + "type": "String" + }, + "date": { + "value": "2014-09-22T08:01:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "0bcba873afaaa00bed4283ec4dc1c4a6ca8c642e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2153": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92010799, + "lng": 10.75808286 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne gata er helt tydelig ment som sykkelsti, men den er enveiskjørt, så når man sykler østover, må man kjøre mot kjøreretningen. Fører til forvirring og utrygghet for syklister og bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-22T07:42:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "56133e52ad03bd084e5a8b5c7e17d95d3a11d498.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2152": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94112685, + "lng": 10.77097892 + }, + "type": "LatLng" + }, + "description": { + "value": "Store hull og manglende asfalt rundt trikkeskinnene gjør det vanskelig og ubehagelig å sykle her.", + "type": "String" + }, + "date": { + "value": "2014-09-22T07:39:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "2f27e7d577468a3b400e8134375545bb0d80b8fa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2151": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91637589, + "lng": 10.76788902 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg har rapportert til Bymiljøetaten tidligere om at asfalten langs Botanisk hage er veldig lite egna å sykle på - veldig humpete og hullete. Ser at det tydeligvis ikke er meninga at syklister skal oppholde seg her, men det er ingen annen logisk trasé mellom Tøyen og Grünerløkka.", + "type": "String" + }, + "date": { + "value": "2014-09-22T07:39:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "c0471a25020f4d8f476692abf3bd17c21903692f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2150": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92903323, + "lng": 10.81054687 + }, + "type": "LatLng" + }, + "description": { + "value": "Her opphører sykkelveien og det er uoversiktlig å sykle over denne veien for å komme seg over til andre siden der sykkelstien fortsetter.", + "type": "String" + }, + "date": { + "value": "2014-09-22T07:36:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "fdfe569f9d3742e6f594026b5e9cb420da65d9a0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2149": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90718904, + "lng": 10.76797485 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister i full fart ned Kongsveien møter syklister i Gamlebyen. Det er ikke plass til syklistene, det mangler sykkelfelt. Trikken går helt inn til fortauet og syklistene må enten ligge på utsiden eller foran/bak trikken. Skaper mange farlige situasjoner mellom. Mye hull og skader i veien i tillegg til trikkeskinnene er farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-22T07:19:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "b4df30c4c25f813c1eec181ad4456788488b0dca.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2148": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91099748, + "lng": 10.77218055 + }, + "type": "LatLng" + }, + "description": { + "value": "En viktig forbindelse mot byen fra Tøyen/Vålerenga, og det er ganske mange syklister her i morgentrafikken. Fjern p-plassene og lag separterte og gode sykkelfelter helte veien fra Ring 2 til Grønlandsleiret!", + "type": "String" + }, + "date": { + "value": "2014-09-21T21:57:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "888b587776b79414159e4417c39a8f6a0e0d4638.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2147": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95190526, + "lng": 10.78532123 + }, + "type": "LatLng" + }, + "description": { + "value": "trykkesporene ligger over veien og er livsfarlige for syklister", + "type": "String" + }, + "date": { + "value": "2014-09-21T21:11:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "80f9c906317271047ae05e11cfb6f33463f1987b.jpeg", + "type": "String" + } + } + }, + "aftenposten-2146": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93732186, + "lng": 10.75879096 + }, + "type": "LatLng" + }, + "description": { + "value": "Ca. kl. 17.24 kom jeg syklende ned Arendalsgata retning Treschougs gate. Plutselig dukket 20-bussen opp på min venstre side, tutet og passerte meg mens den aksellererte. Da boggi på bussen var på min venstre side bremset bussen kraftig opp samtidig som den svingte til høyre for å stoppe veed holdeplass Arendalsgata retning Galgeberg. Jeg bremset kraftig opp så sykkelen nesten tippet forover.Hvis ikke, hadde jeg blitt kvestet av bussens bakerste hjul. Da bussen stod på holdeplassen, banket jeg på sjåførens sidevindu. Han åpnet ikke vinduet, men pekte nese til meg.Sjåføren var av østeuropeisk utseende, ca. 50 år, bart.", + "type": "String" + }, + "date": { + "value": "2014-09-21T21:01:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "21499d7d5a748ee1f767572b2befb027f37ce610.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2145": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90802823, + "lng": 10.76797485 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkeskinne i regn med tynn dekk", + "type": "String" + }, + "date": { + "value": "2014-09-21T20:49:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "a154bf7353db02d50e4312bfcfed90442ba1cbd5.jpeg", + "type": "String" + } + } + }, + "aftenposten-2144": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91681688, + "lng": 10.72013497 + }, + "type": "LatLng" + }, + "description": { + "value": "kaos pga mange som kjører barn tl skolen. Mange farlige situasjoner", + "type": "String" + }, + "date": { + "value": "2014-09-21T20:39:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "d48451b59c63277629ed7577b67479350d397bac.jpeg", + "type": "String" + } + } + }, + "aftenposten-2143": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93495696, + "lng": 10.69321632 + }, + "type": "LatLng" + }, + "description": { + "value": "En rekke trange opplevelser, særlig østover. Sykler for fort til å bruke fortauet der det er mange fotgjengere fra Heggeli og østover. Må bruke veien. Har tatt igjen og snakket med flere bilister som oppgir ikke å ha sett meg tross signalvest og lys.", + "type": "String" + }, + "date": { + "value": "2014-09-21T20:35:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "51533951f759a1f53c2c622ee9bda5732e0778d9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2142": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94542574, + "lng": 10.68866729 + }, + "type": "LatLng" + }, + "description": { + "value": "fartsdump med hull eller feil som fører til punktering selv i lav fart. Kan føre til ulykke i stor fart. Jeg meldte fra for over ett år siden også, men feilen er der fortsatt", + "type": "String" + }, + "date": { + "value": "2014-09-21T20:33:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "0afab35008a651cd226d723ec41b4fec38a4f86a.jpeg", + "type": "String" + } + } + }, + "aftenposten-2141": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92053818, + "lng": 10.67566394 + }, + "type": "LatLng" + }, + "description": { + "value": "veiarbeid, punktering", + "type": "String" + }, + "date": { + "value": "2014-09-21T20:28:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "f3b163731e62924e623d17094f83304263812fb0.jpeg", + "type": "String" + } + } + }, + "aftenposten-2140": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94708066, + "lng": 10.77029228 + }, + "type": "LatLng" + }, + "description": { + "value": "I svingen her er det lagt asfalt som jevner ut forskjellen mellom fortauskant og veibane ( av en eller annen uforståelig grunn) derfor må syklister godt ut i veien i svingen", + "type": "String" + }, + "date": { + "value": "2014-09-21T20:11:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "80f665efaa9fe6cec8ffe3068620da93db7ce4c0.jpeg", + "type": "String" + } + } + }, + "aftenposten-2139": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91345014, + "lng": 10.75445652 + }, + "type": "LatLng" + }, + "description": { + "value": "Tidligere var det merket sykkelfelt på denne strekningen. Merkingen ble etterhvert slitt bort og helt borte etter nyasfalteringen. Denne veistrekningenl er blitt mer utrygg.", + "type": "String" + }, + "date": { + "value": "2014-09-21T19:32:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "8ede5787157ce8b0f32efc67641a794c11df6dad.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2138": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91321349, + "lng": 10.74471473 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det skiltet sykkeltrasé rett fram, samtidig som det er skiltet påbud om å svinge til høyre, uten unntak for syklister. Man bryter altså trafikkreglene ved å ta i bruk sykkeltraseen. Skilting som dette oppmuntrer syklister til å ignorere trafikkreglene.", + "type": "String" + }, + "date": { + "value": "2014-09-21T19:06:17Z", + "type": "DateTime" + }, + "bilde": { + "value": "2a52d36c7ea661626e6ac5d4f72db074.png", + "type": "String" + }, + "streetview": { + "value": "91b8b7718a61e967c9205597c995725d8d476288.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2137": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91684915, + "lng": 10.75316905 + }, + "type": "LatLng" + }, + "description": { + "value": "Øvre del av Torggata skal være stengt for motorisert ferdsel, men det mangler skilting som varsler om dette i krysset med Osterhaus gate. Biler som kommer kjørende i Osterhaus gate kan tilsynelatende fullt lovlig svinge inn i og kjøre gjennom den nye «sykkelgata».", + "type": "String" + }, + "date": { + "value": "2014-09-21T19:02:06Z", + "type": "DateTime" + }, + "bilde": { + "value": "8d90d9b41d433657c3f48da41931e50e.jpg", + "type": "String" + }, + "streetview": { + "value": "8e9c86ceed83cb1e9ec4be4b3c73167d9a6d20ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2136": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92231264, + "lng": 10.75728893 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det merket sykkelfelt med trafikk i begge retninger, samtidig som det er skiltet innkjøring forbudt, uten unntak for syklister. Man bryter altså trafikkreglene ved å ta i bruk sykkelfeltet. Skilting som dette oppmuntrer syklister til å ignorere trafikkreglene.", + "type": "String" + }, + "date": { + "value": "2014-09-21T18:52:53Z", + "type": "DateTime" + }, + "bilde": { + "value": "6d07e6b20f41cca45fc728c0fc3602f4.png", + "type": "String" + }, + "streetview": { + "value": "63538be87f0e891726cf3295b31b54f619fb84a9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2135": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9201295, + "lng": 10.75738549 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det skiltet sykkelfelt, samtidig som det er skiltet innkjøring forbudt, uten unntak for syklister. Man bryter altså trafikkreglene ved å ta i bruk sykkelfeltet. Skilting som dette oppmuntrer syklister til å ignorere trafikkreglene.", + "type": "String" + }, + "date": { + "value": "2014-09-21T18:51:52Z", + "type": "DateTime" + }, + "bilde": { + "value": "4b30928591954cc527a2f52f44d7a51f.png", + "type": "String" + }, + "streetview": { + "value": "2112d38940373dc17b84ec56c8f1ac967792e6b2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2134": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92495803, + "lng": 10.75926303 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet i Thorvald Meyers gate er en vits. Serveringssteder har tatt seg til rette, slik at det blir blokkert av kafebord og barnevogner. Også handelsboder i feltet. Syklister må ut i trikkesporet.", + "type": "String" + }, + "date": { + "value": "2014-09-21T18:40:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "12a5e1eea71ed99b11e56595a10a4bb93b266c0a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2133": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9271516, + "lng": 10.71132659 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne veien har sykkelsti, men den ender opp mellom to filer i et lyskryss. Du er nødt til å stå på rødt, og vike for bilene før du kan svinge mot Frognerparken. Biler og busser må også kjøre over sykkelfeltet for å svinge.", + "type": "String" + }, + "date": { + "value": "2014-09-21T17:01:16Z", + "type": "DateTime" + }, + "bilde": { + "value": "ddc6f38b4b1265c5dcb2710dcc4008c3.png", + "type": "String" + }, + "streetview": { + "value": "2a27e86f851dfecd10990853fe9e8b804bdd50c3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2132": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93495696, + "lng": 10.82625389 + }, + "type": "LatLng" + }, + "description": { + "value": "Brobekkveien fra Persveien til Østre Aker vei er generelt vanskelig å komme fram på sykkel. Mye tungtrafikk gjør veien farlig å sykle. smalt fortau på én side av veien gjør det vanskelig å passere fotgjengere.", + "type": "String" + }, + "date": { + "value": "2014-09-21T16:23:56Z", + "type": "DateTime" + }, + "bilde": { + "value": "92d885733df3e635ce9df72889a0c441.png", + "type": "String" + }, + "streetview": { + "value": "4f44421e98479427721c508b4884ff6f8f92cbef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2131": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90931924, + "lng": 10.76416611 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister mellom Nordenga bru og Platous gate må klatre opp / ned 20 cm høy fortau, eller kjøre en U-formet omvei vestover. Unødvendig klønete.", + "type": "String" + }, + "date": { + "value": "2014-09-21T15:59:54Z", + "type": "DateTime" + }, + "bilde": { + "value": "2cee27259c974d29cce526f823cdc597.jpg", + "type": "String" + } + } + }, + "aftenposten-2130": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93823553, + "lng": 10.78301668 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er for dårlig sikt pga busker i bed mot Maxbo. Her er det mange nestenulykker mellom syklister som kommer ovenfra Sinsenkysset og syklister som kommer nedenfra og skal svinge til venstre og sykle under Ring3.", + "type": "String" + }, + "date": { + "value": "2014-09-21T15:11:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "61fed545576b882e0bb6711f329ea824270c67fc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2129": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94856358, + "lng": 10.69604873 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det en dyp sprekk på langs midt i veien. Lett å kjøre et sykkelhjul ned i sprekken - samme effekt som å kjøre i trikkeskinne.", + "type": "String" + }, + "date": { + "value": "2014-09-21T15:02:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "6eaf17a5be4c5a3141dac7803a810041d2e92e36.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2128": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91715031, + "lng": 10.81099748 + }, + "type": "LatLng" + }, + "description": { + "value": "De ivrigste syklistene viser liten forståelse for at det faktisk kan befinne seg mennesker i undergangen, og kommer inn i den nitti graders svingen i 25 kilometer i timen. At det er tegnet retningspiler på bakken synes å være i beste fall veiledende og frivillig. Hva er galt med å sakke farten såpass at du ikke dreper den du garantert ikke har tid til å bremse for?", + "type": "String" + }, + "date": { + "value": "2014-09-21T14:13:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "52ee60415678b7bd89e63d91485866186e7be89c.jpeg", + "type": "String" + } + } + }, + "aftenposten-2127": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92003271, + "lng": 10.6914246 + }, + "type": "LatLng" + }, + "description": { + "value": "Her ender sykkelvei rett før krysset og syklister som skal opp Halvdan Svartes gate må krysse to felt med bilder som kjører raskt opp bakken for å nå trafikklyset. Her må det tilrettelegges for syklister som skal til venstre.", + "type": "String" + }, + "date": { + "value": "2014-09-21T13:55:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "392c2ce283ed8ecc74b8beaf5e0b1bdd9eda3fcf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2126": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9396436, + "lng": 10.76443433 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig bakke hvor biler ofte kjører for fort og syklister nedover har høy fart, mens syklister oppover sykler svært sakte.", + "type": "String" + }, + "date": { + "value": "2014-09-21T13:48:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "57b653d3e8f18aea4a5ec0e2864de2101334f7b5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2125": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93540846, + "lng": 10.73969364 + }, + "type": "LatLng" + }, + "description": { + "value": "Nylig lagt ny asfalt, men ingen sykkelvei?! det Det er stor plass å ta av både fra fortau og gate. Her er biler i høy fart og syklister for raske til å kunne kjøre på fortauet (ref. dødulykke for kort tid siden hvor to syklister kjørte i hverandre før bussen kjørte over den en. Syklisten ble dømt for å holde for høy fart på fortauet. Uforstålig at det ikke er gjort noe med denne vein nå!", + "type": "String" + }, + "date": { + "value": "2014-09-21T13:46:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "59cb235ab9872156c7ff7ce1718e39c8a103cc43.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2124": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91272942, + "lng": 10.80328345 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklistene er henvist til et altfor smalt fortau. Veldig ubehagelig strekning . Mange syklister langs Østensjøveien/Grenseveien og 0 tilrettelegging.", + "type": "String" + }, + "date": { + "value": "2014-09-21T13:45:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "0d39861a01b5ce64c5d3fa821f648900d414e1b7.jpeg", + "type": "String" + } + } + }, + "aftenposten-2123": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94112685, + "lng": 10.7711184 + }, + "type": "LatLng" + }, + "description": { + "value": "Store hull i asfalten rundt trikkeskinnene gjør det risikabelt å krysse. Har er det om å gjøre å krype over i gangtempo. Selvsagt utrolig irritabel for alle andre man deler veien med. Dette problemet har jeg rapportert inn for flere år siden uten at noe er gjort.", + "type": "String" + }, + "date": { + "value": "2014-09-21T13:12:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "b38e99a12f8c2f9bf9bfa41d8f3f59b0ca35e988.jpeg", + "type": "String" + } + } + }, + "aftenposten-2122": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88189594, + "lng": 10.78382134 + }, + "type": "LatLng" + }, + "description": { + "value": "Nestenulykke. Jeg blir forbikjørt av en bil et par meter før krysset som deretter brått svinger til høyre uten å blinke, slik at jeg må bråbremse for å unngå å bli meid ned. Stuper nesten over sykkelen. Bilist kjører av gårde uten å undersøke hvordan det gikk.", + "type": "String" + }, + "date": { + "value": "2014-09-21T12:47:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "04d1f8ab0060699cff58c56b8da28db88b6a9565.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2121": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89692344, + "lng": 10.76063632 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt opphører og går over i krapp sving hvor veien er smal. I rushtiden om morgenen er det mange bilister som kun har fokus på seg og sitt og gjerne prøver å kjøre forbi så snart anledningen byr seg, selv ved møtende trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-21T12:16:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "04e544c0ab9eedc212a6d0229384c35c0ec23a6d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2120": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87297957, + "lng": 10.79030156 + }, + "type": "LatLng" + }, + "description": { + "value": "Buss for trikk tar u-sving på brannstasjonen og rett ut i veien, og meier nesten ned syklist i sykkelfeltet på vei ut.", + "type": "String" + }, + "date": { + "value": "2014-09-21T12:00:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "31a714d1f740823cfb0323a858cc12f739b52b2a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2119": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89423277, + "lng": 10.54539442 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig punkt. Alle syklistene (dvs. i begge retninger) blir ledet inn mot et knøttlite punkt ved foten av brua. Her vil det kunne skje ulykker. Heldigvis er ikke farten så stor på dette punktet. Dårlig konstruert samferdsel", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:53:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "415acc88c265d0ca2348c8b9b9a8a16a8cd1994a.jpeg", + "type": "String" + } + } + }, + "aftenposten-2118": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89345782, + "lng": 10.55277585 + }, + "type": "LatLng" + }, + "description": { + "value": "Når syklistene som kommer fra Oslo mot Sandvika skal krysse veien på dette punktet, opptrer det ofte utrivelige situasjoner. Vi må ut av sykkelfeltet og ut i veien for å krysse over. Jeg har sett minst 10 situasjoner på dette punktet som ikke passer inn under \\\\'gode minner\\\\'.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:46:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "c6220c8ade2470d75c3b2a82fffa38a37ec717aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2117": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90951289, + "lng": 10.62075376 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig brøyting om vinteren. Her ble jeg presset av veien av en bilist. Sykkelfeltet var fullt av snø og jeg måtte sykle i veien. Fikk et ublidt møte med snøen. Hvorfor kan det ikke brøytes om vinteren på sykkelfeltene?", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:44:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "7db31086be56e86befedabc5011ce0cea8944c68.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2116": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9206995, + "lng": 10.67647933 + }, + "type": "LatLng" + }, + "description": { + "value": "Nok en gang er det veiarbeid og dårlig framkommelighet for syklister (med mindre man elsker å punktere).", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:41:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "3889dba8a0881ed4637c8ace81e282e27fcdb7b7.jpeg", + "type": "String" + } + } + }, + "aftenposten-2115": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91768809, + "lng": 10.68746566 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne svingen er rett og slett krøkkete. Her kommer det til å skje ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:40:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "b2823f50cb9aabefb12752404862ee60fb752819.jpeg", + "type": "String" + } + } + }, + "aftenposten-2114": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91056717, + "lng": 10.70913791 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kommer opp fra Kielferja, over brua og skal opp på Drammensveien (mot Solli Plass) er veien ikke spesielt egnet for annet enn offroadsykler. Det er masse kantsteiner som man må hoppe over og hullete vei.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:38:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "70372e51a06b7718f5cd2f5837188916059d8fde.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2113": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93403955, + "lng": 10.67420482 + }, + "type": "LatLng" + }, + "description": { + "value": "Betongfundamentet for støyskjermen har flere umotiverte innhakk med skarpe kanter. Syklende mot vest kan falle ut mot betongkanten og få store skader. Innhakkene bør avskjermes.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:37:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "62f8122caedaa3756f4ed5a82f35d3e6a23b2455.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2112": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94125045, + "lng": 10.9216547 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil og syklist kolliderte. Syklist hentet med ambulanse. Bilister kjører helt frem til vei før de ser til høyre og venstre.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:35:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "bdacfcf52be31b59b3fcdd3cb866cc835af309ec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2111": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92056507, + "lng": 10.67574977 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble påkjørt av en bil som kom ut fra marinaen i stor fart.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:35:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "8d94d71480c88db5ce509bff54dfbd1678ef07db.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2110": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93204898, + "lng": 10.70560812 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble kjørt ned av en bilist i rundkjøringen. Jeg lå i ytre felt, han lå i indre. Bilisten skar tvers over fra indre felt, kjørte meg ned og forsvant nedover Middelthuns gate. Han stoppet 100 meter nede i gaten (for å se hva som hadde skjedd?) før han stakk av fra ulykkesstedet.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:32:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "bfcb1da3eb74395fbb56fc8a461e2d26b47a8724.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2109": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89376995, + "lng": 10.54364562 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg sykler fra Asker til Oslo hele året. Om vinteren er det relativt bra brøytet i Oslo og Asker. Bærum kommune på sin side gir totalt blaffen i brøyting for syklister og gående. Langs veien fra Sandvika mot Blommenholm (den som går ved siden av E18) blir det brøytet fra veien og opp på fortauet. I vinter kunne det gå over en uke før snøen ble fjernet fra fortauet. Skråplanet ned fra brua (for den som kommer fra Sandvika) ble ikke strødd på 2 uker! Det var umulig å gå der. Jeg kom meg opp pga piggdekk på sykkelen. Gående eller mennesker med rullestol ville ikke kunne klart å ta seg opp/ned over brua i lange perioder. Bærum gir tydeligvis blaffen i fremkommeligheten for gående, rullestolbrukere og syklister om vinteren.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:28:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "543c6a8416cbbce51bec2e31ae10464e7f878d5f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2108": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91327803, + "lng": 10.64165353 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er bygget en ny veibru for syklister og gående på Lysaker. Veien er på høyde med vestlandsveier fra 70-tallet. Den er svingete og tar ikke hensyn til at syklistene beveger seg raskere enn de gående. Overgangen mellom brua (det lange skråplanet) og den videre veien må være laget av noen som ikke sykler. Her er det hull, brostein, kryssing av offentlig vei og sviner på svinger.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:23:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "f2baaf6e3e124f8aaf2e0a61e1511e877dfab320.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2107": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93687147, + "lng": 10.68130001 + }, + "type": "LatLng" + }, + "description": { + "value": "Kaotisk i svingen til Monolittveien med signal- og lysstolper og køer ved fotgjengerfeltene. Vinterstid er hele strekningen kaotisk og trang når i perioder mer enn halvdelen av GS-vegen er blokkert av snø fra bil-vegen og tilstøtende gårdsplasser. Særlig sykling i vestlig retning er farlig med risiko for å ramle ut foran biler/busser, som kommer i stor fart rundt svingen fra Monolittveien og opp mot stasjonen. En dødsulykke som den ved Ullevål Sykehus kan lett skje her også.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:22:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "0c5bf9c411e1ff331312ecc1ed168eb4fcf6ac02.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2106": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91466565, + "lng": 10.7179141 + }, + "type": "LatLng" + }, + "description": { + "value": "I forbindelse med veiarbeid er det nesten umulig å komme forbi på sykkel. Jeg har selv opplevd en nestenulykke på Solli plass", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:19:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "a9bb0bd90ff7b3084b2ed09591bf93b4adac3759.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2105": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93806892, + "lng": 10.78489422 + }, + "type": "LatLng" + }, + "description": { + "value": "En smørje av møtepunkt for gående fra busstoppet og syklister som runder fra nordøst(gjerne i litt høy fart etter den bratte nedoverbakken). Når dette er kombinert med høy vegetasjon helt inntil den smale sykkel/gangveien fra nordøst, blir det mange situasjoner her.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:19:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "79700f4700e662f29740ec22aefd3b6e2d6be1db.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2104": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94183711, + "lng": 10.67108702 + }, + "type": "LatLng" + }, + "description": { + "value": "Flere syklister påpeker ignoranse / uansvarlighet fra bilister som skal ut og inn Morgedalsveien. Krysset er utformet slik at det ikke er mulig for biler å se oppover Sørkedalsveien og få oversikt uten å sperre sykkelstien. Ofte står bilene og trailere LENGE og venter på en luke. At syklister blir provosert er ikke vanskelig å forstå, men skyld på kryssets utforming, det er ikke konstruert til å håndtere den trafikkmengden. OG verre blir det med trafikk ut inn til ambassaden.", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:13:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "d7fc7bd75a50b02efd2eb1f158e57e6e1807d44a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2103": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93691339, + "lng": 10.68147897 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble påkjørt av bil som skulle inn på eiendom", + "type": "String" + }, + "date": { + "value": "2014-09-21T11:06:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "b5556d91ed53e683de122ab8c7772a523eddee9e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2102": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94166553, + "lng": 10.67103166 + }, + "type": "LatLng" + }, + "description": { + "value": "Ulykke mellom sykkel og bil med alvorlig personskade for noen år siden i krysset Sørkeldalsveien / Morgedalsveien. Detaljer hos politiet. I tillegg flere mindre ulykker og sammenstøtt og nesten ulykker,ukentlig.", + "type": "String" + }, + "date": { + "value": "2014-09-21T10:58:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "b23776f982a4a836a44aa5aa6f614557f66ee2d1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2101": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94183303, + "lng": 10.67110859 + }, + "type": "LatLng" + }, + "description": { + "value": "Nesten-ulykke. c 2005. Jeg kjørte bil oppover Sørkedalsveien en mørk høstkvveld, og tok til venstre inn Morgedalsveien. Nedover gang-sykkelveien kom en ungdom i full fart på rulleski i mørket. Jeg rakk akkurat å bremse. Men rullesyklisten skjente inn rett forran bilen, tok seg for med hånden mot panseret og fortsatte i full fart tvers over Morgedalsveien inn på gresset og holdt på å krasje i kontorbygget til Njårdhallen. Jeg har tidligere sittet i styret i Husebyåsen Velforening. og i den forbindelse tatt opp farene i dette krysset med rette vegmyndighet. Men de svarer ikke elller svarer negativt på mine/våre henvendelser. Morgedalsveien har ÅDT på ca 2000 to tusen biler. Sørkedalsveien har ca 19000, nitten tusen, ÅDT. Det er derfor ofte utfordrende å kjøre med bil både ut og inn M", + "type": "String" + }, + "date": { + "value": "2014-09-21T10:49:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "2a6ab40dbc96a1f449125ed0136dfa5366e554df.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2100": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93905781, + "lng": 10.69028735 + }, + "type": "LatLng" + }, + "description": { + "value": "Provoserende merking i sykkelveien (ringveien for syklister!) om at vi må sykle forsiktig grunnet kryssende vei. Må selvfølgelig være omvendt! Bilistene i den lille villaveien må kjøre forsiktig grunnet kryssende hovedvei for syklister!", + "type": "String" + }, + "date": { + "value": "2014-09-21T10:44:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "4ddeab4208bb8acd7988b871303161ec20bc09bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2099": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93172108, + "lng": 10.73422193 + }, + "type": "LatLng" + }, + "description": { + "value": "Theresesgate er blitt farligere å sykle i etter at parkeringsplassene er fjernet, pga at trikken har fått fritt spillerom og kjører med vesentlig høyere hastighet enn tidligere. Videre kan blomsterpottene være farlige hindringer som er lett å overse for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-21T10:20:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "255db5c2a055a5dea6de0fe6b568b3d96db59e49.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2098": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89573957, + "lng": 10.80280065 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist påkjørt av bil da syklisten skulle krysse (svinge til venstre) Enebakkveien for å fortsette Vårveien mot Ekeberg. Sykkelvei under Ryenkrysset stopper opp i Enebakkveien. Syklister må gå av sykkel og krysse to gangfelt for å komme \"trygt\" videre mot Ekeberg.", + "type": "String" + }, + "date": { + "value": "2014-09-21T10:13:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "24bd91c017f1c7ba3129c34eceb141e3fb20c8e6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2097": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92357084, + "lng": 10.73516607 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler parkerer for tett på 2 fortgjengeroverganger over Dalsbergstien. Det blir uoversiktlig og faresituasjoner oppstår for de mange syklister og fotgjengere som krysser gaten. Syklister har en spes. vanskelig passasje fordi innkjøring til Sofies gate er sperret og syklister derfor kan bli nødt til å kjøre opp på fortauene for å komme fram.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:39:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "c7d6fb9b7d127280457d9c3aab0604071e10efdb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2096": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96113344, + "lng": 10.77567815 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklistene kommer i alt for stor fart ned bakken i Neptunveien mot togundergangen til Akerselva, hvor mange barn krysser veien til barnehage og skole. Har sett et tilfelle hvor et barn ble påkjørt av sykkel, og mange nestenulykker. Syklistene må her sykle saktere.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:37:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "f2b92fdfa80b7b32ee5a3662cea28e48c2ba642d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2095": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94608127, + "lng": 10.7868576 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved midlertidig arbeid på trikketrase til Kjelsås står busser på Disen holdeplass - 3-4 meter før trikken svinger ut i veien. Kom syklende oppover og måtte bråbremse og havnet på hodet 50 cm fra trikken.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:35:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "53bd605a234d1724a3f98322abbb3826c2c201b5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2094": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92002196, + "lng": 10.5782783 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjenger- og sykkelundergang. Kræsj syklist mot syklist, fra gjønnes får man stor fart. Tunnelen er trang og dårlig merket. Barneskolebarn ferdes her daglig. Bør merke kjøreretning bedre og varsle om at farten må senkes på vei inn i tunnelen. Brukket albu.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:31:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "484a5c0d1c5ca102f6b31e55cbf0d5c9ae86cfee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2093": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92981595, + "lng": 10.69452524 + }, + "type": "LatLng" + }, + "description": { + "value": "Det at man har arbeidsparkering langs Monolittveien er unødvendig da det skaper farlige åpning av bildører fra folk som skal ut av de parkerte bilene inn i sykkelfeltet. Dette er en av de mest brukte sykkelveiene og mange sykler utenfor sykkelveien pga disse parkerte bilene. Veien er såpass smal at hvis det er parkerte biler her og møtende trafikk blir det for smalt til å passere.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:30:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b2c4c4ea0e36e09c89f7a8c515e7a1845674621.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2092": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93464516, + "lng": 10.68361744 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange bilister overser vikepliktskilt (delvis skjult bak en busk) fra Priorveien ut i Monolittveien. Sammen med lysregulert gangfelt skaper dette ofte farlige situasjoner for syklister på vei ned Monolittveien. Har selv opplevd flere nestenulykker her pga tvil om vikeplikt.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:29:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "2aa5cecc2a7875b025ab09290840ba4c49193e0c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2091": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93145819, + "lng": 10.7027659 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved utløpet av Volvat terrasse i Sørkedalsveien skjer det daglig nestenulykker med syklister. Det er busker som sperrer for sikt fra syklister som kommer vestfra og for bilister som kommer nedover veien Volvat terrasse. Sørkedalsveien er riksvei og det er lagt begrensning på eiendommen at hjørnet skal være uten busker/trær - det er begge deler.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:22:04Z", + "type": "DateTime" + }, + "bilde": { + "value": "f139bbad6bb345bb1a468de08ee0272c.JPG", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2090": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9283666, + "lng": 10.75645208 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det svært mange bilister som kjører forbi på den enveiskjørte strekningen for så å presse seg inn rett foran trafikkøya og plutselig bråbremse og svinge til høyre, og de blinker først etterpå (ihvertfall når det \"bare\" er en syklist bak).", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:14:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "691e12a107adc3a427fa58809121862a10f82316.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2089": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9264356, + "lng": 10.7270331 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset Dalsbergstien-Sofies gate. Mange biler i Dalsbergstien, mange fotģjengere og syklister krysser veien. 2 fotgjengerfelt, men biler parkert så tett inntil at sikten for dårlig for fotgjengere og særlig syklister (som må finne seg vei mellom fotgjengerfeltene).", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:11:01Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2088": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92011875, + "lng": 10.71403026 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av drosje som kom bakfra. Veien blir for smal når det brøytes dårlig og man kjører i høyre hjulspor. Bilene fristes til å presse seg forbi selv om det er fartsdumper og veldig lite å tjene på å kjøre forbi. Meldte drosjenummer til politiet og Oslo Taxi - fikk svar fra Oslo Taxi men ikke politiet.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:09:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "01963988bfa213fdcb6699403cf014acb1ee515d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2087": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92959232, + "lng": 10.76097965 + }, + "type": "LatLng" + }, + "description": { + "value": "Her pleide det å være motstridende skilting. Forbudt for motorvogn nordfra, men merket med enveiskjøring og innkjøring forbudt når man kommer nærmere Sannergata. En bilist skulle lære meg at jeg syklet mot enveiskjøring så han ruset motoren og la seg helt over til venstre slik at jeg måtte gjøre en kraftig unnvikelsesmanøver og ramlet over fortauskanten. Jeg meldte saken til politiet som byttet ut \"forbudt for motorvogn\" med \"innkjøring forbudt\" nordfra. Så nå er syklister forvist til enten fortauet eller en stupbratt gangvei.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:08:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "ae7131c68389d9d7909fc17165527092f32c39fa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2086": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9287698, + "lng": 10.7672131 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved kø kjører bilister inn i krysset på rødt lys her, lenge etter at det har blitt grønn mann. Umulig å vite hvordan man skal sykle for å komme fra Dælenenggata til Sannergata når man skal videre mot Alexander Kiellands plass.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:01:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "3423687174a0a770e427f1e657a163eb382b0468.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2085": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9121055, + "lng": 10.56271076 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvis du følger Bærumsveien, må du krysse under Kirkeveien. Problemet er at etter undergangen må man enten ta til høyre eller venstre med en gang, uten å kunne se om noen kommer.", + "type": "String" + }, + "date": { + "value": "2014-09-21T09:00:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "6572ecddeacb763dba427a4bdc5fa408451d91f8.jpeg", + "type": "String" + } + } + }, + "aftenposten-2084": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92958156, + "lng": 10.73299884 + }, + "type": "LatLng" + }, + "description": { + "value": "Bogstadveien/Hegdehaugsveien. For smalt mellom trikkeskinner og fortauskanter. Må kjøre midt mellom trikkeskinner. Mange hissige bilister og farlige forbikjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:57:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "79ee04935310e935c47fd904a63109489fbcfea6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2083": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91155688, + "lng": 10.72604656 + }, + "type": "LatLng" + }, + "description": { + "value": "I rundkjøringen ved Aker Brygge møter syklistene trikk, biler og fotgjengere. Ikke tilrettelagt for syklister og man må manøvrere mellom fotgjengerne. I dette området er det ofte mange fotgjengere, så her har jeg opplevd flere farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:52:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "1f117e02251a180dcf8df7453a77962d733e847c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2082": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90985715, + "lng": 10.7144165 + }, + "type": "LatLng" + }, + "description": { + "value": "Fra krysset ved Color Line og gang- og sykkelistien bort til Tjuvholmen: Her er det ikke tilrettelagt for syklister. Det har medført farlige situasjoner for fotgjengere som ikke er klar over all sykkeltrafikken. Jeg tenker da særlig på ferjepassasjerer som ikke går her ofte.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:51:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "67860860d6e9404924ba748932b9c897dab90909.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2081": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90549985, + "lng": 10.76886534 + }, + "type": "LatLng" + }, + "description": { + "value": "I dette krysset må man legge seg ut i god tid når man skal følge \"hovedsykkelveien\" østover til venstre. Det nytter ikke å komme seg gjennom krysset hvis man ligger i sykkelfeltet. Det kjører alltid 2-3 biler over etter at det har skiftet til rødt lys, så man slipper ikke over før de kryssende bilene har begynt å kjøre for lengst.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:48:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "317635fbbf86e4b50b6d528d7a79d048c5efbbac.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2080": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94078291, + "lng": 10.72754859 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelhjulene satt fast på trikkeskinnene. Endte opp på legevakta med skadet skulder og sykkelen min ble ødelagt :(.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:45:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "3858d2c9f2516c2d92d67e751c81004ffd3fa560.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2079": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91155688, + "lng": 10.72604656 + }, + "type": "LatLng" + }, + "description": { + "value": "I rundkjøringen ved Aker Brygge møter syklistene trikk, biler og fotgjengere. Ikke tilrettelagt for syklister og man må manøvrere mellom fotgjengerne. I dette området er det ofte mange fotgjengere, så her har jeg opplevd flere farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:43:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "1f117e02251a180dcf8df7453a77962d733e847c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2078": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91095983, + "lng": 10.73596 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelstien krysser trikkeholdeplassen. Farlig å sykle her dersom det står personer på holdeplassen.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:40:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "3d716bc6ca2dd1697152b872c020e26da5f1ec92.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2077": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9108899, + "lng": 10.63068866 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjengere kommer opp fra trappen og rett inn i sykkelstien. Her blir det trangt og uoversiktlig.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:36:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "04165cdf1985abbdbfca0d2c327ec6b235d7bf11.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2076": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9121055, + "lng": 10.56271076 + }, + "type": "LatLng" + }, + "description": { + "value": "Under krysset på Haslum er det to kryss hvor sykkelveier møtes i enden av tunneler i bunnen av en bakke. Ingen måte å se folk som kommer fra andre retninger.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:29:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "6572ecddeacb763dba427a4bdc5fa408451d91f8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2075": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92502792, + "lng": 10.61246037 + }, + "type": "LatLng" + }, + "description": { + "value": "Helt ny vei og asfalten har allerede sprukket. Ikke lenge til sprekken er stor nok til at man får et sykkelhjul ned i den. Tegn på slett arbeid.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:25:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "3f85a4fb1409298b0904bbc83d8b5a319dba38a1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2074": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92677526, + "lng": 10.63927173 + }, + "type": "LatLng" + }, + "description": { + "value": "Fire sykkelveier møtes i bunnen av en bakke fra tre sider. Fra to kanter kommer man gjennom trange tunneler uten håp om å se eller bli sett av de som kommer fra de andre retningene.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:22:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "70588ab61410b545b8ec2037851614aae33a63ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2073": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9435128, + "lng": 10.70444941 + }, + "type": "LatLng" + }, + "description": { + "value": "Siden minst 2000 når jeg begynte å sykle i Oslo har DETTE vært syklistenes vei på denne delen av ring 3. Fotgjengere hoier og roper skjellsord etter deg uansett hvor sakte du sykler og om du er på fortau eller i veibane. Alle som sykler til og fra jobben/universitetet langs ring 3 MÅ gjennom dette svineriet.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:18:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "587fb32cc15ea2770446b53f3a2dfe1da060bbd2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2072": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90663495, + "lng": 10.79149246 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye brukt sykkelrute på fortau rett forbi skolebygning. syklistene bruker fortauet fordi overgangen fra vei til skolegård er sperret med en lav murkant. Ved å bruke fortauet kan man komme forbi murkanten og gjennom skolegården på Vålerenga skole.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:01:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "a8ba17c4e87ac0762211e3b8e46ff84dc119d756.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2071": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95238876, + "lng": 10.75003623 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien forsvinner plutselig før rundkjøringen på Tåsen og dukker opp igjen på andre siden. Syklister har ikke evnen til å fordampe og så gjenoppstå på den andre siden.", + "type": "String" + }, + "date": { + "value": "2014-09-21T08:01:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "9b972d11354b2bef9caa244d55c5e6ea117ee66c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2070": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94936948, + "lng": 10.73135733 + }, + "type": "LatLng" + }, + "description": { + "value": "Plutselig går sykkelveien inn i et overgangsfelt der syklister har vikeplikt for bilene som kommer fartsblinde rundt svingen.", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:59:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "512449eeca1899dd64e8b9ba2ccff9adda296f36.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2069": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92678601, + "lng": 10.7121849 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner i krysset! Gir farlige situasjoner fordi bilene vil først gjennom krysset. Det burde absolutt vært merket rødt sykkelfelt gjennom dette krysset slik at det blir tydelig for alle parter hvor syklistene kan plassere seg.", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:56:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "6237589cc40b5ac8b0e069c826c2bed61c76786e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2068": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90692545, + "lng": 10.79309105 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange syklister bruker gangveien fra Bryn over Vålerenga ned til Bjørvika til og fra Jobb. Ved Etterstadgata slutter sykkelveien og går over i et smalt gatepartiet med parkerte biler på begge sider. For å komme videre må man først inn i Fritjofsgate en uregulert gatestump som er delvis avstengt og ofte helt sperret av parkerte biler. I Fritjofsgate er det mye kjøring til å fra barnehage og fullt av skoleban på vei til/fra Våerenga skole. Deretter går sykkelruta på fortauet tett forbi bygningen med førsteklassinger hvor barna venter om morgenen. Sykkelruta fortsetter deretter gjennom skolegården på Vålerenga skole som er full av barn i jobbrushet.", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:56:33Z", + "type": "DateTime" + }, + "bilde": { + "value": "21ae041455d6ca21bfe72fdaafd9447b.jpg", + "type": "String" + }, + "streetview": { + "value": "748aabd5cdbe0b4a509c4e8b7a0359c7ac7a8687.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2067": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9293074, + "lng": 10.71671247 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner i krysset! Gir farlige situasjoner fordi bilene vil først gjennom krysset. Det burde absolutt vært merket rødt sykkelfelt gjennom dette krysset slik at det blir tydelig for alle parter hvor syklistene kan plassere seg.", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:55:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "e86e4015955a46d1ee07057d2a1adb24bf397780.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2066": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.918, + "lng": 10.58931827 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter plutselig sykkelveien og man må krangle med biler, høye asfaltkanter og tett plasserte stolper for å komme gjennom Bekkestua.", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:52:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "73f7954f8b1b105c2c7b2d78d5cff0e405ebdde4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2065": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92312994, + "lng": 10.73531627 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange nesten ulykker. Biler parkerer helt inn til fotgjengerfeltet, gir dårlig sikt for både syklister og biler, veldig farlig. Parkering forbudt må innføres i krysset. Og kanten på fortauet fjernes slik at mulig å sykle sømløst inni Sofiesgate.", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:48:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "36239402958d055956fa9b63f2e8d9597ff0d783.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2064": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.881616, + "lng": 10.77194452 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler mot Oslo. Møtene biler kommer rundt en svært brå sving uten sikt. Disse kommer ofte over i motgående kjørefelt. Innkjøpet til sykkelfeltet videre mot Oslo er plassert slik at man som syklist trekkes mot midten av veien. Busker bør klippes. Sykkelfelt flyttes", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:48:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "2db8c12f746bf2eee5163d7dd65cc9d0f48d8b96.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2063": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92649569, + "lng": 10.72917938 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset Nordabakken/Sporveisgata. Ingen steder å stoppe for syklister, kanten til fortauet er høy. Veldig farlige situasjoner etter stor fart ned bakken og rushtid for bilene. Her bør komme egent sykkelfelt og oppmerking av rødt stoppfelt for sykler snarest!", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:45:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "2d98b508df04b0b0f364c18a73f6b6c4ffb76968.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2062": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92728063, + "lng": 10.72862148 + }, + "type": "LatLng" + }, + "description": { + "value": "I Nordabakken får man stor fart og syklister blir skviset mellom parkerte biler og trafikken, Her bør komme sykkelfil snarest!", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:40:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "b2afa37c1bd55f8fb2e7e02d19462544010f0487.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2061": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87048084, + "lng": 10.79119205 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet mot Oslo. Bil fra Oslo skulle opp Lambertseterveien. Krysser mitt sykkelfelt. Sammenstøt med store materielle skader. Bilkø i Ekebergveien mot Oslo stenger for sikt for syklist og bilist. Sykkelfeltets oppmerking opphører før krysset og starter igjenn etter krysset. Her burde sykkelfeltet ha ekstra markering gjennom krysset slik at bilisten forstår at den er iferd med å krysse et sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:27:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "1f065c87d2292f7f37c886204b31856dce4bf2ae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2060": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93050082, + "lng": 10.73354601 + }, + "type": "LatLng" + }, + "description": { + "value": "Bra at parkeringsplassene er borte, det gir bedre plass til syklister. Men hva med å sørge for at den ekstra plassen blir tilgjengelig for syklistene, og pålegge trikken å kjøre litt saktere gjennom thereses gate?", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:02:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "86b2d55eb635d37913c371a293e7b80e054552dd.jpeg", + "type": "String" + } + } + }, + "aftenposten-2059": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90589794, + "lng": 10.76767444 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble påkjørt av en bil 11.09.2014", + "type": "String" + }, + "date": { + "value": "2014-09-21T07:01:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "97ac4285625b91c919187cd8dc3daf45dcf6e3cb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2058": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92047365, + "lng": 10.74257969 + }, + "type": "LatLng" + }, + "description": { + "value": "Hva skjer her? Hvorfor stopper sykkelfeltet noen meter? Her står det alltid biler i sykkelfeltet, også der hvor det faktisk er sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-21T06:54:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "1b0351e450d493dbbe8b6386edf776b26c19ef7f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2057": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92738815, + "lng": 10.73887825 + }, + "type": "LatLng" + }, + "description": { + "value": "Umulig kryss på alle måter. Lag oppmerking som tillater syklister å skifte felt når de skal svinge.", + "type": "String" + }, + "date": { + "value": "2014-09-21T06:48:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "504aa5b1e84bc5fd7377993770c0dcd53939e15c.jpeg", + "type": "String" + } + } + }, + "aftenposten-2056": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92718923, + "lng": 10.74759006 + }, + "type": "LatLng" + }, + "description": { + "value": "Her blir man presset inn i parkerte biler når man sykler. Gaten er ganske bred, er det nødvendig med parkering på begge sider? Man kunne med fordel fjernet en del gateparkering her for å gjøre plass til syklister. Det er parkeringshus både på ilasenteret og på Alexander Kiellands plass.", + "type": "String" + }, + "date": { + "value": "2014-09-21T06:42:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "9855b510df1f759013315d7435ba4e08528ee660.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2055": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9290171, + "lng": 10.7692945 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er en farlig løsning. Man kommer i stor fart fra alle sider og møter en undergang fra siden. Her er det ikke enkelt å se andre traffikanter.", + "type": "String" + }, + "date": { + "value": "2014-09-21T06:35:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "a0eb77ca29b055b3c553454537a56700b5ae4df5.jpeg", + "type": "String" + } + } + }, + "aftenposten-2054": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92926977, + "lng": 10.75903773 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne delen at Thorvald Meyers gate ble enveiskjørt nordover for en stund tilbake. Dette er imidlertid en viktig nord-sør sykkeltrase, så sykelister trosser dette forbudet. Farlige situasjoner skjer når biler kommer ut av parkeringshusene i Ringnes Park fra øst og ser kun til venstre. Tilsvarende skjer ved utkjøring fra Nav på vestre side av veien.", + "type": "String" + }, + "date": { + "value": "2014-09-21T06:33:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "e860ea78a0f84776bbdefa69dee6e7641668d0a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2053": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91815057, + "lng": 10.74606657 + }, + "type": "LatLng" + }, + "description": { + "value": "En bilist kjørte forbi meg farlig nært, han var ikke oppmerksom på meg, antakelig fordi han snakket i mobiltelefon. Det opplever jeg ofte som syklist. Spesielt ubehagelig synes jeg det er fordi jeg sykler med barnesete. Halve gaten er sperret pga. arbeid. Ellers er gaten smal, og det tar ikke bilistene hensyn til. De kjører forbi med veldig knapp margin og med god fart.", + "type": "String" + }, + "date": { + "value": "2014-09-21T06:08:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "b3dc48d0ec24564810e5dd6d805896d9b995f001.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2052": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92856014, + "lng": 10.76238512 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det tydeligvis plass til tre felt for biler, men man prioriterer ingen tilrettelegging for sykkel. I rushtida er enkelte bilister hissige. I denne gata har jeg opplevd å bli presset ut mot fortauskanten tre ganger av bilister som bare skulle ta igjen køa 50 meter lenger fremme.", + "type": "String" + }, + "date": { + "value": "2014-09-20T23:12:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "a4a9a681dbbadc1bbdf76935311dbeb6da1ac0bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2051": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92100063, + "lng": 10.68150043 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er sykkelfelt, men pga få p-plasser parkerer biler over sykkelfelt og blokkerer veien!", + "type": "String" + }, + "date": { + "value": "2014-09-20T22:09:33Z", + "type": "DateTime" + }, + "bilde": { + "value": "62735bb5e4e14831c24d5934f9213c9a.jpg", + "type": "String" + }, + "streetview": { + "value": "e4037ad51ee0e7e9d5e6e3ddf2122166090ece18.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2050": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92997937, + "lng": 10.75719237 + }, + "type": "LatLng" + }, + "description": { + "value": "Waldemars salonger. Her stikker det to gelendere ut i stien fra smijernsgjerdet over elven. Og de stikker ALT for langt ut, noen kommer til å treffe et av disse i høy fart ned Oslos bratteste bakke som er rett før broen.", + "type": "String" + }, + "date": { + "value": "2014-09-20T21:17:45Z", + "type": "DateTime" + } + } + }, + "aftenposten-2049": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91622531, + "lng": 10.78526973 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette krysset er farlig både for syklende, bilister som kommer fra Sigurd Hoels vei og fotgjengere som krysser veien. Miljøgaten Ensjøveien har blitt en høy hastighet gjennomkjørringsvei og de som kjører i Ensjøveien overholder ikke vikeplikten fra høyre og ofte nekter å stoppe. Det er flere nesten ulykker i dette krysset daglig og en god del krangling/konflikter særlig med bilistene i Ensjøveien. Bilene som kjører på Ensjøveien kommer gjerne i høy hastighet siden det finnes ingen fysiske hindringer (fartsdumper). Manglende respekt til vikeplikt gjør også at det er nesten fysisk umulig for syklende å svinge ut av Sigurd Hoels vei inn på Ensjøveien til venstre på en trygg måte selv om det finnes en ganske bra sykkelfelt i veien. Da velger man å kjøre på fortauet og ned til Gladengveien", + "type": "String" + }, + "date": { + "value": "2014-09-20T18:39:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "4ebcd6ddfb2106adc491ac1f22469592b6f0e405.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2048": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91651572, + "lng": 10.79372406 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er mye (farlig) feilparkering i krysset Malerhaugveien-Stålverkveien på Ensjø. Det er biler som ofte står midt dette t-krysset og/eller alt for nærme t-krysset og gjør at det er veldig utfordrende å sykle her. Dette er mange barn som går i dette området hver dag (pga skole/barnehage) og krysset er veldig uoversiktlig . Også i krysset med Grønvoll alle (40 m unna) er det en del feilparkering.", + "type": "String" + }, + "date": { + "value": "2014-09-20T18:18:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "edab60a4b9b1044c05140f2772f634d7624350bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2047": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91561759, + "lng": 10.80056905 + }, + "type": "LatLng" + }, + "description": { + "value": "Ekstremt farlig kryss, vanskelig for syklistene og gående. Her prioriteres det bil først og fremst. F.eks. skal man sykle over fra Innspurten inn på Grønnvoll alle må man ente sykle i veibanen eller sykle på fotgjengeroverganen, bilene som svinger fra Innpsurten til venstre og fra Grønnvoll alle til høyre slippes inn samtidig som det er grønt lys for forgjengere. Her blir det mye konflikter og farlige situasjoner særlig mellom bilister og syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-20T18:15:49Z", + "type": "DateTime" + }, + "bilde": { + "value": "b1fea4f17f348786aba36d944d9220fe.jpg", + "type": "String" + }, + "streetview": { + "value": "923a703d3863aa7553f915d5d00db592ae217b5d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2046": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92497953, + "lng": 10.67543864 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørd av en bil som skulle svinge til høyre, men som ikke blinket eller såg etter syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-20T15:43:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "324ecc4f66c7dbe140a1990ea95ca594a8b5292b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2045": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8370027, + "lng": 10.80662749 + }, + "type": "LatLng" + }, + "description": { + "value": "Her synes jeg hele strekningen fra Oppegård kommunegrensen og helt fram til Sæther krysset er skummelt. Og da spesielt fra kommunegrensen og fram til Prinsdal senter. Det står på kartet at hauketo krysset er tilrettelagt men mener dette ikke er på langt nok sikkert. Stort sett sykler de fleste i veien her og det er farlig mellom biler og delvis kollektivfelt. Mellom trikkestoppen/snuplassen og helt fram til Sæter krysset er risikosport.", + "type": "String" + }, + "date": { + "value": "2014-09-20T15:06:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "e26b650c7964bbaf09a013e5d884773a645b029a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2044": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88137912, + "lng": 10.78707218 + }, + "type": "LatLng" + }, + "description": { + "value": "Strekningen Ekebergveien opp mot Jacobs og helt til starten av Ekebergsletta er uten tilrettelegging. Her er det også skole med mange gående på fortau og kryssende barn", + "type": "String" + }, + "date": { + "value": "2014-09-20T15:01:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "2bd21c53361f338c65d92efaf36ecc304ee3ab9a.jpeg", + "type": "String" + } + } + }, + "aftenposten-2043": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92033384, + "lng": 10.74286937 + }, + "type": "LatLng" + }, + "description": { + "value": "Daglig parkerer kunder og ansatte i sykkelfeltet utenfor Big Tasty i Ullevålsveien 13. En gang denne våren markerte jeg med ringeklokke for en mann som hadde losset varer fra bilen i sykkelfeltet. I etterkant ble jeg forfulgt av bilen som kjørte forbi meg i stor fart og bråbremset. Var heldig som greide å stoppe i tide.", + "type": "String" + }, + "date": { + "value": "2014-09-20T14:24:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "03dd84f970f9af8aa3923d0c8268860712291e0c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2042": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91229914, + "lng": 10.76439142 + }, + "type": "LatLng" + }, + "description": { + "value": "Gjelder hele Grønlandsleiret. Bilister, private og yrkessjåfører, benytter sykkelvei som stoppested for varelevering, hente folk, parkeringsplass mens de løper inn i butikken. Sykler man gjennom Grønnlandsleiret må man regne med å svinge ut av sykkelfeltet to tre ganger langs strekningen.", + "type": "String" + }, + "date": { + "value": "2014-09-20T14:14:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "5985bbc0f2c955353b5ac4274e9b533e3f9952aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2041": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92057044, + "lng": 10.67557811 + }, + "type": "LatLng" + }, + "description": { + "value": "I fbm med veiarbeider gis det her totalt beng i syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-20T12:31:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "db5cb7c954f1da0e4184407bec04d25fa58e1c1f.jpeg", + "type": "String" + } + } + }, + "aftenposten-2040": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.86231556, + "lng": 10.49099922 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye brukt pendlervei. Det haster å få på plass sykkelfelt i veibanen.", + "type": "String" + }, + "date": { + "value": "2014-09-20T12:26:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "8ceebeb24618ef880c7996fdcd17f1e9fd042222.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2039": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91315971, + "lng": 10.82348585 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen alternativer for syklister. Kommer rett ut i trafikken.", + "type": "String" + }, + "date": { + "value": "2014-09-20T12:25:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "b1fa46a5eca4cb0a2496cf9d6e93193c09079861.jpeg", + "type": "String" + } + } + }, + "aftenposten-2038": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9305277, + "lng": 10.73351383 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikk og biler holder svært høy hastighet, etter man fjernet parkeringsplassene i Theresesgate. Tidsspørsmål før det skjer ulykke. Det var mye bedre å sykle i Theresesgate tidligere mye når det var parkeringsplasser på begge sider og trikken måtte faktisk ta hensyn til de parkerte bilene.", + "type": "String" + }, + "date": { + "value": "2014-09-20T11:51:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "71f8d2dd5692ffc83ca1eddfc3596e90b80cad46.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2037": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91370831, + "lng": 10.74595928 + }, + "type": "LatLng" + }, + "description": { + "value": "Enveikjørt gate. Syklister sykler mot kjøreretningen hele tiden som kan føre til ulykker! Vennligst få opp skilting at dette er ulovlig!", + "type": "String" + }, + "date": { + "value": "2014-09-20T10:36:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "b5153fa28630965b5e4b0d244a8ebff82616e512.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2036": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92190162, + "lng": 10.77188014 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkeskinnene står opp av asfalten, slik at man er nødt til å sykle over fotgjengerfeltet i stedet for rett frem på veien.", + "type": "String" + }, + "date": { + "value": "2014-09-20T10:05:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b20dd0d465349ad9d179b733daa310e41a3733f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2035": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9297966, + "lng": 10.7177639 + }, + "type": "LatLng" + }, + "description": { + "value": "Lå på innsiden av 20buss mot Majorstua. Plutselig La bussen seg inn i sykkelfeltet og tvang meg opp på fortau. Traff et tre. To brudd i ryggen, brukket krageben og storetå. Altfor trange sykkelfelt og busser som bruker mer en sitt eget felt.", + "type": "String" + }, + "date": { + "value": "2014-09-20T08:30:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "c190c1b723609762a28188168234e7d04f7fc535.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2034": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9271594, + "lng": 10.7200745 + }, + "type": "LatLng" + }, + "description": { + "value": "Nye opphoyde fortau som \"perrong\" for trikkeskinner finnes flere steder i byeni tillegg til Bogstadveien, bl.a. Frogner. Veldig farlig for syklister. Det er ingen plass til både syklist og trikk, og ingen steder å komme seg unna. Skal trikken måtte vente på syklister som ikke klarer å sykle like fort? Eller skal syklistene kjøres ned av trikken?", + "type": "String" + }, + "date": { + "value": "2014-09-20T07:23:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "1cd71bc8203192c4bc8f7ff1b72f3f86e3197a2f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2033": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9196294, + "lng": 10.67129731 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har det blitt mye bedre på strekningen med utvidet gangfelt, men hvorfor velger man å legge en 40 cm \"grøft\" med løs stor singel på siden av sykkelvene? Er det for å være sikker på at syklister som plutslig må ut av sykkelbanen for å unngå kollisjon med andre skal gå på tryne? Det er i alle fall ikke lett å holde", + "type": "String" + }, + "date": { + "value": "2014-09-20T01:42:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "6a33c822ddec68096e5831f134d6170c0673073d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2032": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93044169, + "lng": 10.72016716 + }, + "type": "LatLng" + }, + "description": { + "value": "For smalt sykkelfelt (og forsåvidt bilfelt). Ofte klarer ikke biler og busser holde seg ute av sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-19T17:59:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "3ba2d3c353ce4a80ee8734635d9aed06d7c25033.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2031": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92902247, + "lng": 10.71669101 + }, + "type": "LatLng" + }, + "description": { + "value": "Majorstukrysset. Trikkeskinnene stikker veldig høyt opp fra asfalten og det gjør det ikke bedre at det er et busstopp du må forbi, rett på den andre siden (fra vest mot øst).", + "type": "String" + }, + "date": { + "value": "2014-09-19T17:58:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "6bfd0a4e1b130e08ccb71cb6d8a7dd0dee865510.jpeg", + "type": "String" + } + } + }, + "aftenposten-2030": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92176418, + "lng": 10.67901134 + }, + "type": "LatLng" + }, + "description": { + "value": "På Skøyen er sykkelfeltet lagt midt på et torg der folk haster forbi for å rekke buss/tog. Det er veldig vanskelig for syklister og fotgjengere å holde styr på hverandre. Det hadde vært mye tryggere for alle om sykkelfeltet lå helt paralellt med veien. Som syklist behøver du da kun å konsentrere deg om bilene (som vanlig) og ikke være redd for hastede fotgjengere som løper ut i sykkelfeltet uten å se seg for, og fotgjengerne kunne haste avgårde uten å plutselig få en forhastet syklist i siden.", + "type": "String" + }, + "date": { + "value": "2014-09-19T17:56:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "ab5b01ac0832ba82d7b3edc1e56a134d98eb1508.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2029": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91315971, + "lng": 10.64028024 + }, + "type": "LatLng" + }, + "description": { + "value": "Å legge sykkelfeltet i midten på Lysaker torg gjør det vanskeligere for bilisten å se det når du kommer ut av den. Det er også vanskelig for både gående og syklister at de gående ofte krysser veien for å komme mellom buss/tog her, men syklistene sykler mellom Oslo og Lysaker (fotgjengertrafikken krysser sykkeltraffikken).", + "type": "String" + }, + "date": { + "value": "2014-09-19T17:51:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "95c6d04a59a17d3cd350922dedb7ab34e8d20603.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2028": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91334795, + "lng": 10.64188957 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man sykler østover i krysset er det umulig å se etter biler når du kommer rundt svingen ved enden av sykkelbrua. I tillegg gjør brosteistripene at du må fokusere ekstra på å klare å holde deg på sykkelen - dette gjør det enda vanskeligere å se etter biler.", + "type": "String" + }, + "date": { + "value": "2014-09-19T17:49:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "1e44b169f6ef24648743152a8d8b5aea15020031.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2027": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93229625, + "lng": 10.74147462 + }, + "type": "LatLng" + }, + "description": { + "value": "Har flere ganger på 3 år opplevd at biler presser seg inn ved siden av meg, så kort avstand at jeg kan ta på bilen. Dette skyldes en trafikkøy i krysset som gjør det for smalt til trygt å kjøre bil og sykle i bredden samtidig.", + "type": "String" + }, + "date": { + "value": "2014-09-19T17:23:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "09e9961fdf40b7aa5038e1107ea7740ce187e8e4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2026": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93523108, + "lng": 10.7441461 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset er overbefolket med 2 høytraffikerte busslinjer. 37-bussen mot sentrum står i krysset i venstre felt, og bussholdeplass rett etter krysset i Geitmyrsveien. Alle syklistene står på innsiden av bussen i krysset, og blir presset av disse når det blir grønt lys.", + "type": "String" + }, + "date": { + "value": "2014-09-19T17:21:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "c8cad3a42ecb4a38cdd5da26f4b44b6b0e1ced0d.jpeg", + "type": "String" + } + } + }, + "aftenposten-2025": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94939634, + "lng": 10.73148608 + }, + "type": "LatLng" + }, + "description": { + "value": "Gangveien krysser Sognsveien, der folk kjører av og på Ring 3 i høy hastighet. Bru-pillarene gir dårlig oversikt.", + "type": "String" + }, + "date": { + "value": "2014-09-19T17:19:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "676179b94819921cfdd3c1136982e9859b643c0f.jpeg", + "type": "String" + } + } + }, + "aftenposten-2024": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9075656, + "lng": 10.77943325 + }, + "type": "LatLng" + }, + "description": { + "value": "Her ligger to nesten ubrukte sykkelfelt. Syklistene bruker fortauene på begge sider av sykkelfeltene.", + "type": "String" + }, + "date": { + "value": "2014-09-19T15:58:31Z", + "type": "DateTime" + }, + "bilde": { + "value": "0a6f11f68e141d8171d864de85179bba.jpg", + "type": "String" + }, + "streetview": { + "value": "130e2d1cb27d0ae785d36a0f621f587ae1998b03.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2023": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92856014, + "lng": 10.7611835 + }, + "type": "LatLng" + }, + "description": { + "value": "En billist presset seg forbi meg her. Det er to gule striper og det var motgående trafikk. 20 meter senere ville det åpnet seg opp til å bli to felt: https://www.youtube.com/watch?v=f3UQFZO8XVM", + "type": "String" + }, + "date": { + "value": "2014-09-19T14:46:34Z", + "type": "DateTime" + }, + "bilde": { + "value": "3e37d5525ced819cac195480babd3455.png", + "type": "String" + }, + "streetview": { + "value": "74e4dfaa4d41d1160aa7dddb73c047324ed9340c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2022": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96126234, + "lng": 10.74467182 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært uoversiktlig kryss med rushtrafikk, fotgjengerfelt, pplass for Jokerbutikk og varelevering, henting og levering i Nordberg barnehage, besøk og ansatte ved Nordberg sykehjem, barn som spiller tennis i tennishallen", + "type": "String" + }, + "date": { + "value": "2014-09-19T14:42:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "99c630cef94a7877a305da95046dbafa9fc18450.jpeg", + "type": "String" + } + } + }, + "aftenposten-2021": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96214312, + "lng": 10.74291229 + }, + "type": "LatLng" + }, + "description": { + "value": "Har vært noen kollisjoner mellom syklister og biler i dette svært uoversiktlige krysset. Skolevei for mange til Kringsjå skole. Mye trafikkert kryss hele døgnet, fritid, butikk, kirke trafikk til&fra.", + "type": "String" + }, + "date": { + "value": "2014-09-19T14:39:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "692ea7cd1e4c9bdacb60e1d98112c372f1f4f69b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2020": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92595268, + "lng": 10.74504733 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil fra Grafisk Spesialisering AS presser meg ut av veien for så å skjelle meg ut for at jeg sykler i veien: https://www.youtube.com/watch?v=rUXBleDa9ZM", + "type": "String" + }, + "date": { + "value": "2014-09-19T14:25:54Z", + "type": "DateTime" + }, + "bilde": { + "value": "cbd16a569469c60f145923f79ab70106.png", + "type": "String" + }, + "streetview": { + "value": "6e1c4350a57beda5c48b37752d5331b2d2bfc2f5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2019": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92397947, + "lng": 10.74077725 + }, + "type": "LatLng" + }, + "description": { + "value": "Agressiv Oslo Taxi-bil tuter og presser meg til siden for å kunne kjøre forbi oppå doble gule striper: https://www.youtube.com/watch?v=M8mt5AN6t8k", + "type": "String" + }, + "date": { + "value": "2014-09-19T14:22:02Z", + "type": "DateTime" + }, + "bilde": { + "value": "18311d3734c3ff80612d973d9c950594.png", + "type": "String" + }, + "streetview": { + "value": "189c6f0c5dd0bbeccae5719a9a3043deb1f91bd9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-2018": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.911374, + "lng": 10.74478983 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkesporet går i det rødmerkedet sykkelfeltet, slik at man blir presset ut av trikken når den kommer. Veldig stressende fordi man blir skvist inn i forauet og må hoppe av sykkelen for å komme opp på fortauet for ikke å bli påkjørt av trikk.", + "type": "String" + }, + "date": { + "value": "2014-09-19T13:42:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "6c7ee6d631ceebd8d863416450b48aab75573cf8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2017": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90941068, + "lng": 10.74291229 + }, + "type": "LatLng" + }, + "description": { + "value": "90 graders knekk på veien - hvor nord-sør og øst-vest gående møter hverandre med minimal oversikt. For utenforstående/ferske, er det helt umulig å vite hvor man kommer før man står i krysset og klør seg i hodet. Det er heller ikke spesielt trafikksikkert. Masse brosteiner og kumlokk i forskjellig høyde gjør det til en svært ubehagelig strekning. Det er også så smalt at man deler strekningen med fotgjengere i de fleste tilfeller, som gjør det umulig å sykle forsvarlig raskere enn gangfart. I nordenden av Rådhusgata er det ingen sykkelfelt, man må ut på såpeglatt brostein gjennom rundkjøringen og videre derfra er det ingen skilting...", + "type": "String" + }, + "date": { + "value": "2014-09-19T12:50:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "f4d8188f2c9f6069218e9c91ccf634a83daf6bf6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2016": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91277245, + "lng": 10.74614167 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlige trikkeskinner som stikker opp over asfalten flere steder, og attpåtil er de lagt i alle retninger slik at man \"må\" krysse\". Falt så lang jeg var da jeg syklet i retning vestover i Kirkegata, såpeglatte og høye kanter. Og dette skal være en prioritert strekning?", + "type": "String" + }, + "date": { + "value": "2014-09-19T12:48:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "deefb7d7eba54cf709c5f8f31fe6fc34f36d3fee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-2015": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92596881, + "lng": 10.64888477 + }, + "type": "LatLng" + }, + "description": { + "value": "Byggefolk parkerer ofte ulovelig her i enden av sykkelveien der man skal ut i Silurveien mot Radiumhospitalet. Skaper uoversiktige og farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-19T12:05:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "1dbda9171fbd4fcad5db7324b97d600946012800.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2014": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91141703, + "lng": 10.62639713 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig smalt sykkelfelt etter bussoldeplassen på vei mot Lysaker. Starten av sykkelfeltet er maks 50cm.", + "type": "String" + }, + "date": { + "value": "2014-09-19T11:13:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "d0b09a4ec738adc6a801b34086ecf2d60fc688cf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2012": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95029356, + "lng": 10.71696996 + }, + "type": "LatLng" + }, + "description": { + "value": "Har nesten blitt påkjørt på vei nedover Sognsvannsveien - fra venstre flere ganger. Bilister fra Gaustad sykehus tror ikke det kommer sykler (med lys/refleks osv) nedover veien. Høy kantstein på høyre side av veien gjør det umulig å \"ta grøfta\" om det kommer en bil i høy fart.", + "type": "String" + }, + "date": { + "value": "2014-09-19T11:08:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "886988731a74b87ac9f66e080dbbd5cadeecbbce.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2011": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91163756, + "lng": 10.75661301 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler hver dag fra Hegdehaugsveien til Schweigaardsgate hvor jeg jobber. Kan velge mellom Tullinløkka - smalt med trikkeskinner og mange kryssende fotgjengere ved Tinghuset eller mot trafikken i Kristian IVs gate. Hele Schweigaardsgate , fra Jernbanetorget til Likningskontoret/Skatt Øst blir syklistene tvunget å ta fortauet eller det atskilte kollektivfeltet mot øst. Mot Jernbanetorget velger jeg, som syklist, enten fortauet eller veien og forserer samme med trafikken en farlig rundkjøring. Men feite overvektige Oslo politikere i H og FRP bryr seg ikke, de sykler ikke selv men bruker av skattepengene (fra samferdselspotten) å la seg flytte rund av privatsjåfør. GJENSIDIG FORAKT !!!", + "type": "String" + }, + "date": { + "value": "2014-09-19T10:39:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "ae0fddf89b227b94ac2b519653d55585607acca1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2009": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90618845, + "lng": 10.76473474 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil som brått svingte inn på trelastgata. Sjåfør hadde ikke sett meg. Dette skjedde om morgenen i sommer med godt dagslys.", + "type": "String" + }, + "date": { + "value": "2014-09-19T09:55:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "e57a1ec2c2167dd8ab0f02042a5d92c0f840e9ac.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-2008": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93207586, + "lng": 10.69124221 + }, + "type": "LatLng" + }, + "description": { + "value": "Når du kjøre Skøyenveien og skal krysset Monolitveien er det ikke godt å vite hva som kommer fra høyre. Skrått vei i krysset, noe som gjør det kun mulig å se til venstre. Som syklist er det best å bruke gangfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-19T09:52:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "3f265e5a711ed6313080000cdb2c0f63532ab6b7.jpeg", + "type": "String" + } + } + }, + "aftenposten-2006": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95068575, + "lng": 10.6855452 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister som kjører inn Bjørnveien bruker begge felt fordi det er en enveiskjørt vei inn. Jeg må sykle ut til Stasjonsveien med stor forsiktighet ettersom jeg holdt på å bli kjørt ned av bilist på vei inn for en stund tilbake.", + "type": "String" + }, + "date": { + "value": "2014-09-19T09:34:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "85da4d12a9f3bde9542d2df29699514c45019e2d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2005": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91595641, + "lng": 10.74458599 + }, + "type": "LatLng" + }, + "description": { + "value": "Her sperrer staten bokstavelig talt sykkelfeltet. Bil med riksvåpen som tilhører departementenes sikkerhets- og serviceorganisasjon (underlagt Jan Tore Sanners Kommunal- og moderniseringsdepartementet) pleier ofte å parkere med snuten halvveis ut i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-19T08:54:08Z", + "type": "DateTime" + }, + "bilde": { + "value": "6a0d43f6521d15cb203b53a53b8730a1.jpg", + "type": "String" + }, + "streetview": { + "value": "f9a29012d1269e79b7f44fdc1c087937eab21eda.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2004": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92243631, + "lng": 10.67957997 + }, + "type": "LatLng" + }, + "description": { + "value": "Nestenulykke. Sykler ned Hoffsveien gjennom rundtkjøringen og rett frem i Drammensveien der jeg vil legge meg til høyre. Helt uventet kom det en drosje sørfra (under jernbanen) som bruker den adskilte filen for bus/taxi til høyre. Det var nære på. Helt uavklart hvem som har vikeplikt her (taxi\\\\'en tutet ikke så jeg tror han hadde vikeplikt). Farlig trafikkløsning som bør gjøres noe med. Christian", + "type": "String" + }, + "date": { + "value": "2014-09-19T08:38:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "97c6b159e4f7d9f688166a0c86fc3e0ff740ba32.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2003": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91611237, + "lng": 10.78009843 + }, + "type": "LatLng" + }, + "description": { + "value": "I dette krysset er det vanskelig for syklister som skal fra Tøyen og videre opp Økernveien. Sykkelfeltet ligger på høyre side av to felter for biler, hvorav det høyre er for å svinge til høyre opp Ensjøveien. Til overmål er det lysregulering med et vanlig lys for biler og et lys for kjøring til høyre. Det er grønt både rett frem og til høyre samtidig, noe som selvsagt gir bilistene som skal til høyre en forventning om bare å kunne svinge, uten å ta hensyn til syklistene som skal rett frem i sitt felt som bilistene da må krysse. Her burde veimerkingen vært slik at sykkelfeltet fortsatte rett frem, og at feltet som skal til høyre lå til høyre for sykkelfeltet. Da ville bilistene i større grad ha opplevd at de skiftet fil (og dermed hadde vikeplikt) når de krysset sykkelfeltet. Alternativt bu", + "type": "String" + }, + "date": { + "value": "2014-09-19T08:32:26Z", + "type": "DateTime" + }, + "bilde": { + "value": "7a99a6e32fdf315123ce10c0901e4586.jpg", + "type": "String" + }, + "streetview": { + "value": "f8f3c5b6e1f795f6ca7eab766b32324192711cce.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2002": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94976705, + "lng": 10.73042392 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet opphører. Biler daglig inn i sykkelfeltet før krysset ved Kirkeveien. Her må sykkelfelt markeres og gis plass helt ned til krysset (mulig å ta av fortauet som er bredt og stort nok). Svært farlig kombinasjon med mye trafikk, nedoverbakke, ett bilfelt som blir til to før krysset, på bekostning av sykkelfeltet som bare blir borte.", + "type": "String" + }, + "date": { + "value": "2014-09-19T08:19:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "28b6e14dd0a2c34902f4c5bd8a272c27b7365165.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2001": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8768459, + "lng": 10.78859139 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke oppmerket sykkelfelt etter asfaltering. Biler legger seg langt ut til høyre i veibanen, og presser syklister inn til kanten ved fortauet. Flere skumle episoder her.", + "type": "String" + }, + "date": { + "value": "2014-09-19T07:58:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "a8786e3825b58f90bf0538f70b269785fb60f20c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-2000": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91731702, + "lng": 10.7538557 + }, + "type": "LatLng" + }, + "description": { + "value": "Nylagt brostein gjør at farten må reduseres til krypefart, at bremselengden øker og at det er sklifare ved regn. Brosteinen gjør også at fotgjengere tror dette er gågate. Parallellgata Mariboes gate er også enveiskjørt, så du kommer deg ikke bort fra dette området.", + "type": "String" + }, + "date": { + "value": "2014-09-19T07:54:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "7e98024bbfe35ceb0660825fc9c29fa7316e988e.jpeg", + "type": "String" + } + } + }, + "aftenposten-1999": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92808705, + "lng": 10.80805778 + }, + "type": "LatLng" + }, + "description": { + "value": "Undergang mellom Risløkka og Økern utrolig lite gjennomtenkt, selv om den er ny. Dårlig sikt rundt krappe svinger, og fotgjengere som skal til/fra T-banen kommer brått ut i bunn av bakker fra begge sider", + "type": "String" + }, + "date": { + "value": "2014-09-19T07:50:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "5214c75287b5e1a8a120f3b03761d75eda94efe0.jpeg", + "type": "String" + } + } + }, + "aftenposten-1998": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90964736, + "lng": 10.71789264 + }, + "type": "LatLng" + }, + "description": { + "value": "Mellom rundkjøringene på Hjortneskaia og Aker Brygge går det som på Strava er et segment kalt \"Det farlige gjerdestrekket\". Her er det komplett kaos med fotgjengere, båtturister og syklister - i en bredde på kun et par meter - og med innsnevring pga trafikkskilt midt på der det også kommer en gangvei fra siden. Her ligger det en bred gressplen rett på innsiden av gjerdet ved innkjøringen til Color Line - denne brukes ikke til noe som helst! Ingen soler seg her, ingen lufter bikkja. Hvorfor ikke utvide gangveien slik at man fikk separert fotgjengere og syklister slik som store deler av Tour de Finance er videre? Frem til det eventuelt er på plass må det gå an å skyfle alle båtturister inn gjerdet halvveis med massiv skilting, det ville hjelpe det også", + "type": "String" + }, + "date": { + "value": "2014-09-19T07:46:39Z", + "type": "DateTime" + }, + "bilde": { + "value": "53e83f56871cd48c03b1a600bcb95c1c.png", + "type": "String" + }, + "streetview": { + "value": "c9f150a853d6ecf08df8e3d91a6c1614edf5ec77.jpeg", + "type": "String" + } + } + }, + "aftenposten-1997": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92328049, + "lng": 10.83526611 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke direkte farlig, men bremser fremkommeligheten. Fra Brevollbru og til Ole Deviks vei på rute e6 strømsveien er det mye dårlig asfalt. hadde vært fint å sykle på ny asfalt her", + "type": "String" + }, + "date": { + "value": "2014-09-19T07:36:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "930f2cbebba5592ffe0f66155fd4dbb82bf4f8a2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1996": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90585491, + "lng": 10.76771736 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikk, biler og syklister som skal til venstre i samme kryss. syklistene sykler både på høre side og venstre fortau", + "type": "String" + }, + "date": { + "value": "2014-09-19T07:26:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "bc37be446659b28ae7adc082baaf769f8b0b5b5b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1995": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88096996, + "lng": 10.78599929 + }, + "type": "LatLng" + }, + "description": { + "value": "19. september: Syklist påkjørt av bilist som ikke så seg for. Skader i hodet. Ambulanse.", + "type": "String" + }, + "date": { + "value": "2014-09-19T07:12:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "8949bba3f3a0f40681cfa47b2b008d26caf25905.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1994": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88101303, + "lng": 10.78580617 + }, + "type": "LatLng" + }, + "description": { + "value": "Her skjer det ulykker nesten hver uke. Bilister krysser sykkelfeltet uten å være oppmerksomme, kjører på syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-19T07:12:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "1f7ea39300cce3f40ea9f04d4876f54eef80d325.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1993": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9106371, + "lng": 10.72894334 + }, + "type": "LatLng" + }, + "description": { + "value": "Bakhjulet kom ned i trikkeskinnen med et stygt fall som resultat. På tross av lav fart førte det til ødelagt albue, forslåtte hender, istykkerrevne klær og ødelagt klokke.", + "type": "String" + }, + "date": { + "value": "2014-09-19T06:05:11Z", + "type": "DateTime" + }, + "bilde": { + "value": "5eb11c3ea55f1eed29d9204a5d8085a9.jpg", + "type": "String" + }, + "streetview": { + "value": "966f0f51263b7821e578b683af0b5db136f883cb.jpeg", + "type": "String" + } + } + }, + "aftenposten-1992": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92976972, + "lng": 10.66327214 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av annen syklist.Undergang er svært dumt utformet, med nedoverbakke som ender i 90 graderssving inn i en tunnel uten belsyning. Den andre syklisten holdet for stor fart og klarte ikke holde seg på sin side av veien i 90graderssvingen. Hun så neppe meg før hun var svært nær pga at det er så mørkt i tunnelen når det er lyst ute", + "type": "String" + }, + "date": { + "value": "2014-09-18T22:44:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "aa6da0936e3446a4616a192f5f5b37740c72b17f.jpeg", + "type": "String" + } + } + }, + "aftenposten-1991": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90475743, + "lng": 10.76715946 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom Oslo gate inn mot byen. Mellom trikkeskinnene i samme retning/høyre felt er et lag av asfalten fjernet. Dette la jeg ikke ordentlig merke til og veltet midt i gaten da jeg skulle svinge inn mot midten for å gjøre klar til å svinge til venstre ned Bispegata.", + "type": "String" + }, + "date": { + "value": "2014-09-18T21:44:21Z", + "type": "DateTime" + }, + "bilde": { + "value": "c0a0c8b168c22dc5f8eafe7b5b32afc1.jpg", + "type": "String" + }, + "streetview": { + "value": "a3b346b8a464b15c2e6b38a11e1ad4489484f034.jpeg", + "type": "String" + } + } + }, + "aftenposten-1990": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90775926, + "lng": 10.75713872 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg hadde gledet meg til sammenhengende sykkelfelt i Bjørvika. Entusiastisk cruiset jeg nedover Dronning Eufemias gate. Det var en fryd helt til jeg plutselig befant jeg meg i en skvis midt mellom to store busser. Det var ekstremt ubehagelig og jeg forsto virkelig ikke hvor det var meningen at jeg skulle ha syklet. Jeg endte opp med å løfte sykkelen opp på det brede fortauet (ville vært god plass til stor sykkelvei her), snu og krysse gata. Der er det kaotisk, men jeg skjønner i det minste hvor sykkelveien er. Problemet der jeg stoppet opp er at sykkelfeltet blir til bussfelt, og jeg synes det var vanskelig å forstå hvor man egentlig burde syklet. Er det meningen at jeg skal krysse gaten ved gangfeltet (det står ikke noe skilt), eller skal jeg ligge i feltet i midten mellom bussene og bile", + "type": "String" + }, + "date": { + "value": "2014-09-18T21:24:15Z", + "type": "DateTime" + }, + "bilde": { + "value": "aba338ac3872c017b292570145468d29.jpg", + "type": "String" + }, + "streetview": { + "value": "fbb2a65a88bc196edcc00a20672090ee2c2440f3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1989": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92862465, + "lng": 10.71498513 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien forsvinner på det mest trafikkerte punktet i krysset i Majorstua, hvor fortauet i tillegg er så smalt at det er vanskelig å sykle.", + "type": "String" + }, + "date": { + "value": "2014-09-18T21:09:09Z", + "type": "DateTime" + }, + "bilde": { + "value": "af0a3ac76d56a33b831ddac5f4640482.jpg", + "type": "String" + }, + "streetview": { + "value": "a018d83a1341d0139fca3538ba4602ff0e969fe9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1988": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93530096, + "lng": 10.76509952 + }, + "type": "LatLng" + }, + "description": { + "value": "Langs hele veien fra Grunerløkka opp mot Torshov har man valget mellom å kjøre ned gående på det smale fortauet, eller bli kjørt ned av trikken på den smale veien.", + "type": "String" + }, + "date": { + "value": "2014-09-18T21:05:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "860db103d37884ee0dd6491cbab92aa99c457a19.jpeg", + "type": "String" + } + } + }, + "aftenposten-1987": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92448488, + "lng": 10.77557086 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner og blir plutselig til parkeringsplasser for 4-5 biler. Første gang jeg syklet her ble jeg helt satt ut. Det er plutselig ikke noe sted å gjøre av seg og man klemmes inn mot bilene som står parkert hvs det er mye trafikk. Nå vet jeg at det er mulig å sykle på fortauet, som er veldig bredt akkurat her. Det ville vært veldig enkelt å lage sammenhengende sykkelvei akkurat her, nettopp fordi det er mye plass til overs på fortauet. Parkeringen burde fjernes, eller flyttes lenge inn på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-18T20:49:14Z", + "type": "DateTime" + }, + "bilde": { + "value": "68dea3d52fae975badb9906a127ee60b.jpg", + "type": "String" + }, + "streetview": { + "value": "394cb8af4ed48e157c2794c344c98d3ce3fa3fbd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1986": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91024443, + "lng": 10.77733039 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussholdeplasser i sykkelfelt. Buss venter ikke til sykler har passert, men legger seg inn slik at syklister må \"hoppe\" opp på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-18T20:31:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "a3e480c79d2c850170f4d0e698dfc12f94a0f753.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1985": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92958156, + "lng": 10.77814579 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelfelt/vei mellom Sinsenkrysset og Carl Berners plass. Smale felt kun for bil, mange mennesker på fortauene og bussholdeplasser på begge sider av veien.", + "type": "String" + }, + "date": { + "value": "2014-09-18T20:23:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "cfca783d161f4c84188fb48dc54a45a69c31c6da.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1984": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92032309, + "lng": 10.64222216 + }, + "type": "LatLng" + }, + "description": { + "value": "Skolevei: Mange barn som sykler i stor fart nedover veien. Veldig dårlig oversikt i krysset Ombergveien/Sollerudveien. Sollerudveien har vikeplikt for Ombergveien. Vanskelig for biler å se om det kommer noen da det er en hekk på venstreside av veien i Ombergveien.", + "type": "String" + }, + "date": { + "value": "2014-09-18T20:03:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "46701d99aa7d78454f89db5744c28c1f241353f1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1983": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9237644, + "lng": 10.64461469 + }, + "type": "LatLng" + }, + "description": { + "value": "Stor hekk som henger ut i svingen, umulig å se om det kommer noen fra høyre og rundt svingen.", + "type": "String" + }, + "date": { + "value": "2014-09-18T19:53:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "b74f100a7cebf1f2274f74f38fa1de5a8954c0a2.jpeg", + "type": "String" + } + } + }, + "aftenposten-1982": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92635053, + "lng": 10.72129368 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelvei, haugevis med kryssende fotgjenger i shoppingrus, utalmodige bilister og tutende trikk - har er det full kaos og høye fortauskanter forhindrer til og med flukten når det blir alt for trangt om plasse. At det er lov å kjøre bil i dette friluftsshoppingsenteret er uforståelig og i det minste burde dette ha vært shared space eller tempo 30 sone.", + "type": "String" + }, + "date": { + "value": "2014-09-18T19:18:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "6fd11777862e0db38e377a005dbf2716c369d1de.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1981": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92237717, + "lng": 10.6797409 + }, + "type": "LatLng" + }, + "description": { + "value": "Den naturlige veien å sykle mellom thune og denne rundkjøringen er Drammensveien. I denne rundkjøringen må man veksle mellom bilvei, fotgjengerovergang og sykkelsti. Det skaper usikkerhet og dermed farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-18T19:15:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "865d910ce0356402d200b667f7fb439c7254ec06.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1980": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93905243, + "lng": 10.67993402 + }, + "type": "LatLng" + }, + "description": { + "value": "Traff på 2 ambulanser her i dag. Syklist mot skater. Vet ikke hva som skjedde men innbilder meg at skateren kom fra Jon Smestad veien og syklisten fra Røa-retning (og hadde litt fart). Men det er ren gjetning. Se også https://twitter.com/oslopolitiops/status/512480549576126464", + "type": "String" + }, + "date": { + "value": "2014-09-18T19:06:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "39bfa2ef2d5cb002542594474e3a4275710e4f95.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1979": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9377357, + "lng": 10.73045611 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har det kommet fartsdemper på slutten av sommeren. Men asfalten i denne er ikke trukket helt inn til fortauskanten. Så der sykkelfeltet skulle ha vært er det nå en dyp renne mellom fortauskanten og den skrånende siden av fartsdemperen som dekker halve sykkelfeltet. Som syklist må man trekke ut i kjørefeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-18T18:38:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "c5ceb586454bfb6813f5c2f602cf838743a11ade.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1978": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9366984, + "lng": 10.8310604 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler står helt oppi gangfeltet på hver side i retning Linderud -Vollebekk. og gjør at gangfeltet blir uoversiktelig. Samt at det står trær og bukser på høyre siden som hindrer utsikt nedover Flere har fått parkeringsbøter der. Bilførere som tar av fra Østre aker vei kjører ofte litt for fort og ser ikke syklistene før de står i gangfeltet. Det burde ha vært et større område på begge sider av gangfelt der det var forbudt å parkere sånn at både syklister og bilister kunne se hverandre.Har hatt 2 nesten ulykker i gangfeltet. Den ene gangen sto jeg i gangfeltet godt synlig og bilisten som kom fra Østre aker vei stoppet ikke før jeg nesten hadde den på forskjermen min. Den andre gangen kom jeg fra Linderud og jeg nærmer meg fotgjengerfeltet jeg ser det kommer en kassebil fra høyre på vei nedo", + "type": "String" + }, + "date": { + "value": "2014-09-18T18:29:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "aaf5f88d96bfff2c7313cddf25489fed29e75620.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1977": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9311209, + "lng": 10.78993749 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet i sykkelfeltet. Parkeringsplasser på innsiden av feltet. I det jeg passerer en drosje som står parkert går plutselig passasjerdøren på venstre side bak opp. Kjører rett i døren, stuper av sykkelen. Hjelmen sprekker, slår meg ganske kraftig på høyre side.", + "type": "String" + }, + "date": { + "value": "2014-09-18T18:20:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "294f789659311eeed859d66eda968ac286cdc28f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1976": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92971058, + "lng": 10.74321269 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner.", + "type": "String" + }, + "date": { + "value": "2014-09-18T17:43:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "e963a8e9ce936a67cd04aa5bf61b6a3142757c0a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1975": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9263344, + "lng": 10.74990749 + }, + "type": "LatLng" + }, + "description": { + "value": "Barnevogner 2 i bredden i sykkelfeltet. Det er dårlig merket, folk skjønner ikke at det ene feltet er sykkelvei og det andre feltet er for gående.", + "type": "String" + }, + "date": { + "value": "2014-09-18T17:42:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "707a3acd0bd58e28dd7bf9b94d02fd327efffc43.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1974": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9382409, + "lng": 10.78296303 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kan man krysse under Ring 3 eller bøye av til venstre mot Hans Nilsen Hauges gate. Bøyer man av til venstre er det vanskelig å se om det kommer noen i mot, og veien svinger lett slik at man tror man har oversikt selv om man ikke har det. Dersom noen hadde trimmet noen busker ville det blitt helt fint.", + "type": "String" + }, + "date": { + "value": "2014-09-18T17:34:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "0a200666845b4dedf104639acb33065f1680426c.jpeg", + "type": "String" + } + } + }, + "aftenposten-1972": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94179321, + "lng": 10.78084945 + }, + "type": "LatLng" + }, + "description": { + "value": "Under Ring 3 går det en gangvei som ender ved Grefsen Stasjon. Her er det ikke mulig å se om noen krysser veien uten at man kryper ut i krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-18T17:20:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "498b71723006b0df41178204c71b5834ae758735.jpeg", + "type": "String" + } + } + }, + "aftenposten-1971": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92375365, + "lng": 10.80423831 + }, + "type": "LatLng" + }, + "description": { + "value": "I krysset mellom gang/sykkelvei til Helsfyr og Økern er det komplett umulig å se om det er noen som krysser veien får du befinner deg midt i krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-18T17:18:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "5af5124c6abcedf8bbceb10478347826e9ca1575.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1970": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93001163, + "lng": 10.79483985 + }, + "type": "LatLng" + }, + "description": { + "value": "Et geni av de sjeldne har funnet ut at å legge gateparkering mellom sykkelfelt og fortau er en god idé....", + "type": "String" + }, + "date": { + "value": "2014-09-18T17:17:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "c3b6b3bb327d7cfad05d50100b936a589d3fae47.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1969": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93743473, + "lng": 10.78456163 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang/sykkelveien som går fra Løren under Sinsenkrysset er trang, komplett uoversiktlig og mørk. Syklister kommer ofte i (for) høy fart, og fotgjengere er ofte litt vel opptatt av mobiltelefonen. Dette er en dårlig kombinasjon.", + "type": "String" + }, + "date": { + "value": "2014-09-18T17:15:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "faa98adf6fbaaf31034cf6b11ec963d686a400ce.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1968": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94423285, + "lng": 10.77592492 + }, + "type": "LatLng" + }, + "description": { + "value": "En mer hullete vei tror jeg ikke det finnes i Oslo. Det er et lappeteppe uten like, nye hull dukker opp hver uke og trikkeskinnene har laget lange og brede sår i asfalten på hver side. Legg til at det er ekstremt smalt mellom trikkeskinnene og fortauet, og du har en av Oslos farligste vei for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-18T17:12:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "a40afe941d90ce0ca9da8484a04f45ebb86ec34e.jpeg", + "type": "String" + } + } + }, + "aftenposten-1967": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92054894, + "lng": 10.74252605 + }, + "type": "LatLng" + }, + "description": { + "value": "Hver dag parkerte biler i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-18T16:31:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "af7c65a3c787c6f403cf44f43e51e85543021a37.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1966": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91785353, + "lng": 10.6631533 + }, + "type": "LatLng" + }, + "description": { + "value": "Her ligger de farlige utkjøringene tett. Hva med å sette opp noen skilter eller andre tiltak som viser at man er i ferd med å krysse Norges mest trafikkerte sykkelvei - tilsvarende det som settes opp for syklister?", + "type": "String" + }, + "date": { + "value": "2014-09-18T15:51:11Z", + "type": "DateTime" + }, + "bilde": { + "value": "04150d8b66ab2066b4c8b945241ed0d8.jpg", + "type": "String" + }, + "streetview": { + "value": "8fbb94dc7e8627460a0b0fb170aec3741f4146a1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1965": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94856358, + "lng": 10.64362764 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det i og for seg et sykkelfelt på hver side, men område preges av total anarki fra bilister. De parkerer i sykkelfeltet fordi de \"skal bare\" noe på senteret. Også stor risiko for å støte på en bildør som åpnes. Generelt et veldig kaotisk område - og kryss - som både syklist og bilist. Ingen naturlig plassering for syklister som skal nordover over Røakrysset, før krysset, ift. å komme seg til sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-18T15:38:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "826fa52c0883c2eeb0f5997dbd7a9b8f88aa14de.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1964": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93951462, + "lng": 10.76924085 + }, + "type": "LatLng" + }, + "description": { + "value": "hull ved trikkeskinene, trikkeskiner stikker langt ut på asfalten, man må bruke konsentrasjon og nesten hoppe over skinene", + "type": "String" + }, + "date": { + "value": "2014-09-18T15:30:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "22ff6e7869f762b827f3c313f311b608d27da087.jpeg", + "type": "String" + } + } + }, + "aftenposten-1963": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92458704, + "lng": 10.7242763 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkeskinner som går skrått på kryss, og som er veldig glatte. Spesielt farlig dersom det regner, men dessverre vanskelig å gjøre noe med.", + "type": "String" + }, + "date": { + "value": "2014-09-18T15:21:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "2486e347a1577f862c6aeb89e71e35adfc40a6e1.jpeg", + "type": "String" + } + } + }, + "aftenposten-1962": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94383521, + "lng": 10.77136516 + }, + "type": "LatLng" + }, + "description": { + "value": "Pga parkeringer er gangfeltet uoversiktelig. Hvis du kommer fra Grefsenveien og skal over til Akerselven så risikerer du lett å bli påkjørt. Dette er selvfølgelig om man går over gangfeltet. Er man på sykkel , og sykler over kan man bli så høy at man blir sett over den parkerte bilen. Pass på", + "type": "String" + }, + "date": { + "value": "2014-09-18T15:11:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "26ce0a782bf0c344e28a5f991bd840f56434448f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1961": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94396955, + "lng": 10.77562451 + }, + "type": "LatLng" + }, + "description": { + "value": "Utrolig hullete vei. Biler har punktert. Ser ut som om den eneste løsningen fra kommunen er et skilt som informerer om dette!", + "type": "String" + }, + "date": { + "value": "2014-09-18T15:09:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "fe487cbfe6906c24ba4a61b1e80e6d5bf1ce80b2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1960": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91779027, + "lng": 10.6628859 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler står parkert delvis ut i gang- og sykkelveien. Ekstra skummelt når det er en kajakk eller lignende på taket. Det mest idiotiske er en bil med sykkelstativ(!) som stikker godt ut i gang- og sykkelveien.", + "type": "String" + }, + "date": { + "value": "2014-09-18T14:22:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "3378e539f2aefcc527c331dc1e7a0e7718f38320.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1959": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89300575, + "lng": 10.50777912 + }, + "type": "LatLng" + }, + "description": { + "value": "Det ligger cm-tykke lag av løs grus på asfalten i veibanen og på fortauet. Selv i lav fart fikk jeg skikkelig skrens der i går.", + "type": "String" + }, + "date": { + "value": "2014-09-18T14:05:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b59a99b3a56e02858c3a54feb99f21dd5b5c7df.jpeg", + "type": "String" + } + } + }, + "aftenposten-1958": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92777524, + "lng": 10.76711654 + }, + "type": "LatLng" + }, + "description": { + "value": "Her krysser gangveien en annen gangvei, som går mellom Fagerheimgata og Marstrandgata. På denne gangveien er det utrolig mange biler som kjører. Gjentatte hevendelser til kommunen fører ikke fram.", + "type": "String" + }, + "date": { + "value": "2014-09-18T13:40:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "54ae625016d51d346aa1344527c2477ab5ce6817.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1957": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92211907, + "lng": 10.77085018 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig plass til sykkel ved siden av trikkeskinner pga mange hull, brostein, mye kollektivtrafikk mellom sofienberg og schous bryggeri", + "type": "String" + }, + "date": { + "value": "2014-09-18T13:22:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "d9e2471e9820c86be99da999d58081b6b9a32c08.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1956": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92612472, + "lng": 10.72814941 + }, + "type": "LatLng" + }, + "description": { + "value": "Sporveisgt er en viktig gate for mange syklister, og jeg sykler den nesten daglig. Men i retning sør-vest har det i mange år vært veldig dårlig kvalitet på asfalten nærmest fortauet. Mye hull, kumlokk/rister som ligger flere cm lavere enn normalt, og generelt så humpete at en er nødt til å legge seg midt i bilfeltet i et par hundre meter, med det resultat å få en rekke utålmodige bilister bak seg som gjør farlige forbikjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-18T13:08:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "7232a7d445e568d458c2f400bfd606d808d6a948.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1955": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91323501, + "lng": 10.75336217 + }, + "type": "LatLng" + }, + "description": { + "value": "Blir ofte stående midt i krysset når man skal svinge til venstre fra Ring 1 til Stenersgata.", + "type": "String" + }, + "date": { + "value": "2014-09-18T13:03:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "e8d2605988625a8e8d419879a1ed701745bb6647.jpeg", + "type": "String" + } + } + }, + "aftenposten-1954": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92624838, + "lng": 10.72132587 + }, + "type": "LatLng" + }, + "description": { + "value": "Klemt mellom trikk og trikk.. Null sykkelvei og livsfarlig !", + "type": "String" + }, + "date": { + "value": "2014-09-18T13:00:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "828ce1df52fcb041e208ef7558654c3712d0db74.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1953": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92917837, + "lng": 10.71605801 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye av Kirkeveien har god sykkelsti og legger opp til at syklister bruker Ring 2. Men her mellom Valkyriegata og Sørkedalsvn forsvinner den, noe som skaper farlige situasjoner mellom syklister som kommer nordfra og skal videre rett fram i Kirkevn og bilister som skal svinge inn til høyre oppover Sørkedalsvn. Det burde vært merka rødt sykkelfelt i dette krysset slik at det blir tydelig for begge parter hvor syklistene kan plassere seg.", + "type": "String" + }, + "date": { + "value": "2014-09-18T12:55:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "33235f837431177726e5693df39278bbd6d2692d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1952": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93279078, + "lng": 10.74918866 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler kjører forbi og rett inn til høyre.", + "type": "String" + }, + "date": { + "value": "2014-09-18T12:52:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "7cc5278be45e261e918b873e325722e856386abb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1951": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94551708, + "lng": 10.71740984 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysningen her med trikken er helt håpløs. Store huller i asfalten på begge trikkeskinnene, og løse asfaltbiter/pukk. Lett å skli eller å punktere her. Det burde være en smal sak å asfaltere opp.", + "type": "String" + }, + "date": { + "value": "2014-09-18T12:52:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "2a5a0efc458e3ebbadbf5ce890825a847dc22269.jpeg", + "type": "String" + } + } + }, + "aftenposten-1950": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94308291, + "lng": 10.77381134 + }, + "type": "LatLng" + }, + "description": { + "value": "En klassiker av en vei full av hull og farlige trikkeskinner. MYE verre enn Dokkveien. Fra Nordpolen og opp til Storo er dette et mareritt for syklister (og bilister).", + "type": "String" + }, + "date": { + "value": "2014-09-18T12:49:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "5260b643f1cfb5fb4e62d9af5894c6e6388773ec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1949": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92659247, + "lng": 10.73399662 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg bor øverst i Sofies gt og registrerer at mange (med meg) bruker denne lange gata som sykkelåre fra sentrum og nordover, som et mye tryggere alternativ enn f.eks. Pilestredet/Thereses gt. Men akkurat dette kvartalet har enveiskjøring og følgelig risikabelt å sykle der på vei sørover. Siden denne gata er sentral for mange syklister burde det vært gjort noe med slik at denne lille stubben kan sykles begge veier selv om det er enveiskjørt for biler.", + "type": "String" + }, + "date": { + "value": "2014-09-18T12:47:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "07bbfa59eb599910a451964a1ef7a4aee5a4172a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1948": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92575375, + "lng": 10.73196887 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved bussholdeplassen (Bislett) er det meget dype spor etter bussene. Har sett biler punktere der, og sykler svært forsiktig forbi stedet.", + "type": "String" + }, + "date": { + "value": "2014-09-18T12:46:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "691aa623f4440c387c24c204e2bab5c90dcb0a22.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1947": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90831871, + "lng": 10.78434705 + }, + "type": "LatLng" + }, + "description": { + "value": "I dag var det ikke mindre enn tre biler parkert i sykkelfeltet i Strømsveien. I tillegg var det mye glasskår.", + "type": "String" + }, + "date": { + "value": "2014-09-18T12:43:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "2ae286622d7232ae04c490a4da8dabf92073b200.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1946": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91077695, + "lng": 10.83053469 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man sykler ned Tvetenveien er det \"umulig\" å komme over på sykkelfeltet nederst i Tvetenveien. Dette fordi man naturlig får høy fart, og det dermed føles tryggere å sykle veibanen ned enn å kaste seg inn på faremomentet med å bytte over til sykkelfeltet da disse er separert med en \"høy\" kant.", + "type": "String" + }, + "date": { + "value": "2014-09-18T12:40:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "f1090d9d5d8bcc81365fbe7d99cce6dbdc46e8ad.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1945": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92736127, + "lng": 10.73895335 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei nordover er dette krysset farlig tilrettelagt for sykkel hvis du skal fortsette rett fram oppover Ullevålsveien. Før krysset må du forlate sykkelstien og legge deg i midtre bilfelt, noe som er svært risikabelt fordi det ofte kommer biler i stor fart i høyre felt som skal videre opp til høyre langs parken og har grønt lys mens det er rødt lys rett fram. Her har jeg ofte følt meg utrygg og opplevd aggressive bilister som ikke skjønner hvorfor jeg er tvunget til å legge meg i midtre felt og vente på grønt lys der.", + "type": "String" + }, + "date": { + "value": "2014-09-18T12:36:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "98c77d1d7ce1f0fa578632667c456e4521e7b3bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1944": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94948768, + "lng": 10.73184013 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved juletider settes det ofte opp et juletresalg mellom bussholdeplass og kryss. Juletrærne settes på begge sider av gang-/sykkelvei og gjør fremkommelighet vanskelig og hele området veldig lite oversiktlig.", + "type": "String" + }, + "date": { + "value": "2014-09-18T11:54:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "4b0ab06e79a85e6a8d8fc0b028f8398e3bb68132.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1943": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93176408, + "lng": 10.78835964 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det mye vikepliktslurv fra både biler og syklisters side. Med alle fotgjengere og syklilster som ferdes i dette krysset ville en undergang vært mest effektiv. En rundkjøring er kanskje mer realistisk. Denne hadde trolig ført til jevnere trafikkflyt og det hadde vært enklere for syklister å komme seg gjennom da de kun hadde trengt å bekymre seg for biler fra venstre. Og ikke høyre, venstre, bakfra og rett frem slik det er i dag.", + "type": "String" + }, + "date": { + "value": "2014-09-18T11:20:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "c12d32898fe2f480b742b2c750a876c2afab6770.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1942": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92375903, + "lng": 10.80420613 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig ved undergangen. Et vidvinkelspeil hadde hjulpet mye her! \"Kjørefeltene\" er merket opp på bakken så noen har gjort en innsats for å gjøre det sikrere her.", + "type": "String" + }, + "date": { + "value": "2014-09-18T11:15:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "1e6306cbdec95c8675071fa6eb2d7c7936a89656.jpeg", + "type": "String" + } + } + }, + "aftenposten-1941": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94181471, + "lng": 10.80110549 + }, + "type": "LatLng" + }, + "description": { + "value": "De lange bakkene mellom Sinsenkrysset og Tonsen kirke er potensielt livsfarlige fordi sykler og gående deler gang-og sykkelveien. Her kan man fint trille nedover å få en hastighet på 50km/t uten egen innsats. Adskilte felt for sykler og gående er et must her.", + "type": "String" + }, + "date": { + "value": "2014-09-18T11:00:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "3cae06226b337896d6fb125825b66f433478c6b5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1940": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91878513, + "lng": 10.66888332 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er direkte farlig både for for fotgjengere og vanlige syklister å befinne seg på gang- og sykkelveien langs Bestumkilen i arbeidstidas slutt (rushtida). Da kommer det fykende horder av velvoksne menn i hurtigtogsfart på resersykler, som uten hensyn, brøyter seg fram slik at vi vanlige fotgjengere og syklister må skvette av banen.", + "type": "String" + }, + "date": { + "value": "2014-09-18T08:22:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "188e73282eda222a22fae9dbd4321ae62569e44d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1939": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89815031, + "lng": 10.75853347 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet tar slutt ved Kongshavn VGS. Syklistene slåss om plassen med bilene retning sentrum. har observert flere farlige forbikjøringer av biler. Sykkelulykke 15.9.14.", + "type": "String" + }, + "date": { + "value": "2014-09-18T04:42:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "486ef9676d4253e6415167625be915dc2fd55925.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1937": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93484409, + "lng": 10.72866439 + }, + "type": "LatLng" + }, + "description": { + "value": "Dersom gateparkering fra krysset og vestover langs Blindernveien fjernes kan syklister krysse lyskrysset i eget sykkelfelt. Biler som kommer fra Ullevålsveien og skal til høyre inn på Kirkeveien har egen påkjøring. Denne strekningen sykles av mange studenter daglig.", + "type": "String" + }, + "date": { + "value": "2014-09-17T19:39:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "93f3b252b5eabb2bda708679293b437e3152dbbf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1936": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90628528, + "lng": 10.77380061 + }, + "type": "LatLng" + }, + "description": { + "value": "Såkalt sykkelfelt, adskilt med bredt felt med brostein. Smalt, fullt av humper og forhøyninger. Hvis noen spør hvorfor jeg sykler i veien i stedet for i sykkelfeltet, svarer jeg at dette er ikke sykkelfelt, det er en dårlig spøk.", + "type": "String" + }, + "date": { + "value": "2014-09-17T19:31:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "2ce8a5caf6cd819c6b63346b173ac4fbd448178c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1935": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.97433849, + "lng": 10.9290291 + }, + "type": "LatLng" + }, + "description": { + "value": "Står en trailer i parkering forbudt sone omtrent til alle tider på døgnet. Kommer seint på kvelden og drar tidlig om morgen. Står på tomgang lenge og forstyrrer ro orden for beboerne. Latterlig at Bymiljøetaten har gitt opp han der. For han kommer ikke til å gi seg. Se å få han fjernet.", + "type": "String" + }, + "date": { + "value": "2014-09-17T18:37:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "7179905e70c820b1735e237bc3d999ceca0084f4.jpeg", + "type": "String" + } + } + }, + "aftenposten-1934": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90628528, + "lng": 10.77380061 + }, + "type": "LatLng" + }, + "description": { + "value": "Såkalt sykkelfelt, adskilt med bredt felt med brostein. Smalt, fullt av humper og forhøyninger. Hvis noen spør hvorfor jeg sykler i veien i stedet for i sykkelfeltet, svarer jeg at dette er ikke sykkelfelt, det er en dårlig spøk.", + "type": "String" + }, + "date": { + "value": "2014-09-17T18:31:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "2ce8a5caf6cd819c6b63346b173ac4fbd448178c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1933": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95878124, + "lng": 10.7913982 + }, + "type": "LatLng" + }, + "description": { + "value": "Myrerfeltet er nylig gjort om til treningsbane for små fotballspillere. Mange foreldre leverer, henter og/eller parkerer. Innkjøringen til Nordhagaveien er omgitt av høye hekker som gir svært dårlig oversikt på en vei som plutselig er langt mer trafikkert.", + "type": "String" + }, + "date": { + "value": "2014-09-17T17:51:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "7da9815679eae175913167ad10e4ff127b3c3773.jpeg", + "type": "String" + } + } + }, + "aftenposten-1932": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93118352, + "lng": 10.70992112 + }, + "type": "LatLng" + }, + "description": { + "value": "Konfliktpunkt mellom syklister, fotgjengere og bilister. Sted: Utenfor Sørkedalsveien 9, v/nedkjøring til P-hus for XXL. Sørkdalsveien er på dette stedet firefelts, med fartsgrense 60 km/t. Fra Majorstua og vestover mot det angitte punktet er veien svært bred, med god plass til to kjørefelt for biler, en rad parkerte biler langs kanten, *og* syklister mellom disse. Mange syklister velger derfor å bruke veien fremfor fortauet på denne strekningen. Ved det angitte punktet smalner veien inn og har akkurat plass til to bilfelter, samtidig som det begynner en oppoverbakke. De aller fleste syklister finner det her så ubehagelig å fortsette syklingen i veibanen at de svinger opp på fortauet via innkjøringen til XXL-parkeringshuset.", + "type": "String" + }, + "date": { + "value": "2014-09-17T17:38:06Z", + "type": "DateTime" + }, + "bilde": { + "value": "6e235b38026fc3576678acc13d5e8027.jpg", + "type": "String" + }, + "streetview": { + "value": "a3264d24c79c8b6353f6aa2411106e341095f88b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1931": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95176558, + "lng": 10.72741985 + }, + "type": "LatLng" + }, + "description": { + "value": "Nestenulykke. Jeg var på vei ned Sognsveien. I krysset skulle en bil til venstre ned mot Sogn-videregående/Ring 3. Bilen måtte vente på grunn av møtende trafikk. Bil nummer to la seg da ut og sperret hele sykkelfeltet. Jeg lå da 20-30 meter bak og måtte bremse så hardt at dekket fikk en rett flate på nesten ti cm (landeveisykkel). Jeg traff bilen med venstre albue og \"lente\" meg mot bilen for å få igjen balansen. Kvinnen som kjørte fortsatte uten å spørre om hvordan det gikk.", + "type": "String" + }, + "date": { + "value": "2014-09-17T16:40:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "f0da71ac4064ba8243c1afeb26d08e94bcf3dc28.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1930": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94011653, + "lng": 10.90302944 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien skulle heller legge inn i krysset, slik at (1) syklisten blir sett av bilister og (2) bilisten må ikke bremse ned til 8 km/t for å komme over krysset", + "type": "String" + }, + "date": { + "value": "2014-09-17T15:49:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "72d497603b7a3bcc1303905d3947f9b0d5281176.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1929": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90736118, + "lng": 10.78076362 + }, + "type": "LatLng" + }, + "description": { + "value": "Bommen v inngangen er ett konstant problem for syklende. Fordi det ikke blir satt opp gjennomkjøring forbudt skilt her, så venter det alltid biler i sykkelfeltet på å smette gjennom bommen etter bussene. Dette fører også til massse råkjøring for å rekke å komme gjennom bommen og det er daglig nestenulykker her.", + "type": "String" + }, + "date": { + "value": "2014-09-17T12:17:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "3752dcbb13a418c93e325774bcfaa39ee9ed710c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1928": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92833435, + "lng": 10.74982166 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg opplever nesten daglig bilister som svinger av til Statoil rett foran meg, som om de ikke har sett meg. Ofte uten blinklys og/eller i stor hastighet.", + "type": "String" + }, + "date": { + "value": "2014-09-17T11:59:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "3f6b09b5b30de0bf82239263cbb37c487515f4a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1927": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90733967, + "lng": 10.78037738 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som står parkert i sykkelfeltet og venter på å snike seg gjennom bommen. Når bussen kommer blir det mye farlig kjøring for å rekke å komme gjennom før bommen går ned igjen. Blitt mye verre etter at politiet fjernet Passering forbudt skiltet ved bommen.", + "type": "String" + }, + "date": { + "value": "2014-09-17T11:51:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "a2dbb6148a757455a77eaf059534bd07cab062f8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1926": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91097059, + "lng": 10.82954764 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvis man som sykkelist faktisk velger å bruke fortauet nedover er Hellerud bussholdeplass et farlig moment. Fortauet smaler inn og man må passere ventende passasjerer. Mange fotgjengere går midt i feltet med musikk på øret og legger ikke merke til sykkelister som forsøker å komme forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-17T11:48:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "d1957d9fe1caa8a80298ae2093cb659a4dac1d00.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1925": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91163218, + "lng": 10.76990604 + }, + "type": "LatLng" + }, + "description": { + "value": "Her stanser SYKLISTER aldri for rødt lys. Har ved flere anledninger nesten blitt kjørt ned av syklister i fotgjengerovergangen her, enda den er lysregulert. Mange syklister bryr seg tydeligvis ikke om trafikkreglene som de også er pliktig å følge når de sykler i veibanen. Foreslår at dere tar også lager en kampanje for bedre sykkel-vett......", + "type": "String" + }, + "date": { + "value": "2014-09-17T09:28:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "9699a556ce21cf4e47432c156b11d1233b41d5f2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1924": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90908256, + "lng": 10.78820943 + }, + "type": "LatLng" + }, + "description": { + "value": "Nestenulykke. En renovasjonsbil stoppet plutselig i veibanen og begynte å rygge inn over sykkelfeltet for å rygge videre inn i en sidegate. Har ikke bilister vikeplikt når de rygger? Jeg bråbremset og dro sykkelen opp på fortauet. Begge renovatørene skrek skjellsord til meg, og den ene kastet en gjenstand etter meg. Jeg fant det lurest å ikke begynne noen diskusjon med disse hissigproppene, og fortsatte.", + "type": "String" + }, + "date": { + "value": "2014-09-17T08:58:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "c38b752b58893d74669e11ea10c9ac95802a6aab.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1923": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9185055, + "lng": 10.83603858 + }, + "type": "LatLng" + }, + "description": { + "value": "Det naturlige veivalget mellom Alnabru og Bryn/Østensjø. Ingen tilrettelegging for sykkel. Det er fortau på deler av strekningen, men det er mange inn- og utkjøringer fra bedrifter, og mange biler som står parkert på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-17T07:32:56Z", + "type": "DateTime" + }, + "bilde": { + "value": "740ff647f90453369792320797a44c11.jpg", + "type": "String" + }, + "streetview": { + "value": "3edd9119cc6c0f5562f9bb56ddcb39cd69253566.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1922": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91837644, + "lng": 10.846982 + }, + "type": "LatLng" + }, + "description": { + "value": "Ytre ringvei, som binder Oppsal og Tveita til Alna. Ingen tilrettelegging for sykkel, mye trafikk og svært hullete og gammel asfalt på et tynt fortau. Uoversiktlige svinger gir farlige forbikjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-17T07:27:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "45479db9dfc94943b195631c3700fc51bec7cfb1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1921": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94013802, + "lng": 10.72960853 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet i rundkjøring, Bilist overholdt ikke vikeplikt. Vi kolliderte, men ingen skade.", + "type": "String" + }, + "date": { + "value": "2014-09-17T07:13:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "18b358f9f91aca60bc7ec1bba08892dedeb6991d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1920": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93517196, + "lng": 10.74291229 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom gående i retning Ullevål sykehus da jeg ble påkjørt bakfra av syklist i stor fart.", + "type": "String" + }, + "date": { + "value": "2014-09-17T07:10:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "41fd19fa58a2df90debfa5f3d2d0a5599a53198c.jpeg", + "type": "String" + } + } + }, + "aftenposten-1919": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92097374, + "lng": 10.68171501 + }, + "type": "LatLng" + }, + "description": { + "value": "Norges største ansamling av skjødesløse sjåfører? Jeg har så godt som aldri opplevd at det IKKE står parkert biler i sykkelfeltet. Opplever ofte biler som \"høyre-hooker\" meg og andre da de skal parkere i gaten eller inn til parkeringshus etc. Ikke uvanlig å oppleve biler i motsatt kjøreretning, evt. biler som tar en u-sving og krysser sykkelfelt i begge retninger uten å ta hensyn til andre enn seg selv. Her bør det permanent utplasseres en trafikkbetjent.", + "type": "String" + }, + "date": { + "value": "2014-09-17T06:55:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "a0b7e710b54a6de47b583bcef68d4944d9004082.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1918": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91022292, + "lng": 10.74373841 + }, + "type": "LatLng" + }, + "description": { + "value": "Byggearbeider har bredt seg utover fortau. Lastebiler parkerer utenfor der. Syklister og gående kommer ikke forbi", + "type": "String" + }, + "date": { + "value": "2014-09-17T06:54:33Z", + "type": "DateTime" + }, + "bilde": { + "value": "93401b7e1aead86856f569d43e37d3d1.jpg", + "type": "String" + }, + "streetview": { + "value": "31e8605b51454b8e3d33f244b053cb61df3139fa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1917": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9177096, + "lng": 10.66261768 + }, + "type": "LatLng" + }, + "description": { + "value": "Ofte konflikt mellom bilister som ikke forstår at de har vikeplikt for gående og syklende på gang og sykkelsti, når de skal inn til marina/mabxo/etc. Har flere ganger opplevd å måtte kaste meg unna biler, som uten å bruke øynene/hodet, har krysset rett foran meg eller andre. Dette gjelder også yrkessjåfører som så absolutt burde vite bedre da de kjører her ofte...", + "type": "String" + }, + "date": { + "value": "2014-09-17T06:48:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "aa7d801564ac36b39668236b0e48eed1a8ce6093.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1916": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91599405, + "lng": 10.65570831 + }, + "type": "LatLng" + }, + "description": { + "value": "Kombinasjonen av gang og sykkelsti uten merking/adskillelse, samt nedoverbakke med der tilhørende stor fart, fører til mange ubehagelige situasjoner/nestenulykker mellom syklister og fotgjengere. Spesielt nå som det er blitt populært i parkere langs Drammensveien er det mange fotgjengere som krysser gang og sykkelsti.", + "type": "String" + }, + "date": { + "value": "2014-09-17T06:46:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "24270266f060b604da1b5e1767dea223a26ec083.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1915": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94416837, + "lng": 10.73098182 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien er nyasfaltert og ordnet - og sykkelfeltet er tatt bort. Her var det mulig å være syklist i travel trafikk, det er det ikke lenger. Hvorfor fornye vei når en fjerner sykkelfelt?", + "type": "String" + }, + "date": { + "value": "2014-09-16T21:38:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "70aa7a36be6965a4cd429fdd4567ebc820801d9c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1914": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92248471, + "lng": 10.82947254 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelstien er fin og oversiktlig. Jeg sykler mot sentrum og ser et øyeblikk ned på sykkelcomputeren. Registrerer samtidig at det kommer en bil inn rett foran meg og jeg bremser umiddelbart. Forhjulet stopper akkurat inntil sia på bilen som også stopper, men bakhjulet løftes opp og jeg og sykkel skraper opp siden på bilen når vi deiser i bakken. Ingen personskader, bare en ødelagt eike, slark i hjul og riper på sykkel og bil. Sjåføren hadde kjørt parallelt med meg, og til tross for at det er oversiktlig og jeg hadde på meg gul sykkeljakke, så han meg ikke da han skulle forte seg å svinge inn før en møtende bil. Han sa han selv var en ivrig syklist.", + "type": "String" + }, + "date": { + "value": "2014-09-16T20:29:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "b5639e75f118f10daf191c26272c17345aaff9ca.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1913": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93069972, + "lng": 10.85543632 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet på sykkelsti mot sentrum og skulle kysse Stubberudveien. Samtidig kom det en bil ut fra Stubberudveien som skulle til høyre. Pga 4 meter høye gjerder tett inntil sykkelveien er det veldig dårlig sikt. Sjåføren kom fort og så bare til venstre for å sikre seg at det var klart på bilveien og stoppet derfor ikke. Jeg klarte ikke stoppe, og kom nesten klar, men bilen traff bakhjulet som slang ut som en pendel. Vekten var så langt fram på sykkelen at jeg unngikk å falle foran bilen. Her var det snakk om tilfeldigheter at jeg ikke satt klistra i grillen. Sjåføren sa han var klar over at utkjøringen var farlig, og at det bare var uker siden en kollega hadde kræsjet med syklist på samme sted. Det trengs stoppskilt for bil og speil, eller fjerne gjerder.", + "type": "String" + }, + "date": { + "value": "2014-09-16T20:09:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "6469ca1766d8613e9440b9e4aec04b3fe270d5c4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1912": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90747415, + "lng": 10.78082799 + }, + "type": "LatLng" + }, + "description": { + "value": "Alltid masse biler som venter på at bussen passerer bommen. De venter i sykkelfeltet. Når bussen kommer så blir det mye rar og farlig kjøring for å rekke etter bussen under bommen før den går ned.", + "type": "String" + }, + "date": { + "value": "2014-09-16T20:09:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "9e5c80914f4e5cd836659e7df674e19286ace755.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1911": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9194627, + "lng": 10.76497077 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ikke sykkelvei og ikke mye plass til å sykle på fortauet. I veien går det trikk. Ikke lett og sykle her", + "type": "String" + }, + "date": { + "value": "2014-09-16T18:24:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "7e1cd9c100e78c8cee2e32bf1ec66b7cefcdcc35.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1910": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95277555, + "lng": 10.76224565 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler man østover på gang- og sykkelveien treffer man en 90 graders sving, uten sikt, i bunnen av en nedoverbakke. Hadde en slik løsning blitt valgt på Ring 3, som går parallelt med gang- og sykkelveien, hadde det blitt ramaskrik. I tillegg til å være en trafikkfarlig løsning så er det et godt eksempel på at syklister ikke prioriteres i Oslo.", + "type": "String" + }, + "date": { + "value": "2014-09-16T17:53:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "26ea6c5c3f3ea94652c9a5115235a80c0466277e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1909": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95421523, + "lng": 10.69600582 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er en farlig vei som har parkeringsforbud som aldri blir fulgt. Siden jeg har blitt påkjørt i svingen har jeg pleid å varsle bymiljøetaten hver gang det er mer enn 10 biler parkert i/på fortauet, eller når de står på begge sider av veien og sperrer for større biler. De sender svært sjeldent ut bil for å hjelpe og jeg håper ingen andre blir skadet.", + "type": "String" + }, + "date": { + "value": "2014-09-16T17:27:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "30d59ccb8f2777d7bc530092789318b780f6044e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1908": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95389292, + "lng": 10.69544792 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ofte parkert biler selv om det er parkering forbudt. Jeg syklet oppover når det kom bil susende nedover og ble påkjørt. Kragebrudd.", + "type": "String" + }, + "date": { + "value": "2014-09-16T17:26:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "2be9dc1ff481d14f4507bc555419405722570c7c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1907": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92517309, + "lng": 10.71398735 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig asfalt. Mye hull, humper og aggressive bilister. Parkering på begge sider av veien gjør det trangt og skummelt å navigere utenom hullene/humpene.", + "type": "String" + }, + "date": { + "value": "2014-09-16T16:46:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "c7c3283ba83b36e68b177d73522337fd74cfddd1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1906": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90876519, + "lng": 10.7584691 + }, + "type": "LatLng" + }, + "description": { + "value": "Mellom de opphøyede fotgjengerovergangene (støpt i betong) og veien før/etter (asfaltert) er det en kant på 2-3cm. Flere steder. Denne er som skapt for å punktere sykkeldekk. Med stor busstrafikk parallelt med sykkelfeltet kan det fort skje ulykker her. Hvorfor er kantene der? Når rettes dette på?", + "type": "String" + }, + "date": { + "value": "2014-09-16T16:40:39Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1905": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92334501, + "lng": 10.75920939 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet i Thorvald Meyers gate går mellom Grüners gate og Seilduksgata. For å koma til sykkelfeltet i Markveien frå Sofienberggata og sørover er det fint å sykla diagonalt over Olaf Ryes plass. Men i krysset Grüners gate/Thorvald Meyers gate er det både mykje biltrafikk og trikkestopp, og det skapar ein ganske kaotisk situasjon for syklistar (og fotgjengarar) som må kryssa gata der.", + "type": "String" + }, + "date": { + "value": "2014-09-16T16:39:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "412bc341fdc84d94348ace7c9b0e62dbc0518115.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1904": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84643168, + "lng": 10.80389499 + }, + "type": "LatLng" + }, + "description": { + "value": "Merket som tilrettelagt, men \"tilretteleggingen\" akkurat her er på trafikkert fortau. Ikke egnet til gjennomgangssykling", + "type": "String" + }, + "date": { + "value": "2014-09-16T16:37:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "e94a5b5b8c4ed805b1e5fa14f937cd582a93e090.jpeg", + "type": "String" + } + } + }, + "aftenposten-1903": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9493265, + "lng": 10.73123931 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister kommer fort fra ring 3 og er sjeldent klar over fotgjengerfeltet/sykkelveien som krysser veien", + "type": "String" + }, + "date": { + "value": "2014-09-16T16:34:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "1f1adbd6a41271c6ce43edd25b834d401d46515b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1902": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94874088, + "lng": 10.73200106 + }, + "type": "LatLng" + }, + "description": { + "value": "For å komme opp på broen må du sykle opp på fortauet og gjennom bussholdeplassen. Lett å kollidere med ventende busspassasjerer.", + "type": "String" + }, + "date": { + "value": "2014-09-16T16:33:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "a64cf209cecad97b21f0915e11ffdddda47c8c7f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1901": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91221782, + "lng": 10.77064681 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien blir snev i svingen, ingen plass til at bil og syklist kan kjøre samtidig. Hele strekningen mellom Hausmannsgate/Storgata krysset og frem til rundkjøringen Fredensborgveien/Møllerveien er en farlig vei å kjøre da biler kjører fort og bussene kjører med hyppige ruter gjennom hele dagen.", + "type": "String" + }, + "date": { + "value": "2014-09-16T15:55:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "cf780c06d8eee833471494afe169210cd85a16b8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1900": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.924872, + "lng": 10.76123714 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler står midlertidig parkert på sykkelveien.", + "type": "String" + }, + "date": { + "value": "2014-09-16T15:06:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "0510a630e686c6d8397f2ac42cb7f69f0b146a54.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1899": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93208661, + "lng": 10.70626258 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg syklet i høyre kjørebane (plassert til høyre) og skulle rett frem. Noen få meter (5-10) før jeg kom inn i rundkjøringen kom en BMW X3/5 bakfra og kjørte forbi meg - og svingte til høyre en knapp meter foran meg! Jeg ønsker merking av sykelfelt gjennom rundkjøringer og kryss på alle veier hvor det er lov å sykle.", + "type": "String" + }, + "date": { + "value": "2014-09-16T14:47:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "aa9793a25fb4c8699518cfb89f0949a32840bf81.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1898": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90964198, + "lng": 10.74211835 + }, + "type": "LatLng" + }, + "description": { + "value": "Lyskryssene i hele Rådhusgata er utformet slik at det er naturlig for fotgjengere å stå midt i sykkelfeltet når de venter på grønn mann for å krysse Rådhusgaten. Det skaper farlige situasjoner og unødig irritasjon for syklister som kommer syklende i sykkelfeltet og har grønt lys.", + "type": "String" + }, + "date": { + "value": "2014-09-16T14:39:19Z", + "type": "DateTime" + }, + "bilde": { + "value": "93eeaeebb6a6fe67889bcbb54d2c388b.JPG", + "type": "String" + }, + "streetview": { + "value": "2858e164cb2a9a45978805126d0a4267a4b15394.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1897": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93639742, + "lng": 10.93139648 + }, + "type": "LatLng" + }, + "description": { + "value": "Fortauet er smalt og svingete ved broa over Ellingsrud-elva, mellom Oslo og Lørenskog. Bilister bruker også gjerne halve fortauet for å passere køen som gjerne oppstår ved rundkjøringa lenger øst.", + "type": "String" + }, + "date": { + "value": "2014-09-16T14:29:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "6fbf745633fa46d9887caf3ef93f0031a89f8c5b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1896": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87709346, + "lng": 10.84063053 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler parkerer i sykkelfeltet for å hente i barnehage. Mange farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-16T14:29:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "cbc0d899ef93f73f70a149b6e82d5aa1912d2908.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1895": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94192218, + "lng": 10.7433629 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister og gående som kommer gjennom Ullevål sykehus må ta en brå 90 graders sving i en trang enveiskjørt vei.", + "type": "String" + }, + "date": { + "value": "2014-09-16T14:24:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "50635f0d3525d410e373357d367910725c74d28f.jpeg", + "type": "String" + } + } + }, + "aftenposten-1893": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91065861, + "lng": 10.76741695 + }, + "type": "LatLng" + }, + "description": { + "value": "Lå i sykkelfeltet og holdt samme fart som biltrafikken. Plutselig svinger bilen som ligger rett til venstre for meg inn til ledig parkeringsplass mellom sykkelfelt og fortau. Jeg brøler heldigvis så høyt at bilføreren hører meg og får stoppet bilen før det blir kollisjon.", + "type": "String" + }, + "date": { + "value": "2014-09-16T14:10:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "46d4d8731f59446c60fccea7b1e4323bd25630d9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1892": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91237444, + "lng": 10.74578762 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen realistisk mulighet å komme sørfra inn i torggata her. I praksis må man benytte storgata om man skal østover", + "type": "String" + }, + "date": { + "value": "2014-09-16T14:02:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "314c632f1536a0dcf08cb42fb8e337bbc700b676.jpeg", + "type": "String" + } + } + }, + "aftenposten-1891": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91750525, + "lng": 10.75428485 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister som kommer fra sørøst langs hausmannsgate kommer ikke lovlig inn i torggata da det er skiltet med påbudt kjøreretning rett frem. Dette skiltet må få underskilt \\\\'gjelder ikke sykkel\\\\'", + "type": "String" + }, + "date": { + "value": "2014-09-16T13:59:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "a17ffa3e45a7d87937deef381ec5477784807390.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1890": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90910407, + "lng": 10.74432849 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det feil i kartet. Det er ingen tilrettelegging i denne gaten. Det finnes noen gamle sykkelsymboler malt på fortauet, men uten skilting har disse ingen betydning og det vil ikke være lov for syklende å kjøre der.", + "type": "String" + }, + "date": { + "value": "2014-09-16T13:50:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "182ffe3230127b95c27084a13b50e3083958dcdb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1888": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92753869, + "lng": 10.71325778 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien går her i en sving mot høyre før sykkelfeltet opphører. I denne svingen respekterer bilistene i svært liten grad sykkelfeltet med den konsekvens at syklister blir presset mot veiens kant (Som består av kanstein). Løsninen her må bestå i å legge inn fysiske hindre i veien som stopper bilene frå å svinge over sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-16T13:37:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "27374170b5833e369e656b444211aec97e3e4e58.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1887": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92943104, + "lng": 10.71683049 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er særdeles farlig å stå i sykkelfeltet i kirkeveien i krysset mot valkyriegata. Kjøretøy i det alminnelige kjørefeltet kan uten varsel gjøre svingmanøvre inn i valkyriegata eller feltskifter for å plassere seg i avkjøringen mot sørkedalsveien. Det eneste trygge her er å forlate sykkelfeltet og selv bruke det alminnelige kjørefeltet eller kjøre mot rødt. Situasjonen her kan utbedres ved å plassere en fremskutt stoppsone for syklister med utforming slik at de syklende havner foran og ikke på siden av det alminnelige kjørefeltet", + "type": "String" + }, + "date": { + "value": "2014-09-16T13:34:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "1f9638f37c95a263e015051551f53e030a24b45b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1886": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9179131, + "lng": 10.83524139 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke tilrettelagt for sykkelister. For en som skal fra Oslo sørøst til Oslo nord / Lillestrøm er dette den naturlige vei å sykle,", + "type": "String" + }, + "date": { + "value": "2014-09-16T13:15:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "3d840e1c4193c91046b55ae4c288f721cd123e80.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1885": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93999829, + "lng": 10.72984457 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom kjørende i rundkjøringen, ble påkjørt av bilist som ikke overholdt vikeplikten. Bilisten kom kjørende inn i rundkjøringen fra Sognsveien sørfra. Heldigvis var det ikke et alvorlig sammenstøt. Jeg falt over panseret og sykkelen fikk et ødelagt hjul. Ingen personskade.", + "type": "String" + }, + "date": { + "value": "2014-09-16T12:18:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "642803b9e40b508229072b9a0aed1a52d9bc2d16.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1884": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9374186, + "lng": 10.68280935 + }, + "type": "LatLng" + }, + "description": { + "value": "undergangen ved Smestad T-bane er meget uoversiktlig for både gående og syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-16T12:10:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "a2121379d437be2b8ce3ec429153d159d62e8ebd.jpeg", + "type": "String" + } + } + }, + "aftenposten-1883": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93613406, + "lng": 10.73270916 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært mange fotgjengere som skal mellom buss- og trikkeholdeplass i rush-tid. Syklister kan da velge mellom å hoppe 15 cm ned til trafikkert vei eller snoke seg mellom irriterte fotgjengere.", + "type": "String" + }, + "date": { + "value": "2014-09-16T11:50:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "ad79dc6652b77a382c0f49aad78485a509067b04.jpeg", + "type": "String" + } + } + }, + "aftenposten-1882": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92936653, + "lng": 10.71651935 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Slemdalsveien, helt opp til Ris, er ekstremt smal, både i veibanen og på fortauet. Syklister får ikke plass. Når man sykler i retning Slemdal, altså oppover, stopper hele biltrafikken fordi det er ikke plass til å kjøre forby. Det skaper farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-16T11:12:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "14d41d819ff649707b04ed5664f0d10b841bffbd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1881": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92624838, + "lng": 10.73420047 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange syklister kommer ut denne enveiskjørte gaten i høy fart mot kjøreretningen. Da er det vanskelig å påberope seg forkjørsrett for bilene som skal ned mot Bislett. Tilrettelegging er kjempebra, men inntil det skjer MÅ alle, også syklister forholde seg til trafikkreglene.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:59:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "d29d761c2082c38bc74c31b204f7eb2ce09ebe12.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1880": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92732901, + "lng": 10.77321052 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kommer sykkelfeltet plutselig opp på veien, og det er ikke så lett å se for en buss som kommer bak om det kommer en syklist ut. (Eller for syklisten å se om en buss er på vei) Det er dårlig merket for bussen at den må ligge lenger til venstre her.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:58:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "5a807621a9b38d4e284cad212e2a9118778b290f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1879": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92624838, + "lng": 10.73420047 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange syklister kommer ut denne enveiskjørte gaten i høy fart mot kjøreretningen. Da er det vanskelig å påberope seg forkjørsrett for bilene som skal ned mot Bislett. Tilrettelegging er kjempebra, men inntil det skjer MÅ alle, også syklister forholde seg til trafikkreglene.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:57:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "d29d761c2082c38bc74c31b204f7eb2ce09ebe12.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1878": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93174795, + "lng": 10.72270989 + }, + "type": "LatLng" + }, + "description": { + "value": "Herfra blir sykkelfeltet ekstremt smalt. Veldig skummelt, særlig når lastebiler og busser skal forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:56:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "355a680e694aac1977678930417c24a61b5087ac.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1877": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9255559, + "lng": 10.75921153 + }, + "type": "LatLng" + }, + "description": { + "value": "Her ble det for noen år siden utført noen gravearbeider der sykkelstien i Thorvald Meyers gate krysser Seilduksgata. Men firmaet som gravde la ikke skråskjærte kantstein tilbake på plass, men la i stedet rette stein, slik at det blir en høy kant på tvers av sykkelbanen som sykler/barnevogner/rullestoler må over.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:42:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "74dd7ccbd5ac8075b61b924adf3a23d1c177cefb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1876": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93574815, + "lng": 10.7899003 + }, + "type": "LatLng" + }, + "description": { + "value": "Her bruker staten/kommunen milionbeløp på å bygge ny tunnel og nye påkjøringer. Men sykkelstien på nordsiden av denne vegen, opp fra Sinsenkrysset og opp mot Sinsenveien (der lages en rundkjøring) stopper blind når man kommer fra Sinsenkrysset oppover. I stedet for å forlenge denne sykkelveien 40 m og helt opp til den nye rundkjøringen i Sinseneien, å nå sykelistene enten foreta en kryssing av veien, eller sykle på feil side mot kjøreretningen. Alternativet er en lang omkjøring via et gårdstun. Ville det ikke vært en ide å bare forlenge fortau/sykkelsti 40 meter opp til den nye rundkjøringen i Sinsenveien.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:36:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "35b36df42df6e5b06a9c9400d8cc95a69c440c3f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1875": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91640816, + "lng": 10.74448943 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg kommer ned sykkelfeltet og skal inn i rundkjøring der sykkelfeltet slutter og videre rett frem. Det er mye trafikk og en stasjonsvogn som er på vei rundt i rundkjøringen, så jeg setter ned fart og holder litt igjen selv om det kunne vært plass på utsiden - vil signalisere at jeg ser og overholder vikeplikt. Mann i høy fart på sykkel suser forbi meg på venstre side, tvinger seg inn mellom meg og bilen i rundkjøringen. Det går bra, men det hadde det ikke gjort om jeg hadde lagt meg litt ut/sett meg bak akkurat da.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:34:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "24d2bd22c79dfe95d528ddf4a705e7d3575bdf57.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1874": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91964554, + "lng": 10.74149608 + }, + "type": "LatLng" + }, + "description": { + "value": "Store hull i veidekket og måtte etterhvert legge meg littegrann inn mot midten av veien på sykkelen. Dårlig plass, parkering begge sider av vei - stasjonsvognen bak virket mer på hugget for å kjøre forbi enn å kjøre rolig og måtte bremse en hel del og så meget irritert/sint ut. Dette var kun sekunder unna større vei med sykkelfelt så utålmodigheten er stor, selv i en stille sidegate.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:30:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "3dd19f3d51e3c8114ea8fdc90880179cd6102f07.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1873": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92090383, + "lng": 10.77502369 + }, + "type": "LatLng" + }, + "description": { + "value": "Etter at Finnmarksgata ble stengt for biler gjennom Tøyenparken har jeg observert flere farlige situasjoner mellom sykkel og bil i krysset Finnmarksgata/Sofienberggata. Alle biler som kommer nordfra i dette krysset *må* svinge til høyre, mens syklistene kommer i stor fart og skal rett fram. Bilistene har vikeplikt for syklistene, men sjåfører er usikre pga stengt vei framover og fokuserer ikke på hva som kommer i blindsonen på siden av dem. Har sett flere nestenulykker her, og er redd for at det kommer til å skje en alvorlig ulykke snart.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:27:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "711bdebb58c1841cb8141b34a636a0d4a4375b76.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1872": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92744191, + "lng": 10.74825525 + }, + "type": "LatLng" + }, + "description": { + "value": "kamp mellom buss, bil og syklister. spesielt på vei opp bakken siden det er vansklig å holde samme tempo som resten av trafikken, har flere ganger opplevd å bli skviset ut til siden. Her kunne de fjernet alle parkeringsplassene langs veien og heller fokusert på sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-16T10:00:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "a4a483faff6f4b570f7fffb775729bd0f217fc2b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1871": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.81524536, + "lng": 10.46619415 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang og sykkelvei går over i et fortau i bunnen av en bakke. Syklistene har vikeplikt over fortauet. Tett vegetasjon gjør at det er dårlig oversikt for syklistene som kommer \"sørfra\". Mange biler som skal ta av mot Gullhella, og det blir ofte sterk bremsing for syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-16T09:56:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "821eccf0db43a9973d07635942abcad57261cbfc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1870": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92385043, + "lng": 10.79174995 + }, + "type": "LatLng" + }, + "description": { + "value": "her må du ta en sjangs og sykle før det blir grønt lys for å få et forsprang før bilistene. Spesielt hvis du skal rett fram. veldig ubehagelig å sykle her.", + "type": "String" + }, + "date": { + "value": "2014-09-16T09:56:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "b380d3e94e638a0d81c663da44ea648c89c72d84.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1869": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91289078, + "lng": 10.81187725 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig for syklister, aggressive bilister. Dårlig tilrettelagt i dette området, er livredd hver dag.", + "type": "String" + }, + "date": { + "value": "2014-09-16T09:52:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "34a6f2934768242bedf37755fec11da0bbce9c35.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1868": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93482796, + "lng": 10.76312541 + }, + "type": "LatLng" + }, + "description": { + "value": "Gamle trikkeskinner og brostein med store sprekker.", + "type": "String" + }, + "date": { + "value": "2014-09-16T09:47:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "22df291faf8a53e1507e63f70bfdff61294000b8.jpeg", + "type": "String" + } + } + }, + "aftenposten-1867": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91566599, + "lng": 10.72265625 + }, + "type": "LatLng" + }, + "description": { + "value": "stor glipe i avløp med langsgående hull gjorde at hjulet mitt satte seg fast og jeg ble kastet over styret. Ble presset ut i veikanten av bilister. fortauet er ikke mulig å sykle på pga fotgjengere, trær og røtter som ødelegger asfalten. Tilsammen er det kun 10-15 m sykkelfelt i hele parkveien(!) jeg slapp unna med skrubbsår og forstuelser, men sykkelen min fikk bøyd ramme, ødelagt felg og flere eiker som røk av. ble en veldig dyr reprasjon. Jeg har meldt fra til Oslo Kommune tidligere, uten noe svar.", + "type": "String" + }, + "date": { + "value": "2014-09-16T09:46:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "79c6736d0f4536456864191bf3d423954994d4a0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1866": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94916532, + "lng": 10.63972234 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler her daglig mellom Østerås og Oslo sentrum, og opplever konflikter mellom bilister og syklister ofte. Det er veldig smalt, ikke plass for syklister verken i veibanen eller på fortauet. Mye trafikk, også tungtransport og busser, som presser syklistene ut av veien. Om vinteren er det ekstra ille.", + "type": "String" + }, + "date": { + "value": "2014-09-16T09:18:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "6ae0c994a0c118a8c2da6a736ed69fc7383c1678.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1865": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95640687, + "lng": 10.76990604 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble presset ut av veien her av en bil som kjørte forbi alt for nærme. Endte opp i grøfta på siden mot kirkegården.", + "type": "String" + }, + "date": { + "value": "2014-09-16T08:36:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "8448902411d4ca373bc8412315ed4450c55f3ed7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1864": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90839402, + "lng": 10.75462818 + }, + "type": "LatLng" + }, + "description": { + "value": "Intet annet enn en sinnsyk katastrofe at man i en femti meter bred ny vei ikke klarer å legge til rette for sykler. Som andre nevner: livsfarlig løsning med sykkelfelt og bussfelt i ett, dårlig start og slutt på feltene. Her må noen gå av, for en så dårlig planlegging av en ny paradegate vitner om mentaliteten som rår.", + "type": "String" + }, + "date": { + "value": "2014-09-16T08:28:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "264a8f68ffcdbc621099b873fc053cdacc63a15f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1863": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92650645, + "lng": 10.77657938 + }, + "type": "LatLng" + }, + "description": { + "value": "en må sykle midt i den trange bilveien for å komme opp Trondheimsveien uten å sperre for all kollektivtrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-16T08:20:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "057ac87e067d8a6f99a347a147b0f2148b9faef4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1862": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89111132, + "lng": 10.76076507 + }, + "type": "LatLng" + }, + "description": { + "value": "Avkjøringen til Sjursøya er skummel. Særlig nå som avkjøringsfilen er sperret og bilen får en slakkere kurve i avkjøringen som gjør at de holder høyere fart. Dessuten er det med veiarbeidene videre bort mot Sørenga horribelt tilrettelagt for syklister, spesielt brua som ender i en glatt nedkjøring ut i en kryssende gs-vei.", + "type": "String" + }, + "date": { + "value": "2014-09-16T07:56:12Z", + "type": "DateTime" + }, + "bilde": { + "value": "7ff75d432280bfd2ef1f1fbacd374fe9.jpg", + "type": "String" + }, + "streetview": { + "value": "54bbe9205ab68bf330b2158e87035bec4df714d3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1861": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8764258, + "lng": 10.77591419 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele traseen fra der gs-veien går over en glatt og smal metallbro ned til \"Paddehavet\" og videre ganske uoversiktlig vei videre. Mosseveien fremstår som et tryggere alternativ.", + "type": "String" + }, + "date": { + "value": "2014-09-16T07:51:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "2edd6ab8a7336ac98af454f6dbc909205cdb8062.jpeg", + "type": "String" + } + } + }, + "aftenposten-1860": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9150744, + "lng": 10.74381351 + }, + "type": "LatLng" + }, + "description": { + "value": "Betongblokker på kryss og tvers gjør sykling med henger umulig. Står igjen etter \"sikringen\" av regjeringskvartalet.Har ikke funnet et eneste eksempel på selvmordsyklister som har blåst i filler regjeringsbygg.Kanskje på tide å åpne opp for sykkel?", + "type": "String" + }, + "date": { + "value": "2014-09-16T07:46:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "d289eb39092bfd55095a91e064fcd17e2da7b8b4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1859": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91198717, + "lng": 10.74910283 + }, + "type": "LatLng" + }, + "description": { + "value": "Rødt, fint sykkelfelt som avsluttes brutalt i en korttids P-plass for hotellet. Viser med all tydlighet at en P-plass alltid er viktigere enn et sammenhengende sykkelveinett. Syklister må, som alltid, vike fra sykkelfeltet og inn i trafikken.", + "type": "String" + }, + "date": { + "value": "2014-09-16T07:42:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "74ef52395f702544a251cd0a7abd9d90d6db6948.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1858": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91005079, + "lng": 10.74365258 + }, + "type": "LatLng" + }, + "description": { + "value": "Byggearbeider har byget seg ut i sykkelvei og sperrer. Syklister og gående må ut i veien for å komme forbi", + "type": "String" + }, + "date": { + "value": "2014-09-16T07:04:55Z", + "type": "DateTime" + }, + "bilde": { + "value": "862d9c4282b7a162b2a741c968148dd8.jpg", + "type": "String" + }, + "streetview": { + "value": "4b71d228893f97e645e62bdb2219c506b1b9e7da.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1857": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91241747, + "lng": 10.79820871 + }, + "type": "LatLng" + }, + "description": { + "value": "Symbolene på asfalten er slitt, snart helt borte. Symbolene er viktige for rett bruk av de delte gang- og sykkelarealene fobi bussholdeplassen.", + "type": "String" + }, + "date": { + "value": "2014-09-16T06:51:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "cc13c9824da12562bd1675dc3e4ee0a7b04fa53b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1856": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94390775, + "lng": 10.75996577 + }, + "type": "LatLng" + }, + "description": { + "value": "Kommer man ovenfra på fortauet og ut i gangfelt langs Bergensgata kommer biler ofte i stor fart inn i gangfeltet fordi de bare speider etter trafikk nedenfra i rundkjøringen. I tillegg dårlig oversikt på grunn av tverrparkerte biler tett innpå gangfeltet. Har neste blitt påkjørt her mens jeg trillet sykkel over veien.", + "type": "String" + }, + "date": { + "value": "2014-09-16T06:31:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "57494346d5460fafc3840967674ef588cf470c8c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1855": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92956006, + "lng": 10.79655647 + }, + "type": "LatLng" + }, + "description": { + "value": "Alltid biler parkert i sykkelfeltet. Skyldes en smal stripe på innsiden som ikke er bred nok for biler. Burde vært skiltet p-forbud.", + "type": "String" + }, + "date": { + "value": "2014-09-15T23:22:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "4cadffbb493ae434452f6ea793de8fb77cdbfd10.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1854": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90604858, + "lng": 10.76507806 + }, + "type": "LatLng" + }, + "description": { + "value": "...og for meg som kom inn fra venstre (ned Kongsveien fra Ekeberg) gir det desto mindre mening å krysse bilveien 2 ganger — nei, da sykler jeg heller 100m på feil side!\nDessuten: Jeg elsker den flotte sykkelveien (kremt *fortauet*) på sydsiden av Eufemia, og lyskrysset over dit er en velsignelse i forhold til den blå gangbroa som stod der i fjor (som jeg var så redd for å hekte styret, skli, og slå ut tenna på hver gang jeg sykla over).", + "type": "String" + }, + "date": { + "value": "2014-09-15T22:17:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "fed4439b175e6f4af3e0d98f725b7d514146e2df.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1853": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91043808, + "lng": 10.76278209 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil parkert i sykkelsti, påkjørt nå jeg syklet forbi den.", + "type": "String" + }, + "date": { + "value": "2014-09-15T21:58:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "bd540106b78746ccfa7411c0eda3871fa03988ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1852": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91765582, + "lng": 10.85028648 + }, + "type": "LatLng" + }, + "description": { + "value": "Delen av Tvetenveien uten tilrettelegging for sykkel hvor man må sykle i veibanen har fartsgrense 60 km/h. Delen med separat sykkelvei ved siden av har 50 km/h.", + "type": "String" + }, + "date": { + "value": "2014-09-15T21:44:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "4902db0e9dc212490e585a7072c3b775f027030c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1851": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93479359, + "lng": 10.76470449 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvis det er ett sted det er håpløst å sykle i Oslo, så er det nedover Vogts gate på Torshov. Et salig kaos av trikk, biler, fotgjengere, syklister og parkerte biler. Ingen steder å sykle overhodet. Helt håpløst. Den elendige skrangle-trikken må vekk fra gatene og det samme gjelder parkeringsplassene på begge sider av veien.", + "type": "String" + }, + "date": { + "value": "2014-09-15T20:28:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "90216a94f60c119746741318cd0dd1eb9c3dfbc7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1850": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91979611, + "lng": 10.72705507 + }, + "type": "LatLng" + }, + "description": { + "value": "alltid spennende å sykle her. vikeplikt eller lys hadde gort ting enklere, men fortstt bedre enn å sykle lengre opp mot høgskolen med sporvogn opp til Bislett", + "type": "String" + }, + "date": { + "value": "2014-09-15T19:07:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "53165a50f19c0af4301818ec124ef53dc2c8a80a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1849": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91527877, + "lng": 10.72274208 + }, + "type": "LatLng" + }, + "description": { + "value": "masse biler, trikk, dårlig asfalt", + "type": "String" + }, + "date": { + "value": "2014-09-15T19:03:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "8bc218a3ebbe4ef7efd7f5e94bc5fc50eb167a98.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1848": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91087915, + "lng": 10.73598146 + }, + "type": "LatLng" + }, + "description": { + "value": "folk som skler oppover, vi som kommer andre veien må . . . trikke, folk som går av . . . right through the crowd? Hvem kom på denne ideen?", + "type": "String" + }, + "date": { + "value": "2014-09-15T19:01:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "9b2aefde1340f4c46af145d7ea4f66b8b36ad973.jpeg", + "type": "String" + } + } + }, + "aftenposten-1847": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89515839, + "lng": 10.75763225 + }, + "type": "LatLng" + }, + "description": { + "value": "midlertidig (?) bygningshelvte. De prøver så godt som muligt men nesten umulig å se bakover forå ikke bli påkjørt når man krysser veien nedover til havn. Og en bro laget av blå kontainer uten sikt, ogned til en vei, Oslo til høyre men hvor, OK, rett inn blant alle tunge lastebiler. How long wil this last?", + "type": "String" + }, + "date": { + "value": "2014-09-15T18:58:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "d6a51ea083d55f5e55d48fcfed41ce19c6d36a40.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1846": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90462832, + "lng": 10.82170486 + }, + "type": "LatLng" + }, + "description": { + "value": "en bilist kjørte en syklist inn i kantsteinene og kjørte videre. Fra rundkjøringen rett under T-bane broen opp forbi stasjonen kommer bilister i full fart bakifra og u risikere å bli påkjørt, klarer du det, da kommer rundkjøringen foran Bryn senter, bare trafikk kaos der også", + "type": "String" + }, + "date": { + "value": "2014-09-15T16:59:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "f47c761fc81d755f70e040b8ca910bb4f5af0e35.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1845": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92545267, + "lng": 10.73093891 + }, + "type": "LatLng" + }, + "description": { + "value": "rundkjøring med trikk og dårlig asfalt og masse stressete bilister og busser. Bare kaos!", + "type": "String" + }, + "date": { + "value": "2014-09-15T16:54:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "6c4857a0e25fe8464a721b72ac42580f307f0e0e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1844": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87607042, + "lng": 10.776515 + }, + "type": "LatLng" + }, + "description": { + "value": "En annen syklist kolidere med meg når han syklet oppover på den smale sykelbroen. Dårlig sikt og han sa han hdde dårlig tid, for smal for 2-veis traffik. Det gjelder også den andre broen aet par hundre meter lengre inn mot byen, og hele strekken er uoversiktlig med syklistersom holder for høy fart . . . men det er en annenfeil, ikke akkurat sykkelveien", + "type": "String" + }, + "date": { + "value": "2014-09-15T16:51:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "f4d3f3c968531dcacc1dd3777b3f4e91f3a7732d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1843": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8728611, + "lng": 10.7788968 + }, + "type": "LatLng" + }, + "description": { + "value": "Problemet er 2-to-feltsveier sm kommer inn på broen, bilister/busser som svinger inn, dårlig sikt for de og syklister. Han som syklet foran meg ble nesten truffet av en bil som kom fra Mosseveien og ville over broen. han traff de skrå-legte kantsteinene og veltet. Måtte hentes av sykebilen pga hjernristelse og større kutt", + "type": "String" + }, + "date": { + "value": "2014-09-15T16:47:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "c6cfa3676d6353a1594e8c08db2cc963260e1237.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1842": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92575375, + "lng": 10.74218273 + }, + "type": "LatLng" + }, + "description": { + "value": "Geitmyrsveien er enveiskjørt 30 km i timen. Jeg bor i området sykler mot kjøreretningen, fordi fortau på begge sider som regel er full av barn på vei til skolen (Ila skole). Er veldig klar over min \"sivile\" ulydighet og veldig bevisst på å avpasse farten. Uansett er det alltid noen bilister som lar seg provosere, selv i en 30 sone, og sær de som knapt overholder fartsgrensen. Forrige uke satte en drosjesjåfør opp farten til minst 60-70 for å kjøre truende og tett mot meg. Han var rett og slett skikkelig satt ut og forbannet! Så enveiskjørte bilveier , især MÅ legalt åpne for syklister begge retninger! Så får bilister finne seg i å kjøre mer aktsomt.", + "type": "String" + }, + "date": { + "value": "2014-09-15T16:15:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "863fe6ad51bbefc30f9a37480d482e7a8e241c9f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1841": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92926439, + "lng": 10.77825307 + }, + "type": "LatLng" + }, + "description": { + "value": "\"Det er forbudt å stanse ... helt eller delvis på fortau\" ser ikke ut til å gjelde kebabkunder, altså. Det er allerede trangt nok når man går, men fullstendig håpløst når man sykler. Og bruker man veibanen, ja da...!", + "type": "String" + }, + "date": { + "value": "2014-09-15T16:04:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ce78ed921a71305d8c4bb346577350975260d1d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1840": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93440334, + "lng": 10.77548503 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler i gaten står parkert tvers over \"inngangen\" til stien gjennom Torshovdalen her, noe som hindrer fremkommelighet for syklister så vel som f.eks. barnevogn. Her kunne man lett malt opp noen få meter med parkering forbudt på asfalten.", + "type": "String" + }, + "date": { + "value": "2014-09-15T15:54:13Z", + "type": "DateTime" + }, + "bilde": { + "value": "f51ea7e3eeda9a7980ee418e13acc940.jpg", + "type": "String" + }, + "streetview": { + "value": "de90e7dc4ebcab43bc23bb2ce940b4834ab40d81.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1839": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91765582, + "lng": 10.75458526 + }, + "type": "LatLng" + }, + "description": { + "value": "Kommer man fra Eventyrbrua og skal rett fram i Torggata er det få bilister som overholder vikeplikten når de svinger til høyre. I tillegg står bilene ofte i den nye, pene, røde sykkelboksen (men dette har blitt bedre etter boksen til slutt fikk sin hvite stoppelinje).", + "type": "String" + }, + "date": { + "value": "2014-09-15T15:47:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "c941a4985cb4c7cc4febaf52259c2e6299d0cc30.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1838": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93476884, + "lng": 10.74775099 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister i begge retninger har valget mellom et smalt fortau eller kjørebanen. Særlig nedover velger jeg heller sistnevnte, men selv i 35 km/t blir jeg én av 5 ganger forbikjørt av en utålmodig bil som ikke gidder å gi meg klaringen loven krever ved å legge seg ut i venstre felt.", + "type": "String" + }, + "date": { + "value": "2014-09-15T15:40:38Z", + "type": "DateTime" + }, + "bilde": { + "value": "211c2d291c928e6b3a7ab7207fbd0eb9.png", + "type": "String" + }, + "streetview": { + "value": "95246b7b3a04145c5a7701a7cd6dd26b610bc3d6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1837": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93291979, + "lng": 10.74961781 + }, + "type": "LatLng" + }, + "description": { + "value": "Utrolig skummelt kryss. Sykler man opp Uelands gate forsvinner plutselig sykkelfeltet og man får både biler som svinger til høyre og som forbikjører med skremmende lite klaring. Og skal man opp til venstre mot sykehuset må man krysse to godt trafikkerte kjørefelt.", + "type": "String" + }, + "date": { + "value": "2014-09-15T15:35:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "690f88942381c9556da6c58de34945d3894a0c20.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1836": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9096701, + "lng": 10.7418397 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ulovlig(!) merket \"sykkelvei\" på fortauet. Andre srteder i byen (Sognsveien, Ekebergveien) er dette fjernet fordi det faktisk ikke er lov. Hvis man sykler vestover her, kan man i tillegg få døren til Stattholdergaarden som en effektiv sperre.", + "type": "String" + }, + "date": { + "value": "2014-09-15T14:19:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "83a54211b968675e49661fd65592cf3c07f4fe29.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1835": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92867841, + "lng": 10.81023573 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ofte mye trafikk, og nølende bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-15T14:09:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "4e9fd738b72065ae17e575641cfde691b1c86f20.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1834": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93661241, + "lng": 10.83101749 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler kommer ofte med høy fart inn fra RV 163, og biler står parkert helt inn til krysset. Dårlig sikt.", + "type": "String" + }, + "date": { + "value": "2014-09-15T14:08:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "0ce31099c491bdffd30e48552f28871173a8dd99.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1833": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9338282, + "lng": 10.82734823 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig sikt når man kommer sørvestfra. Hekk og parkerte biler gjør at man praktisk talt må ha forhjulet ut i veien før man ser noe.", + "type": "String" + }, + "date": { + "value": "2014-09-15T14:06:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "56d106330450674fa1529d245a737ed0aae20233.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1832": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93236613, + "lng": 10.82199454 + }, + "type": "LatLng" + }, + "description": { + "value": "Ganske uoversiktlig veikryss, med mange parkerte biler som ytterligere reduserer sikten.", + "type": "String" + }, + "date": { + "value": "2014-09-15T14:05:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "e1df7c06a563c27fb6b28a93e74c44098f9ccae3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1831": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91859692, + "lng": 10.68642497 + }, + "type": "LatLng" + }, + "description": { + "value": "Suddenly ending biking lane", + "type": "String" + }, + "date": { + "value": "2014-09-15T13:59:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "018b4233262c0d63d9031d678068704c2dd34ce0.jpeg", + "type": "String" + } + } + }, + "aftenposten-1830": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94390775, + "lng": 10.75996577 + }, + "type": "LatLng" + }, + "description": { + "value": "Kommer man ovenfra på fortauet og ut i gangfelt langs Bergensgata kommer biler ofte i stor fart inn i gangfeltet fordi de bare speider etter trafikk nedenfra i rundkjøringen. I tillegg dårlig oversikt på grunn av tverrparkerte biler tett innpå gangfeltet. Har neste blitt påkjørt her mens jeg trillet sykkel over veien.", + "type": "String" + }, + "date": { + "value": "2014-09-15T13:55:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "57494346d5460fafc3840967674ef588cf470c8c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1829": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94190875, + "lng": 10.75738951 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang-/sykkelveien i Bjølsengata slutter i en bom, med en smal passasje ut i Sarpsborggata. Denne er konsekvent sperret av parkerte biler. Syklist, fotgjenere må derfor ut på plenen for å komme forbi, og får dårlig oversikt for kryssende trafikk. Viktig skolevei for elever til Bjøslen skole.", + "type": "String" + }, + "date": { + "value": "2014-09-15T13:49:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "bc6e1585a34ddf05b6d8883fb97b8be69f454e28.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1828": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91833879, + "lng": 10.6659758 + }, + "type": "LatLng" + }, + "description": { + "value": "Fra gangbroen er det stupbratt ned til sykkelveien på tvers. Her må man sikte godt for å finne en luke når man skal ned.", + "type": "String" + }, + "date": { + "value": "2014-09-15T13:17:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "969aed491db5502f7e2385a688c6ec9f3c21227e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1827": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95554742, + "lng": 10.76239585 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet i Maridalsveien brøytes stort sett ikke om vinteren. Det betyr at man som syklist må legge seg ut i veien - og der er det ganske trangt fra før. Eventuelt er brøytingen gjort så dårlig at det uansett ikke er mulig å sykle i sykkelfeltet - stor fare for å kjøre av i sporete løssnø.", + "type": "String" + }, + "date": { + "value": "2014-09-15T13:12:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "1f5aa12c717c9686c529d7d6646e2f41b745853b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1826": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95482762, + "lng": 10.76108694 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kommer nedover Maridalsveien i retning sentrum har man vikeplikt for biler som kommer ned denne veien. Men det er ikke mulig å se om det kommer en bil før bilen er godt nede i krysset. Siden man kommer ned en lang bakke her har man høy fart på sykkelen. Har selv vært i og sett flere nestenulykker her. Det burde blitt satt opp varselskilt og gjort grep for å bedre sikten både for oss som kommer ned Maridalsveien og de som skal kjøre ut på veien.", + "type": "String" + }, + "date": { + "value": "2014-09-15T13:09:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "607b481f41aec6b664d514039efd5db0fbb7707e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1825": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93607494, + "lng": 10.73205471 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet slutter rett før krysset, og bilene overtar en trang fil hvor de stiller seg opp i to filer, selv om det egentlig ikke er to filer der. Mal på rødt sykkelfelt, og marker klart med skilt at det bare er en kjørefil her", + "type": "String" + }, + "date": { + "value": "2014-09-15T13:05:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "fa0314ed97662de892566bf0038095b199d9cbb0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1824": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92883109, + "lng": 10.73258256 + }, + "type": "LatLng" + }, + "description": { + "value": "Thereses gate har blitt Oslos råeste hinderløype for hverdagssyklister, hvor man i løpet av få hundre meter får utfordret fysikken til det ytterste, samtidig som man kjenner dødsangsten kommer snikende sammen med hylet fra trikken som nærmer seg bakfra.. Oi, der stod det visst en potteplante, vakttårn, fjellsti, sykkelstativer etc. Når skal maleren få pålegg om å vaske bort malingssølet utafor butikken hans? Dette er noe jeg funderer på mens jeg sitter på den innovervendte benken og glor i husveggen. Neste helg har jeg reservert langbordet nederst i gata, da blir det helgrilling av hjort med jaktlaget! Skål!", + "type": "String" + }, + "date": { + "value": "2014-09-15T12:32:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "a9d58f593c1e7791d19087df8cbef48ed90ecd36.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1823": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91000776, + "lng": 10.79112768 + }, + "type": "LatLng" + }, + "description": { + "value": "Trangt", + "type": "String" + }, + "date": { + "value": "2014-09-15T11:56:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "2d2281724c5da50594153876b695c3b01672ab58.jpeg", + "type": "String" + } + } + }, + "aftenposten-1822": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93330143, + "lng": 10.7867074 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det anlagt et klassisk tilfelle av felle-felt. Dette er et felt som SER UT som et sykkelfelt, og er merket og skiltet som sådan, men som representerer en stor fare for syklende. Det er parkeringsplasser innenfor feltene, som gjør at det eneste forsvarlige stedet å sykle er i det normale kjørefeltet. Her på enten sykkelfeltet skrapes bort, eller parkeringsplassene fjernes. Det burde ikke være lov å markere sykkelfelt utenfor parkeringsplasser slik som det er her.", + "type": "String" + }, + "date": { + "value": "2014-09-15T11:45:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "8402ed27987f9800d2c8b51ed1972f43b6b4cd26.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1821": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92380742, + "lng": 10.8041954 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har situasjonen gått fra vondt til verre for syklister. Etter nybygd kryss har vi den klassiske fellen med en uvoersiktelig undergang i bunnen av en dump. Resultatet er at folk kommer i stor hastighet fra alle kanter med dårlig oversikt. Det er mer enn nok plass her, så en bedre løsning hadde det vært plass til.", + "type": "String" + }, + "date": { + "value": "2014-09-15T11:42:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "4a371e22092f80ca7c44fcca7ab588e7a64c5e32.jpeg", + "type": "String" + } + } + }, + "aftenposten-1820": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94198667, + "lng": 10.74301958 + }, + "type": "LatLng" + }, + "description": { + "value": "Viktig øst/vest forbindelse for syklister. Enveiskjørt og smalt fortau. Trang pga gateparkering. Her bør gateparkering forbys og sykkelfelt i hver retning tegnes opp.", + "type": "String" + }, + "date": { + "value": "2014-09-15T11:30:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "2bb67b2313ca4f89d3d51d218732cdfa49d1b959.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1819": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95004105, + "lng": 10.71703433 + }, + "type": "LatLng" + }, + "description": { + "value": "Uklar merking ifbm gang/sykkelvei som krysser utkjørselen fra Gaustad sykehus. Mange biler krysser gagvei uten å se seg for. De kjører dessuten ut i bilveie som om de har forkjørsrett.", + "type": "String" + }, + "date": { + "value": "2014-09-15T11:12:43Z", + "type": "DateTime" + }, + "bilde": { + "value": "6c47b554fdbab31486820e4e907619e6.jpg", + "type": "String" + }, + "streetview": { + "value": "93de0ec5966b300bccb0cf2f0dd57f09eb3c8002.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1818": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95051383, + "lng": 10.71693778 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bilist som kom ut fra Gaustad sykehus. Måtte sy et kutt i leggen. Jeg syklet sakte (med barn i sykkelsete) i veien oppover i retning Sognsvann.", + "type": "String" + }, + "date": { + "value": "2014-09-15T11:09:58Z", + "type": "DateTime" + }, + "bilde": { + "value": "e2eade63d42b26b2a68863375c6e55c5.jpg", + "type": "String" + }, + "streetview": { + "value": "a530e8a4bb2d0909e2a49eb5962579d277fa169f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1817": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95163665, + "lng": 10.7272911 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil som kom opp Sognsveien og skulle ned Klaus Torgårds vei. Han \"så meg ikke\" og kom in i sykkelfeltet. Brakk skulderen og en del ribbein.", + "type": "String" + }, + "date": { + "value": "2014-09-15T11:04:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "5768f0854f5f53cb9929bc785ce252fb5df43b47.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1816": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92601612, + "lng": 10.71455383 + }, + "type": "LatLng" + }, + "description": { + "value": "Manglende sykkelvei fører til at bilister hele tiden prøver å kjøre forbi og skaper farlige situasjoner", + "type": "String" + }, + "date": { + "value": "2014-09-15T10:53:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "6dc21dd965fb6c842c3888b6b51cd5215e8a4fbc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1815": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94879998, + "lng": 10.72385787 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkefeltet nedover Klaus Togårds vei slutter og går direkte over i et fortau. Som syklist bør man i prinsippet krysse ut i veien og fortsette gjennom rundkjøringen. Dette er ubehagelig fordi man ofte blir presset av biler. Det vanligste er defor å fortsette opp på fortauet der man umiddelbart passerer skiltet til en fotgjengerovergang(!). Hastigheten man har på dette stedet er høy (> 30 km/t) så man har egentlig ingenting på et fortau å gjøre.", + "type": "String" + }, + "date": { + "value": "2014-09-15T10:50:10Z", + "type": "DateTime" + }, + "bilde": { + "value": "ebe367176cd79dd8e9a3d9e81ebd6e8b.jpg", + "type": "String" + }, + "streetview": { + "value": "ac5485a64294cdc6e085272dfdb1acbfcbfc9277.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1814": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91773111, + "lng": 10.75407028 + }, + "type": "LatLng" + }, + "description": { + "value": "Er denne åpen for gjennomkjøring eller ikke? Fra hausmannsgate og inn står det skilt med innkjøring forbudt, men fra andre siden kommer det stadig trafikk som kjører gjennom. Dersom dette ikke skal skje må det settes opp avsperringer mot Hausmannsgate.", + "type": "String" + }, + "date": { + "value": "2014-09-15T10:15:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "9830ba5c976ef5ea340d5b641ca2cec1e9e159de.jpeg", + "type": "String" + } + } + }, + "aftenposten-1813": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93202748, + "lng": 10.76197743 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet opphører.", + "type": "String" + }, + "date": { + "value": "2014-09-15T09:00:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "8513d4acd9635b5b516e5ead03abb27e2f35e70b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1812": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9547739, + "lng": 10.76117277 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister (og bilister) kommer i stor fart nedover Maridalsveien. De har vikeplikt for trafikk fra høyre i krysset med Korsvollbakken, men dette er uoversiktlig med mye vegetasjon osv.", + "type": "String" + }, + "date": { + "value": "2014-09-15T09:00:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "5fdbb2e24f441df876437505f5ea12604a077747.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1811": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92648494, + "lng": 10.7753992 + }, + "type": "LatLng" + }, + "description": { + "value": "Busstopp i sykkelfeltet. Man må passere bussen på venstre side. Når bussjåførene, som noen ganger ikke ser godt nok etter i speilene og i dødvinkelen, svinger ut mens man passerer dem kommer man som syklist i skvis mellom bussen og bilene som passerer i venstrefelt. Svært farlig!", + "type": "String" + }, + "date": { + "value": "2014-09-15T08:59:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "398699764e7f0cbb22b31751fa17cd5decdf8d79.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1810": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93176946, + "lng": 10.76313614 + }, + "type": "LatLng" + }, + "description": { + "value": "Busstopp i sykkelfeltet. Når bussen stopper må man passere den på venstreside. Enkelt bilførere skifter felt fra venstre til høyre når de passerer bussen. Dermed kommer man som syklist i skvis mellom bussen og bilene som skifter felt uten å ta hensyn til syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-15T08:55:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "d2502908cc11b05d7a50841bbb020dfb9b96eb0f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1809": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89922648, + "lng": 10.81455945 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange fotgjengere og syklister. Lang bakke som kan gi høy fart. Ingen oppdeling av veien gjør at man må sykle slalom mellom fotgjengere. Ikke uvanlig å møte på 2-3 i bredden, spesielt ifm avgang/ankomst på T-banen.", + "type": "String" + }, + "date": { + "value": "2014-09-15T08:33:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "637d1c327dcdb35e176e00effd9c7ae8014b4ca5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1808": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89383453, + "lng": 10.80683469 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye trafikk og farlig tilrettelegging. Høy tetthet av biler, syklister, fotgjengere og til og med bussholdeplass med av- og påstigende passasjerer. Burde vært sykkelvei separert fra gående, med forkjørsrett over sideveiene. Her kan det raskt skje ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-15T08:09:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "1734affbb1c78dc5b20dbaf4d478e9a33551ac84.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1807": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92125873, + "lng": 10.7510662 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet slutter rett før rundkjøringen. Der har bilene en tendens til å legge seg ved siden av syklisten, for så å svinge til høyre ut av rundkjøringen - gjerne uten å bruke blinklys.", + "type": "String" + }, + "date": { + "value": "2014-09-15T07:08:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "715b71ec0f21b8b52595545a2f3728252d92a719.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1806": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91226149, + "lng": 10.72257041 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt skiltet som stod her er byttet ut med Blindvei skilt. Skiltet står fortsatt midt i sykkelfeltet", + "type": "String" + }, + "date": { + "value": "2014-09-14T21:05:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "fb2796281f2240f43617f80c3c94e9393ae744bf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1805": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91192801, + "lng": 10.72140097 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkel/gangvei som går langs Munkedamsveien stopper i betongkloss her.", + "type": "String" + }, + "date": { + "value": "2014-09-14T21:04:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "1e31c8d3e00773c7052c6fed4b3247151b72d9c5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1804": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93685964, + "lng": 10.68036317 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykelvei opphører noen meter før kryss over R150. Burde vært tilrettelagt med sykkelfelt slik det er på andre siden av veien. Grønn lys har for kort varighet, ikke mulig å krysse veien før de er rødt og kryssende biler har fått grønnt.", + "type": "String" + }, + "date": { + "value": "2014-09-14T21:00:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "d72c5be665e3ca9209d3022d42aca16cfa113e79.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1803": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.946135, + "lng": 10.6491959 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt opphører plutselig etter jernbanebroen. Feltet fortsetter 50 meter lenger oppe før det igjen stopper ved gangfelt der Sørkedalsveien tar av.", + "type": "String" + }, + "date": { + "value": "2014-09-14T20:55:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "09b4753af4d3bbc5653c815726f6d5f87de392cb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1802": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91779027, + "lng": 10.71552157 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset Gyldenløves gate/Niels Juels gate/Colbjørnens gate er et verstingkryss. Bilene kommer fort, krysset er bredt og før man vet ordet av det befinner man seg midt i krysset skvist mellom to biler. Mhp på antall sykler som krysser her pr. dag bør krysset bygges om, hindre bilene og prioritere syklistenes sikkerhet. Gjelder forsåvidt hele Gyldeløves gate - Colbjørns gate da dette er en av hovedtraséene til og fra Sentrum.", + "type": "String" + }, + "date": { + "value": "2014-09-14T19:38:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "c73e8d81f69f80e3082cd74e607777df7c44a7a9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1801": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92166739, + "lng": 10.77514171 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom i sykkelfelt i Finnmarkgata fra Carl Berner i retning Tøyen. Det kom en bil bak meg som kjører forbi og svinger til høyre uten å registrere meg som kom i sykkelfeltet. Jeg kjører rett i bilen som hadde klar vikeplikt, men jeg husker ikke noe før jeg våknet på nevrokir. avd. med kraniebrudd og et par subdurale hematomer. Kjedelig etter 4 dager i ny jiobb. Hvorfor er ikke sykkelfelt i Oslo sjelden skjermet fra trafikken?", + "type": "String" + }, + "date": { + "value": "2014-09-14T19:17:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "ec44ea833077741bdade71d07017d00bc3be2eaa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1800": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92107591, + "lng": 10.71326851 + }, + "type": "LatLng" + }, + "description": { + "value": "Selv om Gyldenløves gate som helhet er både trang og uoversiktlig peker krysset mot Løvenskiolds gate seg ut som en versting. Her kommer bilene fort ut i et kryss uten noe klart kjøremønster, noen bilførere kjører som i et firkantet kryss, mens andre kjører som om man skulle vært i en rundkjøring. Vi syklister blir fort oversett av bilistene i kaoset som råder dem imellom.", + "type": "String" + }, + "date": { + "value": "2014-09-14T19:17:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "91d10956405e1240a348bf93ee56d6bcb571581e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1799": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93674678, + "lng": 10.68019151 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg savner et tydelig og markert sykkelfelt på vei ut i lyskrysset fra nordsiden slik man har fra syd. Skulle også gjerne sett at sykkelfeltene blir markert hele veien gjennom krysset, spesielt siden Monolitveien er en av hovedtraséene til og fra sentrum for oss syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-14T18:51:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "5823079403ab93c6f4b085884dfde4d9c5d5a4b0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1798": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94478094, + "lng": 10.64738273 + }, + "type": "LatLng" + }, + "description": { + "value": "Gangfeltet ved krysset Ostadalsveien - Røaveien; fortauskanten er ikke senket ned til veibanen som gjør det vanskelig å krysse veien. Spesielt aktuelt med sykkelvogn med barnehagebarn i da fortauskanten blokkerer slik at det tar unødvendig lang tid å få hengeren ut av veibanen. Stedet er på en bakketopp og uoversiktlig.", + "type": "String" + }, + "date": { + "value": "2014-09-14T18:34:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "47257da9822b354d63147cd75569ae9bf53a3166.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1797": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89848393, + "lng": 10.83133935 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet fra Abildsø retning Bryn. Bil overholdt ikke vikeplikten. Påkjørt i siden men flaks gjorde at jeg ikke veltet og havnet under bilen.", + "type": "String" + }, + "date": { + "value": "2014-09-14T17:34:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "3005f8c6418f03de0ea414654f1e82a8120350ea.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1796": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84798377, + "lng": 10.77801704 + }, + "type": "LatLng" + }, + "description": { + "value": "Mosseveien burde være hovedsykkelvei syklister som skal sørover ut av byen. Her har man såkalt \"tilrettelagt\" for syklister med et blandet fortau med mange avkjøringer, holdeplasser og lignende. For å unngå å ta livet av fotgjengere er eneste løsning å legge seg i kjørebanen.", + "type": "String" + }, + "date": { + "value": "2014-09-14T16:49:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "24fd5d11ae6f626f037d307e9c9ae6ddbf88a620.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1795": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93577395, + "lng": 10.73821306 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er tillatt å sykle i kollektivfeltet, men ikke alle yrkessjåfører kjenner til dette og oppfører seg aggressivt mot syklister på denne strekningen. I påvente av en endelig løsning for syklister burde man male en tydelig sykkel sammen med buss- og taxisymbolene.", + "type": "String" + }, + "date": { + "value": "2014-09-14T16:33:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "d208bdb5f03a0aba26d6c8843982baa9b0318826.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1794": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92352782, + "lng": 10.75731039 + }, + "type": "LatLng" + }, + "description": { + "value": "Til tross for at Markveien herfra og sørover er (til en viss grad) tilrettelagt for sykling møter man her enveiskjøring når man kommer nordover. Det burde være en enkel sak å fjerne bilparkering på den ene siden og male opp sykkelfelt mot kjøreretningen opp de kvartalene det gjelder.", + "type": "String" + }, + "date": { + "value": "2014-09-14T16:27:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "728b7ae2652a0946d6bbe9d1dfc1cfc83b100ef0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1793": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9337852, + "lng": 10.75636625 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette strekket opp Maridalsveien er godt egnet for sykkel, men veien er enveiskjørt og fortauene er for smale til å sykle på. Her burde sykling tillates mot kjøreretning, eller andre tiltak innføres for å hindre bilkjøring, som vel er det egentlige siktemålet med enveiskjøringen (samme problematikk lenger opp i gata).", + "type": "String" + }, + "date": { + "value": "2014-09-14T16:20:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "6844e0415af562ea5062ed19c1a7ee21f74d0612.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1792": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89376457, + "lng": 10.54383873 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig hjørne mellom broen og sandviksveien.", + "type": "String" + }, + "date": { + "value": "2014-09-14T09:57:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "9e44bd1a7af5e1d4d5cd4b965ce4585a39069abf.jpeg", + "type": "String" + } + } + }, + "aftenposten-1791": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92603333, + "lng": 10.77604293 + }, + "type": "LatLng" + }, + "description": { + "value": "Altfor trangt for syklister både i bilveien og på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-14T09:46:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "019a99d316f50d11880c59e55f735ad78f3723c9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1790": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9112987, + "lng": 10.75849056 + }, + "type": "LatLng" + }, + "description": { + "value": "ingen sykkelvei, blir nødt til å sykle blant bilene i rundkjøring, utrygt, biler på alle kanter, fortau smalt og ikke plass å sykle på", + "type": "String" + }, + "date": { + "value": "2014-09-14T09:29:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "a6439ab476fae83e3b4681e9fee5059c49396056.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1789": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90799057, + "lng": 10.7678461 + }, + "type": "LatLng" + }, + "description": { + "value": "ingen plass til syklister, ikke plass i veibanen da bilene presser deg opp på fortauet, der er det ikke mulig å sykle for det er en trikkestopp og busstopp hvor det alltid står mange folk", + "type": "String" + }, + "date": { + "value": "2014-09-14T09:26:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "4e2b5060cf363c77a0a1658cacb85a42f3785b4f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1788": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90660267, + "lng": 10.76791048 + }, + "type": "LatLng" + }, + "description": { + "value": "sykkelfelt forsvinner (fortau ikke alteranativ pga alle humpene) på veien presses man mellom bilene og det blir for trangt til å ligge ved siden av bilene", + "type": "String" + }, + "date": { + "value": "2014-09-14T09:22:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "40006c996ab9d9fe808776facba6891162a7784e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1787": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91407404, + "lng": 10.76291084 + }, + "type": "LatLng" + }, + "description": { + "value": "sykkelfelt brukes av fotgjengere, syklister presses ut i gaten og må kjøre sikk-sakk mellom biler som har stoppet midt i gaten for å prate med andre", + "type": "String" + }, + "date": { + "value": "2014-09-14T09:20:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "48aeebd5d7efc4316720f49c6d26dea0345c3fe6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1786": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91244974, + "lng": 10.76374769 + }, + "type": "LatLng" + }, + "description": { + "value": "parkering på innsiden av sykkelvei: bilister står ofte parkert i sykkelfelt og tar ikke hensyn til syklister", + "type": "String" + }, + "date": { + "value": "2014-09-14T09:17:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "66eeaa050019aee1dbd465fa5a2f9dc945795392.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1785": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91036277, + "lng": 10.76765298 + }, + "type": "LatLng" + }, + "description": { + "value": "bilister som parkerer på innsiden av sykkelvei ser ikke syklistene, skjener ut i sykkelfeltet", + "type": "String" + }, + "date": { + "value": "2014-09-14T09:15:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "6c3ce4292bafb9f1513cd73fae3b3c757b13e79c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1784": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91219694, + "lng": 10.75394153 + }, + "type": "LatLng" + }, + "description": { + "value": "Hver gang jeg sykler denne rundkjøringen, er det med hjertet i halsen. Det største problemet er, at utkjøringen mot øst går i 2 fil, mens det går 2 utkjøringer i enkeltfil mot nord. Vil man sykle ut retning Lybekkergata, må man altså skifte til indre fil for å unngå dragsuget mot øst, og med en gang skifte til ytre fil igjen for å komme seg ut igjen. I rushtiden er dette livsfarlig.", + "type": "String" + }, + "date": { + "value": "2014-09-14T09:13:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "5a2bc22574feeae39203399081a89dae62e50d11.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1783": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94715588, + "lng": 10.77093601 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet tok slutt i en rundkjøring, ble skvisjt ut av veien og opp på fortauet av en leddbuss.", + "type": "String" + }, + "date": { + "value": "2014-09-14T08:43:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "5eb1ca4e3b86e0acc04abad23559e1be32facda4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1782": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91169134, + "lng": 10.72630405 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei stopper i intet. Farlige situasjoner daglig!", + "type": "String" + }, + "date": { + "value": "2014-09-14T08:36:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "a3e587d973c031b4308103832b32b5c50f39b980.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1781": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9097926, + "lng": 10.7121849 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ingen markering sykkelvei/fortau. Fjern gjerde mot kaisiden og lag bedre/ eget fortau til alle gående. Enkelt tiltak som vil bedre situasjonen betraktelig.", + "type": "String" + }, + "date": { + "value": "2014-09-14T08:34:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "8254de87b04736a558c0b6d5716263f35efce610.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1780": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91046497, + "lng": 10.70633769 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti krysser bilvei/fotgjengerfelt/parkeringsplass. En veldig lite gjennomtenkt løsning. Fjern parkeringsplassene mot E18 og lag en mer smidig løsning for både fotgjengere, syklister og bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-14T08:30:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "f200b1fc123eeb51937692bd252caaeddc18e911.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1779": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91761818, + "lng": 10.68761587 + }, + "type": "LatLng" + }, + "description": { + "value": "T-Kryss som ikke er merket med vikeplikt. Uoveriktlig. Her skjer det mange farlige situasjoner daglig mellom syklister som kommer fra E18 og syklister til/fra Bygdøy. Bedre skilting og markering i veibanen vil hjelpe.", + "type": "String" + }, + "date": { + "value": "2014-09-14T08:25:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "c4b5b4c8535848495293153045a93ea6ce69823c.jpeg", + "type": "String" + } + } + }, + "aftenposten-1778": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94368475, + "lng": 10.68077087 + }, + "type": "LatLng" + }, + "description": { + "value": "4. juni 2013 0850. Jeg syklet ned Holmenkollveien på gang/sykkel veien. Varebil svingte brått inn på sykkelveien for adkomst til eiendom. Jeg bremset, stupte over styret, landet på hjelmen, stoppet etter 10 meter under bilen. Brukket båtbein i høyre hånd, forstuet venstre håndledd og hjernerystelse. 16 uker gips høyre arm/hånd. Søvnproblem og konsentrasjonsvansker. HJELMEN virket og forhindret alvorlig skade. Politiet mente det ikke kunne anmeldes fordi det ikke var kontakt mellom bil og syklist. De gikk tilbake på dette etter undersøkelse med politijuristen.", + "type": "String" + }, + "date": { + "value": "2014-09-14T07:21:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "7ef3de8ea0f185655749fe8c0a0927f21e34939b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1777": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91332106, + "lng": 10.68089962 + }, + "type": "LatLng" + }, + "description": { + "value": "Left turn here very dangerous.", + "type": "String" + }, + "date": { + "value": "2014-09-14T06:27:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "e6c1cd07d0b4d6e85fa95fe3bbddef8b6e856e76.jpeg", + "type": "String" + } + } + }, + "aftenposten-1776": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95336647, + "lng": 10.76891899 + }, + "type": "LatLng" + }, + "description": { + "value": "folk kommer veldig raskt ned skolebakken(som må være blant byens bratteste bakker) og skal ned på ring3-sykkelveien veldig uoversiktlig med fotgjengere og gateparkering helt ned til hjørnet", + "type": "String" + }, + "date": { + "value": "2014-09-13T21:33:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "01384518150c1f6a034cb1497d8f64cb6c3c8aa6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1775": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9539359, + "lng": 10.78548431 + }, + "type": "LatLng" + }, + "description": { + "value": "sikkert grefsenveien politikerne tenker på når de sier at vi har så trange gater i oslo. Her er alternativene å trille på forttau eller sykle på veien som jeg antar har 50 km/t med rekker av biler langs hver side, hvor man ønsker å holde seg utenfor dørsonen er det ikke særlig langt til trikkeskinna", + "type": "String" + }, + "date": { + "value": "2014-09-13T21:30:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "a80e972292c87956499c4df3338270fca1bf2fae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1774": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95325903, + "lng": 10.78539848 + }, + "type": "LatLng" + }, + "description": { + "value": "ny innsnevring av veibanen sørger for at syklister får enda mer samkvem med bilister som ønsker å gasse opp i gjen etter lyskrysset ved glads vei", + "type": "String" + }, + "date": { + "value": "2014-09-13T21:23:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "e71beb2111632aba867af6b68598a142ab0d44f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1773": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92990411, + "lng": 10.71559667 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det mange parkerte biler og ikke noe sykkelfelt. Det er særlig skummelt om noen bildører flyger opp, må sykle midt i veien for å unngå dette. Særlig forbi taxilinjen.", + "type": "String" + }, + "date": { + "value": "2014-09-13T21:18:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "6b9b1c157312cceb2e9ca02f5fb4775fb4b91e9c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1772": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94494214, + "lng": 10.76016426 + }, + "type": "LatLng" + }, + "description": { + "value": "tett med parkering av biler på hver side av veien, konstant bil og busstrafikk(37,54) gjør at biler prøver seg på forbikjøring med 1-2 cm avstand", + "type": "String" + }, + "date": { + "value": "2014-09-13T21:18:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "6477333c3c7309ed5d2717a71c2a6798e4633380.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1771": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94474333, + "lng": 10.70433139 + }, + "type": "LatLng" + }, + "description": { + "value": "denne sykkelveien eksisterer ikke !!", + "type": "String" + }, + "date": { + "value": "2014-09-13T21:11:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "8aacf42f4db2888ee316225a914b276b895053a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1770": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94027775, + "lng": 10.72976946 + }, + "type": "LatLng" + }, + "description": { + "value": "sykkelfeltet før john collets plass må være blant byens korteste, kun 5-6 meter", + "type": "String" + }, + "date": { + "value": "2014-09-13T21:00:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "51fbb2dbb7bed1eb063a8b62129d638875d2d5d2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1769": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94428658, + "lng": 10.73121786 + }, + "type": "LatLng" + }, + "description": { + "value": "hvorfor hsr msn fjernet rampene som gjorde det mulig å sykle på fortauet i denne gata, nå kjører jo bilene så fort at det nærmest er livsfarlig å opphole seg i gata", + "type": "String" + }, + "date": { + "value": "2014-09-13T20:58:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "f36c19b07628c44bccefe7642c48803c4e3881b9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1768": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93201135, + "lng": 10.94246864 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelvei. Kamp med bilene hver gang.", + "type": "String" + }, + "date": { + "value": "2014-09-13T18:46:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "f83c51653b3946b1d903ae6f6e2831f72cd7a9ac.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1767": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96043524, + "lng": 10.89530467 + }, + "type": "LatLng" + }, + "description": { + "value": "Når jeg kommer nedover mot Oslo, så har jeg plutselig kommet ut på Rv4 pga. de har lagt omkjøringen for sykkelister til å gå rett frem. Ikke noe skilt om at du må ta inn til høyre igjen.", + "type": "String" + }, + "date": { + "value": "2014-09-13T18:43:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "7cfc8cc16de77e21858777622a60cddc1c747a1f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1766": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93938026, + "lng": 10.78193306 + }, + "type": "LatLng" + }, + "description": { + "value": "Vanskelig å krysse vei her med biler og trikk. Noen ihelv. grinder er satt opp forran trikkeskinnene når man skal over for oppover trondheimsveien. Tvinger oss på sykkel å gå..", + "type": "String" + }, + "date": { + "value": "2014-09-13T18:41:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "730e7ab091b3497f243bc81606668f5dcf30ff7e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1765": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94927814, + "lng": 10.73099255 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler skilting… Enten så må sykkelveien ha vikepliktskilt, ellers så må bilene ha det. Har havnet i nestenkollisjoner her nesten hver uke.. og det er forvirrende om hvem som har retten på sin side..", + "type": "String" + }, + "date": { + "value": "2014-09-13T18:38:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "68a3329f6d40db3da928230605f22ba498bc5804.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1764": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93634367, + "lng": 10.68057775 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er helt forvirrende å komme ned fra smestadkrysset og inn i monolittveien når man følger sykkelveien på venstre side. Man må krysse monolittveien for å komme over til sykkelveien på høyre side av monolittveien. Det skaper krøll, forbannelse og farlige situasjoner i trafikken..", + "type": "String" + }, + "date": { + "value": "2014-09-13T18:36:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "6e2e658187b8c012a02e4eac530af8cb5683ae3f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1763": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90172306, + "lng": 10.78967928 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg kommer vanligvis syklende oppover Konows gate og skal til venstre i rundkjøringen for å fortsette oppover i Konows gate. I rundkjøringen har jeg flere ganger opplevd at bilister på vei ned ikke virker å ha til hensikt å overholde vikeplikten, men bare kjører rett gjennom rundkjøringen.", + "type": "String" + }, + "date": { + "value": "2014-09-13T18:01:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "8e14d03877945ebd968e3cd1f962c328acadbbea.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1762": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92517309, + "lng": 10.57073593 + }, + "type": "LatLng" + }, + "description": { + "value": "Foreldre som har levert barn i barnehagen, og som har det travelt med å komme seg på jobb, kjører helt fram over fortauet for å vente på klar bane. De fleste transportsyklistene benytter fortauet her. Jeg har mer enn en gang hatt nestenulykker i dette krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-13T17:08:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "0bc65769d18bee767b8962f32ee9567099e71cd1.jpeg", + "type": "String" + } + } + }, + "aftenposten-1761": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.941589, + "lng": 10.67404389 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti med dårlig asfalt som er dosert feil vei i bakke rundt en uoversiktlig sving med trapp opp fra T-banestasjonen i tillegg.", + "type": "String" + }, + "date": { + "value": "2014-09-13T16:26:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "735300716462ebedc52f9b21927f9ac353cbe497.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1760": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93156519, + "lng": 10.69197177 + }, + "type": "LatLng" + }, + "description": { + "value": "Fartsdump som skaper enorm vanndam når det har regnet som streker seg ut i motgående kjørebane. Den tvinger sykler til å krysse ut fra sykkelfeltet og helt over i motgående kjørefelt.", + "type": "String" + }, + "date": { + "value": "2014-09-13T15:24:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "b1c67a808bbde5d3cd1d70e88ba3d241f82d4eb0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1759": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94143316, + "lng": 10.74586272 + }, + "type": "LatLng" + }, + "description": { + "value": "Her holdt jeg nylig på å meie ned en fotgjenger som plutselig dukket opp bak en hekk. Jeg holdt lav fart så det gikk heldigvis bra denne gangen, men vi begge fikk vel en støkk. Fortauet er smalt og uoversiktlig, veien er enveiskjørt og alternativer finnes knapt mellom Sagene og Ullevål. Reduksjon av gateparkeringen kunne løst mange problemer her.", + "type": "String" + }, + "date": { + "value": "2014-09-13T15:19:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "ffeed940fbd64b7a35d7b241e6ebd453da26f148.jpeg", + "type": "String" + } + } + }, + "aftenposten-1758": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90934076, + "lng": 10.77730894 + }, + "type": "LatLng" + }, + "description": { + "value": "Nestenulykke. Jeg kom fra Tøyen og skulle rett frem. Bil svingte til høyre uten å blinke. Ungikk ulykke ved å bråbremse, men det var nære på.", + "type": "String" + }, + "date": { + "value": "2014-09-13T14:37:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "dafe93ae19ae310d2637b1cdb5db4d5e7102ad3a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1757": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91235292, + "lng": 10.82784175 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien blir smalere, en del bilister er desperate i rushtrafikk", + "type": "String" + }, + "date": { + "value": "2014-09-13T14:22:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "61b29ba22477a465f00ce419d66fbc0d02076e74.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1756": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94847761, + "lng": 10.70377349 + }, + "type": "LatLng" + }, + "description": { + "value": "dette står som Blinderveien, det stemmer ikke. Øvre del av linjen er Slemdalsveien fra Slemdal stasjon til svingen ved avtaket fra Ringveien øst. Deretter går linjen på gangbro over Ringveien, og ned Forskningsveien over Gaustadjordet til Rasmus Winderens vei.", + "type": "String" + }, + "date": { + "value": "2014-09-13T14:21:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "f344bb562875ab80e84220c8f77f63f9fbe4bb48.jpeg", + "type": "String" + } + } + }, + "aftenposten-1755": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94893967, + "lng": 10.70049047 + }, + "type": "LatLng" + }, + "description": { + "value": "Fortau langs t-banen er smalt, med elendig asfalt og store grener/ busker som stikker ut over gjerdet mot t-banen. Nesten alle velger å sykle i veibanen, eller sammen med fotgjengere og syklister i motsatt retning på andre fortau. Er tidligere blitt forbisyklet av annen syklist på dette fortauet noe som førte til felles velt ut i veibanen i rushtiden. Slapp usannsynlig nok unna med store blåmerker. Ikke bare bilister som ikke tar hensyn til syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-13T14:18:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "70684486d6d1e2f6b7a93ca163954da407ca5f46.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1754": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91778489, + "lng": 10.68761587 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang og sykkelveien her går over i et fotgjengerfelt. Som syklist er dette en utkjørsel der man har vikeplikt. Hvis jeg står å venter her står bilene som skal ut på E18 å venter på meg siden de ikke følger vikepliktreglene (de skal ikke vike). Dette fører til en usikker situasjon der syklistene velger å bryte vikeplikten etter å se på sjåføren i bilene i 30-60 sekunder.", + "type": "String" + }, + "date": { + "value": "2014-09-13T14:16:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "8e55b6fe8cc5d5ad0c835fd8fe2b0e181ea859b7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1753": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92425369, + "lng": 10.75927376 + }, + "type": "LatLng" + }, + "description": { + "value": "Etter parkeringen ble fjernet har restaurantene startet å bruke plassen til uteservering, dermed er det masse betjening og folk som går i sykkelveien.", + "type": "String" + }, + "date": { + "value": "2014-09-13T14:10:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "bb4e75036b2be34d9e646c93f391f9c480a95a90.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1752": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91362225, + "lng": 10.74706435 + }, + "type": "LatLng" + }, + "description": { + "value": "Er det meningen at dette er hovedsykkelgaten mellom øst/nord og vest/rådhusplassen bør man tegne opp egne sykkelfiler i gata, hvis ikke kan man (og får heller ikke lov) ikke sykle i mer enn ~15km/timen. Dette blir syklistenes svar på Dronning Eufemias gate, men der er det ihvertfall tunnel under for gjennomfartstrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-13T14:02:53Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1751": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93198985, + "lng": 10.76228857 + }, + "type": "LatLng" + }, + "description": { + "value": "Når sykkelfeltet på ring 2 slutter må man velge enten det smale, hullete fortauet eller kjempe med bilene i ytterfeltet. Bilene kommer i full fart og set er sabla trangt.", + "type": "String" + }, + "date": { + "value": "2014-09-13T11:27:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "8046703566c007546d33343e05627bae53330e23.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1750": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9547739, + "lng": 10.76121568 + }, + "type": "LatLng" + }, + "description": { + "value": "Ulykke i krysset Korsvollbakken/Maridalsveien, bil mot sykkel - og massevis av farlige situasjoner. Sykkelmeteren langs med Maridalsveien nedover mot Bjølsen er flere steder på strekningen livsfarlig, fordi syklister kjører rett ut fra småveiene - på sin høyre-vikepliksrett. Både Sognsveien og Maridalsveien burde være forkjørselsveier med gul firkantskilt. Forskjellen på Norge og Danmark er at alle slike store veier har forrett foran biler inn fra siden og derfor har også sykler og sykkelstien samme rett.", + "type": "String" + }, + "date": { + "value": "2014-09-13T08:36:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "ff4c9cde77dc39b2634f69283ee7449f71f9c79d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1749": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91051338, + "lng": 10.84822654 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler merking for sykkelfelt, noe som fører til at det blir en \"kamp om posisjoner\" mellom syklister og bilister. Fortau er lite egnet å sykle på pga mange inn/utkjøringer til boliger og tidvis mange fotgjengere.", + "type": "String" + }, + "date": { + "value": "2014-09-13T07:43:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "1029d4a755e486436dbd9e0e2677c08b828fb068.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1748": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90571504, + "lng": 10.82088947 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har det vært veiarbeid hele sommeren og det stoppet opp i juli. Asfalten liggerer, men det mangler merking av kjørebaner og sykkelfelt. Fullstendig kaos i rushtrafikken. Dette er en veldig traffikkert veistubb som preges flere kryss med mye av og påkjørunger. Livsfarlig!!!!", + "type": "String" + }, + "date": { + "value": "2014-09-13T07:00:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "64dbf914b38d3d5f2b919aaefbe53e451e3ed1a8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1747": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94530752, + "lng": 10.71576833 + }, + "type": "LatLng" + }, + "description": { + "value": "Gjerde er ikke avsluttet ordentlig slik at det står metallrør ut mot sykkelstien. Har stått slik i mange år. Lars Holden", + "type": "String" + }, + "date": { + "value": "2014-09-13T04:26:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "481f941187d1bb116dbae06df9e68878896c0f9a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1746": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.81315229, + "lng": 10.77243804 + }, + "type": "LatLng" + }, + "description": { + "value": "For noen år siden ble det lagt ny asfalt på Gamle Mossevei. Med ny asfalt og ny veimerking forsvant også den gamle stiplete kantlinja som var før asfaltering. Den stiplete kantlinja var satt slik at man hadde en bred veiskulder som syklister kunne bruke. Det hadde vært fint å få den tilbake langs med Gamle Mossevei.", + "type": "String" + }, + "date": { + "value": "2014-09-12T22:32:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "62e3c5610340ded788a6c91d235974d228424ee7.jpeg", + "type": "String" + } + } + }, + "aftenposten-1745": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91898948, + "lng": 10.78808069 + }, + "type": "LatLng" + }, + "description": { + "value": "Separert gangvei og sykkelvei blir til gang- og sykkelvei. Mange syklister, målløse hunder og lekende barn skvises plutselig inn på et smalere område.", + "type": "String" + }, + "date": { + "value": "2014-09-12T22:13:31Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1744": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91304138, + "lng": 10.8225739 + }, + "type": "LatLng" + }, + "description": { + "value": "Her må man gjennom en bussholdeplass for å komme inn på gang- og sykkelveien.. Man vet aldri når folk kaster seg frem for å komme først inn i bussen som nettopp har dukket opp rundt svingen eller kommer ramlende ut av bussen når den står der.", + "type": "String" + }, + "date": { + "value": "2014-09-12T22:09:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "d01a7b3c87471f67d7ab536317f3c08974958da6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1743": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84056761, + "lng": 10.77805995 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter gang- og sykkelvei langs Mosseveien, og går over på turveiene rundt Hvervenbukta. Derfor velger mange syklister å kjøre ut på avkjøringsrampa til Mosseveien opp til rundkjøringa til Ljansbrukveien. Dessverre er det også mange syklister som velger å sykle fra Ljansbrukveien mot kjøreretningen ned avkjøringsrampa til gang- og sykkelvei langs Mosseveien. En mulig løsning er å lage en sykkelvei langs utkjøringsrampa og et stykke bortover Ljansbrukveien.", + "type": "String" + }, + "date": { + "value": "2014-09-12T21:47:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "0bd7efcc4f41a67f953e79fb7ce196e4fbe3a91e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1742": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93177483, + "lng": 10.78835964 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye trafikk i krysset, mange barn på vei til skolen og syklister, burde vært lyskryss eller aller helst en over/undergang", + "type": "String" + }, + "date": { + "value": "2014-09-12T20:54:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "d3dfb2aeefca01c1f2d637678ab42a0ab288a84a.jpeg", + "type": "String" + } + } + }, + "aftenposten-1741": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92958156, + "lng": 10.7962346 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler parkert langt ute i sykkelveien. Burde vært parkering forbudt her. (er ikke tilrettelagt for parkering)", + "type": "String" + }, + "date": { + "value": "2014-09-12T20:51:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "60340bef0f2985f7ce986100a0ac5cf7e851458b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1740": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85972983, + "lng": 10.78544139 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er gang- og sykkelvei nylig blitt utbedret, men inn mot lyskrysset smalner den til, ca.1,5m. Dermed oppstår det fort situasjoner mellom syklister og gående eller syklister som venter på grønt over fotgjengerfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-12T20:50:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "216b9ac40fb25942c0bf6bd86970976bc9baa6e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1739": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90653274, + "lng": 10.81975221 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet er nå tatt bort. Var mange biler som la seg over i sykkelfeltet uten å sjekke om syklister lå til høyre for bilen. Har opplevd stygge episoder her.", + "type": "String" + }, + "date": { + "value": "2014-09-12T20:48:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "6c8453f722b366ea69928183145d27c81543cd91.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1738": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87897793, + "lng": 10.80800414 + }, + "type": "LatLng" + }, + "description": { + "value": "Innkjøring til Rema 1000 som krysser sykkelvei. Her skjer det nestenulykker så og si hver dag.", + "type": "String" + }, + "date": { + "value": "2014-09-12T20:22:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "ed2a3281c3041a0e8e3f3a4e54234f79dea5b1b7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1737": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95077708, + "lng": 10.63734054 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt fortau gjør at det ikke er plass til syklister når det er gående der. Stor biltrafikk i begge retninger og temmelig smal veg. Mange bilister kjører forbi selv med motgående trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-12T20:21:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "db820e822092abc031efddd3a767586c3ca667f0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1736": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87985551, + "lng": 10.77426195 + }, + "type": "LatLng" + }, + "description": { + "value": "Strekket fra krysset Ormsundveien-Mosseveien via Skrenten og Fisker Syversens vei er svært dårlig tilrettelagt for syklister. Sykkelveien er svingete, bratt og uoversiktlig. I tillegg går den igjennom et boligstrøk og forbi Nedre Bekkelaget skole. Her oppstår det mange konflikter mellom syklister, beboere i området og barn på vei til skolen. En mulig løsning er å lage en sykkelvei langs Mosseveien fra utkjøring Shell-stasjonen til Ulvøya der man i dag har et kollektivfelt. Dermed vil man unngå det farlige strekket i Fisker Syversens vei.", + "type": "String" + }, + "date": { + "value": "2014-09-12T20:19:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "a4210630f998da3ff8aa018854dfd99f17fd89a1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1735": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94568365, + "lng": 10.78248023 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkeskinner, masse hull i asfalt, ekstremt smalt forttau, lang og trang bilkø i rusjtiden på grefsenveien ned mot storo-krysset", + "type": "String" + }, + "date": { + "value": "2014-09-12T20:15:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "8f03cae47ff5f53e23ec7f9e2eced6d8cb6e7cdc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1734": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84714306, + "lng": 10.80369114 + }, + "type": "LatLng" + }, + "description": { + "value": "Her forsvinner gang- og sykkelstien som føres rett inn på Hauketo tog- og busstasjon blant biler og busser. Det er ikke tilrettelagt for å sykle rett fram på Nedre Prinsdalsvei. Mange syklister \"kaste\" seg derfor ut i veibanen. Her burde man lage sykkelfelt i veibanen med et trafikklys hvor syklister har prioritert.", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:42:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "4a23f9f3fc65ce6d29a8a329ed7b3ef55da2f0df.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1733": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84780593, + "lng": 10.8036375 + }, + "type": "LatLng" + }, + "description": { + "value": "Innkjøring til parkeringsplass for Hauketo stasjon går tvers over gang- og sykkelsti. Dette gjør at fotgjengere og syklister blir utrygge når de ferdes her. Den innkjøringen bør fjernes.", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:33:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "e04fd5c734e0b708845bc9076ea79cb98974a23b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1732": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92275355, + "lng": 10.7051897 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei-merkingen er slitt bort i utgangen av rundkjøringen. Dette bidrar til at de fleste biler kutter svingen til fare for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:31:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "80da3d1c3356efe18e489a5365b9c9f1024e4aa3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1731": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92001658, + "lng": 10.67243456 + }, + "type": "LatLng" + }, + "description": { + "value": "Nyanlagt og fin gang og sykkelvei side om side. Men gangveien slutter brått 100 meter før sjølyst marina, og fotgjengere har valget om å gå inn i sykkelveien, eller å gå videre på gresset. Her oppstår det situasjoner når syklister i begge retninger må svinge unna fotgjengere som velger sykkelvei fremvor gress.", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:27:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "4d999581452bae59cfad97330cc1f1c46a3280ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1730": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91755902, + "lng": 10.74381351 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter sykkelveien hlt brått og man får busser og biler tett ved siden av seg.Veldig farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:23:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "557032ade459d020ee006132621fbab19f989a6f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1729": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92743116, + "lng": 10.7393074 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er sykkelvei fram til femti meter fra krysset, deretter er det helt åpent hvor man skal sykle. Det er totalt uoversiktelig", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:20:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "c7425315d6aa3c47edd584e0a215c920b68ee830.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1728": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93666078, + "lng": 10.68030953 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært uoversiktlig kryss. Det tar veldig lang tid å sykle gjennom Smestad-krysset i retning parallelt med ring 3. Det er uoversiktlig i undergrunnen med mange fotgjengere fra T-banen. Videre dreier veien utrolig mange ganger med uoversiktlig og/eller svært krappe svinger. Sykler man fra Radiumhospitalet og retning Vinderen, dreier veien først 360 grader, så 180 grader til.", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:15:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "c95f31fcb4d5807a7fb975a3a155de59143bc206.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1727": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90495649, + "lng": 10.73781609 + }, + "type": "LatLng" + }, + "description": { + "value": "Akerhusstranda er en hovedfartsåre for syklister. Bilister som kommer fra Kongens gate og svinger inn på Akershusstranda har forkjørsrett idag og bruker dette for alt det er verd. Det burde vært satt opp et vikepliktsskilt ut fra Kongens gate. Dette hadde vært en ekte prioritering av syklister framfor bilister for en gangs skyld.", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:15:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "91bad42456a305fcf3ce68250c70e440145a6769.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1726": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92326974, + "lng": 10.60910224 + }, + "type": "LatLng" + }, + "description": { + "value": "Flott sykkelvei langs Jarmyra, men her er det en åpning i støyskjermen der fotgjengere kommer brått ut i sykkelveien. Løsning er trafikkspeil i smuget slik at begge trafikantgrupper ser hverandre i sladrespeilet.", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:05:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "14ad66e3804f1a7c9dbfd437114d1f39f8983358.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1725": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90094828, + "lng": 10.76409101 + }, + "type": "LatLng" + }, + "description": { + "value": "Skateboardere har det heller ikke lett nedover her. Bilister har liten forståelse for bremsemetoder som sikksakking, eller å breie ut jakka til luftbremsing. Og fortauet er ikke bare ubrukelig, på grunn av sin snaue 1m bredde og underlag som en middelaldersk krøttersti, men også en enda farligere enn bilveien, fordi du da kommer helt tett på motgående biltrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-12T19:04:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "5c1006cd52c5e66dec69a2bd9c33e8297a5d4b1c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1724": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91468716, + "lng": 10.58165788 + }, + "type": "LatLng" + }, + "description": { + "value": "Adkomstvei til/fra T-bane, naturlig å sykle på fortau, høyt gjerde skjuler fotgjengere som kommer opp fra Gjønnes t-bane stasjon. Løsning: erstatt noen meter gjerde med gjennomsiktig løsning / sprosser.....", + "type": "String" + }, + "date": { + "value": "2014-09-12T18:55:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "51b075dd521c73fbf07a95d1de7df2ef9c081e88.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1723": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92112968, + "lng": 10.68986892 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet langs fortauet fra Skøyen mot Frognerparken og kjørte i siden på kassebil som brått kom ned Madserud alle, dårlig sikt. Mulig det var min feil der, men jeg kom fra høyre for bilist. Det smalt og sykkelen måtte få nytt forhjul. Det gikk heldigvis bra med meg. Det er noen år siden, før sykkelfeltene kom, tror jeg.", + "type": "String" + }, + "date": { + "value": "2014-09-12T18:48:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "620fd97e1bdc742692718764c2c2f873ddc4b8e4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1722": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92051667, + "lng": 10.74264407 + }, + "type": "LatLng" + }, + "description": { + "value": "Absurd strekning. Er det sykkelfelt her eller ikke? Umulig å vite. Hvis det ikke er det, hva skal oppholdet i sykkelfelt tjene til? Hvis det er det, hvorfor er det ikke merket?", + "type": "String" + }, + "date": { + "value": "2014-09-12T18:27:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "fc5a4069d5a20e8008462d0b6388e77372323088.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1721": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90186295, + "lng": 10.76667666 + }, + "type": "LatLng" + }, + "description": { + "value": "Når søppelbilen stiller seg på skrå her (rett åvom nederste sving) og stopper trafikken i begge retninger, blir det stillestående bilkø helt opp til Sjømannsskolen. Syklister henvises til motgående felt.", + "type": "String" + }, + "date": { + "value": "2014-09-12T17:49:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "72d2c2341ceadb8aa7fa156c5dd435fe10c4bdee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1720": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91086839, + "lng": 10.73336362 + }, + "type": "LatLng" + }, + "description": { + "value": "Hellene på Rådhusplassen har store sprekker med høydeforskjell. Veldig ubehagelig på sykkel med smale dekk.", + "type": "String" + }, + "date": { + "value": "2014-09-12T17:21:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "43635bc4973ff042d7f70d15916314dcfc320a6c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1719": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90524162, + "lng": 10.74344873 + }, + "type": "LatLng" + }, + "description": { + "value": "skummelt trangt i sperringen ut fra den nye sykkelveien.", + "type": "String" + }, + "date": { + "value": "2014-09-12T17:17:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "1b7610e20d45772821157a2d4dcacd502a1b252c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1718": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92275355, + "lng": 10.63948631 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal vei og mye busstrafikk. Busser blir ofte liggende bak meg, eller forsøker seg på farlige forbikjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-12T17:15:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "53bde280b88c12c21f632254d09fc4188f274916.jpeg", + "type": "String" + } + } + }, + "aftenposten-1717": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93585994, + "lng": 10.73222637 + }, + "type": "LatLng" + }, + "description": { + "value": "Har flere ganger opplevd biler som kjører forbi svært nærme, sannsynligvis for å \"skremme\" syklister ut fra veibanen, ved to tilfeller har bilistene også bråstoppet etter forbikjøringen. Har heldigvis unngått ulykke, men kombinasjonen av sykkelfelt som \"forsvinner\" fra Sognsveien til Ullevålsveien og samt en del bilsters manglende respekt for syklisters sikkerhet er årsaken.", + "type": "String" + }, + "date": { + "value": "2014-09-12T17:11:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "3e3c270ba53d6db6ceca5a56ae2cdc8c665898aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1716": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9108146, + "lng": 10.73645353 + }, + "type": "LatLng" + }, + "description": { + "value": "Här går cykelveien genom en busshållplats med massa folk?!", + "type": "String" + }, + "date": { + "value": "2014-09-12T17:01:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "4b66bd0e0d050528ece1486fb1da2773d54daf10.jpeg", + "type": "String" + } + } + }, + "aftenposten-1715": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91182581, + "lng": 10.72718381 + }, + "type": "LatLng" + }, + "description": { + "value": "Här är det omöjligt att förstå var cykelveien är", + "type": "String" + }, + "date": { + "value": "2014-09-12T17:00:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "4a11b4720ff304d47f5959d2fcb63eae2068f512.jpeg", + "type": "String" + } + } + }, + "aftenposten-1714": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91650496, + "lng": 10.73460817 + }, + "type": "LatLng" + }, + "description": { + "value": "Här är det omöjligt att förstå var cykelveien är", + "type": "String" + }, + "date": { + "value": "2014-09-12T16:59:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "846bc92d5c82dbe761b18117f7136b9a5f24d71d.jpeg", + "type": "String" + } + } + }, + "aftenposten-1713": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91328879, + "lng": 10.64347743 + }, + "type": "LatLng" + }, + "description": { + "value": "Här har man lagt brosten som \"sticker upp\" på 4 platser för att cyklister ska sakta ned. Detta är extremt obehagligt att cykla på även i låg fart och svårt att balansera på när man har bagage på cykeln. Detta gör att många väljer bilvägen som går rett bredvid. Absolut inte cykelvennligt och väldigt irriterande och frustrerande.", + "type": "String" + }, + "date": { + "value": "2014-09-12T16:55:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "6561209c145e5faa7177aa8fe561a7ca81c41fc0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1712": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91286927, + "lng": 10.76160192 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist kolliderte med en eldre dame som gikk på rødt. Den eldre damen ble så sinna at hun slo syklisten med krykka si slik at hjelmen sprakk.", + "type": "String" + }, + "date": { + "value": "2014-09-12T16:51:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "5f33787c2b8b0e844a85b60fac5cc9c4afb91b17.jpeg", + "type": "String" + } + } + }, + "aftenposten-1711": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91159453, + "lng": 10.72657227 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter sykkleveien. Hvorfor? Behovet for god sykklvei slutter ikke selvom man begynner å nærme seg sentrum.", + "type": "String" + }, + "date": { + "value": "2014-09-12T16:43:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "01f24cd0a25543e0dc76148625ec681d911872dc.jpeg", + "type": "String" + } + } + }, + "aftenposten-1710": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91045421, + "lng": 10.72069287 + }, + "type": "LatLng" + }, + "description": { + "value": "Her ville det vært logisk å gi bilene vikeplikt. I prasksis fungerer det slik, forvirrende at reglene er motsatt. Hadde reglene samsvart med praksis ville dette vært en tryggere vei.", + "type": "String" + }, + "date": { + "value": "2014-09-12T16:37:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "1064517fe34fed24dcc4638278db6cc13438afba.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1709": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91016375, + "lng": 10.70954561 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er sykkelveien så dårlig at mange velger \"snarvei\" gjennom rundkjøring. Dette er dårlig tilretteleggning som skaper mange farlige situasjoner. Bygg sykkelveiene så gode at syklister foretrekker å sykle på dem, framfor skumle \"snarveier\"!", + "type": "String" + }, + "date": { + "value": "2014-09-12T16:32:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "fede4ae8b2e93bc9a778af37c52fd8ff9abbb0ed.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1708": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92275355, + "lng": 10.63948631 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal vei og mye busstrafikk. Busser blir ofte liggende bak meg, eller forsøker seg på farlige forbikjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-12T16:20:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "53bde280b88c12c21f632254d09fc4188f274916.jpeg", + "type": "String" + } + } + }, + "aftenposten-1707": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90893194, + "lng": 10.76827526 + }, + "type": "LatLng" + }, + "description": { + "value": "Vanskelig med kundeparkering for grønnsakbutikk like ved kryss med busser og stor trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-12T16:17:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "04ecba21af8ddb34f7bf48063ef35b23204e0a1f.jpeg", + "type": "String" + } + } + }, + "aftenposten-1706": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92675376, + "lng": 10.63919663 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er en sykkelfelle!", + "type": "String" + }, + "date": { + "value": "2014-09-12T16:16:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "674366380470e00b47b61561fca38d7507994c80.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1705": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92029082, + "lng": 10.76741695 + }, + "type": "LatLng" + }, + "description": { + "value": "trikker og mange busser. vanskelig å sykle.", + "type": "String" + }, + "date": { + "value": "2014-09-12T15:51:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "a4e6de8170b4ddead11ef6924af5d1fa1e61b4a6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1704": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92476447, + "lng": 10.78943252 + }, + "type": "LatLng" + }, + "description": { + "value": "mye trafikk på morgenen, busser i grenseveien og mange billister ut hasleveien", + "type": "String" + }, + "date": { + "value": "2014-09-12T15:47:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "f125190003641b1bfe5c3c4fa64d5fe2d72754a5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1703": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91049724, + "lng": 10.75067996 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvis man skal sykle mellom Jernbanetorget og Trelastgata: Smal vei deles mellom fotgjengere og syklister over \"plata\". Her kunne det vært god plass, men mange avsatser og sperringer gjør at syklister og fotgjenger må dele et par meter bred vei som består av midlertidig asfalt og ujevn brostein.", + "type": "String" + }, + "date": { + "value": "2014-09-12T15:26:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "b09c7337cae6ba6993234c6439d937dc5ffbd143.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1702": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9363168, + "lng": 10.73376059 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står det en stor gammel trestubbe på fortauet som gjør det halvparten så bredt som ellers. På en vanlig morgen er det fullt av både folk (bussholdeplass), sykler, og motoriserte kjøretøy her, og denne innsnevringen skaper en farlig flaskehals på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-12T15:11:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "c520f15a5a9749d90aa113f928826c815dfffd72.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1701": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9313878, + "lng": 10.7491672 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom syklende på sykkel/gå-vei ned Uelands gate. Måtte bråbremse for bil som kom fra venstre opp Claus Riis\\\\' gate. Veldig uoversiktlig på grunn av høy murkant. Veltet over sykkelstyret og landet på haka. Brakk biter av fire jeksler og måtte sy fire sting.", + "type": "String" + }, + "date": { + "value": "2014-09-12T15:06:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "43f1b327359fdd55dc7ab8c14b8afdc943077514.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1700": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9285924, + "lng": 10.8061695 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet går sammen med kollektivfeltet over holdeplassen på Økern hvor det stopper veldig mange busser. Blir en smal stripe igjen mellom buss på holdeplass og venstre felt. Utrygt inn mot rundkjøringen når man blir liggende mellom bussene på holdeplassen som skal ut etterhvert og biler/busser i venstre felt.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:57:58Z", + "type": "DateTime" + }, + "bilde": { + "value": "da4114e21365bd5d57fbea453f7b33f9.JPG", + "type": "String" + }, + "streetview": { + "value": "996406f310f99ed2c8195dd0a7d00bfd865078a6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1699": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92868916, + "lng": 10.76911211 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne \"rundkjøringen\" etter undergangen er totalt ubrukelig. Ligger store mengder gjørme og råtne blader der som man sklir på når det er fuktig. Veldig uoversiktlig, og man har flaks dersom man kommer seg forbi rundkjøringen uten å krasje med kryssende syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:56:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "e64f28e46c9910a62b3d0ad9727ff894d0b23726.jpeg", + "type": "String" + } + } + }, + "aftenposten-1698": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92714085, + "lng": 10.76582908 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter sykkelveien i intet, hva er det egentlig tenkt at man skal gjøre som syklist her?", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:55:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "15d7ea7c61865b40fd87b1c96b9aaaa1562909e2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1697": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94280348, + "lng": 10.8087337 + }, + "type": "LatLng" + }, + "description": { + "value": "Umulig å se noe ved påkjørselen/avkjørselen til undergangen. Alt for trangt rundt hjørnet til syklende og gående. Ikke spesielt farlig, for det er ikke mulig å holde høy fart her, men både syklister og fotgjengere skvetter til siden man kommer så brått på hverandre.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:52:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "6ec2866d19cb48c2276775d83d7cd5e06f648d3c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1696": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94531827, + "lng": 10.84346294 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig uoversiktlig, små barn kommer løpende ned bakken fra Sletteløkka hvor det er umulig å se noe pga høy hekk før de plutselig er midt i sykkelveien. Nestenulykker rett som det er, snart smeller det skikkelig...", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:49:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "a22cc132415c38a4add3884ca3f0adc57dd5e6f6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1695": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92794727, + "lng": 10.74962854 + }, + "type": "LatLng" + }, + "description": { + "value": "Skal may sykkle inn i Aleksander-Kjellands-rundkjøring kommende fra Falck Ytters plass, så finner man seg igjen mellom to kjørefelt i en hektisk situasjon hvor bilistene er så optatt av å spotte mulighet for å kjøre inn i rundkjøringen at de ikke ser på sykklister på høyre siden. Det trengs en rødt malt sykkelfelt helt inn i rundkjøringen.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:44:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "e21109578d7bdf563c7ab0239e2d29a72d0641d9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1694": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93148456, + "lng": 10.74230074 + }, + "type": "LatLng" + }, + "description": { + "value": "Her bor det en person som dagligs pleier å sette bilen på sykkelfelt for å stige av og åpne gjerdet til hagen og garasjen sin. Har foreslått en elektrisk portåpner med fjernkontroll til ham. Men nei, vi fortsatt møtes av og til på sykkelfeltet under rushtiden.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:42:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "73f8a7a88cbffcd463c4595c8a07fbb1f56cfa2d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1693": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93281766, + "lng": 10.73364257 + }, + "type": "LatLng" + }, + "description": { + "value": "Sushi-butikken på sydsiden har tiltrukket seg mange kunder som parkerer på sykkelfelt utenfor butikken for å hente middagen sin. Sykklister må vike inn i biltrafikken, mens billister ergrer seg over sykkler som ikke bruker sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:39:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "c5fa548dbd2a95a7e66f18ee87d8fdbb898c632f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1692": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93128028, + "lng": 10.73576688 + }, + "type": "LatLng" + }, + "description": { + "value": "Kunder til rengjøringsbedriften her parkerer bil på sykkelfelt når det leverer/henter sine klær. Skaper farlige situasjoner mellom sykklister og forbikjørende biler. Tiltak: økt kontrollvirksomhet med bymiljøetatens sykkelpatrulje.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:37:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "97a73a0ca69bd05bae956cd411b77fe70107661a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1691": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92222123, + "lng": 10.73177576 + }, + "type": "LatLng" + }, + "description": { + "value": "Trekant-Krysset foran Hogskølen er en farlig konstruksjon. Det er ikke klart om det bør brukes høyre eller venstre variant for å sykkle opp mot Bislett. Det er 2 trikksporer, og 2 muligheter å bli påkjørt fra høyre side. Her trengs det tydeligere regler og maling over hvem som skal ha prioritet.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:34:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "bdc3027b50c1b70a139f6a825891def3753d35e3.jpeg", + "type": "String" + } + } + }, + "aftenposten-1690": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94342682, + "lng": 10.7656145 + }, + "type": "LatLng" + }, + "description": { + "value": "Det pågår gravearbeider her, slik at den ene av de to parallelle veiene i parken er stengt og gravd opp. Foreslår at denne gjøres om til ren tofelts sykkelvei, mens den andre beholdes som gangvei. Veiene er også for smale.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:33:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "8de04e0139c29ee7bcc352df4a12db353aba590d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1689": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92310843, + "lng": 10.73274135 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien er trangt, for mye gatelangsparkering og dårlig sikt. Jeg opplever 2 typer farlige situasjoner her: 1) biler trenger seg forbi uten at det er nok plass til dette; 2) biler skyter ut av COOP-parkeringshus (hvor det er dårlig utsikt mot veien, siden biler kjøer opp fra kjelleren) og bilene kutter av forbikjørende sykkler.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:32:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "d31179a5f74399e5d6fdd064afc483bcfd6ae32f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1688": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91382663, + "lng": 10.7435131 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Grensen er en veldig krevende sykkelvei. Her er det trikkskinner, trikk, og biltraffik. Prioritert trafikk fra høyre, og trafikklys. I tillegg hopper det bestadig uoppmerksome fotgjengere som snakker på mobil eller bruker hodetelefoner ut på veien eller gangfelt uten å se på trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:29:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "24dd99f0ea4dce449bb704f4fc6f24dd7a7f1530.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1687": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93952537, + "lng": 10.71909427 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset på Blindern er sterk trafikkert av fotgjengere og bilister. Blindernveien brukes som kortvei til ring 3 for biler som kommer fra ring 2. Her er det alt for mye trafikk som ikke har universitetet som mål. Det er bestadig farlige situasjoner her og videre opp mot meteorologisk institutt. Mulige tiltak: sperring for gjennomkjøring med bil, 30-fartsgrense, sterk innsnevering av veibane til fordel for sykkelfelt, bom.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:21:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "46ed2e718cdc8a8225eecd41c65bd9e02cba378b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1686": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.97799321, + "lng": 10.76110839 + }, + "type": "LatLng" + }, + "description": { + "value": "Maridalsveien er så sterk trafikert av rulleskikjørere og sykkler at biler og busser mister tålmodighet og kjører forbi i farlige manøver. Her bør det vurderes en av 2 mulige tiltak: 1) forby rulleskikjøring eller 2) oprett bomring ved brekkekrysset hvor alle biler bortsett beboere og buss må betale 100 kr. per passering, for å tvinge friluftslivbrukerne over til buss.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:16:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "f3cda327a6b1649257612bc19d07273e5c08a6f3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1685": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95166888, + "lng": 10.76514244 + }, + "type": "LatLng" + }, + "description": { + "value": "Tidligere var det fint å sykkle forbi Gullhaug torg langs Akersleva. Men siden et regjeringsdepartementet flyttet inn, er hele veien sperret med betonblokker og andre sikkerhetstiltak. Skilting til alternativ sykkelrute er ikke på plass, som oftest når det gjennomføres store bygge- og anleggsarbeider i Oslo (for eksempel i Ullevålsveien, på Blindern, i Bogstadveien). Oslo kommune bør skjerpe rutiner med obligatorisk skilting av sykkelruter rundt byggeprosjekter.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:13:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "539299606a90d0efe9eb1ea5903184ec4d60fe32.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1684": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92311918, + "lng": 10.7404983 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt foran Bollywood bar ved Ullevålsveien/Bjerregårds gate er favorittholdeplass for drosjer som skal levere/hente festglade personer fra baren. Treffer ofte på drosjer som står i veien på sykkelfelter. Her trengs det en informasjons- og holdsningskampanje mot drosjenæring - og en pott med belønninger til de beste innsente mobilbilder av drosjer som står på sykkelstien.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:07:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "ea4e4de276941283a3150b762f4227348a4f0e8d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1683": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91318122, + "lng": 10.64181447 + }, + "type": "LatLng" + }, + "description": { + "value": "Ned en bakke, rundt en 90 graders blind sving og så rett ut i en kryssende bilvei - en oppskrift på ulykker! Ganske skremmende at dette er en relativt ny bru, bygd spesielt for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-12T14:03:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "486b5c87f775b7bf62e90abed4777cb4037d0c9f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1682": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92286109, + "lng": 10.74078798 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det parkering på innsiden av sykkelstien. 3 ganger i løpet av de 2 siste årene har en bilist svingt ut fra parkering uten å se etter om det kom noen syklister tråkkende oppver i sykkelstien og kjørt inn i siden på meg. Det går fint hver gang fordi det er en forholdvis bratt oppover bakke så jeg har lav fart.", + "type": "String" + }, + "date": { + "value": "2014-09-12T13:47:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "12d4810221ffa072d8bca5cc37500439d7463c66.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1681": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92679139, + "lng": 10.6391859 + }, + "type": "LatLng" + }, + "description": { + "value": "Fire veier går inn i samme kryss. To av veiene i krysset kommer ut fra tunneler. Og tre av veiene har en nedoverbakke inn i krysset. Man har altså ingen sikt og man får naturlig stor fart inn i krysset. I tillegg til sykler er det både barnevogner og fotgjengere som også har krav på å bevege seg gjennom krysset. Et håpløst kryss der man må stoppe helt opp for å unngå problemer.", + "type": "String" + }, + "date": { + "value": "2014-09-12T13:42:39Z", + "type": "DateTime" + }, + "bilde": { + "value": "75faf09e80dfe6554274d3a276c9780c.jpg", + "type": "String" + }, + "streetview": { + "value": "bf245d8ea6a910a7167e901a5fa8d6d0ecf005bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1680": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92676451, + "lng": 10.6391859 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummelt og uoversiktlig kryss mellom sykkelveiene langs Vækerøveien og Bærumsveien. Syklister kommer i nedoverbakke fra tre kanter, og spesielt når man kommer nedover Vækerøveien og ut av undergangen har man ingen sikt til sidene før man er helt ute i krysset. I tillegg går det mange skolebarn her. Det bør minimum monteres et speil i krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-12T13:34:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "fa0dfe2d2f6d9974f4ba90e16bd865713792183e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1679": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93239838, + "lng": 10.63888549 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele veien er en slak nedoverbakke fra Røa og sørover. I denne veien er det helt naturlig å få god fart, men hver morgen står bilkøen langt oppover veien. Man har da valget mellom å sykle mot trafikken eller å sykle på fortauet for å sykle forbi køen. Jeg velger å sykle på fortauet og må flittig bruke ringeklokka.", + "type": "String" + }, + "date": { + "value": "2014-09-12T13:33:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "4ea528337b348ab229391d6a9beea42c8e9b5abb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1678": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93606956, + "lng": 10.73200106 + }, + "type": "LatLng" + }, + "description": { + "value": "I ettermiddagsrushen kom jeg nedover på høyre side frem mot krysset. Bil nummer 4 åpner døra i det jeg passerer, jeg blir slått av setet og lander etter all hell på rumpa opp på fortauet. Resultatet ble røntgen på legevakta, heldigvis intet brudd, men kraftig forslått skulder.", + "type": "String" + }, + "date": { + "value": "2014-09-12T13:22:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "65e151836fdf504cce6b6ecd4a1f777c33b39062.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1677": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94013265, + "lng": 10.7300055 + }, + "type": "LatLng" + }, + "description": { + "value": "Opplevde i dag 2 nesten-ulykker på sykkel mens jeg kjøre gjennom rundkjøringen på John Collets plass. Jeg kom opp fra ring 2, og skulle videre til universitet langs trikk 18. Siden sykkelfelt bare slutter ved gangfelt, var den 1. nestenulykke en personbil som kjørte forbei meg på venstre side, for å så svinge til høyre i rundkjøringen rett foran meg. Typish situasjon når sykkelvei ikke merkes inn i rundkjøringen. Så kjørte jeg inn i rundkjøringen på ytre side (tvunget ditt av personbilen), for å så bli nesten påkjørt av en varebil som ville ut i Sognsveien, mens jeg var i ferd med å sirkle videre til neste avkjøring. Så stoppet varebilen og sjaføren kjeftet kraftig etter meg at jeg skal sykkle innerst i rundkjøringen når jeg skal til venstre. Det pussige var at han måtte jo har sett hva so", + "type": "String" + }, + "date": { + "value": "2014-09-12T13:02:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "c8d7aea1da5af65ae2c3e150485a0be4cc649631.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1676": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9478866, + "lng": 10.79245805 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange farlige forbikjøringer i disse svingene.", + "type": "String" + }, + "date": { + "value": "2014-09-12T13:01:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "cba55b649a84dd80152bbe7038ce58da253efaaa.jpeg", + "type": "String" + } + } + }, + "aftenposten-1675": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92174267, + "lng": 10.7574284 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det plassert trafikkskilt i sykkelfeltet. I mangel på andre parkeringsmuligheter for sykkel, brukes skiltene som sykkelstativ. Dette hindrer ferdselen i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:58:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "8cf293e25de32c6f989913653be2ef064e88b3d2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1674": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91962403, + "lng": 10.74798703 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kan det bli farlig når biler kjører forbi i Fredensborgveien og det kommer bil i mot på andre siden av svingen.", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:34:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "04478cd1c57f5c8bb5562b0abe4015072a66795e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1673": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92386656, + "lng": 10.75078725 + }, + "type": "LatLng" + }, + "description": { + "value": "Her forsvinner sykkelfeltet i forb med innsnevring ved fotgjengerovergang. En del skumle forbikjøringer der bil presser seg foran.", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:29:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "07f80b2b9e2c5149688c94bcf166522a58b9abc8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1672": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92676451, + "lng": 10.63910007 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist møter syklist. Undergang i nedoverbakke som ender i et \"T-kryss\" med en annen sykkelvei (og alle har nedoverbakke). Man kan ikkese noe før man er midt ute i krysset. Ingen speil eller hjelpemidler. Bare et tidsspørsmål før det smeller her.", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:28:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "653b97d81093cc670012afc3c8278977c2a7fde9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1671": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92545804, + "lng": 10.75013279 + }, + "type": "LatLng" + }, + "description": { + "value": "Her forsvinner sykkelfeltet i forb med innsnevring ved fotgjengerovergang. En del skumle forbikjøringer der bil presser seg foran.", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:28:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "d229ba7e1bab9000bb50d615927489c146a06b28.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1670": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92874292, + "lng": 10.6212902 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilforetning plasserer konsekvent biler og søppelkontainer på eller helt oppi gang- og sykkelveien.", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:14:04Z", + "type": "DateTime" + }, + "bilde": { + "value": "8952b2b67b44985456d9e59b168c025a.jpg", + "type": "String" + }, + "streetview": { + "value": "0f72d1930a1b2bfd2f47e8e9ff59d20c0887d8ed.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1669": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9190221, + "lng": 10.701535 + }, + "type": "LatLng" + }, + "description": { + "value": "Busser som stopper midt der man sykler og trang gate med mye trafikk, ouversiktelige kryss og vanskelig å velge hvilken siden man skal ligge på,", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:07:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "33e5aa2b96aa0e7aa25606c8d7451040188b20a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1668": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92060271, + "lng": 10.75741767 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt blokkert av container.", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:05:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "37bf4f94ac76addfca0f7163a3282354392dd49b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1667": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90732891, + "lng": 10.75891971 + }, + "type": "LatLng" + }, + "description": { + "value": "For smalt sykkelfelt i en veldig trafikkert gate, en blir lett \"klemt\" mellom bussene. Mange lyskryss og busstopp gjør at det er veldig vanskelig og uoversiktlig å sykle her. Gjør som de fleste, sykler på fortauet...veldig synd at det ikke en ikke lykkes med å finne en bedre løsning her på en helt ny vei!", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:04:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "9baf6490ce81678f52d74ef516e553f6f6544c08.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1666": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90985715, + "lng": 10.7647562 + }, + "type": "LatLng" + }, + "description": { + "value": "the whole of schweigaards gate is a building zone, with lots of offices and thus lots of pedestrians. and then they shut down the pavements. and turn off the traffic lights. Is there any body sensible in the city planning office looking out for the safety of cyclists and pedestrians?", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:03:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "bc9d0e608b0a8b56c8a34ccf296c3b2009fd1e21.jpeg", + "type": "String" + } + } + }, + "aftenposten-1665": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91068551, + "lng": 10.72883605 + }, + "type": "LatLng" + }, + "description": { + "value": "Må sykle mellom trikkeskinner et lite stykke fra Vika til Aker Brygge og havnet bak en annen syklist som kom inn fra høyre. Må krysse trikkesinna i bunnen av bakken og skled på skinna fordi jeg var mer opptatt av annen syklist. Brakk leggbenet i fallet, måtte sy i ansiktet og slo meg kraftig selv om farten ikke var særlig høy. Trikkeskinner og sykkel er en veldig dårlig kombinasjon.", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:02:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "9b47d87aa41c49035a5e8b293da28ac2b4305065.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1664": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9517441, + "lng": 10.86637973 + }, + "type": "LatLng" + }, + "description": { + "value": "Trafikkskilt plassert inn på fortauet. Skaper trengsel om to skal passere samtidig, og om det står en tredje og venter ved fotgjengerfeltet så blir det stopp. Unødvendig og farlig ! Skiltet viser feil vei til Trosterud. Pilen skal peke frem ikke til venstre.", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:02:17Z", + "type": "DateTime" + }, + "bilde": { + "value": "260b0c2cb56bae440f86682ee064765b.jpg", + "type": "String" + }, + "streetview": { + "value": "70cfee0842dd6d4c6e80950faf6032141474f73d.jpeg", + "type": "String" + } + } + }, + "aftenposten-1663": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91236368, + "lng": 10.74962854 + }, + "type": "LatLng" + }, + "description": { + "value": "Clarion hotel always have a lorry or van parked here. the cars are pretty impatient from the traffic lights and then there is a ridiculously placed zebra crossing!", + "type": "String" + }, + "date": { + "value": "2014-09-12T12:00:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "2336074089bb102f46be31a419025e17d0f0dbcc.jpeg", + "type": "String" + } + } + }, + "aftenposten-1662": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91215929, + "lng": 10.75458526 + }, + "type": "LatLng" + }, + "description": { + "value": "i pretty much cycle this roundabout holding my breath. there are no quick alternative routes into town from Schweigaards Gate. If you cycle on the pavement of the posten building, then you reach a bottle neck with pedestrians before Byporten, and the busy bus stop. there is no logical line a cyclist can take and i rely on the common sense of the drivers behind me whilst i signal!", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:58:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "478b4217f95b870292574c87f9a1ecad7374785e.jpeg", + "type": "String" + } + } + }, + "aftenposten-1661": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93576857, + "lng": 10.73733329 + }, + "type": "LatLng" + }, + "description": { + "value": "mangler sykkelfelt i store deler av kirkeveien her, god og bred vei, men ikke noe sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:55:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "b697f5f32b383a5ed25b0584aa7933826bbad3ed.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1660": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94239508, + "lng": 10.66326141 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet ned langs Sørkedalsveien i veibanen (for å unngå konflikten i kryss Morgedalsveien Sørkedalsveien nede i bakken). Kassebil bak er på hornet, jeg rister på hodet, hvorpå kassebilen presser seg forbi i svingen. Man bør ha 1 m avstand fra sykkel mot veiskulder og 1,5 m plass mellom bil og sykkel. Har fulgt sykkelveien etter dette.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:49:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "d00d98ea9a46aee726577904d4776862a27753fd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1659": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92711397, + "lng": 10.67548155 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom ovenfra Hoffsveien på sykkel i noe god fart og skulle svinge inn Engebrets vei. Bil i Engebrets vei kjørte ut for å kjøre ned Hoffsveien, brøt vikeplikten og jeg fikk så vidt svinget unna og bremset ned mot fortauet. Man kan ikke stole på at bilistene overholder vikeplikten.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:44:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "30560dfea972ea1b658451b6ef5c14ac44e6f4f4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1658": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94170723, + "lng": 10.67124366 + }, + "type": "LatLng" + }, + "description": { + "value": "I dette krysset synes bilene notorisk å bryte vikeplikten de har for de syklende. Det er vikepliktskilt før sykkelsti og fotgjengerovergang som er delt. Har opplevet at bilene kjører fram fra Morgedalsvegen selv når det er øyekontakt. Her har bilene vikeplikt for de syklende.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:37:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "511e738dff0f244d409c330dfc9956f7ec362d63.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1657": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92101138, + "lng": 10.74203252 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det store hull i asfalten. Når du kommer ned Ullevålsveien og skal svinge inn Frimanns gate så havner du midt oppi hullene.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:33:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "90b42c4282d8344ce542564d9d3cdad6255b0032.jpeg", + "type": "String" + } + } + }, + "aftenposten-1656": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94724438, + "lng": 10.64282072 + }, + "type": "LatLng" + }, + "description": { + "value": "På dette korte stykke vei er det svært mange hull og sprekk i veibanen, særlig I reting fra Røakrysset sørover.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:23:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "798fc0e084a95b05405043a28f4d6603c6799c48.jpeg", + "type": "String" + } + } + }, + "aftenposten-1655": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92685053, + "lng": 10.77196598 + }, + "type": "LatLng" + }, + "description": { + "value": "Delenengata + sannergata bør få sammenhengende sykkelvei, her er det veldig mange som sykler og det finnes ingen sykkelvei, ring 2 går for langt opp og det er ikke noe lenger ned. Dette er en naturlig rute for alle som kommer fra øst og kjører gjennom tøyenparken som kommer fra ensjø og østover.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:17:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "36875148662ed2c1eeca427715b3809fef7a7499.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1654": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91084687, + "lng": 10.7918787 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei mot etterstad fra ensjø slutter plutselig. Mange sykler fra bryn og etterstad, kommer ned etterstadkroken og videre ned etterstadsletta og ut i rundkjøringene ( to rundkjøringer ) før man er på sykkelveien. Her har det vært flere nesten ulykker, biler respekterer ikke syklene i veien i det hele tatt.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:15:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "12b2be42babca97b48c7f0c601348b26ab1bd311.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1653": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9145043, + "lng": 10.78773736 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble påkjørt av bil to ganger. Når biler skal svinge til venstre i krysset i bunnen av bakken legger bilene som er i kø ned mot krysset seg plutselig over i sykkelfeltet for å kjøre rundt bilen, dette har tvunget meg til å hoppe med sykkel opp på kanten, blomsterbed med kantstein, jeg har ødelagt to felger på dette. bilene kjører bare videre uten å ane at de har forårsaket en ulykke.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:10:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "5868340338c1e81bcfc63141deefbad88c58abae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1652": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91645656, + "lng": 10.78210473 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble påkjørt av bil. Veien går fra ett til to felt ned mot lyskryss. sykkelfeltet som går langs enjøveien er plutselig borte, men kommer tilbake nærmere lyskrysset. Er det kø i venstre felt mot lyskrysset legger bilene seg plutselig ut i sykkelfeltet til høyre for å kjøre rundt køen, her har jeg blitt påkjørt av bilist to ganger, Begge gangene uten at jeg ble fysisk skadet, men det er fordi jeg ser dette kommer til å skje", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:07:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "637fd786e4eae4622dcd7383bf339e679531fe95.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1651": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91306289, + "lng": 10.80132007 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei langs riksvei 190 forsvinner ut i en holdeplass før veien fortsetter gjennom undergangen ut på etterstadsletta, her ble jeg rygget på en gang av en bli som ikke så seg for som har parkert ulovlig ved grønsaksbutikken på helsfyr. Grønnsaksbutikken har de siste årene spist mer og mer av uteplassen som gjør at det er daglig konflikt mellom ventende og paserende enten det er til fots eller sykkel... Her er det anarki.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:04:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "c4f753d2f5f69f5dad56c91aac4004deae6aad43.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1650": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92601182, + "lng": 10.73851346 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene som står parkert til høyre for syklistene, er en fare for oss syklister. Det har skjedd flere ganger at bilistene ikke er oppmerksomme på at det kommer sykler bak dem når de kjører ut på veibanen.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:02:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "535a31669a4f60dc10556149c67f17c1f9b29195.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1649": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91363301, + "lng": 10.74978947 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det enveiskjørt og parkering på begge sider opp mot Youngstorget. Vil man opp til Youngstorget og østover på sykkelveien Torggata, må man opp i motsatt retning av bilene her - ingen plass til syklistene. Alternativet er å ta Storgata der det er busser, trikker, biler og ingen plass for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:01:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "558b36a8d9331f1496577c440b2ffe8644bb653b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1648": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91263261, + "lng": 10.76231002 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble \"klippet\" av en bilist som helt plutselig åpnet døra da jeg kom syklende i sykkelfeltet ved Hoggar. Gjorde en krapp unnamanøver som gjorde at jeg havnet foran 37-bussen, hvor sjåføren heldigvis var oppmerksom og klarte å bremse.", + "type": "String" + }, + "date": { + "value": "2014-09-12T11:00:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "9ec18fa3aaac55d68a5c3290d03eb1a055d927b1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1647": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93706388, + "lng": 10.73111057 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilistene respekterer ikke markert sykkelvei når man nærmer seg krysset Sognsveien/Kirkeveien. Markert sykkelvei på bakken fra J. Colletsplass ned til Kirkeveien har hatt dype sporer alle de over 10 årene jeg har syklet her.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:59:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "548a5fda363bd12626133013fdb6f6def723de8e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1646": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91270253, + "lng": 10.76229929 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler her daglig, og det er alltid biler som parkerer i sykkelfeltet, åpner dører, svinger inn foran syklister osv. Taxikøen ved Grønland torg er også et problem. Savner reaksjoner fra politiet som patruljerer OFTE - også overfor syklister som ikke overholder lysreguleringen i kryssene Grønlandsleiret/Tøyengata/Tøyenbekken/Motzfeldtsgate/Lakkegata og Kristian Kroghs gate.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:57:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "a077ccea0b7e6820ba7f812c6d013b7f652b8c34.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1645": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91782253, + "lng": 10.71550011 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kommer mange syklister nedover Gyldenløves gate. Krysset med Niels Juels gate er stort og bredt, og mange biler passerer her. Dette er også skoleveien til mange. Har observert flere tilfeller hvor bil har kommet borti syklist.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:54:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "4cddc9ae66fe3417923f523226448946854fe08c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1644": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90639287, + "lng": 10.76121568 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset Dr. Eufemiasgt./Bispegt./Kong Håkon Vs gt. Her har det utviklet seg en ukultur med at busser som kommer fra sentrum og skal sørover kjører på rødt lys flere sekunder etter at fotgjengere og syklister har fått grønt. Opplever nesten daglig nesten-ulykker her ved at syklister som allerede er i veibanen møter en kryssende buss som svinger til høyre.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:46:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "750b63a813f506c5f5980e0ae8fa4962b693f474.jpeg", + "type": "String" + } + } + }, + "aftenposten-1643": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92825371, + "lng": 10.7145667 + }, + "type": "LatLng" + }, + "description": { + "value": "Gateparkering i tungt trafikkert gate, med smalt sykkelfelt. Har observert mange neste ulykker i dørsonen.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:46:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "d1a6f0b10d7ee6a44eb173ffd1b610a8b356624e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1642": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92899022, + "lng": 10.71600437 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele krysset er utrolig uoversiktlig, samtidig som det er veldig mye trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:44:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "bed590872de2e478ab1ae11cf3177e0baae26da6.jpeg", + "type": "String" + } + } + }, + "aftenposten-1641": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92779674, + "lng": 10.71346163 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig vei. I forbindelse med en innsnevring av veien, så er sykkelfeltmarkering er slitt bort. Her skjer det utrolig mange nesten ulykke. Forholdene har vært slik i mange år.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:42:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "01a7774de4ccb9354ea43d1adbb09c8116a84608.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1640": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91802151, + "lng": 10.74018716 + }, + "type": "LatLng" + }, + "description": { + "value": "Uklart om dette er en rundkjøring! Burde det ikke være det?", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:35:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "4574505418e7545787655df26f3f89e477532994.jpeg", + "type": "String" + } + } + }, + "aftenposten-1639": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90967426, + "lng": 10.71746349 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette partiet kan man kalle \"det livsfarlige gjerdestrekket\". Når man kommer vestfra så går det fra å være adskilt sykkel og gangveier til plutselig å være en smal vei hvor både gående og syklister skal ferdes. Og her er det mange turister pga fergene. Ekstremt dårlig tilrettelagt strekning.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:14:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "8fdea1bb0efaf4c9190db78242c2c05e1656046e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1638": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9202091, + "lng": 10.72323759 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Oscarsgate er en sykkelfelle, dype hull i asfalten gjør den livsfarlig.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:10:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "67b09dc504fdb99c30100e4d83ff944b293908d9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1636": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.86664621, + "lng": 10.79376697 + }, + "type": "LatLng" + }, + "description": { + "value": "\"ny restaurert kryss\" ifm skole. Foreldre som tydeligvis kjører barn til skole krysser sykkelfelt og parkerer i sykkelfelt som de \"finner det for godt\". Slak bakke nedover (sørover retning) medfører stort fart og med mye biltrafikk er det svært uoversiktlig og farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-12T10:01:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "f9ecce214cc7ec341c173ebab124349cc5429b07.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1635": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.78908328, + "lng": 10.79865932 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil bakfra som kjørte forbi meg inn mot kryss og plutselig oppdaget bil midt i veien som skulle svinge til venstre. Dratt med av bilen når sidespeilet traff meg i ryggen.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:55:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "7451ca4c0b56688e48222349e8e48c9ca161d909.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1634": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85491875, + "lng": 10.49085974 + }, + "type": "LatLng" + }, + "description": { + "value": "Her skulle jeg svinge til venstre og inn i undergangen på sykkel / gangvei. Ble påkjørt av sykkel i stor fart som kom bakfra. Er mer nervøs for andre sykelister enn alt annet når jeg er ute og sykler. Mer nervøs på sykkel en på MC i trafikken. Veldig mange (mannlige) sykelister tar IKKE hensyn, men er bare på jeg og meg og mitt..", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:48:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "952139d57d7ca30b7e182f0a2665d81909cee6e9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1633": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96126771, + "lng": 10.77281355 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktelig undergang under togskinnene. Syklister kommer med stor fart fra Neptunveien uten å kunne se om det er noen i tunnellen, eller på andre siden. Det hadde hjulpet mye med speil.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:45:51Z", + "type": "DateTime" + } + } + }, + "aftenposten-1632": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9404336, + "lng": 10.82202672 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkel-/gangvei som blir avbrutt midt i av bilvei uten fotgjengerovergang.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:35:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "dbf11f51d085c544deefcd6a51ff444192cb0909.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1631": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92054894, + "lng": 10.67536354 + }, + "type": "LatLng" + }, + "description": { + "value": "Vært knotete, men håper det blir bra nå", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:33:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "0e32c8cc83e84891cf91ffaa2d594594b4de2791.jpeg", + "type": "String" + } + } + }, + "aftenposten-1630": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93751535, + "lng": 10.68278789 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykt dårlig løsning!", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:33:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "f2a006f568c8049d29a26becec6b801197478803.jpeg", + "type": "String" + } + } + }, + "aftenposten-1629": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94919218, + "lng": 10.73109984 + }, + "type": "LatLng" + }, + "description": { + "value": "Må få til planfri kryssning her", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:32:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "30730bd3528b811356ffe33473df8aa8690182f0.jpeg", + "type": "String" + } + } + }, + "aftenposten-1628": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88183134, + "lng": 10.78398227 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister svinger til høyre opp Marienlundveien, over sykkelfelt, og ser ikke om det kommer syklister. I tillegg svinger bilister litt til høyre inn i sykkelfeltet når de krysser trikkelinjene, fordi møtende bilister som skal inn Marienlundveien har lagt seg over på \"deres\" side i krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:27:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "7879ffa6810cbab2509e7cc0f268f8f0a7a14b3c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1627": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88052311, + "lng": 10.78613877 + }, + "type": "LatLng" + }, + "description": { + "value": "Her e det sykkelfelt, men det (og halve kjørebanen) er så å si alltid blokkert av biler. Alle \"skal bare\",\"selv om det er både P-hus og P-plasser ca 50m unna. Det har skjedd flere ulykker her i sommer.\"", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:25:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "efee7c61e8bb399f4c5097fdd66fb7223d733aec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1626": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93022666, + "lng": 10.71870803 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg kom syklende ned i sykkelfeltet og en bil svingte inn plutselig rett foran meg uten å bruke blinklys. Jeg måtte bråstoppe og hoppe over sykkelstyret.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:25:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "d24e5fbb34bc799417ab98091f6f0661be4af407.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1625": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8785795, + "lng": 10.78743696 + }, + "type": "LatLng" + }, + "description": { + "value": "Flere uker (måneder?) etter nyasfaltering er det fortsatt ikke merket sykkelfelt i Ekebergveien. Biler bruker derfor hele kjørebanen, og det er veldig lite igjen til syklister. Farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:24:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "8640e479cf763f1546dc6699e850445094c6cd77.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1624": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87099245, + "lng": 10.79055905 + }, + "type": "LatLng" + }, + "description": { + "value": "Her stopper Ruters busser i sykkelfeltet, på en \"midlertidig holdeplass\". De blokkerer sykkelfeltet og halve kjørebanen. Mange skumle forbikjøringer. Dette er i tillegg rett før to kryss og et trafikklys. En utrolig dårlig \"løsning\" som gjør det farlig å sykle.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:23:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "279b9a138b34a93289bc5e71358e09554f2955e8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1623": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90936227, + "lng": 10.81322908 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke en eneste sykkelparkeringsplass på Brynseng. Her er det masse plass.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:22:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "4e6989c0040aa39ecb58f30b7c6ab72fdb4969ca.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1622": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87221489, + "lng": 10.80799341 + }, + "type": "LatLng" + }, + "description": { + "value": "Opp denne bakken i Lambertseterveien er det bratt, og det går sakte for syklister. Utålmodige bilister kjører ofte forbi, selv om dette er en \"blind\" sving. Har opplevd mange farlige forbikjøringer og nestenulykker. Her bør det bli sykkelfelt. Noen hundre meter lenger frem tar syklisten ofte igjen bilisten ved rundkjøringen.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:21:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "332b06fbd1d684afe59a2358b2ad7823967c4820.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1621": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.911374, + "lng": 10.80567598 + }, + "type": "LatLng" + }, + "description": { + "value": "Overgangen fra Strømsveien til gang- og sykkelveg videre mot Helsfyr er ikke god. Kun et gangfelt over veien, ikke skiltet og selve undergangen i kulverten er trang og mørk. Bedre skilting, utvidet sykkelveg, og ny oppmerkning trengs her.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:20:40Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1620": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87452503, + "lng": 10.81154465 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet ved Lambertseter senter brukes til parkering. Mage står bare her kort tid, men det er nesten alltid en bil som klokkerer både sykkelfelt og kjørefelt. Busser fra Ruter står ofte parkert i sykkelfeltet. Sykkelfeltet er i praksis ubrukelig mye av tiden.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:19:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "0fa6ae01fcd2b657c511347db3e69bbb38bda30f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1619": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92464532, + "lng": 10.7592154 + }, + "type": "LatLng" + }, + "description": { + "value": "Grønnsaksbutikken har varer så langt ut på fortauet at kundene blir presset ut i sykkelveien.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:18:29Z", + "type": "DateTime" + }, + "bilde": { + "value": "2246c1a025e1a74655f08e6152c6ed99.jpg", + "type": "String" + }, + "streetview": { + "value": "ba0dd0a096bbc2148af0e4ab02983d321127c244.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1618": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87402425, + "lng": 10.81261754 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man sykler inn mot rundkjøringen, forsvinner (som vanlig!) sykkelfeltet. Her er det ofte nestenulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:17:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "a8bdbbd8ff6ded8687dfca6fc63f871ca5dbb71f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1617": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8654828, + "lng": 10.81436634 + }, + "type": "LatLng" + }, + "description": { + "value": "Langbølgen er blokkert av gateparkering. Nå er det planer om sykkelfelt, men beboere som ikke vil miste gratis P-plasser på kommunens område mener sykkelfelt er \"mijøskadelig\". Utrolig, men sant: https://minsak.no/sak/575?msg=comment", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:17:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "4cdfb4a1cfe04d252aa5d0c97824b5fdd603b56b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1616": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90600016, + "lng": 10.76780319 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er veldig liten plass ved siden av trikkeskinnene. Jeg har gjentatte ganger blitt passert med kun centimeters klaring, og ved et par anledninger mistet balansen og sklidd på trikkeskinnene.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:16:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "068514781597801a22405c319b2284f721a2c233.jpeg", + "type": "String" + } + } + }, + "aftenposten-1615": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8611951, + "lng": 10.81758499 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det bred, fin vei og god plass til sykkelfelt. Hvorfor er det ikke malt opp? Nå er det, til tros for god plass, farlig å sykle her. Biler bruker hele veien. Gjeløder hele strekningen, begge sider.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:15:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "d78585d49a86177bf07fb1e35df6d8d668b5e305.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1614": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91845172, + "lng": 10.68989038 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er en avkjøring fra E18 hvor bilene kommer i stor fart og brått inn mot et lite oversiktlig lyskryss (trær etc.). Farten er i seg selv et problem, fordi enkelte biler har så høy fart at de tillater seg å kjøre på rødt. Det burde iverksettes tiltak for å begrense bilenes fart inn i krysset. Risikoen øker fordi trafikklyset for gående/syklende skifter for raskt til grønt etter at bilene har fått rødt lys. Senest i går så jeg en kvinne gå ut i krysset på grønt, samtidig som en bil kom fra E18 i stor fart og kjørte i det lyset hadde skiftet til rødt. Kvinnen hoppet tilbake og bare flaks hindret en alvorlig ulykke. Det derfor bør legges inn en større forsinkelse i trafikklyset for de gående/syklende.", + "type": "String" + }, + "date": { + "value": "2014-09-12T09:12:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "3012b2655e7207bf929d3838c4627e31115102b4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1613": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89776289, + "lng": 10.75919866 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er vel bare Lance Armstrong som har hatt suksess i nedre del av Kongsveien. Farlig ned fra der sykkelfelt slutter. Farlig opp uten sykkelfelt og kun teoretisk mulighet for å bruke fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:56:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "8df729fd0d28447a169b0600e673ec56bcdabb85.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1612": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91099748, + "lng": 10.73269844 + }, + "type": "LatLng" + }, + "description": { + "value": "Rådhusplassen er en katastrofe! Hvorfor ikke asfalterte sykkeslpor?", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:53:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "5ee18ac54c3ecf99c16bc0f337aeab51a41372aa.jpeg", + "type": "String" + } + } + }, + "aftenposten-1611": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93515046, + "lng": 10.74411392 + }, + "type": "LatLng" + }, + "description": { + "value": "Bredden på fortauet i krysset (Nordsiden mot Sagene) er meget underdimensjonert i rush-tiden med tanke på at mengder av syklister og gående krysser her hele tiden. Det grønne lyset for gående/syklende varer dessuten alt for kort. På begge sider av krysset blir fortauet ofte blokkert av gående som venter på grønt lys i motsatt retning (sør). Her kunne det med fordel tatt en liten bit av parkeringsplassene foran bensinstasjonen på hjørnet og evt. av Oslo Skolehage på andre siden for å gi mer plass til alle som befinner seg der samtidig. I verste tilfellet kommer man syklende fra nattevakt på Ullevål med den blendende morgensolen midt i øynene og forsøker å krysse over krysset samtidig med at en horde syklister som skal på jobb stormer mot deg fra andre siden, det er nesten så man må stoppe m", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:43:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "413a3ec5d50dd4e6b0a8166eaabe4d245625b29b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1610": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90626376, + "lng": 10.76555013 + }, + "type": "LatLng" + }, + "description": { + "value": "I retning mot byen (vestover) Venteplass for busser på innsiden av sykkelfeltet, og et par meter senere avkjøring for biler mot Oslo S. Endel biler (og busser) følger ikke vikepliktsreglene for syklene på innsiden eller lar være å se i speilet. Veldig farlig løsning, siden det er nedoverbakke og mange syklister kan ha stor fart. Hele denne korte veistrekningen er preget av en rekke dårlige løsninger som skaper mange uoversiktlige og farlige situasjoner. Stor trafiikk av syklister her.", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:39:44Z", + "type": "DateTime" + }, + "bilde": { + "value": "c082f7e82b7c672b0387628bf685f067.jpg", + "type": "String" + }, + "streetview": { + "value": "186891d8c1e3993f79be9374ebbb293d8aa47461.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1609": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9093761, + "lng": 10.7434243 + }, + "type": "LatLng" + }, + "description": { + "value": "Her går døra til restauranten Statholdergaarden rett ut i sykkelfeltet. Potensiellt svært farlig både for syklist og den som uheldigvis åpner døra når syklisten kommer i stor fart...", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:38:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "65bcb1835b0f4d59c3d4ce6a3988c57323693281.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1608": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95210403, + "lng": 10.75080871 + }, + "type": "LatLng" + }, + "description": { + "value": "Skoleelev kom syklede nordfra og krasjet rett i glassinnsamlingscontainer som er plassert på fortauet ved busskuret. Han hadde heldigvis hjelm.", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:30:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "a2bc5ed4ea035d96c4bd433a098e5cd265c3554d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1607": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94366326, + "lng": 10.77501296 + }, + "type": "LatLng" + }, + "description": { + "value": "Ekstremt hullete vei. Har vært det i veldig mange måneder. Utrolig at ikke ulykker skjer her. Både syklister og bilister opplever store hull i veibanen og rundt trikkeskinner. De har satt opp et skilt som varsler hullete vei..ansvarsfraskrivelse!!", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:16:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "14ed8dfe4b9aa43fe83e159517e328175073d9b7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1606": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90195979, + "lng": 10.76711654 + }, + "type": "LatLng" + }, + "description": { + "value": "Nederste del av Kongsveien er en katastrofe som sykkeltrase. Her er det farlig både som syklist og fotgjenger. Virker som kommunen har satt opp et sykkelskilt og så glemt resten. Det minste en kan gjøre er å redusere fartsgrensen. Reduser også farten i overste del av kongsveien. Tullete med 70grense på sykkeltrase!", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:07:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "a2940b43311d7db8e83d78baebcf3ce2e70a9afe.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1605": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9119818, + "lng": 10.73145389 + }, + "type": "LatLng" + }, + "description": { + "value": "Overgangen Dronning Mauds gt/Rådhusplassen er helt håpløst nå (Matmessen + den nye bussveien) med uoversiktlig inngjerdinger, parkerte biler og syklister og forgjengere presset sammen i full forvirring - uten å nevne trikken.", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:02:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "3e80899adc36c6108628c613c98588902a6548ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1604": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91065861, + "lng": 10.72396516 + }, + "type": "LatLng" + }, + "description": { + "value": "Lysregulert sykkelvei her. Men mange \"turbosyklister\" respekterer ikke rødt lys og kaster seg forbi ventende syklister og fotgjengere. Ut i bilveien og over.", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:02:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "680a2709951695b795158fc638e4fc3e3fbf12e4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1603": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91043808, + "lng": 10.72074651 + }, + "type": "LatLng" + }, + "description": { + "value": "Hovedsykkelvei som går ut i sterkt traffikert vei uten lysregulering", + "type": "String" + }, + "date": { + "value": "2014-09-12T08:00:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "cdb2b6f2411ade7f254ae891e6b6eaded750cd94.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1602": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9108146, + "lng": 10.73271989 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele strand strekningen herfa og til Tjuvholmen er full av varebiler, taxier, trikk, syklister og fotgjengere i herlig blanding. Ingen avmerkde adskilte muligheter.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:59:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "cf1860c9bf494f37eed4aac36896ef4934176349.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1601": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96027949, + "lng": 10.89497208 + }, + "type": "LatLng" + }, + "description": { + "value": "Ny sykkelvei har blitt lagt bak busskuret, og åpnet i dag, 12. september 2014. Men det er jo blitt farligere med en krapp sving hvor en spiss fjellknaus står rett ut mot syklistene. Hvordan er det mulig?", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:58:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "b7cd707a7bb3adee3a594a7ce6cd363738b2864d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1600": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90972805, + "lng": 10.73473691 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det en bom. Mulig å sykle på siden bak parkerte biler. Uoversiktelig", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:57:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "028973de28733cdce75b1aa834aea7c2edf81d42.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1599": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90509098, + "lng": 10.73825597 + }, + "type": "LatLng" + }, + "description": { + "value": "Fra o ginn i denne veien kommer biler og lastebiler fort inn og ut i begge filene lenger ned. Var nylig ulykke her også. Syklist som ble påkjørt.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:56:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "cfec402939f0cab7e0f9e45bcc601d0f3731f43c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1598": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90906104, + "lng": 10.75115203 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele strekningen er dårlig, uklar sykkelmering som kommer og forsvinner. Masse fotgjengere og syklister, skulle vært adskilt sykkel og gangvei, selv der det er en liten strekning med adskilt sykkelvei, trår fotgjengere over. Alt avsluttes i ett stort lyskrys fotgjengeroverganger.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:54:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "7757c6f8335eb4d62de3b73c51abfb0f1b20f8a6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1597": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87288264, + "lng": 10.77926158 + }, + "type": "LatLng" + }, + "description": { + "value": "Fryktelig uoversiktelig. Biler som heldigvis stort sett er obs.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:51:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "04675768be129a0a8a1e0098857e40a14af3ac5e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1596": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87093859, + "lng": 10.79064488 + }, + "type": "LatLng" + }, + "description": { + "value": "Buss parkerer her i sykkelfeltet i lengre tid i påvente av passasjerer. Bør kun stå der ved av og påstigning.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:48:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "9d0e9ae7ee1c13b67b222a26e5171fbe887d1d5e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1595": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87057777, + "lng": 10.79021573 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktelig kryss, med biler, trikk, bom, lys og fotgjengere. Skulle sykle inn bak og mellom en varebil som stod stille, så ikke umerkede stålrør på taket, og fikk rørene over ansiktet, blåmerke i panna 6 sting i kutt under øyet. Glad for at øyet ikke ble skadet. Bil forsvant når jeg fikk karret meg ut av trikkeskinner og bort på fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:46:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "fbf1e580878f570133a7c09a2f978ec73baf6ff3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1594": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94140629, + "lng": 10.75233221 + }, + "type": "LatLng" + }, + "description": { + "value": "Trang gate med bilparkering og midtrabatt. Her ligger ofte biler bare én til to meter bak meg, selv om jeg holder en akseptabel fart. Og at vi ender opp i kø fram mot rundkjøringen lenger ned uansett. Hvorfor opphører trafikkregelen om avstand for bilister når han eller hun ligger bak en syklist eller mopedist?", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:40:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "ed79646f386b68b2fda9fbf3aec30cbf994964d0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1593": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91635438, + "lng": 10.78089237 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner plutselig rett før krysset, før merkingen fortsetter igjen etter få meter. Tanken er nok at biler skal kunne komme forbi andre biler som venter på å komme til venstre mot Kampen. Her skal visst bilene ha førsterett, uansett. Flere nestenulykker her, da biler plutselig vrenger ut i sykkelfeltet uten å se seg for.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:37:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "643069b83fa7c3fc1790f0f3ac3fa0db75d12567.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1592": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91869909, + "lng": 10.76235294 + }, + "type": "LatLng" + }, + "description": { + "value": "Begynnelsen av Trondheimsveien har adskilt vei ved trikkeholdeplass som munner ut i et dårlig merket kryss med to felt og trikkelinjer. Burde vært bedre merking og helst en merket sykkeltras.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:33:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "758f137db59be471c11d74ba3a96767177f2bf25.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1591": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93599969, + "lng": 10.73267698 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei oppover i sykkelfeltet for å krysse Ring 2 blir jeg påkjørt av en varebil som svinger til høyre slik at pedalen hekter i bilen og jeg velter r ut i krysset og blir liggende. Flere biler må bråstoppe. Varebilen havner på midtrabatten. Jeg er uskadd og samler veske sykkel og løse småting. Går bort til varebilen og avreagerer overfor en meget blek sjåfør. Varebilen stikker av. Får ikke tatt nummeret. Et vitne melder seg. Er ikke i stand til å samle meg og ringe politi før alt er over og jeg karrer meg gjennom trafikken tilbake til fortauet. Flaks for meg at det gikk bra.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:26:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "34497e20eed30875ee5ac6ec8964de62ec377e9f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1590": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92820532, + "lng": 10.71439504 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det merket et ekstremt smalt sykkelfelt, men det må være for syns skyld. Med tre kjørefelt, busser og bier som svinger til høyre opp Sørkedalsveien, er dette en sikker oppskrift på ulykker. Hvis noen tør å sykle der i det hele tatt.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:16:19Z", + "type": "DateTime" + }, + "bilde": { + "value": "8b1c284e154b8ab187e5d5c036aec943.png", + "type": "String" + }, + "streetview": { + "value": "48761a84b21088d2f9401c1eeccb38fc83b4d64d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1589": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94054645, + "lng": 10.71656227 + }, + "type": "LatLng" + }, + "description": { + "value": "Bro over Bindernstasjon har 2 skarpe 180-graders svinger som ender opp på perrongen - kunne ha vært ungått ved å forlenge broen opp mot UiO.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:15:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "016b25dab0ada3fd9f6983831a3ef6ee01f38c91.jpeg", + "type": "String" + } + } + }, + "aftenposten-1588": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.930947, + "lng": 10.72087526 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det 1m bredt sykelfelt, i en av Oslos mest trafikkerte gater. Dette er ekstremt smalt, og livsfarlig. Ingen kan sykle trygt på 1m i tung trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:14:33Z", + "type": "DateTime" + }, + "bilde": { + "value": "ad406ed7cdae0aed9e8608482ce8c94c.png", + "type": "String" + }, + "streetview": { + "value": "482577759bdb32515e5fcf74356c62a51d0619f3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1587": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93776257, + "lng": 10.68274497 + }, + "type": "LatLng" + }, + "description": { + "value": "Oslos minst intelligente kryss. Kommer man fra Røa og skal østover, må man igjennom 2 360-graders svinger, over 2 t-bane peronger før man svinger blindt inn i en undergang.Skal man langs Sørkedalsveien så går sykkelveien over/langs hele t-baneperrongen.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:11:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "2a4607e14022cc5115dda0dbb6079bffc01bd424.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1586": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92687741, + "lng": 10.63652515 + }, + "type": "LatLng" + }, + "description": { + "value": "Lite oversiktlig kryss. Lett å kollidere med biler.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:08:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "1111a0b83c7adeed162acef3dc2ceea0d1d8bdef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1585": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94877849, + "lng": 10.60850143 + }, + "type": "LatLng" + }, + "description": { + "value": "RV 168 Griniveien. Ingen sykkelfelt. Mange syklister/joggere/rulleskiløpere i veien (70-sone).Planlagt sykkelsti vil være avbrutt av alle krysninger og dette vil medføre at transportsyklister vil velge denne bort. Revidere plan?", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:07:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "5b810b1063ef8634b0ae95b16bba4f707ca49b8d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1584": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93566645, + "lng": 10.74102401 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det helt texas hver morgen og ettermiddag. Mange, mange syklister (kanskje spesielt ansatte på sykehusene) sykler i full fart på smale fortau på begge sider av veien. Stot risiko for både gående og syklende. Her burde det absolutt vært et sykkefelt i hver kjøreretning!", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:05:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ca7cac530a61b06c7439698d8d28aaee6b43a46.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1583": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91322963, + "lng": 10.64232945 + }, + "type": "LatLng" + }, + "description": { + "value": "Tverrsgående striper av grov brosten for å markere kryssende vei. Reduserer bremseeffekt drastisk og vrir oppmerksomheten bort fra trafikken til å ha det minst mulig vondt over disse stripene.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:05:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "d852448bfd2fb12a7dcea76eddc3a2bbb4525387.jpeg", + "type": "String" + } + } + }, + "aftenposten-1582": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92054894, + "lng": 10.62759876 + }, + "type": "LatLng" + }, + "description": { + "value": "Volsveien er sterkt trafikkert både av syklister og bilister. Bussene står fast i kø og syklistene har ikke noe plass bortsett fra i motgående kjørefelt. Fortauet er trangt og ubrukelig - og har skildd ut/ned mot Lysakerelven flere steder. Stenge denne for rushtidstrafikk?", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:01:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "89ca52d07445850eb4d5db1a4a69664afaf2dab7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1581": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91272942, + "lng": 10.76192378 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet gjennom Grønlandsleiret foregår med hjertet i halsen. Her er det ALLTID biler parkert mitt i sykkelfeltet. En travel taxiholdeplass med biler inn og ut bidrar også til farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-12T07:01:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "9f4011655be554b769050dc4c40f61d58a79d3aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1580": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94182545, + "lng": 10.67109346 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig kryss. Blir værre når den amerikanske ambassasden og ansatte og gjester som ikke kjenner krysset kommer. Manglende merking. Under planarbeidet foreslo jeg over- eller undergang, men kommunen ville ikke med begrunnelse av at syklister ikke ville sykle \"så mye opp og ned\". Venter på første alvorlige ulykke...", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:56:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "984ff0f279edc96f604992606f38263c61f09a78.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1579": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93187159, + "lng": 10.76231002 + }, + "type": "LatLng" + }, + "description": { + "value": "Den fine sykkelveien Christian Michelsens gate forsvinner brått og brutalt i Marcus Thranes gate, og dukker ikke opp igjen før langt oppi Kirkeveien. Plutselig kjemper man om plassen med bilene og bussene, om man ikke da brøyter seg vei blant fotgjengere og trær på det smale fortauet. For ikke å snakke om å brøyte seg vei uten gjennom busstoppet litt senere. Ser mange farlige situasjoner i morgenrushet hver dag.", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:56:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "39ff04d2c179c7d68726911a4cfb659bfb43095d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1578": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92801178, + "lng": 10.74967145 + }, + "type": "LatLng" + }, + "description": { + "value": "Alltid litt skummelt med store rundkjøringer", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:55:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "0727412cd638f076aa46041a1dd27580febde3ac.jpeg", + "type": "String" + } + } + }, + "aftenposten-1577": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91589187, + "lng": 10.72119712 + }, + "type": "LatLng" + }, + "description": { + "value": "Ufremkommelig for syklister tildels også scootere/mc", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:55:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "9b4e51f3a82fc90d2f97ae5827a7ccee193cdb20.jpeg", + "type": "String" + } + } + }, + "aftenposten-1576": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93241988, + "lng": 10.74887752 + }, + "type": "LatLng" + }, + "description": { + "value": "Her var det millimeter fra en ulykke idag, men det aner meg at syklisten prøve å kjøre over fortauet på rød mann?", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:53:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "5b3413a1684e9fc573cb4d03b3c8f03f7e06d2d2.jpeg", + "type": "String" + } + } + }, + "aftenposten-1575": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93745085, + "lng": 10.75000405 + }, + "type": "LatLng" + }, + "description": { + "value": "Litt skummel rundkjøring", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:50:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "3af4d809eca541954b2df36c916c2843320fc536.jpeg", + "type": "String" + } + } + }, + "aftenposten-1574": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92938803, + "lng": 10.7166481 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg sykler med sykkelvogn her hver dag. Jeg tør ikke sykle ut i krysset siden sykkelfeltet plutselig opphører. Må da opp på fortauet som forøvrig er alt for trangt. Står og venter på grønn mann sammen med andre som skal krysse veien retning Frognerparken, tar et skritt frem i det det blir grønt og må kaste meg tilbake fordi en Bring-bil kommer susende (på rødt) og holder på å dra med seg både meg sykkelvogna i døden.", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:50:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "87945c69f77ad3e3fa633aa6e319bfd5ce2d3ddf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1573": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91170748, + "lng": 10.75580835 + }, + "type": "LatLng" + }, + "description": { + "value": "Her finnes det ingen gode alternativer til å sykle i kollektivfeltet. Trikker og busser legger seg tett oppi syklister og tuter kraftig eller kaster seg forbi selv om det er rødt lys litt lengre frem eller de skal stoppe på holdeplassen rett foran.", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:47:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "94e03fdc5d5cc94fd65880e353f4bca078c78a8b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1572": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90030262, + "lng": 10.76205253 + }, + "type": "LatLng" + }, + "description": { + "value": "Kongsveien er hovedåren for alle som skal mellom Oslo sentrum til Bekkelaget/Nordstrand. Nedre del fra Sjømannsskolen til Gamlebyen er ikke tilrettelagt for syklister, og nestenulykker skjer hver dag. En svært ubehagelig veistrekning, både for trafikanter, syklister og gående. Her må noe gjøres før liv går tapt.", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:39:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "053d9b3efd4ddd1ec75fbc5c8aa3c3fbddab352e.jpeg", + "type": "String" + } + } + }, + "aftenposten-1571": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90568814, + "lng": 10.82088947 + }, + "type": "LatLng" + }, + "description": { + "value": "Skulle rett frem, men bilisten som lå bak meg hadde bestemt seg for at jeg sykla sakte nok til at den kunne kjøre inn mot e6 foran meg. Resultatet var bråbrems for meg og en knyttneve i bagasjen på aktuell bil.", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:10:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "bd548eaaf18506ea5b5ddba617844d90fc20d98c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1570": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90804436, + "lng": 10.77866077 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom fra Tøyen og skulle inn mot Jordal. Bilist som kom Galgeberg kjørte rett ut i rundkjøringa slik at jeg nesten ble påkjørt. Opplever i nesten alle rundkjøringer at bilistene ikke viker for syklister som allerede er inne i rundkjøringa.", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:06:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "b3273b5dc8a5c5862515678529ba33c1d0f13929.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1569": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89782746, + "lng": 10.75874805 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig smalt både oppover og nedover. Ingen sykkelfil på vei nedover, men der har syklistene såpass mye fart at det er ok å kjøre sammen med bilene. På vei opp er det så smalt fortau at man tvinges ut i veilbanen, til bilistenes irritasjon...", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:01:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "1e4bd1bf7f6077cbcd183375ff9d2a3f913579c7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1568": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88017316, + "lng": 10.7864499 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler parkerer daglig i sykkelfeltet", + "type": "String" + }, + "date": { + "value": "2014-09-12T06:00:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "6f699b39993e3945ebbbab01485fff0d2758d0a0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1567": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88447995, + "lng": 10.82324981 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet er i praksis stengt i tidsrommet 07:30 - 09 og 15-17 med parkerte biler til barnehage. At det tillates av og påstigning av barn og barnevogner på en sykkelveg ved en forkjørsveg, er helt ubegripelig og meget trafikk farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-12T05:59:55Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1566": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90286367, + "lng": 10.7675457 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt felt mellom trikk og fortau, masse huller, mye trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-12T05:58:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "fb05250f54d528db77e2fa676feb4508c79a4e29.jpeg", + "type": "String" + } + } + }, + "aftenposten-1565": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93518271, + "lng": 10.74421048 + }, + "type": "LatLng" + }, + "description": { + "value": "Kierschovsgate/kirkeveien retning vest: Her mangler sykkelfelt. Det gjør at \"alle\" skal passere en smal del av fortauet for å komme til de bredere delene. Her står det ofte mange mennesker og venter på forgjengerovergang. Løsning: Bygg sykkelfelt!", + "type": "String" + }, + "date": { + "value": "2014-09-12T05:39:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "2f776cc41ba6cb6bc44b2c6d61061fbe539a2fcd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1564": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.907183, + "lng": 10.77918859 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene bruker sykkelfelt som ekstra fil før de skal over lyskrysset", + "type": "String" + }, + "date": { + "value": "2014-09-12T04:50:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "daff72547d0ee3bb5f1fe907b50772322ed8cb54.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1563": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93387658, + "lng": 10.73136806 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei mot sentrum i sykkelfelt opplevde jeg at en bil stopper opp for å svinge til venstre. Plutselig velger han å kjøre for å komme foran 3 bilder fra Kirkeveien. Konsekvenen er at jeg havner oppå panseret på hans bil, heldigvis uten skade.", + "type": "String" + }, + "date": { + "value": "2014-09-12T04:18:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "333ef144bb799a083aecd8a1d08fcb7df40b8a4c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1562": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91222384, + "lng": 10.63416481 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundkjøringen på lysakerlokket er et kaos.", + "type": "String" + }, + "date": { + "value": "2014-09-12T01:46:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "bf47e8901f224dcd7c14633af603d41ab406c2a4.jpeg", + "type": "String" + } + } + }, + "aftenposten-1561": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90623148, + "lng": 10.74580907 + }, + "type": "LatLng" + }, + "description": { + "value": "I dette lysregulerte gangfeltet (hvor sykkelveien krysser bilveien) må man velge om man skal være fotgjenger eller bilist. Hva gjør en syklist på grønn mann? Fotgjengermetoden. Hva gjør en syklist på rød mann? Bilmetoden (følger bilveien i stedet).", + "type": "String" + }, + "date": { + "value": "2014-09-11T23:04:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "d91f9c317d97aca07dab6dacaec9dd8de86a86df.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1560": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91056717, + "lng": 10.72917938 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikk, utbygginger mv. er skremmende, men farligst av alt er alle de hensynsløse syklistene som kommer fra Tour de finance og fortsatt sykler på tid mot jobben i morgenrushet. Et under at det ikke går menneskeliv tapt daglig når Nesoddbåten tømmes for folk. Blir jeg som syklist skadet der nede, er oddsen lav for at det blir av en annen syklist. AV", + "type": "String" + }, + "date": { + "value": "2014-09-11T22:38:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "7823affc4467aa3ca8e0e89e6d321a9e93b9d6f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1559": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93794531, + "lng": 10.68469762 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom syklende mot Smestad og ble påkjørt av bil som skulle inn på Statoil-stasjonen. Det var ulykke som medførte personskade, men det ble ikke politiregistrert. Som andre skriver, dette er et livsfarlig punkt med taxi, buss, bensinstasjonskryssing og sykkel i begge retninger. En dødsfelle.", + "type": "String" + }, + "date": { + "value": "2014-09-11T22:33:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "24e5c5fb6eb19174613911a5d8ffc55db2b0e319.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1558": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94939097, + "lng": 10.73121786 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummel krysning av Sognsveien for gsv langs Ring 3. Mange skumle situasjoner. Burde vært planfri kryssning.", + "type": "String" + }, + "date": { + "value": "2014-09-11T22:23:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "6c7f60b83cf0f5322c71bdc9b68ea94b4c26c7c9.jpeg", + "type": "String" + } + } + }, + "aftenposten-1557": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90425172, + "lng": 10.76676249 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikken tuta på meg bakfra rett før svingen. Fortauskanten var litt i høyeste laget til at jeg bare kunne skvette opp på fortauet i fart fra så spiss vinkel; jeg lå klint inntil fra før. Så jeg bremsa ned, kasta meg av sykkelen og dro den ut av veien. Trikken stoppa også, og føreren virka ikke særlig imponert der han passerte med _det_ morske blikket. Med ca 20m ekstra tolmodighet hadde vi kommet til utforbakken ned til trikkestoppet, og han hadde sluppet å kjøre forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-11T22:18:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "c1dbd2825c67b69ab6fa8122acc4175b7c5295d1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1556": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90834023, + "lng": 10.74919939 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt, mange gående og trikkeskinner", + "type": "String" + }, + "date": { + "value": "2014-09-11T22:13:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "6e7de3dfbd6f92c7c84d1423ec20cc213973c19a.jpeg", + "type": "String" + } + } + }, + "aftenposten-1555": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90792064, + "lng": 10.76788902 + }, + "type": "LatLng" + }, + "description": { + "value": "Totalt kaos uten mulighet for å slippe unna for syklister", + "type": "String" + }, + "date": { + "value": "2014-09-11T22:12:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "751c62fd3249b60d340d8d9a3835d7cf66bded1a.jpeg", + "type": "String" + } + } + }, + "aftenposten-1554": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94933724, + "lng": 10.73132514 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklende har vikeplikt når de sykler over gangfelt. De færreste respekterer dette, og i kombinasjon med at stedet er lite oversiktlig fører det til mange nestenulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-11T22:11:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "bedb70172c727ed0bd4180730f604c334fe248db.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1553": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94887519, + "lng": 10.72905063 + }, + "type": "LatLng" + }, + "description": { + "value": "Helt inntil gang- og sykkelstien går et gjerde. En godt skjult port i gjerdet gjør at det plutselig dukker opp mennesker foran deg.", + "type": "String" + }, + "date": { + "value": "2014-09-11T22:08:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "6b338961ea835da9cc3cedce9cd1fac760ed5279.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1552": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91332644, + "lng": 10.64238309 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det lagt fotgjengerovergang med skilting rett inn i en sykkelvei. Dette fører til gående i sykkelveien. I tillegg er det en bratt bakke som fører syklende rett inn i en kryssende vei. Farlig, spesielt om vinteren", + "type": "String" + }, + "date": { + "value": "2014-09-11T21:57:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "8d798807131190ce60b895897386e2810bb59e6c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1551": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9358277, + "lng": 10.8795762 + }, + "type": "LatLng" + }, + "description": { + "value": "Møteulykke med bil (store skader på bil og en forslått skulder) på snuplass rett ved utløpet av gang og sykkelstien. Det er svært mange veier som krysser hverandre og trafikken er til tider uoversiktlig siden biler har avkjøringer i flere retninger bl.a mot oslo vvs", + "type": "String" + }, + "date": { + "value": "2014-09-11T21:46:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "6ac9ee9651fe0daee88bdee23001ce940e1aec4e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1550": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91986063, + "lng": 10.82088947 + }, + "type": "LatLng" + }, + "description": { + "value": "Har ved flere tilfeller spesielt etter jobb (16-17) møtt biler som kommer opp bakken retning oslo. Dette på tross av at dette er en gang og sykkelsti uten underskilt. Mye skog og stor fart på bilene gjør det svært uoversiktlig", + "type": "String" + }, + "date": { + "value": "2014-09-11T21:38:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "67ce29c3c8c4629f3fcf007dd745a84c239e5c1d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1549": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93060296, + "lng": 10.85556507 + }, + "type": "LatLng" + }, + "description": { + "value": "Gjentatte ganger har biler kjørt rett ut i gang og sykkelstien uten å tatt hensyn", + "type": "String" + }, + "date": { + "value": "2014-09-11T21:33:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "1b7504d92bf17096fd44a5c4cc937bdf74deeafd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1548": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92816769, + "lng": 10.76783537 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg sykler alltid i veien fra fra Fagerheimgata og ned mot Dælenenga. Rundkjøringen og sykkelveiens snarlige slutt og overgang ut i veien gjør det tryggere å holde seg bland bilene på veien gjennom kryssene.", + "type": "String" + }, + "date": { + "value": "2014-09-11T21:17:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "715b5f3ea0e4731ec9852e6bb02d3e19cc9b9421.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1547": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92816231, + "lng": 10.77110767 + }, + "type": "LatLng" + }, + "description": { + "value": "Er det meningen at man skal sykle med kjøreretningen på sykkelveiene i Chr. Michelsensgate bør man male noen piler eller på annet vis informere om det. Ikke alle er klar over man til slutt blir kjørende mot kjøreretningen i et sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T21:11:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "53224b9c44371571586ee081f2ae909bfc149d52.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1546": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92038224, + "lng": 10.74283719 + }, + "type": "LatLng" + }, + "description": { + "value": "Foran trafikkskolen forsvinner plutselig sykkelfeltet i 17 meter, så skolen kan lære elevene sine å ikke ta hensyn til syklister. Deler av denne ruta mangler tilrettelegging og burde ikke vært merka som tilrettelagt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T21:05:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "52a920c62f6d90790f7ea586e6e5e3c701630c66.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1545": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93648879, + "lng": 10.68074941 + }, + "type": "LatLng" + }, + "description": { + "value": "Nok et eksempel på at å blande kollektivknutepunk og sykkel vei er en dårlig ide. Undergangen er skummel selv ved lav fart, man vet aldri om andre er like hensynsfulle som en selv.", + "type": "String" + }, + "date": { + "value": "2014-09-11T21:02:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "8fcd7aede62008e04d75f6e722d85d0e33a15969.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1544": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92604945, + "lng": 10.77624678 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke bare er Carl Berner en katastrofe for syklister, men de har også klart å legge halv meter lange glatte metal plater i fortauet, som er farlige både for fotgjengere og syklister, når de er våte elle det snør. Gikk der i regnvær for en stund siden, og sklei på en, og bare sekunder senere sklei det en liten gutt på en annen en. De er som designet for å ta knekken på eldre, som ikke er så stødig på bena.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:56:38Z", + "type": "DateTime" + }, + "bilde": { + "value": "5273516fe88f0ed7d57aec21174b17e6.jpg", + "type": "String" + }, + "streetview": { + "value": "bdfae1592332f23e358760c742e376d23aae213c.jpeg", + "type": "String" + } + } + }, + "aftenposten-1543": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91230989, + "lng": 10.82633972 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne korte stubben med tofelts sykkelvei er en dårlig vits. Når man kommer ned bakken er det umulig å komme seg fra veibanen og over på sykkelveien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:53:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "cec08eb12cc6bab2855aee9a0a23844a2fd0b396.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1542": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92655483, + "lng": 10.71317195 + }, + "type": "LatLng" + }, + "description": { + "value": "Hull i sykkelbane. Sykkelbane tar slutt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:52:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "136fc7eb027d38d980d256b6a1c3841c8e2ed5dc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1541": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.877115, + "lng": 10.78831672 + }, + "type": "LatLng" + }, + "description": { + "value": "Fant meg selv liggende på asfalten, med overkroppen godt ut i bilveien, uskadd. Dette er et rimelig ålreit sykkelfelt, mellom fortauet og bilveien. Selve fallet husker jeg ikke, bare at jeg kom for nærme fortauskanten, og ikke kunne styre ut igjen fordi balansen kom på feil side. Lærdom: Ikke sykl opp kongsveien på lavt blodsukker (aka. hjem til middag). Da går man i asfalten her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:45:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "24e8a6c328161a91a4c6d22b6eca4fb889a5a48e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1540": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91086839, + "lng": 10.83621025 + }, + "type": "LatLng" + }, + "description": { + "value": "Holder god fart ned bakken. Ikke noe problem å sykle i fartsgrensa. Likevel er det noen biler som må forbi, til tross for forbikjøring forbudt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:45:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "7d56cb03b1ac3648c46bee576a78dcb67567c2e8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1539": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93436034, + "lng": 10.72806358 + }, + "type": "LatLng" + }, + "description": { + "value": "Krasj med bil pga nyasfaltert uten merking av sykelfelt. Sprukket ribbein som følge (ikke rapportert inn til offisiell statistikk).", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:45:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "0d2cf3ad62d0fe762288116ba5f3e89b3a746a5e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1538": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91664479, + "lng": 10.74028372 + }, + "type": "LatLng" + }, + "description": { + "value": "Det mangler gode tverrforbindelser gjennom sentrum. Ring 1 under regjeringskvartalet er en lovlig og rask, men utrygg, snarvei.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:41:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "26fca398c5fafbd67964cbcc0f5ba083d240a2f9.jpeg", + "type": "String" + } + } + }, + "aftenposten-1537": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9160317, + "lng": 10.74882388 + }, + "type": "LatLng" + }, + "description": { + "value": "Kjørt ned bakfra av en bil som skulle kjøre forbi men holdt altfor dårlig avstand. Endte opp med hånda i gips. Bilen stakk av, men jeg fikk notert nummeret. Bilføreren aksepterte forelegget fra politiet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:36:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "cc418547a1519995c57c10822ec1713c3c0d7d8c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1536": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92584515, + "lng": 10.75002551 + }, + "type": "LatLng" + }, + "description": { + "value": "Presset inn i fortauskanten av bil som la seg over i sykkelfeltet rett før det slutter brått.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:31:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "16bc6acfec412e2eef343d190ed5272354b42ef1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1535": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91525725, + "lng": 10.73904991 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kommer man som syklist mot kjøreretningen, med parkering på begge sider og ingen tilrettelegging for sykkel. Farlige situasjoner hver dag.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:30:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "b89177d0825f8124f6b3e96b016ccf3ed2625267.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1534": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92315144, + "lng": 10.72025299 + }, + "type": "LatLng" + }, + "description": { + "value": "Hovedfartsåren for sykkel mellom Majorstua og Sentrum. Ble holdt frem som løsningen da det ble kjent at Bogstadveien IKKE skulle ha sykkelfelt. På denne strekningen er det gateparkering og mange farlige stikkveier. Ser ulykker eller nestenulykker hver eneste dag.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:29:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "cfd186456667995ce55f170da4749e4445a78e61.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1533": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92629139, + "lng": 10.71368694 + }, + "type": "LatLng" + }, + "description": { + "value": "Her begynner hovedfartsåren for sykkel mellom Majorstua og Sentrum. Samtidig slutter sykkelfeltet og begynner ikke før man kommer til Litteraturhuset igjen. Mange stygge hendelser fordi syklister brått skal inn sammen med bilene og på hjørnet Middelthuns/Neuberggata står det som regel en HMK- eller Sandvika Storsenter-buss og skaper kø.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:27:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "c56d1372e499f932b065bcb4dd509c82d3855abe.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1532": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9180484, + "lng": 10.75948834 + }, + "type": "LatLng" + }, + "description": { + "value": "Har nær blitt meid ned flere ganger av busser og ilske taxisjåfører her. Har blitt så skjelven at jeg knapt tør å sykle her lenger. Det tas ikke hensyn til syklister i området i bunnen av Tr.heimsveien/Thorvald Meyersgate.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:24:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "742af5d1a6e4733aef4231ed38633e4318b582b8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1531": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92818382, + "lng": 10.75651645 + }, + "type": "LatLng" + }, + "description": { + "value": "Å sykle fra Sannergata til Bislett over Alexander Kiellandplass er en guffen opplevelse, kjennes svært utrygt, og oplever ofte at busser og taxier ikke tar hensyn, slik at jeg har måttet bråbremse med hjertet i halsen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:18:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "3c7eb97475b55e010d59d02549ab944340bfc9b5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1530": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9163006, + "lng": 10.74434995 + }, + "type": "LatLng" + }, + "description": { + "value": "Fryktelig dum (og stygg) sikkerhetssperre - med høye fortauskanter på begge sider og skummelt ledningsrør på sydsiden - som gjør det vanskelig å sykle fra Akersgata og inn i Teatergata. Her må de få etablert de normale heve- og senkbare sperrestolpene snarest mulig!", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:10:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "d872567d1bfba1168f77b501fb5afb0cbe666ae4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1529": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92050592, + "lng": 10.75724601 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette skal i teorien være en sykkevei. Men fotgjengere og mennesker med barnevogn tar ikke hensyn til dette, det er trolig for dålig merket samt at butikkene har varer på fortauet noe som gir fotgjengerne for dårlig plass. Av 27 gangerpå rad som jeg syklet nedover Markveien, på dagtid, var det kun to ganger jeg kunne sykle uten å måtte tute/bremse/stoppe for fotgjengere. Flere har vist meg fingeren og ropt etter meg når jeg plinger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:09:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "cd5a53f0531d68e05252a89e1f9211409613476c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1528": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9102014, + "lng": 10.82504153 + }, + "type": "LatLng" + }, + "description": { + "value": "I Fyrstikkbakken er det en del sykkeltrafikk, og det er merket gs vei, men mange biler bruker denne snarveien og jeg har møtt noen i den skarpe svingen her. Har ringt politiet og Bymiljøetaten om dette et par ganger, men de er ikke interressert i å gjøre noe. Men de vet om det!!", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:06:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "3c33604e1ac420e96a7659bfbbba06d95f1cb65a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1527": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91626833, + "lng": 10.7485342 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen god løsning for syklister i tunnel opp mot Akersgata. Smalt og farlig, og risikable syklister. Beste mulighet er å sykle midt i veien for å hindre farlige forbikjøringer, noe som gjør biler og busser frustrerte. Dessuten er det svært ofte glassbiter i veien her, som gjør at man blir distrahert. Jeg har trolig punktert flere ganger her!", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:06:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "6bf39cf80cde43bc3f8bae507d792631613cc852.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1526": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91308441, + "lng": 10.76009988 + }, + "type": "LatLng" + }, + "description": { + "value": "Så å si alltid biler parkert i sykkelfeltet. Må gjøre farlige omkjøringer ut i veien. Parkeringsvakter og politi alt for lite aktive i dette området. Burde statuere en del eksempler.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:02:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "0000e170eb44a18951905f89332abf00889c5170.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1525": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92813006, + "lng": 10.74975728 + }, + "type": "LatLng" + }, + "description": { + "value": "Her tør jeg ofte ikke sykle, og ender opp med å måtte trille over fortauet. Dette fordi bussene nesten har kjørt meg ned flere ganger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:02:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "05c58058e30d5b38596a6b16947b8dd35c661bdf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1524": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9161285, + "lng": 10.78022718 + }, + "type": "LatLng" + }, + "description": { + "value": "Utrolig stressende kryss hvis du sykler rett frem oppover Økernveien, siden det er to kjørefelt, og sykkelfeltet er til høyre for dem. Her blir det ofte konflikt og tuting.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:01:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "f6a6ca30d3a19794ff904c837a46188bdaa22eb9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1523": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9102014, + "lng": 10.83116769 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke farlig vei, men irriterende hindringer i undergangen under t-banen. Fremkommeligheten for syklende hadde blitt betydelig bedre med enkle tiltak som f.eks fjerning eller \"krymping\" av betongelement, asfaltering ved fortauskant slik at det blir lettere å komme opp på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T20:00:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "cfdd2fa4155eea40ebe6caebf478e8d22d56b090.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1522": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90749029, + "lng": 10.81256389 + }, + "type": "LatLng" + }, + "description": { + "value": "Ofte dårlig klippet vegetasjon gir dårlig oversikt i bratt bakke, og ekkel murkant på tvers over veien gir fare for velt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:57:49Z", + "type": "DateTime" + } + } + }, + "aftenposten-1521": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93560195, + "lng": 10.73866367 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti? Så fin og stor vei!", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:54:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "f7218da386282c89dbab9c6438a546ca09e14c51.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1520": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91469792, + "lng": 10.78802704 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkerte biler på begge sider av veien ødelegger sikten for bilistene som skal inn/ut fra Kiwi og Rema 1000, de kjører dermed ut i veien uten å ha full oversikt. De ser i hvert fall ikke om det kommer en syklist. Og i tillegg er det mange av dem som har vært på Rema1000 som kjører ut i fotgjengerfelt og sykkelfelt i krysset Gladengveien/Ensjøveien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:52:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "3d6b1fa9f88c8a04d55bc9a63e6db15902553982.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1519": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91914005, + "lng": 10.79368114 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom ned Gladengveien. En bil sto i en innkjørsel og kjørte ut rett foran meg selv om jeg hadde lys og refleksvest. Tilsunelatende hadde han ikke sett meg likevel. Resultat: brukket skulder med påfølgende operasjon.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:52:44Z", + "type": "DateTime" + }, + "bilde": { + "value": "1c39ee5df849c2441b7af0cbf6906a8b.png", + "type": "String" + }, + "streetview": { + "value": "86c6ac72468a35016e09b259f5479d5dac481ced.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1518": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92940954, + "lng": 10.71716308 + }, + "type": "LatLng" + }, + "description": { + "value": "Bråstopp på sykkelfelt i en av de mest travle kryssene i Oslo!", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:52:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "566f3c1620d9e8902496a7c53da4b5e3b328dbf0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1517": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93357557, + "lng": 10.72640061 + }, + "type": "LatLng" + }, + "description": { + "value": "Her i Kirekveien hvor det er sykkelfelt og veien svinger litt til høyre tar enkelte leddbusser innersving og bruker hele sykkelfeltet. Har vært nær ved å blitt overkjørt her en gang, likeledes andre steder i Kirkeveien f eks utenfor Ullevål sykehus på motsatt side, har vært nær ved å miste ballansen et par ganger når leddbussene kjører helt inntil deg.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:50:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "aaeb40a114d4f6df68fc06add1dae88d480d2028.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1516": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92840961, + "lng": 10.76836109 + }, + "type": "LatLng" + }, + "description": { + "value": "Når du bruker sykkelveien, og skal krysse dælenenggata, står det ofte biler parkert for nærme sykkelveien og ødelegger sikten. Dette er en blindvei og den burde vært stengt for biler.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:39:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ad6756241074943177fb93e072292dae9849e30.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1515": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94596306, + "lng": 10.74894189 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal vei, mange syklister, fortauet har for høye fortauskanter og er for smalt for syklister itillegg til forgjengere. Trafikk med \"hastverk\" selv om det er 40km her. Da spesielt i morgenrushet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:39:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "a6c32ef31a25b6cf96d6a8af5c8cf9bff85bc4d0.jpeg", + "type": "String" + } + } + }, + "aftenposten-1514": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93441946, + "lng": 10.74986457 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig for syklister som skal til venstre i krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:36:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "facaf5845faf61adb5c3db95e0d5a7db69ffca96.jpeg", + "type": "String" + } + } + }, + "aftenposten-1513": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92462468, + "lng": 10.77563524 + }, + "type": "LatLng" + }, + "description": { + "value": "Finnmarkgata retning Tøyen. Sykkelfeltet forsvinner rett før en rad med parkerte biler.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:36:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "01418858d6da26d3a62d78e4a1a91098bf321721.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1512": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91301987, + "lng": 10.73844909 + }, + "type": "LatLng" + }, + "description": { + "value": "Stort hull i veien mellom trikkeskinner og fortau. Du skal sikte godt for å treffe mellom hullet og skinnene, men det går fint når man vet det er der. Verst for de som skal til høyre opp Rosenkrantzgate, for de ligger på høyre side av skinnene. De som skal rett frem sykler antakelig mellom skinnene og risikerer ikke å treffe hullet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:34:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "23eb6e9862c7f98fe7e67497f9dc130ba68c5e9f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1511": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88794651, + "lng": 10.77441215 + }, + "type": "LatLng" + }, + "description": { + "value": "OBOS bygger nytt, og har sperret veien med smal passasje i mange mnd, kun dårlig grus/stein som underlag som hurtig medfører punktering. Burde være tidsbegrensning på slikt veiarbeid.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:30:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "a014345f6daba90f321711ab750c9b56b9221c4b.jpeg", + "type": "String" + } + } + }, + "aftenposten-1510": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93194147, + "lng": 10.7621169 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner. Prøver å unngå å sykle her i rushen. Men selv om man sykler når det er lite trafikk og det er to felt, blir man tutet på. Og noen kjører forbi ekstra nærme bare for å vise hva de synes om syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:30:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "149abe3a7fd66d67608f4f4b19841d6d8bf3b1db.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1509": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91054566, + "lng": 10.76231002 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvor skal man egentlig sykle i Schweigaards gate? Langs trikkesporet? I veibanen? På fortau?", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:25:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "7512e8d626426281059bee31126fcab7fb056e95.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1508": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91037353, + "lng": 10.76282501 + }, + "type": "LatLng" + }, + "description": { + "value": "Utrolig dårlig tilrettelegging for syklister, trikkestopp skjærer ut i veibane og blokkerer sykkelplass i veien, asfalten er av svært dårlig kvalitet, bom sperrer vei og har en sykkelomkjøring som er smal, ubrukelig og normal full av søppel og grus", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:24:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "67419628ce4974f68fe1122a44515cce72875fd5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1507": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91856465, + "lng": 10.73708653 + }, + "type": "LatLng" + }, + "description": { + "value": "Nestenulykke. Kom syklende ned Pilestredet i ca.30 km/t, og ble forbikjørt av bil i krysset Nordahl Bruns gate. Det kommer en annen bil ned Nordahl Bruns gate, så han som kjører forbi meg må legge seg inn mot meg før han har kjørt helt forbi. Jeg låser begge hjulene for å unngå sammenstøt. Jeg anmelder han for uaktsom kjøring, og legger ved opptak fra hjelmkamera. Saken blir henlagt fordi politiet ikke prioriterer slike saker, og det står det faktisk svart på hvitt i henleggelsen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:23:38Z", + "type": "DateTime" + }, + "bilde": { + "value": "81fef24a0c54382ac904fe02c57e0868.jpg", + "type": "String" + }, + "streetview": { + "value": "a6d61321f1c2d1e7ee93252deafbc8434019ed3d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1505": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90297127, + "lng": 10.76763153 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlige forhold for krysning av fire trikkeskinner ved overgang fra trikkefelt til vei og trikk", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:22:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "e0e4c87483704a2c6eb4ee643547a4e17b7022ac.jpeg", + "type": "String" + } + } + }, + "aftenposten-1504": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90254086, + "lng": 10.76750278 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært få bilister markerer med blinklys hvilken vei de skal i rundkjøringen, hvilket skaper farlige situasjoner for syklistene", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:21:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "7f12adfd6f392bac4fe472ebf9246c6103786b00.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1503": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90060393, + "lng": 10.76239585 + }, + "type": "LatLng" + }, + "description": { + "value": "Ubeskrivelig dårlig sykkelforhold både opp og ned nedre del av Kongsveien. Oppover er det ikke plass til sykkel i veibane, og dårlig mulighet for biler til å kjøre forbi, fortauet har dårlig asfalt og kantsten kvailitet, og er svært smalt. Nedover er det også smal veibane og nesten ingen mulighet til å kjøre forbi", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:20:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "c36d3c104a2ff8266fd8333cff4541d8f23cc0a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1502": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87993627, + "lng": 10.78874588 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal veibane uten deling av felt og plass til sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:18:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "eeb6ea8a8a2bf69b4cf3651a9d59ea04d857ab3e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1501": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88628864, + "lng": 10.79919576 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig markert kryss, bilene som kommer fra motorveien krysser over til venstre tidlig i krysset, og skjærer langt inn i kjørebanen til dem som kommer fra Steingrims vei og skal opp Sandstuveien", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:17:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "f420976cda3e3ddbb63304a09d4fe15b77b38ff8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1500": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9418362, + "lng": 10.77222347 + }, + "type": "LatLng" + }, + "description": { + "value": "Fra Nordpolen og opp til Birch- Reichenwalds gate må man sykle i trikkesporet. Det er en bratt bakke og det kommer nesten alltid en trikk. Og da er det av sykkelen og løfte den opp på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:15:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "27d2509846024f55e01d6aadfa1475b36191ab36.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1499": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92264601, + "lng": 10.73800921 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister utfører farlige forbikjøringer forbi syklister rett før den krappe svingen i Dalsbergstien, ofte kommer det biler mot og da blir det trangt. Gjelder begge retninger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:07:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "f4a0ebde80090b0df2a7c17a863d9cb7433c0c16.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1498": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9417341, + "lng": 10.67257404 + }, + "type": "LatLng" + }, + "description": { + "value": "Varebil kom ut fra parkeringsplassen foran Njårdhallen. Stoppet midt på sykkelveien for å vente på biltrafikk på veien. Jeg kom syklende fra Smestadkrysset og krysset bak bilen. En syklist fra andre siden gjorde det samme. Fordi vi så hverandre ganske sent (varebil) kræsjet vi bak varebilen på hverandre.", + "type": "String" + }, + "date": { + "value": "2014-09-11T19:00:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "c644e875dcc6d72382602005735fd1d683f9019e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1497": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95221685, + "lng": 10.72737693 + }, + "type": "LatLng" + }, + "description": { + "value": "Oppmerkingen av sykkelfeltet oppover Sognsveien er MEGET mangelfull. Utslit før høsten.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:57:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "bc94437b1b8fe6ba6c3043b85cfea2e59ef680af.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1496": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91101362, + "lng": 10.82541704 + }, + "type": "LatLng" + }, + "description": { + "value": "Høy traffikk og vanskelig overgang over jernbaneveien", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:54:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "c789d42506f66ef96d87fe120353a34a2bf1083c.jpeg", + "type": "String" + } + } + }, + "aftenposten-1495": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92061346, + "lng": 10.74976801 + }, + "type": "LatLng" + }, + "description": { + "value": "Her vil biler ofte prøve å presse seg forbi før man kommer til rundkjøringen, selv om man greit holder 30 km/t på sykkel i den slake nedoverbakken (det er 30-sone her, så det er strengt tatt ingen grunn til å kjøre forbi). Kommer det trafikk i mot, blir sykkel lett presset inn mot gateparkerte biler på høyre side.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:53:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "4da1fa0c78ecb2ba59e05857913441cce63d0084.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1494": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.926743, + "lng": 10.77679395 + }, + "type": "LatLng" + }, + "description": { + "value": "Altfor smal passasje forbi Menybutikken, så syklister må enten trille på fortau/opp en trapp eller sykle midt i veibanen. Har flere ganger blitt tuta på av sinte bilister som ikke vil ha sykler i veibanen", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:51:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "17f0531734fffe162be2ed0c1eb3f377cb0d7aec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1493": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92123722, + "lng": 10.75159192 + }, + "type": "LatLng" + }, + "description": { + "value": "Kaotisk inngang til rundkjøring når man kommer opp bakken. Siden sykkel får lavere fart pga motbakken samtidig som 30-sone opphører akkurat her, vil biler ofte presse seg forbi akkurat i det man kjører inn mot rundkjøring. Samtidig står det ofte firmabiler parkert på høyre side til tross for \"all stans forbudt\",slik at det blir trangt,\"uoversiktlig og farlig.\"", + "type": "String" + }, + "date": { + "value": "2015-01-28T14:06:34.159Z", + "type": "DateTime" + }, + "streetview": { + "value": "6febaac309c209d80734a03d3b788c7f8a339344.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1492": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91993592, + "lng": 10.63601016 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei oppover Lilleakerveien etter slutten av sykkelfeltet blir syklister oftest henvist til fortauet i rush-trafikken. Kom der i dag da en bil plutselig vrengte av uten verken å se i høyrespeilet eller blinke. Jeg brølte ut og unngikk å bli truffet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:47:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d8a28405a03f199dc58df1ca7bb61cbb0081052.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1491": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95276481, + "lng": 10.76231002 + }, + "type": "LatLng" + }, + "description": { + "value": "Når du sykler østover på sykkelveien langs Ring 3 kommer du nedover en bakke, ut av en overbygning og møter sykkelvei fra Maridalsveien i et T-kryss. Her burde det vært montert et speil som viser om det kommer noen på denne sykkelveien, særlig siden den også er en nedoverbakke.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:47:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "469b4bf044b9c44747f896c791b426b85579cd35.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1490": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91138863, + "lng": 10.72732061 + }, + "type": "LatLng" + }, + "description": { + "value": "Skled på glatte trikkeskinner ved kryssing. Gikk i bakken. Ikke skade.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:43:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "06d17bbafb2918e4126733cccaf3d8e4ae02a32f.jpeg", + "type": "String" + } + } + }, + "aftenposten-1489": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92115656, + "lng": 10.75334072 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvis man må ligge helt til høyre i kjørebanen ned den bratte bakken i Møllerveien, har man ingen mulighet til å se om det kommer bil ut fra Brenneriveien før man er i krysset. Selv med svært lav fart ned bakken kan det være vanskelig å stoppe for trafikk fra høyre i tide.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:37:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "4caec236b675cb0df6efd3ec6c3aba6914ac43b6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1488": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91163756, + "lng": 10.75748205 + }, + "type": "LatLng" + }, + "description": { + "value": "Helt umulig å sykle her. Blir skvisa ut av bil og trikk og fortauet er alt for smalt til at en kan sykle der.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:36:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "0ee8a040ec9658f72eaa615f904e7d48d50f8043.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1487": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91927987, + "lng": 10.7641232 + }, + "type": "LatLng" + }, + "description": { + "value": "¨Syklist kjørte i en vanvittig hastighet RETT inn i en bil som stod ved rødt lys (sent på kvelden) ..... Politi tilkalt av sjåfør av bil. og ambulanse ! Politi Bekreftet på stedet at det var syklist som var skyld i ulykken. Så han ble tatt hånd om ....", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:36:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "59e7e6e057f745057febe18f543a0c85703b1e54.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1486": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95088453, + "lng": 10.7398653 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene som kommer ut fra Ullevål Stadion er i konflikt med sykkelveien. Bilene har skiltet vikeplikt inn mot rundkjøringen, men ikke inn mot sykkelveien. Dermed blir bilene stående midt i sykkelveien og vente. Både biler og sykler er usikre på hvilke regler som gjelder. Er syklene egentlig i rundkjøring og har dermed forkjørsrett? Flytt vikepliktskiltet ti meter, så er problemet løst.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:35:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "cbab5577f622585d4f5883e5ac87c3b82e19fff1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1485": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91839795, + "lng": 10.74771881 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som kommer fra Thor Olsens gate overholder nesten aldri vikeplikt for trafikk fra høyre i dette krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:32:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "a347a0723508a830330474e49017404a63180cd7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1484": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91852163, + "lng": 10.74799776 + }, + "type": "LatLng" + }, + "description": { + "value": "Ofte farlige forbikjøringer her. Skarp og uoversiktlig sving, der det lett oppstår farlige situasjoner oppstår hvis det kommer bil i motsatt retning.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:28:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "d5d1a6e7a9aeebf410377cfb1a184be279247779.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1483": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92407625, + "lng": 10.75922012 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjengere og barnevogner i sykkelfeltet gjør dette området nesten umulig å sykle i.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:27:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "192c52cd39f6014e20e587094906f7b572627bb5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1482": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92974822, + "lng": 10.66100835 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig tilrettelagt for syklister i dette krysset", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:25:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "3a41f991434a891e8f1d6bbac250672f8a96b31b.jpeg", + "type": "String" + } + } + }, + "aftenposten-1481": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92978585, + "lng": 10.66323995 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig tunnel, blanding av syklister og gående", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:23:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "95ba68c2007e9b1f87444fb9fa40713249855388.jpeg", + "type": "String" + } + } + }, + "aftenposten-1480": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93791843, + "lng": 10.68470835 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange biler som skal inn/ut av bensinstasjon er ikke oppmerksomme på syklister", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:20:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "f1f381fcafce2d8beb6b85ac758faa85a405b7d1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1479": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94417912, + "lng": 10.77591419 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig vei, hullete asfalt, trangt mellom trikkeskinner og fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:20:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "10b3a8120cc6d6125670e8a2de7ebb1775c25a0d.jpeg", + "type": "String" + } + } + }, + "aftenposten-1478": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93728424, + "lng": 10.68313121 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjengere og syklister burde ikke dele vegen her", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:20:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "2cfca7849cc8407f0b167e490e65363a8bde2e4a.jpeg", + "type": "String" + } + } + }, + "aftenposten-1477": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94265839, + "lng": 10.70360183 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig kryss, spesielt i rushtrafikken", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:17:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "4e1b20ba0b1fe6b7bbbcd92cbd552378e33fab63.jpeg", + "type": "String" + } + } + }, + "aftenposten-1476": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94237358, + "lng": 10.70467472 + }, + "type": "LatLng" + }, + "description": { + "value": "Her skjer det stadig nesten-ulykker", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:17:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "f9491ace414dcc48415ed67d590b826e283f6997.jpeg", + "type": "String" + } + } + }, + "aftenposten-1475": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91740845, + "lng": 10.81192016 + }, + "type": "LatLng" + }, + "description": { + "value": "Stygg og høy kant rundt et stort kumlokk. Dette har i perioder vært \"varselt\" med en trafikkone, uten at det noen gang har vært utbedret. I tillegg henger vegetasjonen ut over gang- og sykkelveien slik at man kjører blindt inn i svingen i retning mot Helsfyr.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:05:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d742424cf78686855d0d5d6d078dae380f88fed.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1474": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84847956, + "lng": 10.8053112 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig dårlig tilrettelagt veikryss. Det er billister som prøver å snikke i lyskrysset ved å snurre på sykkelstien, syklister som sykler i veien fordi det ikke er noen virkelig sykkelvei hvis man skal til nordstrand (fra retning Mortensrud) og mye trafikk om morningen. Her kan det virkelig gjøres noe som helst, det kan bare bli bedre.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:03:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "d71ce634505929a9b273ea143d97a7927c959d9a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1473": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93100075, + "lng": 10.73582053 + }, + "type": "LatLng" + }, + "description": { + "value": "På toppen av Sofiesgate ligger det en kafe. Kafeens uteservering, som jeg antar er godkjent av kommunen, blokkerer passasjen for hundrevis av sykler som skal nedover Sofies gate om morgenen. Klønete av kommunen å ikke ha kjennskap til hovedfartsårene for pendlersyklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:02:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "398cfc30944fca2d94cd7321f01c614076106914.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1472": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85565689, + "lng": 10.80170631 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelfelt, mye stop-and-go i biltrafikken. Syklister presset i buskene pga small vei, og et ønske å forbikjøre syklistene. Ingen virkelig alternativ til veien, fortau er small og brukes av skolebarn (og det skal de ;-)", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:00:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "74df14077bbc56c737ec35548a6da971720088f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1471": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87265647, + "lng": 10.77926158 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er både innkjøring og utkjøring til Ulvøya på begge sider av en liten midtrabatt. Vanligvis er det utkjøring på en side og innkjøring på en annen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T18:00:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "1cb912d64d0e8d45680c2e5430f7863ddca7e038.jpeg", + "type": "String" + } + } + }, + "aftenposten-1470": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9377142, + "lng": 10.7301557 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig uoversiktelig! Bussholdeplass plassert i krysset Sognsveien- Ullevålsallleen. Bussen som går ned Sognsveien svinger ofte inn i sykkelfeltet for å stanse ved holdeplassen uten å bruke blinklys. Syklistene som kommer ned sykkelvei fra Vestre Aker kirke har ikke mulighet til å se om det står noen og venter på bussen pga stort reklameskilt. Dette er en skolevei for mange barn til Marienlyst skole - utrolig klønete lagt opp", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:59:51Z", + "type": "DateTime" + }, + "bilde": { + "value": "d601bfa150fb86bb48586d47796fed26.jpg", + "type": "String" + }, + "streetview": { + "value": "e98d3d66a6b8ef2b1c58368b6aad9dcc2a81f82a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1469": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87356115, + "lng": 10.78999042 + }, + "type": "LatLng" + }, + "description": { + "value": "En del biler skal levere barn på skolen. Parkering i sykkelfeltet og avkjøring mot høyre uten å ta hensikt til syklister som allerede befinner seg ved bilen. Skjer regelmessig.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:58:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "e2e256256627ca957cc74d0ce90cd92a1ba7d4ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1468": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91114809, + "lng": 10.7669878 + }, + "type": "LatLng" + }, + "description": { + "value": "Dame står på fortauet og stirrer på mobilen sin. Pløtselig tar hun skrittet ut på veien (mens hun ser på mobilen) og i sykkelfeltet. Kollisjon med syklist og fotgjenger, heldigvis uten alvorlige skader.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:55:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "89f18884ef24832b3828cdd633a529926ac1de1b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1467": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90612389, + "lng": 10.82024574 + }, + "type": "LatLng" + }, + "description": { + "value": "Flere farlige situasjoner pga dårlig markering og ikke-tilrettelagt byggeplass. Biler og syklister presses sammen, flere biler skal over til venstre (E6), noe som gjør at andre biler prøver å komme forbi på høyre siden der det befinner seg mange syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:50:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "9dad480dd6998d8bb5b52f312ec92a37fe0f1c34.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1466": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94006278, + "lng": 10.72980165 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er mange bilister som prøver å kjøre forbi i rundkjøringa. Dette er meget farlig siden jeg skal ta til venstre. Når jeg sykler midt i veien for å unngå farlige situasjoner, blir det mye tuting.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:48:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "f771a4dbc89ffefe6763db6629c33ef78e8e702f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1465": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90980336, + "lng": 10.81348657 + }, + "type": "LatLng" + }, + "description": { + "value": "Buss presset sykkel ut av sykkelfeltet. Ingen blinklys, ingen forvarsel. Nestenulykke", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:48:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "c50ce2cd32d15a8a364d48da20e70cd847fbe241.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1464": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94460899, + "lng": 10.73145389 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg hadde en ulykke her. Noen åpnet døra på passasjersiden og slo meg derved ned fra sykkelen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:47:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "47a2cb9baf73166338381396849d7def29d24d10.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1463": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91587036, + "lng": 10.75001478 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det altfor trangt. Opplever ofte at bilister ikke kan kjøre forbi meg pga begrenset areal. I tillegg er det mange som tuter når jeg sykler inn i tunnellen for å komme til Ullevålsveien. Det burde bygges sykkelsti her, siden det ikke går an å bruke fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:45:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "fc566c89a485d1406acf1c63fac91f1eed629d03.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1462": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90228261, + "lng": 10.77316761 + }, + "type": "LatLng" + }, + "description": { + "value": "Ekebergveien er veldig bratt med flere uoversiktlige svinger. Det er forbud for biler å kjøre opp den nederste biten av veien. Likevel bryter mange regelen og jeg har opplevd flere farlige situasjoner når jeg syklet ned her. I tillegg blir mange bilister aggressive fordi det ikke er plass til både sykkel og bil samtidig.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:42:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "38e1b9edbdbe9cfa8dffea8255e898eca23aa162.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1461": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93193072, + "lng": 10.72291374 + }, + "type": "LatLng" + }, + "description": { + "value": "Det hører til unntakene de som overholder vikeplikten for sykkelister i dette krysset. Bilene som skal inn mot Marienlyst sjekker sjelden etter sykkelister som kommer nedover Kirkeveien mot Majorstua", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:40:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "3ea8d55d219d00c41f53d5bda16dbeecf6415a4b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1460": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91829577, + "lng": 10.80640554 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang og sykkelvei slutter plutselig i en merkelig snuplass som bilister ofte kjører tvers igjennom for å unngå å kjøre venstre fra Strømsveien. Konflikt idet GS-veien ender og litt senere der bilene skyter ut igjen på andre siden.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:36:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "fe06e5cd4da758448b4b4a45659690dcf5ef3d3e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1459": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91734391, + "lng": 10.80555796 + }, + "type": "LatLng" + }, + "description": { + "value": "Sjelden biler fra Strømsveien overholder vikeplikten når man sykler sørover på Innspurten.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:33:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "499fb468124ce6fe3e4081fbe54fb943966b582f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1458": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92378591, + "lng": 10.7611835 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkeringen er innenfor sykkelfeltet, hvis en bilist åpner døra kan man bli alvorlig skadet", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:31:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "f24a126c859b5c9f7d0f94bf48dfaf44c1c3160c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1457": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91289078, + "lng": 10.81758499 + }, + "type": "LatLng" + }, + "description": { + "value": "I bunnen av bakke på begge sider er det et T kryss med en uoversiktlig undergang. Som syklist samler man fart for å komme opp igjen på andre siden. De fleste sykler gjennom boligområdet for å slippe dette.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:31:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "c74a7443205479c5bc45aa2783f5fa900c3feb8a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1456": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92460317, + "lng": 10.75931668 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler med vareleveranser parkerer i sykkelfeltet hver eneste dag. I tillegg er det mange som parkerer her i korte perioder for å gjøre korte ærend.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:30:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "7243278e50fbdfef124335e1eedaa04da2ac8e6d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1455": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91303062, + "lng": 10.82366824 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvis du har fulgt fortauet hele veien ned snurper sykkelvei og fortau seg sammen til et smalt fortau med dårlig sikt. Bilistene har satt opp farten for å komme forbi de som har holdt fartsgrensen ned Tvetenveien samtidlig som de forstyrres av ekstra felt, vikeplikt for biler i rundkjøringen. Og der skal man tydeligvis hoppe ut i veibanen hvis man skal mot Helsfyr.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:28:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "5f2175c596a1ab54d6e34a92ae75bd72fd66fcd8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1454": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91192263, + "lng": 10.82805633 + }, + "type": "LatLng" + }, + "description": { + "value": "Nedover Tvetenveien er det ingen måte å komme inn på sykkelveien over broen. Ett felt og 60 km/t gjør at bilistene blir rasende og skal straffe deg for at du ikke bruker sykkelveien du ikke kan komme inn på.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:25:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "b672b54570316f54370bee90ca54424970db5d3c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1453": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91233141, + "lng": 10.83779811 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkerte biler og lasterbiler på hver side av veien. Biler må også holde seg unna dørsonen til tross for at de dermed ligger langt ute i motsatt kjørefelt. Jeg må ofte gjøre unnamanøver for møtende biler. Mange holder alt for høy hastighet der det ikke er parkerte biler på begge sider.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:21:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "71bc52653eafa56c5d488b0b651f542260804675.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1452": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9145043, + "lng": 10.74922084 + }, + "type": "LatLng" + }, + "description": { + "value": "Torggata fra Hausmasgate mot sentrum er nå uten sykkelvei (fjernet???) og full av biler i begge retninger. Nestenulykker ofte sykkel/bil( og jeg sykler der ofte.)", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:12:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "a93873c716f6e7344bd8df752c0269abd4134297.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1451": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8586847, + "lng": 10.80166339 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil som kom over i min kjørebane da den kjørte forbi en stillestående bil. Skrubbsår på hender, albue og hofte. Ødelagte klær.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:07:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "6e285b930c696a8a58359defb37b7996c0323fa2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1450": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91663919, + "lng": 10.73412237 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist påkjørt i lyskryss. Drosje svingte til høyre, rett på syklist (som kom fra samme vei) uten å signalisere med blinklys, og uten å sjekke speil/ dødvinkel. Syklist kjørt til legevakt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:06:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "30c2c11649c994708b37c0e994121d3021341bd6.jpeg", + "type": "String" + } + } + }, + "aftenposten-1449": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91795698, + "lng": 10.68716526 + }, + "type": "LatLng" + }, + "description": { + "value": "Kollisjon mellom bil og sykkel i rundkjøringen på Bygdøylokket. Bilist kjørte ut fra innerste felt og traff syklist i ytterste felt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:04:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "ca6b3106286634a098aaaf810badc3226137254c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1448": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90850989, + "lng": 10.78562936 + }, + "type": "LatLng" + }, + "description": { + "value": "Saktegående bilkø. Flere syklister i sykkelfila. 100m igjen til bussholdeplass. Tre syklister hadde passert bussen, den fjerde var halvveis langs leddbussen da den begynte å legge seg ut i sykkelfila. Høye fortauskanter gjorde at syklisten ikke kom seg unna. Eneste grunn til at det ikke ble noen påkjørsel var at syklisten klarte å få sjåførens oppmerksomhet ved å slå hardt, flere ganger i siden på bussen samtidig som syklisten vred styret for å unngå at det ble \"tatt\" av bussen. (Syklisten hadde knall gul refleksvest, og ville vært lett å se om sjåføren sjekket speilet.)", + "type": "String" + }, + "date": { + "value": "2014-09-11T17:03:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "5c886c59606fb5981650c7e1f5fd9e5f6f6d158d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1447": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91223459, + "lng": 10.75088381 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjenger gikk på rødt lys og ble påkjørt av syklist.", + "type": "String" + }, + "date": { + "value": "2014-09-11T16:56:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "fa2389e21cb0fc65cb7b8b80655178dc5b535847.jpeg", + "type": "String" + } + } + }, + "aftenposten-1446": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93362395, + "lng": 10.7544136 + }, + "type": "LatLng" + }, + "description": { + "value": "Presset ut av veien av bussen", + "type": "String" + }, + "date": { + "value": "2014-09-11T16:54:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ea761fed875901e4cb7e0d8da33ab1a85a372a6.jpeg", + "type": "String" + } + } + }, + "aftenposten-1445": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90556284, + "lng": 10.76894742 + }, + "type": "LatLng" + }, + "description": { + "value": "Lyskryss. Kommer man fra St.Halvards gate, registrerer ikke lyskrysset deg som syklist. Det \"ser\" kun biler, og skifter aldri til rødt med mindre det er en bil som skal ut fra denne veien. Det fører til at mange syklister ikke gidder å vente på en bil som skal samme vei, og sykler rett ut i krysset på rødt lys. (Og her er det dårlig sikt!)", + "type": "String" + }, + "date": { + "value": "2014-09-11T16:46:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "723158d0d0695213bdfb50a9cbec9f3502d96e69.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1444": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91358998, + "lng": 10.74698925 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei som går over i gå gate. Sykkel å gågate passer ikke sammen. Møller gata burde hvert mulig å sykle i begge rettningen. Dette er et mye mer naturlig sted å sykle, men er bare mulig en vei.", + "type": "String" + }, + "date": { + "value": "2014-09-11T16:25:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "954e254d41b836e482d731404c16e67c97918a19.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1443": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91816671, + "lng": 10.66566467 + }, + "type": "LatLng" + }, + "description": { + "value": "Her krysser Norges mest trafikkerte sykkelvei tvers gjennom en snuplass for biler. Ofte farlige situasjoner når bilistene ikke er oppmerksomme og syklistene tror at bilistene ser.", + "type": "String" + }, + "date": { + "value": "2014-09-11T16:18:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "201108134917aa044a3b750fcd6f43cb13c9b6ab.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1442": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90524162, + "lng": 10.76729893 + }, + "type": "LatLng" + }, + "description": { + "value": "Lattervekkende \"sykkelvei\" med hårnålsvinger rundt søyler i undergang.", + "type": "String" + }, + "date": { + "value": "2014-09-11T16:07:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "75641bbf64d8124fe6fd10f520b82ab3052846ba.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1441": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91495607, + "lng": 10.76990604 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig og farlig kryss. For eksempel er det vanskelig for busser fra sørvest å se syklister som kommer fra høyre.", + "type": "String" + }, + "date": { + "value": "2014-09-11T16:03:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "5e7042dcd699d693a4db797867c86ef10f3ee27e.jpeg", + "type": "String" + } + } + }, + "aftenposten-1440": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91833341, + "lng": 10.70420265 + }, + "type": "LatLng" + }, + "description": { + "value": "Falte med sykkel, for trangt til biler og sykkel, fraktur på armen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:46:39Z", + "type": "DateTime" + }, + "bilde": { + "value": "3860ecca4afb1c69f844781f2b7ed6b4.jpg", + "type": "String" + }, + "streetview": { + "value": "3cf2492b058dbf2a1df47d372124b317ff547e2d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1439": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91846248, + "lng": 10.70467472 + }, + "type": "LatLng" + }, + "description": { + "value": "Nesten påkjørt mange ganger på grunn av mangler av sykkelvei", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:45:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "f14192c3ef020b121a00daac7f685f105ed68379.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1437": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93638667, + "lng": 10.93131065 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig knekk på fortau i forkant av gangbru", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:25:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "8264d9379db395a47bc7cf90bace44db09f0a663.jpeg", + "type": "String" + } + } + }, + "aftenposten-1436": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90827029, + "lng": 10.76797485 + }, + "type": "LatLng" + }, + "description": { + "value": "Oslogate mellom Arupsgate og Schweigaardsgate. Ingen steder å gjøre av seg for syklister.Trangt og skummelt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:22:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "27f2eb3721fb8fc428c14687434f221f52a3fdfc.jpeg", + "type": "String" + } + } + }, + "aftenposten-1435": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92173192, + "lng": 10.75733184 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er gjort et ærlig forsøk på å lage en sykkelvei i markveien med sykkeltrafikk i begg retninger. Men bred sykkelvei har ført til smalt fortau som butikkene i tillegg ofte legger beslag på ved å sette ut varer. Merkingen er også slitt. Dette er til tider en populær gate og fotgjengere har liten respekt for sykkelveien og sperrer den ofte med barnevogner og grupper som bruker hele veiens bredde. Hele Markveien burde vært en ren gang- og sykkelgate opp til Sannergata. En forlengelse av Torggata.", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:19:31Z", + "type": "DateTime" + }, + "bilde": { + "value": "c8ca8f1eaca8da3076b7252d13f1ca9f.png", + "type": "String" + }, + "streetview": { + "value": "57db8671785582c9345e9cdf0a81bc8f28bbe3aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1433": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8949808, + "lng": 10.54870158 + }, + "type": "LatLng" + }, + "description": { + "value": "For syklister som ferdes ned Stasjonsveien er det ingen enkel oppgave å komme seg opp på fortauet før rundkjøringen. Dette er en mye brukt sykkelvei for syklister fra Jar, Stabekk og Bekkestua. Generelt sett mangler det en tilrettelegging for syklister på denne strekningen, og man blir syklende i veien, til hinder for bilister som skaper farlige forbikjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:17:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "2535cf22777b70cf797201c1bfd019909dc62b51.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1432": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9436955, + "lng": 10.70459961 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist MOT bil, i sommer! Syklisten ble fraktet bort i Ambulanse... PLUSS, folk som bor her blir ofte NESTEN påkjørt, av Uforsiktige Syklister, daglig! (spes. mand.-fred.) Det er fler som snakker i mobiler & sykkler som og har VELTET, akkurat ved plantasjen xkrysset- da IKKE pga veiforhold. Men, pga uoppmerksomhet, ihht møtende trafikk, som tydeligvis kommer brått på.", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:17:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "6a0ef1b11291a195551664f5ad87a3de9323723b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1431": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92689354, + "lng": 10.80217838 + }, + "type": "LatLng" + }, + "description": { + "value": "Pga veiarbeider på gang-/sykkelvei er det stadig ny trasè og/eller varierende underlag uten at endringene er varslet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:08:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "85f0571d4ed774a960101cbb9a58a7966a7896b9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1430": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92103289, + "lng": 10.67645788 + }, + "type": "LatLng" + }, + "description": { + "value": "Her krysser sykkelveien to bilveier. Feltet der sykkelveien krysser er markert som fotgjengerfelt! Fotgjengerfelt er vel for fotgjengere? Syklister har vikeplikt for kryssende biler, men merkingen forteller \"kjør på\". Hvorfor ikke markere tydeligere med vikepliktskilt slik at syklistene blir oppmerksom på vikeplikten?", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:06:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "7ec24502c76224c77537e0df751a29e1bf0eea51.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1429": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91274018, + "lng": 10.76183795 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet i begge retneinger er jevnlig fullt av biler som bruker det som parkering og for av og påstigning, og nærmere taxitasjonen på grønlands torg blir det ekstra mye.", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:04:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "da9f8be7257731cdd0c5ec66d3439df154415357.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1428": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94142779, + "lng": 10.74969291 + }, + "type": "LatLng" + }, + "description": { + "value": "Tåsenveien har ikke sykkelfelt. Men nedover, rett før rundkjøringen oppstår det 100 m med sykkelfelt. Skaper falsk trygghet da det slutter rett foran rundkjøringen, hvor det ikke er plass til både sykkel og bil. Mannlig syklist ble kvestet av lastebil her tidligere i år.", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:03:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "59a00871a6204c2b15787561984470edc56b9535.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1427": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93521496, + "lng": 10.74969291 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet går mellom parkerte biler og én fil for bilene. Men 30 m før rundkjøringen ender sykkelfeltet i et bussfelt/en ekstra fil for bilene. Mange farlige situasjoner når bilene legger seg inn rett foran syklistene og når bussen krysser fra holdeplass og over i venstre kjørefelt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:00:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "270a14f54e591031c81a5184281e833a5e70fb05.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1426": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91154612, + "lng": 10.82623243 + }, + "type": "LatLng" + }, + "description": { + "value": "Fortau mangler, smal vei som er dårlig belyst", + "type": "String" + }, + "date": { + "value": "2014-09-11T15:00:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "01a539ca3d99f792b9ac825bd2034ee19a585c1c.jpeg", + "type": "String" + } + } + }, + "aftenposten-1425": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92728063, + "lng": 10.76585054 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti nordfra stopper plutselig opp. Må ned fra fortauskant og ut i krysset før traseen fortsetter med sykkelfelt i Schleppegrells gate.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:50:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "a6e680b4e8e41b8e9b9e83a4e4766f035093a23f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1424": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92845262, + "lng": 10.76838254 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti fra begge sider stopper brått ved fortau. Må forsere kantstein og krysse gate for å komme videre.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:46:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "c316dd3c72d263a52052ad2d015e109b74f8af5f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1423": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94085277, + "lng": 10.75011134 + }, + "type": "LatLng" + }, + "description": { + "value": "syklist presset ut av rundkjøring av bilister flere ganger siste 10 år.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:46:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "58a5bf3f06799437af730eae5feccd74a9517bb0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1421": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9327424, + "lng": 10.74919939 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist presset av veien av bilister flere ganger i løpet av 10 år.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:44:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "ff64fc15270809694dfe0836128ef87c02ce91cf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1420": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91958101, + "lng": 10.75119495 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil presset syklist til kollisjon", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:42:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "65e2ed5790d1f6b3aa95c57eaf47030bde0868cf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1419": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92679139, + "lng": 10.7290399 + }, + "type": "LatLng" + }, + "description": { + "value": "I Norabakken i Pilestredet får du god fart. Pga bilkø i krysset med Sporveisgata skulle jeg sykle opp på fortau ved innkjøring midt i bakken. Der var det spor, slik at sykkelen veltet og jeg fikk hode-/skulderskade mm. Dette bør repareres eller helst bør det bli en egen sykkelfil - ref. også litt lengre ned der Taxier rygger ut/snur i gata", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:41:27Z", + "type": "DateTime" + }, + "bilde": { + "value": "3db7e04df58ce930d7942fefb843cacc.JPG", + "type": "String" + }, + "streetview": { + "value": "3262b7aa8aa59e561601a69aff5bdd89da664f63.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1418": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92009186, + "lng": 10.7583189 + }, + "type": "LatLng" + }, + "description": { + "value": "Gata er trang, det er knapt plass til de parkerte bilene og biler som skal passere på veien. Jeg kom syklende med kjæresten min, det sto en bil midt i veien med dørene åpne. Det var forvirring i forhold til hvorvidt vi skulle sykle forbi eller om bilen skulle kjøre først - ikke plass til at vi kunne kjøre samtidig. Kjæresten min syklet forbi bilen, jeg syklet etter, vinduet på bilen var nede og de hørte meg rope noe til kjæresten min. I det de kjørte forbi krysset i Markveien ropte de \\\\'JÆVLA BERGENSHORE\\\\' etter meg.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:28:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "cdcd48928b4a2fb959f35639f6784cf0401e66e9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1417": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9181936, + "lng": 10.74406027 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset er forferdelig uoversiktlig i utgangspunktet. Jeg fulgte trafikkregler og ventet på grønt lys, skulle fra Ullevållsveien til Thor Olsens gate. Stor svart bil gasset på i det lyset ble grønt og raste forbi meg, jeg ble livredd og måtte bremse/manøvrere for å unngå bilen og få oversikt over øvrig trafikk - mannen i bilen ropte sånn ca \\\\'hold deg på fortauet din jævla syklist\\\\' i det han suste forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:22:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "71a2a23dffe31110a24d4ecc8dcb0744b6672e02.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1416": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91123415, + "lng": 10.74975728 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er kollektivpulsåra i Oslo, men ute sykkel adkomst! Fortauet er fullt av folk og \"vollene\" buss og trikk kjører i er for høye og smale til å passere stanset buss/trikk. Ufattelig at man ikke har dedikert plass til sykkel… men ikke overrasket:-(", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:16:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "e52eaff7ccb165436a42e34aa1edfc1083349a3d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1415": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9276032, + "lng": 10.74342727 + }, + "type": "LatLng" + }, + "description": { + "value": "Geitmyrsveien langs parken er veldig trangt. Det er gatelangsparkering på begge sider, og det er ikke mulig å kjøre forbi et bil når noen sykkler opp her. Men mange bilistene forsøker likevel å kjøre forbi med ganske lite avstand til syklister her. Mulige tiltak: forby parkering på en side, eller skilting av sykkelgate med prioritet for sykkeltrafikk. Det kan også tenkes en bom med beboerkort (slik det fins på Grünerløkka) som stenger ut gjennomkjørend traffik.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:16:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "4647e33cf7b4c678708c7a20548034bc11069aa4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1414": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93423671, + "lng": 10.69845199 + }, + "type": "LatLng" + }, + "description": { + "value": "Firefeltsvei med trafikk opp mot 60-70 km/t. Eneste alternativet til å sykle i veien er er smalt fortau som skal deles med gående. Mange gående dukker \"plutselig\" opp når de kommer fra t-banen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:15:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "3e5e9aa470df869809882c655a3a0530af971c57.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1413": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92549568, + "lng": 10.73829889 + }, + "type": "LatLng" + }, + "description": { + "value": "Nesten-ulykke ved nedkjøring på sykkelfelt på Ullevålsveien fra kryss Colletts gate/Ullevålsveien. Plutselig kjører det en parkert personbil fra gatelangsparkering inn i sykkelfelt uten å se på sykkeltrafikken først. Svinger kjapt ut i veibane (ikke tid til å snu meg og se på trafikken) - så tuter det løs en mektig tute bak meg. Etter jeg er forbi personbilen og tilbake på sykkelfelt ser jeg at jeg hadde nesten blitt kjørt på av en Ruter-buss. I bilen var det en kvinne med småbarn på passagiersete. Hun hadde sett til høyre mot baby\\\\'n mens hun kjørte ut til venstre på sykkelfelt. Det erikke altid bra med sykkelfeld ved siden av gatelangsparkering - spesielt hvor det går nedover bakken hvor sykkler kommer ganske fort.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:13:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "8b4874a78ff3dbeadb709c66f2018a9667f8e70e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1412": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94186844, + "lng": 10.67109346 + }, + "type": "LatLng" + }, + "description": { + "value": "Splitter ny sykkelvei med livsfarlig kryss. Her må syklistene selv ta noe av ansvaret da mange kommer i stor fart ned sykkelveien som krysser Morgedalsveien. Krysset er uoversiktlig da biler kommer sent til synet, og det er heller ikke regulert med trafikklys.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:12:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "d04557cce5fc6e36b321a9a650c7b2a19158c9d5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1411": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91078233, + "lng": 10.82549214 + }, + "type": "LatLng" + }, + "description": { + "value": "Velger Fyrstikkbakken for å unngå Tvetenveien. Gang/Sykkelvei sperres ofte av ulovlig parkerte biler.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:08:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "42b5a4150ff3b4f523eb00855b702e52c98ac6d7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1410": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90450996, + "lng": 10.82194089 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei fra Ryen/Manglerud avsluttes ved rundkjøring utenfor Bryn-senteret. Her oppstår ofte potensielt farlige situasjoner med biler i dobbel rundkjøring.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:07:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "e2b789715ed263711690bed05d5c66995010c9f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1409": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.98039798, + "lng": 10.9722948 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelstien som går parallelt med riksvei 22 ned fra Gjelleråsen krysser Bråtenveien i bunn av en lang bratt bakke. Til og fra jobb er det mye trafikk på begge veiene og sykkelstien ofte blokkert av biler som står i kø på fotgjengerovergangen. Syklister kommer ofte i høy fart nedover riksvei 22, noe som skaper farlige situasjoner same ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:06:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b42eefeb9f57040c273d770c6eb5b1dc4c203a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1408": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94817673, + "lng": 10.64180374 + }, + "type": "LatLng" + }, + "description": { + "value": "Fra Røa-krysset til kommunegrensen mellom Oslo og Bærum er det kun et smalt fortau som ikke er egnet for sykling. Bilveien er meget trafikkert og mange bilister presser seg forbi selv om det kommer trafikk i mot, og da er det ikke mye å gå på.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:06:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "8cafdeab46d3736393e080afa729d4f94ff124b4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1407": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94453914, + "lng": 10.77660083 + }, + "type": "LatLng" + }, + "description": { + "value": "Veidekke er gjennomhullet. Det er veldig store sprekk langs trikkskinner, og dype hull hvor det er blitt borte både asfalt og grus. Veien er så farlig at den bør stenges for alt trafikering med bil, motorsykkel eller sykkel inntil trikkskinner og veidekke er bygget opp på nytt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T14:06:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "2594598330369dd53aa876045d63b05b0f1939ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1406": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92097912, + "lng": 10.64768314 + }, + "type": "LatLng" + }, + "description": { + "value": "Flere ulykker, ingen store personskader enda. Sikt kan lett bedres hvis den regulerte frisiksonen beskjæres sluk den skal. Har meldt fra til Bymiljøetaten i to år uten at det blir tatt tak i. Grunneier nekter å beskjære slik reglene tilsier.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:56:47Z", + "type": "DateTime" + }, + "bilde": { + "value": "d0f4e79e643eb4b0646ae1eb6085a766.jpg", + "type": "String" + }, + "streetview": { + "value": "865aa519ba1bf02f3aec0e65befb3dd8affe64c4.jpeg", + "type": "String" + } + } + }, + "aftenposten-1405": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90867374, + "lng": 10.75138807 + }, + "type": "LatLng" + }, + "description": { + "value": "Et veldig kort sykkelfelt foran Operaen. Ikke plass til fotgjengere og syklister foran Operaen i sommer med turbusser fulle av folk. I kjørebanen er det heller ikke plass til syklistene. Sykkelfeltet langs kaia tar slutt og I krysset må man snirkle seg gjennom mengder med folk. Farlig!", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:49:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "404848bc9962bd68c298b5c98e06de6fd6f46ddc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1404": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90417641, + "lng": 10.49644947 + }, + "type": "LatLng" + }, + "description": { + "value": "Hissige bilister og dårlige forhold for sykling.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:48:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "b4d6da5bcb5b07c14b44b9813b1cd14d7531985b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1403": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8942543, + "lng": 10.55902004 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister pressen syklister ut av veien", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:46:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "2f695980075e627533478a14a1ace763cc611980.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1402": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87631811, + "lng": 10.49956083 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil kjørte forbi og bråbremset rett før rundkjøring uten grunn. Jeg klarte ikke å bremse og resultatet var at baklykten på bilen ble knust.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:44:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "07a3ae62cf952713b3ea4380ec3b07982486c29a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1401": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9088136, + "lng": 10.75052976 + }, + "type": "LatLng" + }, + "description": { + "value": "Kommer sør fra Langkaia. I krysset forsvinner sykkelfeltet og syklister skal guides opp på fortauet, gjennom forvirra turister. Jeg har falt her to ganger. Krapp sving, prøver å dra forhjulet opp på fortauet i sakte fart (~3-4km/t), forhjulet \"glir\" ned igjen og dermed er balansen borte.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:43:51Z", + "type": "DateTime" + }, + "bilde": { + "value": "eb6319bc5858ebca83ec21cce8a7fad1.jpg", + "type": "String" + }, + "streetview": { + "value": "fcc1b9a57e44738e0a4fa093f3b1b33a8be5ce5b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1400": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.79443825, + "lng": 10.48679351 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister bruker spylervæske ved forbikjøring", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:42:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "fc641a381dd5cd81135669e6f18b7ad21b0dd355.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1399": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.81548271, + "lng": 10.47022819 + }, + "type": "LatLng" + }, + "description": { + "value": "Agressive bilister henger på hornet og bremser foran syklistene", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:41:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "c812fac4133b13081261eaf52a952a6eabc1679d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1398": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91078771, + "lng": 10.72919011 + }, + "type": "LatLng" + }, + "description": { + "value": "Har falt her to ganger. Begge ganger er samme oppskrift: Masse folk, fullstendig uoversiktelig, hurtig kursjustering etterfulgt av hjul i trikkeskinner. Mistenker at Dokkveien er den veistubben med størst mørketall i landet når det kommer til ulykker. Ser stadig vekk folk falle her. Særlig i regn og når det er mye folk.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:40:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "dbec8d060df97fe22036ceff68392420f66c5137.jpeg", + "type": "String" + } + } + }, + "aftenposten-1397": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90817885, + "lng": 10.75542211 + }, + "type": "LatLng" + }, + "description": { + "value": "Kolliderte med bil som svingte til høyre uten å bruke blinklys. Sykkelfelt I Dr. Eufemias gate er farlig da det brått tar slutt og man må kjøre mellom busser på holdeplass og biler som skal til høyre. smalt sykkelfelt også", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:40:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "c9f770cd982a5037568da019109d4a6db59f8e7b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1396": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.82997947, + "lng": 10.46962738 + }, + "type": "LatLng" + }, + "description": { + "value": "Aggresive bilister som ikke ser ut til å akseptere at veien også er for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:40:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "5e9a072442d8c3c72755bc74daefb57856169e09.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1395": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93418296, + "lng": 10.57339668 + }, + "type": "LatLng" + }, + "description": { + "value": "Bakketopp. Uoversiktelig. Ingen sykkelvei. Biler kjører forbi uten å vite om biler kommer i mot.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:39:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "3a4274c580dcc4a5aebf214327d88b91764ab84c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1394": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84967589, + "lng": 10.80380916 + }, + "type": "LatLng" + }, + "description": { + "value": "Bratt vei som ender ved barnehage/skole der foreldre som skal hente barn parkerer uoversiktlig i bakken og på gang-/sykkelvei, selv om det er parkeringsplass 10 meter unna. Og dermed skaper farlige situasjoner for egne barn. Forstå det, den som kan.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:38:50Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1393": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89714945, + "lng": 10.52079319 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom nedover Evjeveien midt på lyse dagen, med blinkende frontlys. Ble påkjørt midt i rundkjøringa av en bilist som kom fra høyre (jeg var da inne i rundkjøringen). Jeg hadde måttet bremse for å slippe fram to biler for å komme inn i rundkjøringen selv, men fikk likevel høre at \"jeg kom i hundre!\". Sjekket speedometer når jeg kom hjem, og faktisk hastighet var 24km/t. Det gikk bra med meg, men sykkelen ble ødelagt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:35:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "61864905ede5fab4c72e80642a3473f31f2c4bbc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1392": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87011463, + "lng": 10.81430196 + }, + "type": "LatLng" + }, + "description": { + "value": "Kommer man nord fra i Langbølgen og skal inn til Mellombølgen er det mye trafikk bakfra som presser. Det er også møtende trafikk. Legger jeg meg ut mot venstre opplever jeg ofte hissige bilister bakfra, til og med forbikjøringer. Dette gjøres enda verre om det er rødt lys 100 meter før. Signal med venstre hånd fører også ofte til at møtende biler stopper opp, selv om jeg ønsker å overholde vikeplikten...", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:31:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "15fa7527c124d38a4696972cf851e81b6287f703.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1391": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93456459, + "lng": 10.73432922 + }, + "type": "LatLng" + }, + "description": { + "value": "I krysset Sognsveien /Stensgaten kan være farlig hvis trikk og varslingslys er litt usynkront..Mulig det har blitt bedre nå, Men opplevde her flere ganger som både fotgjenger og syklist at jeg så at blinket hvit og da jeg er på vei over blinker det rødt og trikken er rett ved. Noen ganger nær på å bli fanget i mellom 2 trikker Opp og ned gående Alle gangene blinket det hvit men rødt da jeg stod på midtrabaten hvor trikken går..Man blir stående i gaten hvis man ikke ser det røde lyset før man går ut.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:28:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "fd1771313f625ca760202c69ee1e5a9e87130c9a.jpeg", + "type": "String" + } + } + }, + "aftenposten-1390": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88188518, + "lng": 10.78355312 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt forsvinner før krysset og mange skal først over krysset, så opp Raschsvei. Pressende bilister fører til at mange syklister legger seg inn på sykkelfeltet rett etter krysset, for så å snike seg ut i veibanen igjen 100 meter etter krysset for å kom seg opp Raschsvei.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:25:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "cb2da6c0beb82ef2a826b66e6f7b303317388f23.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1389": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92518922, + "lng": 10.7232356 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister er ignorert i nye Bogstadveien. Skandaløst.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:24:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "6641e91d3c9deb032e9cfe576922788677216b90.jpeg", + "type": "String" + } + } + }, + "aftenposten-1388": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9150744, + "lng": 10.76978802 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet fortsetter rett fram ved siden av en buss-bom. Alle biler må svinge til høyre eller venstre (retning sørover), mens mange syklister skal videre ned sykkelfeltet i Tøyengata. Det er vanskelig å få gjort det tydelig for bilistene hvor man skal her, slik andre også har rapportert.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:22:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "911541ebaabe95e1406ce937ac3551bc2360b1a1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1387": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91567137, + "lng": 10.77127933 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset er kaotisk for syklister som ønsker å fortsette rett fram i Tøyengata retning nordover, som dermed må krysse bilister som svinger til/fra Hagegata. Hvordan gjør man det tydelig for bilister at man skal rett fram og ikke svinge?", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:20:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "4bbc090248af80e2c6465d738cb85d5d06435f73.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1386": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91574666, + "lng": 10.77118277 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister som svinger til venstre fra Hagegata inn i Tøyengata er ofte ikke observant på sykkelfeltet som starter her. Dermed ligger det ofte biler langt ut i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:18:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "6293aa129f14f151be0969c217d4f295e6dd5820.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1385": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92874292, + "lng": 10.6212902 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilforetning plasserer konsekvent biler og søppelkontainer på eller helt oppi gang- og sykkelveien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:13:25Z", + "type": "DateTime" + }, + "bilde": { + "value": "2c19904e6de1a5a357b44e6cc660968a.jpg", + "type": "String" + }, + "streetview": { + "value": "0f72d1930a1b2bfd2f47e8e9ff59d20c0887d8ed.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1384": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92375365, + "lng": 10.77554941 + }, + "type": "LatLng" + }, + "description": { + "value": "Lyskrysset Ring 2 - Rv 4 ser ut til å være trykksensorbasert og derfor er det vanskelig å få krysset til å registrere at du står og venter på grønt lys. Det blir ikke grønt lys for sykkel/bil selv om det er grønn mann og kjørsignal for buss. Gjelder begge retninger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:12:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "90b2170a32c49b17bb7e43fcc69dcf75695564f5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1383": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92967295, + "lng": 10.66101908 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundkjøring der hovedsykkelvei ring 3 krysser fotgjengerfeltet ved utkjøring mot Radiumshospitalet. 80% av bilene blinker ikke ved utkjøring fra rundkjøringen, og da vet ikke en syklist at han skal vike selv om han har vikeplikt. Mange nestenulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:04:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "336fe203b31da56a642e376ed3b6518f058163d1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1382": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9290171, + "lng": 10.81051468 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen overgang etter gang/sykkelvei tar slutt. Vanskelig å krysse veien \"lovlig\" til tross for at det er skiltet videre med sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:00:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "315c0cca4745c9071fc42d960cde75994646b86b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1381": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92694193, + "lng": 10.63650369 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil fra Hartmannsvei som skull østover i Bærumsveien stoppet riktignok før fotgjengerfeltet, men så seg ikke til høyre og kjørte da det var klart fra venstre. Jeg havnet på panseret og brakk skulderbenet. Siden jeg ikke hadde gått av sykkelen var det vel jeg som hadde vikeplikt. Her burde det vært en adskilt sykkelvei med vikepliktsmarkering.", + "type": "String" + }, + "date": { + "value": "2014-09-11T13:00:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "b7a3083e5d561adea6b39929e5a652c313b34233.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1380": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92860315, + "lng": 10.71521043 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil skulle kjøre forbi mellom de 2 lyskryssene, la seg inn for tidlig og sendte meg i asfalten.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:58:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "3ca784ef200e38467b483f7592cafaad0fee2a6e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1379": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9106371, + "lng": 10.72945833 + }, + "type": "LatLng" + }, + "description": { + "value": "Som syklist er det et mareritt å komme seg til Nesoddbåten - stort antall syklister, alle i forskjellig hastighet og ikke minst forskjellig oppfatning av hva som er riktig oppførsel når alle må sykle mellom trikkeskinnene. Å komme seg UT fra mellom trikkeskinnene nede ved brygga er også veldig skummelt, siden man da må \"bryte ut\" og det kommer folk i stor fart fra alle kanter.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:49:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "613a244dd302a4d8d70aa60c0c50311363ed0ba6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1378": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91274556, + "lng": 10.75134515 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen løsning fra sykkel mellom spektrum og Jernbanetorget. Man må sykle over fortauet for å komme gjennom.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:44:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "16cc4c254b0a67541f9a85b97da4e8cc25d07f9b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1377": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91222921, + "lng": 10.74940323 + }, + "type": "LatLng" + }, + "description": { + "value": "Innkjøringen sykkelvei mot kjøreretning. Livsfarlig. Stupte i bakken for å unngå fotgjenger og bilist som ikke så seg for.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:42:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "e9148fab78f94d1e7cbeb24ab228907c330a3589.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1376": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9213125, + "lng": 10.75746059 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjengere går i sykkelstien", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:36:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "da90d1b8155847b9805818d3d21b1880411fdf78.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1375": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92620537, + "lng": 10.76797485 + }, + "type": "LatLng" + }, + "description": { + "value": "Massiv utbygningsarbeid som tidvis gjør at syklister, gående og biler i to retninger må dele ett kjørefelt, da det ene gangfeltet er sperret av til byggearbeid, det andre gangfeltet som parkering for biler og det ene kjørefeltet er sperret.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:34:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "725019dff24edaf74798c20704c2e37c8c81d473.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1374": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91079308, + "lng": 10.72866439 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig, biler, forgjengere og trikk i ett", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:33:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "0aa9a772d9b2ba8b0e2be260b6f71a5086b1a63a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1373": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90987866, + "lng": 10.71151971 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg såg et barn rulle ned fra sykkelveien ned mot E18. Jenten var 3 år gammel og tappet kontrollen over sparkesykkelen sin. Rekke mangler. Jenten var heldig da hun kunne rullet helt ned på E18.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:25:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "713e18e482836a14a07578c8c883803520769197.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1372": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92489351, + "lng": 10.77823162 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler parkert i veien gjør den smal og gir liten oversikt over trafikanter som kommer ut fra innkjørslene. Burde ikke være gateparkering og bredere fortau så ikke trærne tar all plassen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:24:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "88a41e1ec3205c3dd0170bc70baabfd7a0acb51b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1371": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94204041, + "lng": 10.69639205 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister fra Holmenveien kommer nedover i stor fart. Samtidig går det fotgjengere, ofte barn. Nedre del av veien er bilvei til boligene. Veien er også trang. Fort gjort at det smeller en dag.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:21:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "05ecda853456068d8cc77e96dd5425f5fd29e24c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1370": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.82864224, + "lng": 10.40860176 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilist forsøkte å presse felt med syklister av veien", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:19:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "012fcf0779cfa5a5f85b2c58d35cf720d7768f38.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1369": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93196835, + "lng": 10.66949486 + }, + "type": "LatLng" + }, + "description": { + "value": "Her sykles det fort begge retninger. Strekningen er trang og deles av fotgjengere, ofte skolebarn, og enkelte hus har utgang rett inn i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:16:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "e052dd1f7077f402a38ed1fd37ad928834ee6a9a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1368": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92149533, + "lng": 10.80662012 + }, + "type": "LatLng" + }, + "description": { + "value": "Her burde det vært merket et skille for gående og syklende. De gående ser seg aldri for, og vimser frem og tilbake. Dette skaper skumle situasjoner hvis ikke de syklende tar hensyn. Det kunne enkelt vært liitt bredere og skilt mellom gående og syklende.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:09:43Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1367": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92297938, + "lng": 10.7368505 + }, + "type": "LatLng" + }, + "description": { + "value": "Opp Dalsbergstien er det livsfarlig. Her må det komme sykkevei. Det er bare et spørsmål om tid før det skjer en alvorlig ulykke.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:05:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d8ac6e3451fb0da95dacf32cd12132e4966ee90.jpeg", + "type": "String" + } + } + }, + "aftenposten-1366": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92450639, + "lng": 10.73976874 + }, + "type": "LatLng" + }, + "description": { + "value": "Håpløs innsnevring. Tre biler som venter på grønt lys er nok til å hindre syklister å komme forbi. Bilister tar heller ikke hensyn og stopper helt inntil kanten.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:04:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "7062b7be6da8dc14b1edb52e9844fd336871aada.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1365": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92515158, + "lng": 10.77861785 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ingen sykkel vei men buss fil inntil den blir slått sammen med veien før Carl Berner krysset.Her kommer jeg nedover fra Hassle og konsentrert om å bremse opp for grønn buss noen meter fremme ved holdeplassen. En meter og to lenger opp ser jeg det står det ei dame som ser nedover mot krysset og ser ut til å skal gå over men det drøyer og jeg lar meg rulle videre. Plutselig går hun rett ut uten å ha sett oppover. Jeg brå bremser for å ungå kolisjon. Det er like før styre legger seg på tvers i det jeg stopper og ungår å kjøre i henne.Gikk heldig vis bra men hva vis det hadde vært en bil eller buss som kom der.Fikk kun en unskyld. Jeg er av den typen som stort sett kjører pent.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:03:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "362913b20462fcaf4056cad422ede9a2e7e398c8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1364": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93568795, + "lng": 10.73840618 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvorfor finnes det ikke et sykkelfelt her? Fortauene er brede, men fulle av fotgjengere som aldri tar hensyn. Dette fortauet kunne enkelt vært delt mellom syklister og gående. Veien er svært traffikert.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:02:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "82e98140b7fdd67559911b149a2a212f02c40ecd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1363": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91236368, + "lng": 10.74058413 + }, + "type": "LatLng" + }, + "description": { + "value": "Bommen dekker hele kjørefeltet og syklister presses opp på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T12:01:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "5c70fb746b8da55911ed2081d5a4c82c8dbd5bde.jpeg", + "type": "String" + } + } + }, + "aftenposten-1362": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96105825, + "lng": 10.89638829 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig uoversiktelig med biler som skal inn og ut på Trondheimsveien. Ble påkjørt av en bil som skulle ut på veien, havnet under den og ble dratt et par meter bortover, bare flaks at det gikk bra", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:59:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "1572e3e7cd7be2592567d243a2d7ddc00bf7cd9e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1361": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91332106, + "lng": 10.64261913 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved det tidligere Gjensidigebygget kommer det syklister i stor fart over fotgjengerovergang. Vanskelig for billister å se syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:57:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "d52e2632e341bdcd629e85298f71ae89c1f8652c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1360": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91376747, + "lng": 10.76756715 + }, + "type": "LatLng" + }, + "description": { + "value": "Vanskelig å komme seg opp til Enerhauggata fra Tøyengata. Sørligata er enveiskjørt, og bilene kommer raskt fra rundt svingen i motsatt retning. Fortauet er for smalt, og det har i tillegg stått et stillas der i lang tid. Den lille gangveien litt nedenfor er ofte blokkert av feilparkerte biler. Et sykkelfelt ville gjort seg!", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:57:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "7fca3e5b6c472ab6c691edb145293fcf3ec12fdc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1359": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95126059, + "lng": 10.66451668 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvem har egentlig vikeplikt her? Ser ut at biltraffiken i Arnebråtveien ALLTID har første rett?", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:56:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "ade7c7c4dd81e559465a3ea61683f0a9389af04b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1358": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90538149, + "lng": 10.74355602 + }, + "type": "LatLng" + }, + "description": { + "value": "Alt for liten avstand mellom søylene. Jeg holder meg på veien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:51:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "493e1daa5b3731fcf77e080794b2045118eef6f4.jpeg", + "type": "String" + } + } + }, + "aftenposten-1357": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94655948, + "lng": 10.71076869 + }, + "type": "LatLng" + }, + "description": { + "value": "Slemdalsveien nedover: Fortauet slutter og man havner mellom biler som skal til venstre (ringen) og ned mot Vinderen. Uoversiktlig og mange biler som trur at de klarer å komme videre før syklisten kommer.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:51:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "a3872f9306c9f4496fd767c3cb7742d039125120.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1356": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91298222, + "lng": 10.76477766 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig kaotisk i denne delen av Tøyengata. Ofte feilparkerte biler ved butikkene og vanskelig fremkommelighet. Vanskelig å få oveblikk over trafikksituasjonen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:51:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "ef2cb445d656e96a8c816230ab185cb3e71da955.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1355": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87656579, + "lng": 10.77572107 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien langs Mosseveien tar en tur ned til \"Paddehavet\" på en svært trang og uoversiktlig vei. Her er det både beboere som kjører, trafikk til marinaen og fotgjenger. Det føles mye tryggere å sykle langs E18 hvor det ikke en gang er kollektivfelt...", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:44:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "772bdfefbff84be9448296301c1aa75769fcb848.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1354": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94603828, + "lng": 10.77612876 + }, + "type": "LatLng" + }, + "description": { + "value": "Har opplevd flere ganger at biler har krysset over sykkelfeltet her på vei inn til Statoil eller Storosenteret, uten å se seg for, noe som har ført til farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:44:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "0355cacd5d02ffb767c871e7f2ccf985b0ce4564.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1353": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89848393, + "lng": 10.80406665 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkel og gangveien fra Ryen krysset og bort til Plogveien/Svartdalsveien stopper uten forvarsel og ender på et fortau. Det er ingen god sykkeltrase fra gang/sykkelveien og videre til svartdalsveien som man skal følge videre ned til byen. Dette skaper farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:41:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "91ac1b524704c6c0194af49e0ce52292780ea5bc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1352": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91478397, + "lng": 10.74913501 + }, + "type": "LatLng" + }, + "description": { + "value": "fremkommligheten på torvet burde vært bedre, få bort den bommen, og få litt mer ordnete forhold i dag er det det glade kaos,", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:40:58Z", + "type": "DateTime" + } + } + }, + "aftenposten-1351": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93109752, + "lng": 10.75855493 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet i stor fart. Bilen foran meg svingte inn på Sagene skole uten å blinke. Veien er smal pga mange parkerte biler. Jeg klarte ikke bremse pga grus i veibanen og krasjet på baksiden av bilen og ble slengt framover. Slapp unna med skrubbsår.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:40:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "281db8211111a5087336b49e335f4e62fd0ce6e9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1350": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91090604, + "lng": 10.76129078 + }, + "type": "LatLng" + }, + "description": { + "value": "Her (på andre siden) er eneste brua over til barcode uten å dra bort til oslo S. Hele området er sperret av pga. bygging på tomt ved teaterplassen. Hvorfor får private utbyggere ALLTID lov til å fortrenge fotgjengere og sylkister når de bygger?", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:39:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "7469c2dcec14756a057f463afde44b4292dfc293.jpeg", + "type": "String" + } + } + }, + "aftenposten-1349": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90251396, + "lng": 10.78375697 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet slutter og går inn på en gangvei med et kryss. Som sykkelist holder du høy fart nedover når du kommer over på gangstien. På gangveien er det ikke gjort noe skille for sykler og gående som skaper farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:37:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "964b1447f6a6f56d544dd07e7b7431412188ddab.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1348": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9253774, + "lng": 10.72287082 + }, + "type": "LatLng" + }, + "description": { + "value": "Nye bogstadveien er veldig fin, men noen har ikke tenkt på syklister i plantegningene:/", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:37:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "b4f82a5e37200ee2e8e96243a41291c17a6e066c.jpeg", + "type": "String" + } + } + }, + "aftenposten-1347": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91982837, + "lng": 10.72711944 + }, + "type": "LatLng" + }, + "description": { + "value": "Nestenulykke. Ble nesten påkjørt av bil i høy hastighet fra Uranienborgveien, da jeg var midt i krysset. De har forkjørsrett, men det er dårlig sikt akkurat her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:36:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "3cf5a1e3cbb6378c7f07c6491af3987c0d0037cd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1346": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92173192, + "lng": 10.73033809 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg risikerer daglig helsen langs vei/trikkeskinner fra Thereses gate videre nedover Pilestredet hvor det ikke er tilrettelagt for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:35:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "67b50bcfdf2165500732bcfcf51b3d894509e2a7.jpeg", + "type": "String" + } + } + }, + "aftenposten-1345": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9183119, + "lng": 10.73334217 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er ingen logisk vei for å komme seg fra Stensberggata til Slottsparken, siden holbergs gate er enveiskjørt. Viene burde være toveiskjørt for syklister, og enveiskjørt for bilister. Allerede i dag brukes denne veien flittig av syklister i begge retninger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:32:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "dfa795e4b8db3f7649f8c79c60f82435d79ff5df.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1344": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93466671, + "lng": 10.72908282 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet fordufter på sedvanlig Oslo-vis 15-20 meter før krysset når man sykler mot ullevål. Sykler her hver dag og opplever stadig taxier som presser seg forbi, ofte i rundt 50 km/t eller mer for å rekke grønt lys i krysset. En liten ubalanse på sykkel da, og ullevål har en ny kortreist organdonor.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:29:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "4dae03ba41e69aa95f475b6076cc97158757198a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1343": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92989336, + "lng": 10.74340581 + }, + "type": "LatLng" + }, + "description": { + "value": "Her sniker vi syklister daglig på rødt lys. Det burde vært sykkelvei gjennom krysset, hvor syklister som skal ned bakken langs st. hans haugen kan kjøre til enhver tid, å slippe å bruke gangfeltet som snik-vei.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:28:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "97cbaea673ce466dea9feb1c21b42b32151a37fb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1342": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91781716, + "lng": 10.73801994 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye trafikk og syklister har ingen pass, og blir heller ikke respektert", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:21:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "ec4df14046d7f1293d22dc86b8e685fd26817907.jpeg", + "type": "String" + } + } + }, + "aftenposten-1341": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87065317, + "lng": 10.79095602 + }, + "type": "LatLng" + }, + "description": { + "value": "Har du livet noenlunde kjært så passer du deg virkelig i i dette trafikkomplekset her. To motstående T-kryss plassert på rad, det ene med trikkebom, som gjør at biler stanger i kø og vil fort over (forståelig nok) fotjgengerfelt, OG nå i ombygging, ventende buss som står rett før disse to-kryssene (sperrer sykkelfeltet og utsikt selvfølgelig). Alltid masse kø og stressa trafikanter. Et trafikalt lite mini-helvete til tider. PASS OPP!", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:19:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "6fdaab78d1698d1c8ea6f72a4c4a36ac5064e298.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1340": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95189452, + "lng": 10.77123641 + }, + "type": "LatLng" + }, + "description": { + "value": "røykere på nydalen jernbanestasjon står oppe på sykkelveien på grunn av røykeforbudet på stasjonsområdet, skaper farlige situasjoner, når folk kommer i stor fart", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:19:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "0018f89f2a64e9e63b45f5d0c5f110bf07b35938.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1338": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91289078, + "lng": 10.74735403 + }, + "type": "LatLng" + }, + "description": { + "value": "Forhjulet i trikkeskinne. Salto over styret. Forstuet fot. Sykemeldt en uke.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:17:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "bbafdcaf0735c5f161cfbc0122b61c21c560bb63.jpeg", + "type": "String" + } + } + }, + "aftenposten-1337": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92725375, + "lng": 10.76115131 + }, + "type": "LatLng" + }, + "description": { + "value": "Her oppstår det farlige situasjoner når leddbuss svinger til venstre i lyskrysset. Syklister som ligger i sykkelfeltet til høyre for bussen blir presset ut.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:17:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "7a354096158245e5e0999fdba0c454b98bd35fd3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1336": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91362225, + "lng": 10.75044661 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg ble påkjørt av bussen mens jeg rundt hjørnet på sykkel. Det var ikke plass på fortauet pga veiarbeid, og heller ikke plass i veien påga trikk, biler, og busser. Derfor havnet jeg og sykkelen klemt mellom et veiarbeid-gjerde og en buss når bussen rundet hjørnet samtidig som meg, og sykkelen ble knust under bussen etter at jeg hoppet av.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:16:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "2ef3b371f4fa9b29fd428c5e6afeecd613d6a4a1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1335": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92724299, + "lng": 10.76205253 + }, + "type": "LatLng" + }, + "description": { + "value": "I Schleppegrells gate, på østsiden av krysset med Toftes gate, står det ofte biler parkert i sykkelfeltet. Gjelder begge sider av gaten.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:15:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "c9e4b755b750408ec810f6093fb2af9952554f85.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1334": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89577186, + "lng": 10.75675249 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien er gjennom en byggeplass. Det er svært trangt her, og intet mindre enn 5 kryss der det kommer tunge anleggsmaskiner og krysser \"sykkelveien\". Det nye nå er en slags kontainertunnel/bro der det er markert å være glatt, uten å gjøre noe for å avhjelpe det. Som skapt for ulykker, jeg gruer meg til vintersykling her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:14:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "e317f99891a6164d27fc39f51708dfab064fa7e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1333": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87334575, + "lng": 10.79016208 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil som ikke tar sykkelfeltet i betraktning og svinger ut. Jeg bråbremser på sykkel og unngår såvidt å bli meid ned. Farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:14:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "7f493adc1dad5da4527830c36211a0c5fee2648c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1332": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91081998, + "lng": 10.73598146 + }, + "type": "LatLng" + }, + "description": { + "value": "sykkelveien føres rett gjennom trikkeholdeplassen", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:13:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "1522f51c511d6285279125f2ae8361711e815ac4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1331": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93819253, + "lng": 10.68529844 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler daglig forbi Smestad. På en strekning over ca 200m skal jeg forbi en utkjøring fra taxiholdplass, forbi en busstasjon, forbi utkjørin fra bensinstasjon, gjennom en fotgjengerundergang, gjennom T-bane perrong, forbi en busstasjon til. Alt er market som sykkelsti langs Ring 3. Det skal vanskelig gjøres å planlegge en sykkelsti verre.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:13:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "8aaa22670fe9bbe035b18ec292d7063ab91996be.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1330": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93603194, + "lng": 10.72503805 + }, + "type": "LatLng" + }, + "description": { + "value": "Merking av sykkelfelt i vestlig retning er slitt bort på deler av denne strekningen. Fører til at biler kjører eller står i feltet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:13:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "353dfb41f605f2d102c3d81da76657aa4e62ed49.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1329": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92848488, + "lng": 10.73244094 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye trafikk og ingen sykkelvei. I tillegg er det trikk og trikkeskinner som gjør veien veldig utrygg. Man må velge om man vil ut på høyresiden av skinnene og få biler som passerer tett inntil deg, eller om man skal sykle midt i veien, og bremse trafikken. Svært ubehagelig.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:13:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "25cbe7cfe4f4408fee1f1281881dfce44a6a62f8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1328": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9260387, + "lng": 10.77749133 + }, + "type": "LatLng" + }, + "description": { + "value": "Det går fint å sykle i bussfeltet helt til bussholdeplassen Carl Berners T, men der opphører feltet og mange biler skal flette. Det er fullt av folk på fortauet, og umulig å sykle inn i Carl Berner-krysset på en god måte.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:12:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "8f7e8616e077e33fc5667581754560b1080183c9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1327": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9108899, + "lng": 10.73340654 + }, + "type": "LatLng" + }, + "description": { + "value": "på rådhusplassen burde det være en form for oppmerking som kunne sørget for at slapp å sykle på kryss og tvers blant fotgjengere, viktig at den blir holdt \"hellig\" ved plasskrevende arrangemanger som bilens dag og oslo skishow", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:12:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "e825c738b78e08743c912864cb5da62163ccdb67.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1326": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87840721, + "lng": 10.78769445 + }, + "type": "LatLng" + }, + "description": { + "value": "Området rundt Holtet er rett og slett farlig. Sykkelfeltet krysses av biltrafikk ørten steder.Ble påkjørt av bil som svingte brått over sykkelfelt. Legevakt. Au. Farlig. Har også sett annen person som ble påkjørt på nøyaktig samme sted. Da var det politi til stede, og påkjørte lå på bakken. Farlig sted.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:11:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "50c617bb027951167e0e5caa831c06ef750e977c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1325": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92396872, + "lng": 10.79149246 + }, + "type": "LatLng" + }, + "description": { + "value": "Vanskelig å sykle Grenseveien i dette krysset begge veier - veibanen varierer i bredde, og bilistene kommer i tidvis stor fart.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:11:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "460d418902541b2e3e32c8e65b4d61bddb1543a9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1324": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8800924, + "lng": 10.78656792 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist syklet i sykkelfeltet. Bilist krysset sykkelfeltet uten å se syklisten, syklisten kjørte inn i bilen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:10:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "b98fa4d499e9f74c4a4c08384f30340a8afec654.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1323": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91613388, + "lng": 10.79391717 + }, + "type": "LatLng" + }, + "description": { + "value": "Kryss fullt av tungtransport, personbiler, skoleelever, syklister og andre. Uoversiktlig - og livsfarlig glatt om vinteren. Ingen fotgjengerfelt og uklar vikeplikt!", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:09:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "54396c77725502aec85d7f7feb2690624a3ba738.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1322": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94141704, + "lng": 10.76542139 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummelt kryss, her kommer joggere, fotgjengere, hunder og syklister inn fra fire retninger. Mange uhell her, spesielt de som kommer ned fra Mor Gohjertas vei", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:08:47Z", + "type": "DateTime" + } + } + }, + "aftenposten-1321": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93493546, + "lng": 10.72806358 + }, + "type": "LatLng" + }, + "description": { + "value": "helt idiotisk gateparkering for kun et fåtall biler rett foran krysset i en ellers så fin(etter norske standarder) sykkelvei mellom universitetet og regjeringskvartalet", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:07:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "1654ab4a1fb32b8270e3dfa5866deb3d26ed454f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1320": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88411389, + "lng": 10.76909065 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det en brå innkjøring fra Mosseveien som krysser gangfelt/sykkelsti. Den brå innkjøringe er ment for tungtrafikk til havneområdet, og tungtrafikken kommer dundrende forbi i 40-50 km. De har ikke noe oppbremsingsfelt i Mosseveien, så de skal heller ikke bebreides. Strukturell feil! Farlig. Sett flere nesten-ulykker..", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:07:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "4363a17993b614e636ab80637d573ef16551d734.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1319": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9109921, + "lng": 10.63380002 + }, + "type": "LatLng" + }, + "description": { + "value": "På sykkelstien mellom Lysakerlokket og Fornebu er det mye morro. Mange syklister, mange fotgjengere og av og til noen biler skaper mange farlige situasjoner. Spesielt den bratte bakken ned fra Lysaker som ender I en krapp og uoversiktlig sving.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:06:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "be4fbc9d6e2e0504927eceb863115fe4ad11ced4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1318": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90982121, + "lng": 10.71834272 + }, + "type": "LatLng" + }, + "description": { + "value": "Front kollisjon mellom to syklister ved innsnevring pga. veiskilt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:05:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "937a28e0dfc9d6e45f0536689c89b795f85e954b.jpeg", + "type": "String" + } + } + }, + "aftenposten-1317": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91605321, + "lng": 10.75183868 + }, + "type": "LatLng" + }, + "description": { + "value": "I torggata er det mange vareleveringer som ikke overholder de plassene som er satt opp, men som i stedet slår seg løs over alt som finnes av fortauet, den burde være bare lov med varelevering på visse tider", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:04:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "d25bfee7bcbb6b78732c6b3e33007184d2fa2a73.jpeg", + "type": "String" + } + } + }, + "aftenposten-1316": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89605169, + "lng": 10.75574398 + }, + "type": "LatLng" + }, + "description": { + "value": "Her går sykkelstien g je n n o m en innkjøring som trafikkeres av tungtrailere som har dieselpåfyllingplass på tomt bak. Helt absurd! Sett to ulykker der, den ene med ambulanse. Farlig!", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:04:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "82a3bf5a89eff67b7a536e6f58067fc522c17df5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1315": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92770535, + "lng": 10.71331143 + }, + "type": "LatLng" + }, + "description": { + "value": "\"Alle\" biler kutter svingen inn i sykkelfeltet. Dette skjer for øvrig også mange andre steder. Fellesnevneren er smal veibane og krapp sving -> bilisten velger en linje som ikke medfører brå retningsendringer.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:04:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "99740894e2ab7c19cac5f9f7b15167e8ab119888.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1314": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91984988, + "lng": 10.7804203 + }, + "type": "LatLng" + }, + "description": { + "value": "For høy fart, svært krapp sving og grus i veibanen gjorde at sykkelen mistet veigrepet og jeg falt av. Skrubbsår på hofte, albue, armer og tre sting på venstre kne.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:03:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "6f8e4f82f9d48df2acefd53ee2f8609c099bd892.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1313": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9112256, + "lng": 10.72781467 + }, + "type": "LatLng" + }, + "description": { + "value": "Front kollisjon med syklist som syklet i motsatt kjøreretning.", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:03:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "fc5d4d43a382739249f95215aedd890093a2f34e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1312": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92308692, + "lng": 10.64094543 + }, + "type": "LatLng" + }, + "description": { + "value": "smal veibane, både 23 og 32 bussen har trasse her og syklister må sykle i veibanen. dette er også skolevei til lilleaker skole, trangt om plassen til myke trafikanter og 50 km/t sone. sett ned fartsgrensen og få sammenhengende sykkeltrasse fra rundkjøringen i vækerøveien/ullernchausseen og ned til lysaker/sollerud", + "type": "String" + }, + "date": { + "value": "2014-09-11T11:03:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "3e873541ff8c056ff79fbf16abf2276cb70beb13.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1311": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9396436, + "lng": 10.77383279 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet på forkjørvei mot Akerselva og ble påkjørt fra høyre. Det var trær og ugress som kan ha ødelagt sikten for bilføreren. Hadde de kuttet et par greiner og fjernet ugresset, kunne ulykken kanskje vært unngått.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:58:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "1a1689c0f757fd1032d76655df8f37bcc7da62a8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1310": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93635442, + "lng": 10.68055629 + }, + "type": "LatLng" + }, + "description": { + "value": "Ekstremt uoversiktelig kryss med meget stor trafikk og plutselig opphør av sykkelsti.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:58:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "307bd245e5ffcde40387acb4b8999e53a54d12a5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1309": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94528603, + "lng": 10.77742695 + }, + "type": "LatLng" + }, + "description": { + "value": "sykkelveien opphører rett før \"rundkjøringen\" i storokrysset, på andre siden er det 3 bilfelter og forttau som oppgang fra t-banestasjonen og som brukes som bussholdeplass i rushtiden", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:56:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "dbe9a3579f7b2c081879bdc9cf3e120aaff5121b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1308": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92480748, + "lng": 10.70893406 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist påkjørt av bil som kom ut fra Munthes gate, syklist var på fortau og kom fra Majorstuen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:56:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "84e87be521f2a4acd37124e3127824923fede4cd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1307": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92205454, + "lng": 10.68757295 + }, + "type": "LatLng" + }, + "description": { + "value": "Drosjesjåfør kjørte inn til siden og stoppet i sykkelfelt for å sette av passasjer. Jeg gikk på hodet over styret i forsøket på å unngå drosja. Sliter fremdeles med nakkeskaden tre år senere.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:55:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "f5873d8ffdf580d257c40dda560cc17a5a4aedde.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1306": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91115885, + "lng": 10.81037521 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil som kom ut Brynsveien så ikke syklist i retning Manglerud, som ble påkjørt og kastet ut i Østensjøveien, lav trafikk i Østensjøveien på dette tidspunktet, noe som ikke er normalen i rushtiden.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:53:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "bf37c7d8381af71c0e8971842c30006580cb0bec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1305": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91784942, + "lng": 10.65497875 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært uoversiktlig kyss mellom Nedre Skogvei og Vækerøveien. Enkelt å utbedre med bekæing av busker I krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:52:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "112d6797a346ca00d5ad6aa1702bc8c35e18c61b.jpeg", + "type": "String" + } + } + }, + "aftenposten-1304": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91212702, + "lng": 10.80624461 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt opphører", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:51:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "e07c6f45647d301e22788ee1a2533046a6294600.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1303": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91714493, + "lng": 10.81096529 + }, + "type": "LatLng" + }, + "description": { + "value": "Flere 180 graders svinger, og høy hastighet på de som er i retning helsfyr.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:50:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "ef20b2dd02adfb5f5c40274021d24cca0fd380e8.jpeg", + "type": "String" + } + } + }, + "aftenposten-1302": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9237429, + "lng": 10.80423831 + }, + "type": "LatLng" + }, + "description": { + "value": "Kunne med fordel ha vært speil ved undergang, så man vet hva som kommer de andre veiene i krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:49:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "a68473ea6d70f9883a5552c9f67aea04a6ef130b.jpeg", + "type": "String" + } + } + }, + "aftenposten-1301": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89446956, + "lng": 10.80565452 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig kryssing av vei for å komme til kulvert under Ryen-krysset, som bare er tilgjengelig fra én side. Det er også uklart hvor syklist skal ferdes, på bredt fortau med avkjøringsmuligheter før og etter kryss eller i veibanen. Å benytte veibanen fører ofte til stygge forbikjøringer av bilister som benytter lokalveien Enebakkveien som gjennomfartsåre. De fleste for å slippe unna bomringen. Ny sykkeltrasé er planlagt, men kjenner ikke status og fremdriftsplan.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:48:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "24558531476aa7f346fa4fa7bda965cb55e8e399.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1300": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93038793, + "lng": 10.79299449 + }, + "type": "LatLng" + }, + "description": { + "value": "Bredt og fint sykkelfelt, men gateparkering ligger innenfor, biler parkeres ut i sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:47:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "76684b4e7a36be43bc19b0f66856895bb0478b21.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1299": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89154188, + "lng": 10.80908775 + }, + "type": "LatLng" + }, + "description": { + "value": "Uklart hvor syklist skal ferdes, på bredt fortau med avkjøringsmuligheter før og etter kryss eller i veibanen. Å benytte veibanen fører ofte til stygge forbikjøringer av bilister som benytter lokalveien Enebakkveien som gjennomfartsåre. De fleste for å slippe unna bomringen. Ny sykkeltrasé er planlagt, men kjenner ikke status og fremdriftsplan.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:47:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "0facd88df9c348fb612988cb116b753d84037a28.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1298": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9462747, + "lng": 10.77525973 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forbi Storo senter respekteres ikke av bilister. Biler som skal inn til Statoil, Thaugland og Storosenteret må krysse fortauet og dermed nesten alltid vente på fotgjengere. Denne ventingen foretar de ofte i selve sykkelfeltet. De krysser også sykkelfeltet uten å se etter syklister først. Det gjør ikke saken bedre at lav morgensol gjør det vanskelig å se bilens blinklys (hvis dette overhodet tas i bruk).", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:46:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b8d1e3f2345336c17b2038ab7197b1cddf52b08.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1297": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94115372, + "lng": 10.77107548 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkeskinner og dårlig asfalt, sykkelfelle!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:44:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "acb39b46d86a5be26f8ca97aefff6f72d45b5875.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1296": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87649041, + "lng": 10.50078392 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei-merking er utvisket og dårlig synlig. Opplevd at speil på biler treffer sykkelstyret", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:44:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "894a9e808f6d7f8886abfba7bd8470e4bff797a6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1295": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94011653, + "lng": 10.76567888 + }, + "type": "LatLng" + }, + "description": { + "value": "Gateparkering gjør krysset uoversiktlig, dårlig merking og skilting for vikeplikt, og manglende gangfelt sørger for at vikeplikt ikke overholdes, og forgjengere \"ramler\" ut i veien mellom biler som står parkert.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:44:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "692f8411cb7634d6f8c8ee5e27f7b82ca9c8d0c1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1294": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92224812, + "lng": 10.73186159 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig situasjon!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:40:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "d1c499e8f49e766e59fc479ad6cc6c7404178615.jpeg", + "type": "String" + } + } + }, + "aftenposten-1293": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92507631, + "lng": 10.73076725 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset ved Josefines gate og Pilestredet er neste ikke mulig å mestre med sykkel hvis det er mye trafikk! Uklar hvem som får kjøre først!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:39:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "de618912b1379c0d6a42f56a9e24c3cd0600bb5d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1292": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90893194, + "lng": 10.74490785 + }, + "type": "LatLng" + }, + "description": { + "value": "Er dette \"tilrettelagt\"? Vanskelig å finne rett veg inn fra OsloS/Bjørvika. Sykkelfeltet (når du finner det) fylles opp av korttidsparkerte varebiler, søppelcontainere og fotgjengere. Bruker heller veibanen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:38:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "2b69cad2734f934cb955e114e61af10bf27c821a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1291": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91874211, + "lng": 10.68218708 + }, + "type": "LatLng" + }, + "description": { + "value": "Som fotgjenger er det veldig lite oversiktlig å krysse sykkelveien. Syklistene kommer i meget høy fart, og fotgjengere må krysse sykkeltrasséen mellom to svinger. Her er det bare å ta sats å springe over før noen eventuelt kommer og et fotgjenger/sykkel-kræsj er et faktum.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:37:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "b45d514f3caf4956613d24f510fd520295fe7c3f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1290": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9290386, + "lng": 10.76934814 + }, + "type": "LatLng" + }, + "description": { + "value": "Situasjon ved ny undergang er farlig og uoversiktlig! Høy fare for at man ikke ser hverandre. Bratt bakke som gjør at mange nærmer seg med høy fart!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:37:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "1357b7cf29acfc72a10db1c9d0fb0cf79d988866.jpeg", + "type": "String" + } + } + }, + "aftenposten-1289": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92614085, + "lng": 10.77591419 + }, + "type": "LatLng" + }, + "description": { + "value": "Ny trafikkløsning på Carl Berners plass er uoversiktlig og farlig for syklister! I tillegg kommer mye buss og trikk trafikk!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:35:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "7baef299191cb0b15e8ce0b1e9bc5a9f597d3cc2.jpeg", + "type": "String" + } + } + }, + "aftenposten-1288": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90931924, + "lng": 10.76381206 + }, + "type": "LatLng" + }, + "description": { + "value": "Avkjøring til Nordengabru på nordsiden er dårlig løst for syklister! Trange svinger!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:33:37Z", + "type": "DateTime" + } + } + }, + "aftenposten-1287": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94262077, + "lng": 10.70360183 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei \"langs\" ring 3 går for tiden ned i krysset Holmenveien/Borgenveien. Meget trafikkert kryss, daglige farlige situasjoner både i bilvei og på fortauene. Ny sykkelvei langs ring 3 mellom undergang Gaustad og Holmenveien skulle påbegynnes i høst, men ser nå at den er ytterligere forsinket på grunn av utredning av kollektivfelt på ring 3.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:33:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "5fdd1a207fbe4be795d9299eef1fa372938cbe96.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1286": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90744725, + "lng": 10.75649499 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært trangt, trafikert, uoversiktlig trafikkbilde. Som alltid er sykkeltrafikken prioritert nederst, etter biler og fotgjengere. Hvor skal syklistene gjøre av seg her? Mange blir nødt til å finne på egne trafikkregler.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:32:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "dd661721b001a72443da32eb20ec8fe62a99ccc2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1285": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91355771, + "lng": 10.75029373 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er trangt for syklister i Storgata, mange trikker og busser. Vanskelig å kjøre inn og ut av gaten fra/til sidegater på grunn av høy fortau!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:31:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "698dc77c4584a91d8b2f746a5d18106040566e78.jpeg", + "type": "String" + } + } + }, + "aftenposten-1284": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91016913, + "lng": 10.70925593 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen vei utenom rundkjøringen, buss kom inn i full fart som førte til bråbremsing og kjedekollisjon med flere sykler. Brukket ribben.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:31:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "575daf2394fea2dbb4e64e1a0b7e9f1eff834d8c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1283": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94529678, + "lng": 10.70536136 + }, + "type": "LatLng" + }, + "description": { + "value": "Er mangler det et stykke sykkelvei!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:29:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "76b67378a4bc9b72930fa836ae3d0475a474017e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1282": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89465253, + "lng": 10.83264827 + }, + "type": "LatLng" + }, + "description": { + "value": "Flott sykkelfelt, men vegen er av \"dessverre\" også av topp kvalitet, bred og rett. Fører av og til til svært høy fart hos noen bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:28:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "cb9cb5edd65069731013f0bc3afef874258cb14c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1281": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93955761, + "lng": 10.70433139 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig, trang og bratt vei! Man blir nesten tvunget å sykle på fortau, men her kan man fort komme i konflikt med fotgjengere!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:28:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "6f8eee9570ff6490fa829e4696511f44689ceeae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1280": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90569352, + "lng": 10.82091093 + }, + "type": "LatLng" + }, + "description": { + "value": "Enda et eksempel på at syklistene blir glemt eller grovt nedprioritert. Her er det ingen markeringer for sykelfelt og fritt fram for bilene å bruke hele veibanen. Noe de stort sett gjør. I tillegg er det nå laget høye kanter opp til gangfeltet. Så kommer du i en skvis med buss eller bil, som jeg stadig gjør. er du fort fanget. Har prøvd et par ganger å sykle sakte på gangfeltet, bare for å bli hudflettet av en fortgjenger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:27:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "0e570fd4738ead01f39c9050dea13b83cec1d2bc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1279": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94340533, + "lng": 10.72162628 + }, + "type": "LatLng" + }, + "description": { + "value": "Situasjonen rundt t-bane stopp Forskningsparken er uoversiktlig for syklister! Det er også vanskelig å finne frem som syklist siden siden noen gater er stengt for biler uten at man har tenkt på syklister!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:27:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "16590583f4df1d87892d5cee2e9974726ba2b57c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1278": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9043647, + "lng": 10.82248806 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet opphører å eksistere før rundkjøringen. Det gjør ikke syklistene. Bilister legger seg tidlig helt til høyre i veibanen på vei inn mor rundkjøringen, dvs. i sykkelfeltet når det er mye trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:23:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "40e318b2a30138fda506aa30bdfcaa14a87761eb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1277": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92072101, + "lng": 10.76273918 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien her er farlig for syklister, med til dels tre kjørefelt med mye bil- og busstrafikk, samt to trikkeskinner. Å være syklist føles ikke veldig velkomment og er farlige da busser tuter og sneier syklister til stadighet", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:22:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "501e61d9bcbe53b03ff36f6022f69427511c3c05.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1276": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93332293, + "lng": 10.72638988 + }, + "type": "LatLng" + }, + "description": { + "value": "Oppmerkingen av sykkelfeltet følger ikke kantsteinen rundt den lille knekken til høyre, som fører til et veldig smalt sykkelfelt og biler som (uten å krysse merkingen) kommer veldig nærme syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:21:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "f1e636c787da85954c052687546a2b3c2d6213aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1275": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90716752, + "lng": 10.75967073 + }, + "type": "LatLng" + }, + "description": { + "value": "Såfremt du ikke har et ønske om skader og/eller tidlig død, bør du holde deg unna vestgående sykkelfeltet i Dronning Eufemias gata. Veldig dårlig planlegging gjør at du sykler gjennom en serie lyskryss i en kontinuerlig konfliktsituasjon med busser, biler og fotgjengere. Etter et par skremmende situasjoner med noen busser holder jeg meg langt unna denne gata.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:19:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "92a059c90f269a70eb678042cf6ddc4a3ac157f5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1274": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88008702, + "lng": 10.82651138 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt bakdel av sykkel. Sykkelbane \"blir borte\".", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:19:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "aa86f3f574c52a7e0155f820b01c077a4e0e9af7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1273": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92087157, + "lng": 10.68958997 + }, + "type": "LatLng" + }, + "description": { + "value": "Om vinteren benyttes sykkelfeltet i Drammensveien til lagring av snø. det ligger alltid store hauger utenfor innkjøringene.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:19:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "b86d129ba4c9e7ff814485caf20690b5f73bbff9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1272": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92615376, + "lng": 10.77610301 + }, + "type": "LatLng" + }, + "description": { + "value": "Hektisk morgen i Carl Berner i det trikk, buss, bil og fotgjengere kjemper seg igjennom rundkjøringen. Jeg kommer kjørende nordfra, og holder for fotgjengere, så blir det klart, og jeg kjører. Om trent i det samme kommer det en syklist susende nedover til venstre for meg, men i kollektivfeltet. Jeg må bråstoppe i rundkjøringen for å ikke kollidere. Syklisten fortsetter ferden retning Majorstuen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:18:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "f1f5aec758bad649651cc7b8a9dce9c333a519e4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1271": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91742996, + "lng": 10.72900772 + }, + "type": "LatLng" + }, + "description": { + "value": "Ny drenering på slottsplassen fungerer dårlig for syklister på grunn av store ujevnheter!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:16:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "8938948d694c23833709314af5b1189ba8581624.jpeg", + "type": "String" + } + } + }, + "aftenposten-1270": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92283958, + "lng": 10.67836761 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler kjører og parkerer i sykkelveien for å slippe av folk som skal med toget/flytoget. Ofte opplevd nestenulykker her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:15:50Z", + "type": "DateTime" + }, + "bilde": { + "value": "c7fd301044e23e75660362a7f9a34575.JPG", + "type": "String" + }, + "streetview": { + "value": "18e27cd585ae5d29f8ab707a702fcd573452eff6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1269": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93795606, + "lng": 10.68466544 + }, + "type": "LatLng" + }, + "description": { + "value": "Inn og utkjøring fra bensinstasjon, bussholdeplass og taxiholdeplass. Veldig uoversiktelig.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:15:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "481aa64b76c5537e38337d64fe26ebb89e4e754a.jpeg", + "type": "String" + } + } + }, + "aftenposten-1268": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9388294, + "lng": 10.68749785 + }, + "type": "LatLng" + }, + "description": { + "value": "Koblingsboks for trafikklys står midt midt i gang og sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:14:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "b2d41eb04fecc8a00ed773e9840bd5daa4b223e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1267": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95000344, + "lng": 10.73307394 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler parkert foran Ullevål Stadion står med fronten eller bakenden ut over gang og sykkelvei, og gjør den 1/3 smalere enn det den faktisk er. Man kan bli påkjørt av parkerende biler som plutselig kommer inn i gangveien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:13:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "1272ff7301dd25b0d35696ae1239c6e0b0add8a6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1266": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91105127, + "lng": 10.73531627 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti over rådhusplassen! Farlige situasjoner når man sykler fra gaten på plassen. Her kan det lett oppstår missforståelser mellom bilister og syklister! Situasjonen ved Akersgata er spesielt uoversiktlig og forvirrende!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:13:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "fff4b75a41724bbbba1d223b80b311b3ea119b61.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1265": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91264068, + "lng": 10.76285183 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler i parkeringsfeltet tar ikke hensyn til sykkelfelt. Krysser foran sykler, parkerer i sykkelfelt og åpner dører fra bil når sykler kommer.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:12:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "9f494eba167de4a696cfe6486a56df5d6e3368d4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1264": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94738961, + "lng": 10.76011598 + }, + "type": "LatLng" + }, + "description": { + "value": "Busslomme bryter sykkelfeltet. Syklet ved siden av buss på vei nedover Maridalsveien og kom sannsynligvis i bussens blindsone. Ble presset inn mot fortauskanten og måtte bremse hardt for å unngå å komme i klem når bussen svingte inn mot bussholdeplassen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:12:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "564d71acdb7ff67a5bc7c96663b5bfffbbda2294.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1263": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94878386, + "lng": 10.72877705 + }, + "type": "LatLng" + }, + "description": { + "value": "Port fra kolonihagen fører rett ut i på gang og sykkelvei. Plutselig står det folk foran deg som ikke var der ett sekund før.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:11:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "8a1d74de41edbbc4b1fcab63209e8abcaf3ea38e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1262": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94926203, + "lng": 10.73098182 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig situasjon for syklister under gangbro ved Ullevål stadion når man sykler langs ring 3", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:10:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "7445e9f4aaae1655e6c2dcaa5e6c8da1bcdcfd65.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1261": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94558156, + "lng": 10.71365475 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er to veier rundt broen for syklister. Gir uklart trafikkbilde fordi man ikke vet hvilken vei andre syklister eller fotgjengere vil velge.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:10:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "7c52bc409347349c0c733455eb63c04ac6b4d2cb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1260": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94567828, + "lng": 10.71087598 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal veibane rundt blind sving inn i tunnelen. Sluk plassert midt i sykkelfeltet. Betongkant ved inngangen til tunnelen. Vanskelig å ikke kommer over i motgående sykkelfelt pga. alt dette.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:09:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "9d80d84eac8800164ac72ccfe5376724e94a42d1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1259": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93198985, + "lng": 10.72325706 + }, + "type": "LatLng" + }, + "description": { + "value": "Kirkeveien oppleves trang når man beveger seg på sykkel! Mye trafikk og mange busser!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:09:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "19b9a87655f785db190cf93d3ab5c3126802b499.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1258": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91349317, + "lng": 10.73662519 + }, + "type": "LatLng" + }, + "description": { + "value": "Trang gate med mange busser, ingen plass for syklister i gaten!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:08:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "7a298ff9ad11827e4a14060a0d4049ab19155ae2.jpeg", + "type": "String" + } + } + }, + "aftenposten-1257": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90740086, + "lng": 10.81880673 + }, + "type": "LatLng" + }, + "description": { + "value": "For sykling fra Brynseng gjennom Rundkjøring og opp mot Bryn senter. Det eksisterer sykkelfelt inn og ut av rundkjøring, men den forsvinner i selve rundkjøringen. Bilister som ikke er oppmerksom på dette kan kutte svingen (noe som ofte skjer gjør siden det er kø her i rush-tiden) og presse syklist inn i fortauskant. Det er ikke naturlig eller lagt til rette for at man skal sykle fra sykkelfelt og opp på fotgjengerfeltet her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:07:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "f296090b5d8db40342716977b66b92ded0eda56e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1256": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94487229, + "lng": 10.70569396 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange syklister tar \"snareveien\" over skolegården, og kommer i stor fart inn på veien igjen ved innkjøringen til skolen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:07:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "e756bb2660938ec7e58dda9eb4dd2461a66866ed.jpeg", + "type": "String" + } + } + }, + "aftenposten-1255": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91264337, + "lng": 10.74791193 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig situasjon for syklende! Man har selv dårlig oversikt og så er det fare for at man ikke blir sett!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:07:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "0796a7a39efcecb431edd7deae66a99b4a0b23e1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1254": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9065166, + "lng": 10.76295375 + }, + "type": "LatLng" + }, + "description": { + "value": "Leddbuss la seg uten forvarsel ut og tok hele sykkelfeltet. Måtte kaste meg opp på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:06:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "33d5df4ab22039ec4cc5453cb2ad50c0a490f3f6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1253": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94285722, + "lng": 10.70383787 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien går igjennom parkeringsplassen til Vinderen handelsområde. Mye farlig. Biler som rygger, varelevering som sperrer veien, uklare forhold angående vikeplikt (høyreregel, ut fra parkeringsplass osv.), mange fotgjengere som ikke ser seg for, og uklart hvor sykkelveien går pga. dårlig skilting", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:06:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "90f2e68a4f1911067d4d16df55121fb26ca37e4e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1252": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92880744, + "lng": 10.71548938 + }, + "type": "LatLng" + }, + "description": { + "value": "Innkøringen fra Kirkeveien og inn i krysset, der kollektivfelt plutselig opphører.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:06:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "3d04c1053a63fd072ed9b798a5cfb2374453a077.jpeg", + "type": "String" + } + } + }, + "aftenposten-1251": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91801075, + "lng": 10.73784828 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset mangler tilrettelegging for syklister! Jeg unngår å sykle her siden det er farlig og trangt!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:06:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "d24aa919e6e4b0d8d24c626770a050e14f2004c6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1250": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93588144, + "lng": 10.73531627 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummet å krysse over fra kollektivfelt til avkjøring ullevål sykehus, vanskelig å køre EL bilene i kollektivfeltet, som ALLTID kjører forbi (tett på) sykler.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:05:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "44c9ca47ab1f1b8e7f355478dba0daf9be6675b2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1249": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9115246, + "lng": 10.75711727 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke morsomt å sykle i Schweigaardsgate, spesielt ved Oslo bussterminal. Helt ny gate, men ingen tilrettelegging for syklister!!!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:04:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "1b1891f360f5f3eb97aa4a693ac0f818bf265f13.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1248": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94554395, + "lng": 10.70570468 + }, + "type": "LatLng" + }, + "description": { + "value": "denne sykkelveien eksisterer ikke!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:03:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "30d124676e59d48e562514e5df575c895baffbdc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1247": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93573095, + "lng": 10.73218345 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummelt å krysse veg, når en skal videre til Ullevål sykehus", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:03:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "77037df90169f7ab3431cb886e9d472a25ba2ef0.jpeg", + "type": "String" + } + } + }, + "aftenposten-1246": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91127718, + "lng": 10.74997186 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er veldig vanskelig å krysse Jernbanetoregt med sykkel, spesielt i nord-sør retning! Farlig og skummelt siden på grunn av mange busser og trikker og ingen sykkelfelt!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:02:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "c756d7397c2785ae8c4d15c703c25f00e6b8575e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1245": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91259496, + "lng": 10.63601016 + }, + "type": "LatLng" + }, + "description": { + "value": "Lysakerlokket: Problem 1: Taxiholdeplass midt i sykkelveien.. Problem 2: Syklister som sykler imot kjøreretningen. Problem 3: Parkeringsselskap som anlegger parkeringsplasser som fører til at sikten fra sykkelveien mot bilveier hindres.", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:02:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "2264ff180c0682146fb11080058600c957247aff.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1244": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9431259, + "lng": 10.73025226 + }, + "type": "LatLng" + }, + "description": { + "value": "Gaten bygges om til miljøgate uten at det tas hensyn til syklister! Situasjonen var bedre for syklister før ombygging!!!", + "type": "String" + }, + "date": { + "value": "2014-09-11T10:01:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "9420f62242fe8c6407abe4df33101fac93b334ab.jpeg", + "type": "String" + } + } + }, + "aftenposten-1243": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94112685, + "lng": 10.77106475 + }, + "type": "LatLng" + }, + "description": { + "value": "Kryssing av trikkeskinner her er livsfarlig. Dype huller i overgangen mellom trikkeskinnner og asfalt", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:59:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "4e122f921cec879059f1308882a339a8fb624d0a.jpeg", + "type": "String" + } + } + }, + "aftenposten-1242": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89834403, + "lng": 10.57573556 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler fra Høviksvingen som skal ut på E-18 overser syklister i sykkelfeltet. Denne veien var tryggere å sykle på før man \"tilrettela\" for syklister med sykkelfelt, fordi man da måtte bruke veibanen, som hindret biler i å kjøre forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:59:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "648942a7ddf3a19d6c4277f7c6c6461130f9112e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1241": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93555895, + "lng": 10.73960781 + }, + "type": "LatLng" + }, + "description": { + "value": "Ring 3 ved Ullevål sykehus er ikke tilrettelagt for syklister. Bred fortau, men hvis man sykler her kommer man i konflikt med fotgjengere og folk som venter ved bussholdeplasser.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:59:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "52c958464d00d34ed10624c896508f3e608cd6c8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1240": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84748864, + "lng": 10.78859701 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig hullete vei. Farlig når man skal svinge av ned Kruttverkveien og samtidig må gi tegn.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:58:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "b4c400d75dad1c8e4071dc9330f16253ebb199cf.jpeg", + "type": "String" + } + } + }, + "aftenposten-1239": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91799462, + "lng": 10.74431508 + }, + "type": "LatLng" + }, + "description": { + "value": "Skjønner ikke hvordan jeg skal komme meg over krysset på en fornuftig måte som syklist, kommer fra Thor Olsens Gate og skal ned St. Olavs Gate. Like stort kaos hver dag for alle syklistene som kommer denne veien. Burde ikke være enveisskjørt i St.Olavs Gate for syklister. Hvilken alternativ vei skal man som syklist ta? Et forbud ingen uansett forholder seg til...", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:58:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "2696134f0b52a399cceb5064eaab997209c27c32.jpeg", + "type": "String" + } + } + }, + "aftenposten-1238": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92852788, + "lng": 10.71493148 + }, + "type": "LatLng" + }, + "description": { + "value": "Dagelig opplever jeg nesten ulykker i kirkeveien mellom sørkedalsveien og middelthums gate på vei til jobb. Difuse sykkelfelt som stopper og starter igjen, farlige høyresvinger og bildører som plutselig går opp mitt i sykkelfeltet (gateparkering er lagt på innsiden - hvorfor ikke fjerne den helt på dette strekket?)", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:58:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d91cfa466c01d245ee35c5671a87bbd3c513319.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1237": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91996818, + "lng": 10.72669029 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom syklende fra Parkveien, svingte inn i Hegdehaugsveien, og fikk forhjulet i trikkeskinnen i svingen. Jeg gikk rundt. Etter meg hadde jeg en rekke biler, så jeg ser det som ren flaks at jeg ikke ble påkjørt der jeg lå midt i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:57:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "5d39f7f729729774de26ef77f397f55fc39b86ec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1236": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91599943, + "lng": 10.74892044 + }, + "type": "LatLng" + }, + "description": { + "value": "Situasjon hvor Ring 1 ligger over bakken og i tunell frem til Akersgata er ikke løst for syklister! Farlig å sykle her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:57:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "bf04871b2c77de87631ff3b2f86dd392b8bd6bf7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1235": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94090114, + "lng": 10.85110187 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilbom sperrer sykkelfeltet retning Økern. Ingen forvarsling om at feltet er sperret.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:56:15Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1234": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93742935, + "lng": 10.68343162 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig og uoversiktlig undergang, og sykkelsti over perong på t-bane plattform.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:54:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "87b6f68949d31ec6031cbbe8c0d8b4433d1f6fa0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1233": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85814597, + "lng": 10.78475475 + }, + "type": "LatLng" + }, + "description": { + "value": "Trangt, mange parkerte biler (og om morgenen er det ofte noen som skal ut), samt lange greiner som henger ut i veien og gjør at man må sykle nesten midt i veien (retning nordgående).", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:54:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "a0bf53626a0c334d96bc1679d14da9913a08f341.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1232": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91543473, + "lng": 10.73328852 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er en høy kant her (hvor brostenen slutter) som er veldig ubehagelig, og som jeg er redd for hver dag.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:54:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "939f3349f465c2aca02f4a85b741a429dc840b6e.jpeg", + "type": "String" + } + } + }, + "aftenposten-1231": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93530902, + "lng": 10.74432313 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister som kommer fra Sagene og skal videre langs Ring 2 retning Majorstuen sykler over bensinstasjonen eller hopper opp på fortauet for å unngå lyskrysset. Veldig uryddig trafikkbilde pga dette.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:52:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "ed82e08ce637dfbdb7c3b9f1138eac5f2c386ac4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1230": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9077754, + "lng": 10.76791048 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg sklei ut på våte trikkskinner i nedoverbakke mot Schweigaards gate. Skrubbsår og skadet tommel. Heldigvis kom det ingen bil eller trikk. Her er det logisk å krysse skinnene mot midten av veien fordi asfalten til høyre for skinen blir plutselig smal ved bussbomen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:51:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "8d5ddb2ee80348881391f153916df148ddaf0643.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1229": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94273362, + "lng": 10.70371448 + }, + "type": "LatLng" + }, + "description": { + "value": "Frontkollisjon mellom to sykler. En kom ned Borgenveien i stor fart, en ut bak en parkert bil. En brukket tommel og en tommelfinger ut av ledd, flere dagers sykmelding på begge.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:50:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "3d0969c1d90d9d98e066fef287ed2878d064417e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1228": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94480243, + "lng": 10.86191654 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset Nedre Kalbakkvei og Svenn Oftedalsv. Stort kryss, helt sikkert laget for å lettegjøre for tungtransport, men medfører heller at kjøretøy kan ta av fra N.Kalbakkvei i HØY hastighet. Farlig for syklende på parallel gang og sykkelvei. Syklende har også høy hastighet i bakken her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:48:04Z", + "type": "DateTime" + }, + "bilde": { + "value": "1e0691f922a82cc67f50b79ffdf9d413.jpg", + "type": "String" + }, + "streetview": { + "value": "6ad3334c7ceda42e46d8174204252e6e319dab0c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1227": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91383739, + "lng": 10.78891754 + }, + "type": "LatLng" + }, + "description": { + "value": "Klassisk situasjon, bilfører (som snakker i mobil!) svinger plutselig til høyre inn en avkjørsel - over et flott sykkelfelt - og jeg unngår så vidt å bli kjørt ned. Mulig at rød asfalt gjør sykkelfeltet enda tydeligere og vil hjelpe? Men kanskje ikke mot uoppmerksomme og tanketomme bilister som ikke skjønner at et sykkelfelt på høyre side krever bitte litt oppmerksomhet når han skal svinge til høyre.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:46:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "97c45d8d045768c6f006647efc74e8385bd2ae2b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1226": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93175871, + "lng": 10.73887825 + }, + "type": "LatLng" + }, + "description": { + "value": "Nesten daglig blir jeg forbikjørt av biler ned denne gata. De kjører fort forbi meg og legger seg forran, og når de oppdager fartsdumpene og må bremse veldig fort ned ender det med masse nestenulykker", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:46:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "90ed9263f989d99b3576449738613c4bb5364798.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1225": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92740764, + "lng": 10.73894664 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene holder veldig høy fart her, særlig for å rekke grønt lys. Derfor er det mange som ikke stopper for fotgjengere i feltet. Jeg og min hund ble påkjørt i fotgjengerfeltet her fordi sjåføren var mest opptatt med å sjekke om fotgjengeren på andre siden skulle gå ut i feltet, slik at han bare kunne kjøre på om ikke. Resultatet var at bikkja kom under bilen og jeg oppå. En veldig enkel løsning vil være å lage en fartsdump under fotgjengerfeltet, slik at bilene reduserer farten og dermed risikoen for alle som ferdes i dette krysset (gjelder farene påpekt av syklistene her).", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:45:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "ece25e615ab0c981d7754cfe1d7711569a8b75af.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1224": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92727122, + "lng": 10.76572716 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter sykkelveien rett ut i et trafikkert kryss. Det er veldig uoversiktlig og en av de mest trafikkerte sykkelveien fra nord av sentrum ned mot sentrum. Etter man forhåpentligvis har passert krysset uten å kollidere med biler eller fotgjengere kan man sykle videre bortover Schleppegrells gate.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:43:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "b5a0f7a0de334b1044c6e2a23bf8a4078d0a4d2a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1223": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93196835, + "lng": 10.76217591 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet slutter brått og det er ekstremt farlig for syklist på denne strekningen", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:40:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "fe96357718e84caec57196754d3778b78221ccf8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1222": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84830711, + "lng": 10.80359458 + }, + "type": "LatLng" + }, + "description": { + "value": "Løsningen for å krysse krysset fra Ljabruveien-sør (fra Bjørndalen) til Ljabruveien-nord (mot Ljan og Mosseveien) eller til Ekebergveien er kjempe klønete: man må enten trille sykkelen over trappen eller kjøre ned rampen i feil retning følgt av en U-sving på fortauet. De aller fleste syklister velger derfor å krysse i bilfelt. Dette er utrygt spesielt i nor-sør retning. I det minste kunne man lagt til en rampe som peker nordover.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:37:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "70eb12ba230df98e6bb7cc59a19e6a5462425e5e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1221": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92614623, + "lng": 10.76104938 + }, + "type": "LatLng" + }, + "description": { + "value": "Scooter ventet på at det skulle bli klart for å svinge til venstre inn Nissens gate. Bil som lå bak kjørte ut i sykkelfeltet for å kjøre forbi scooteren på høyre side. Jeg kom bakfra i sykkelfeltet og måtte svinge opp på fortauet for å hindre sammenstøt med bil. Krasjet inn i trafikkskilt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:34:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "5fc19be6eed7c76af58d1c1b4b5b2225e6bafe40.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1220": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91297146, + "lng": 10.68012714 + }, + "type": "LatLng" + }, + "description": { + "value": "Det virker som busser og biler forventer at det smale, ofte travle, gangfeltet skal brukes av syklister. Konsekvensen er ofte svært aggresive sjåfører av både buss og bil, som nærmest presser syklister av veien, eller opp mot fortauskant. Jeg har selv opplevd at buss har kommet bort i sykkelstyret ved forbikjøring.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:33:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "d898fa2510b30291ec55e57afd57ead00783d187.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1219": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93710688, + "lng": 10.92886447 + }, + "type": "LatLng" + }, + "description": { + "value": "Når du kommer ned bakken med god fart er plutselig sykkelstien vekk, og du sykkler på fortauet. Runt en sving kommer plutselig et busstopp der det ofte står mange fotgjengere med musikk i ørene go venter på bussen. Ingen markering om opphør av sykkelsti, eller advarsel til fotgjengerne om syklister i rel. høy fart. Pas på!!", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:32:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "338dd421ec41439d41474537aeece74035156ef2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1218": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90984639, + "lng": 10.74099183 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt stopper plutselig her. Farlig for syklist å hekte seg på veien etter dette.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:29:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "e0f7b34c6e775eef6ee1edf36c404bf13584aa8a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1217": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90891311, + "lng": 10.74608266 + }, + "type": "LatLng" + }, + "description": { + "value": "Det står lukeparkerte biler på innsiden av sykkelfeltet. Pluss at det er utkjøring fra parkeringshus på andre siden av veien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:28:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "c11ab7229dc3ac87ba34a9c6106da0b4bf37fc75.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1216": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94087964, + "lng": 10.75937032 + }, + "type": "LatLng" + }, + "description": { + "value": "bred vei som mangler sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:27:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "02c9dc8083f602920dd692fd5d5307401e909f13.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1215": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90889967, + "lng": 10.74605584 + }, + "type": "LatLng" + }, + "description": { + "value": "Her så jeg en dame ble påkjørt forfra av en ISS varebil. Her er det alltid flere biler som står lukeparkert på innsiden av sykkelfeltet. Dette medfører en veldig høy rissiko for å bli påkjørt, siden føreren av bilen ofte ikke ser hva som kommer ovenifra. Det var det som skjedde i dette tilfelle. Bilen kjørte ut i sykkelfeltet og damen på sykkelen frontkolliderte i bilen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:27:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "39e8a2e8a7baef76b961e24c37b4c887e001ae97.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1214": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94323337, + "lng": 10.77394008 + }, + "type": "LatLng" + }, + "description": { + "value": "Enveiskjøring som tvinger sykkelister inn på ekstremt smalt og trafikkert fortau. Plass til å lage sykkelfelt her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:26:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "a3edcb45a78aa2573958097c5ce453ca370fbcaf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1213": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9070169, + "lng": 10.81938743 + }, + "type": "LatLng" + }, + "description": { + "value": "Her bør du ligge midt iveien. Ble engang klemt mellom lastebil og fortau, som tok sykkelfelt i bruk. Heldigvis klarte jeg å få sykkelen opp på fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:26:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "4ff73c0a5bfdd3575f0eefb5402c634e269564f9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1212": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91000776, + "lng": 10.76788902 + }, + "type": "LatLng" + }, + "description": { + "value": "Cyclists are squeezed between buses/ trams and cars sneaking through the bom. Lots of conflict between traffic and pedestrians.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:26:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "403d7ddc35b78a5484afa8c0e0e524c272e3bb30.jpeg", + "type": "String" + } + } + }, + "aftenposten-1211": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.98417655, + "lng": 10.75316905 + }, + "type": "LatLng" + }, + "description": { + "value": "Utålmodige bilister som kjører forbi myke traffikanter i altfor høy fart og for tett på.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:25:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "eb16b805fe198a500177062343c98b7c8f761eed.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1210": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92429132, + "lng": 10.72398662 + }, + "type": "LatLng" + }, + "description": { + "value": "Høy kant på trikkestopp og trikkeskinner presser syklisten til å krysse trikkeskinnene for å sykle imellom dem. Hele Holtegata er elendig for syklister. da veien er smal og liten plass for syklister mellom fortau/parkerte biler og trikkeskinner.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:24:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "e92946fd782896692c5f3a741de2e3a27e2d5410.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1209": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92934503, + "lng": 10.71658372 + }, + "type": "LatLng" + }, + "description": { + "value": "Skulle gjennom krysset, var grønt lys, bil skulle til høyre opp slemdalsveien. traff venstre side av panser med forhjul. blei liggende midt krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:23:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "6ea476a870de79ae9274309eb06682d23d5f1774.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1208": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91173975, + "lng": 10.74874877 + }, + "type": "LatLng" + }, + "description": { + "value": "Anten så står det en konteiner i sykkelfeltet eller så står det store lastebiler som sperrer sykkelfeltet.Må ut i veibanen for å komme forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:21:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "eb3208747a6a31d6d96995cb93a544b040e9110e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1207": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94080441, + "lng": 10.91637611 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig vei med bil-tverveier med dårlig sikt, ender i t-kryds (med vikeplikt) på tvers av sykkelsti i nedoverbakke. Pleier kjøre ut på bilveien her for å unngå å bli kjørt ned (og for å slippe bremse ned al den gode farten). Bussen som kommer bak meg må bare roe seg litt ned...", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:20:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "3068d14b76aa42f6cc7fb426f2b9418e3b44e11c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1206": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91225745, + "lng": 10.8057028 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter brått sykkelfeltet før rundkjøringen til fordel for \"gigantisk\" fortau som starter etter rundkjøringen. Det er ikker merket sykkelbanepå fortauet, aner ikke hva som er tanket bak dette. Det er heller ikke lagt opp til noen enkel overgang fra sykkelfelt til fortauet (må opp på fortauet via opphevet gangfelt). Lite gjennomtenkt..", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:15:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "62ce35fa722aae637226946f8c19ba6d240f58ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1205": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92735993, + "lng": 10.77321052 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er vel og bra med tilrettelagt sykkelvei, men man får ikke noe varsel om at sykkelveien brått opphører og man befinner seg i samme felt som blant annet leddbussene 20 og 21.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:14:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "14512cee94302c9fb26b016622f63d03eef8ea3d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1204": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91382663, + "lng": 10.72527408 + }, + "type": "LatLng" + }, + "description": { + "value": "Her må man sykle på fortauet for det er ikke mulig å sykle i veien ettersom det er så trangt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:14:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "551a4221dd17e8c1a373124d40e4e357b3659a18.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1203": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94905787, + "lng": 10.73072433 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig kryssing av sterkt trafikkert vei.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:12:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "0a59dec3546b10729cc9e54b1ee3aec445a032b2.jpeg", + "type": "String" + } + } + }, + "aftenposten-1202": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93732186, + "lng": 10.75007915 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt forsvinner plutselig like før rundkjøring. I rushtida er det håpløst for syklister som skal av på siste avkjørsel å komme seg inn i riktig felt, og man blir tvunget til å ligge ytterst. Skaper farlige situasjoner når biler kjører ut av rundkjøringa.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:11:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "d3bd5cc8e1c1db3832d24350a09e6e5fb8ebb473.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1201": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93198985, + "lng": 10.76250314 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti ute på ring 2 med hissige bilister, og i krysset med Voghts gate farlig høyre-sving, hvor bilene ikke ser seg om før de svinger høyre. Har vært tett på å bli kjørt på her mange ganger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:11:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "98c6d77a1196fc1aa53b5c8e006ad12a638c73b3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1200": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93783782, + "lng": 10.68497657 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei midt i travel inn og utkjøring til statoil stasjon. Stor ulykkesfare.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:10:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "0347676a34d5624afb2fecaa0ce443366b6211a9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1199": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92869992, + "lng": 10.7647562 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg sykler fra sannergata over alexander kjellands plass, videre over st.hanshaugen, bislett, parkveien og ned løkke veien. Langs hele strekkningen er det ikke sykkelsti og opplever ofte at det er utrygt å sykle", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:10:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "c48c0c44b345fba7e1b16b2ff39328e0a640f0ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1198": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92900097, + "lng": 10.65884113 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister i høy fart begge retninger, innsnevring med 3/4 bom, barnehage og buss-holdeplass; inviterer til konflikt/farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:10:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "71335b838061d818a8e63d4b42990198144582ea.jpeg", + "type": "String" + } + } + }, + "aftenposten-1197": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93734336, + "lng": 10.68325996 + }, + "type": "LatLng" + }, + "description": { + "value": "Helt håpløs blanding av bussholdeplass, t-bane, gående og syklende i en trang koridor.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:08:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "624f5f38bc1c77f386a2d9caae6d6d5c662be2b6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1196": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95279167, + "lng": 10.7622376 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkeltunellen har null side-sikt, skaper farlig situasjon - ingen ville funnet på å lage en bil-undergang/tunellåpning på denne måten.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:08:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "8db3abdc9a661c043e976e23c42fd37ca48fae83.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1195": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93706388, + "lng": 10.68210124 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt fortau som samtidig er sykkelvei - i begge retninger! -og bussholdeplass", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:07:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "4933bed0030f159715e8145e2f28cc78dbbb1f67.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1194": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93656941, + "lng": 10.73141098 + }, + "type": "LatLng" + }, + "description": { + "value": "sykkelfeltet er nesten ikke synlig, hele vei ned fra rundkjøringen John Colletts plass til krysset i Kirkeveien. Mange bilister som kommer over på sykkelfeltet spesielt rett før og etter busholdeplassen. Føler meg alltid utryggt når jeg sykler her med barn i sykkelvogn. Sykkelfeltet må være mer synlig og det kan ikke slutte bratt slik det gjør nå.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:06:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "dd9350dab124dcc8e0b86f06851790d86d5d0609.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1193": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93547296, + "lng": 10.74061632 + }, + "type": "LatLng" + }, + "description": { + "value": "Manglende oppmerking for sykkel, bredt fortau med gående og syklende sammen ingen god løsning.", + "type": "String" + }, + "date": { + "value": "2014-09-11T09:04:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "7ad6a7ff1d3193a41d3f6291d5a27aac9bfaa142.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1192": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92130175, + "lng": 10.75741767 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det sykkelfelt for trafikk i begge retninger, men feltet er til tider uframkommelig på grunn av at det brukes som en slags gågate. Særlig om ettermiddagen er det vanskelig å komme fram her på sykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:59:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "fa70aed968a74b16b0140a6e2bae46125bc6417b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1191": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94012727, + "lng": 10.76570034 + }, + "type": "LatLng" + }, + "description": { + "value": "Gateparkering på nordsiden av krysset fører til dårlig sikt til Brochmanns gate. Mange som kommer ned Treschows gate som bryter vikeplikt, eller \"kommer brått\" på.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:55:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "c820641a139a4be767c79832305dcc5116785fad.jpeg", + "type": "String" + } + } + }, + "aftenposten-1190": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93304342, + "lng": 10.8640623 + }, + "type": "LatLng" + }, + "description": { + "value": "Idrettsparken ikke sikret mot sykkelsti. Cricketball traff sykkel. Farlig om syklist blir truffet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:54:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "322975181fb15df76f151a817151ce75200272a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1189": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93920291, + "lng": 10.76329708 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg syklet for fort ned bakken og overholdt ikke vikeplikt til kassebil som kom ut Ålesundgata. Svært dårlig sikt på grunn av biler ulovlig parkert helt ut i krysset. Slapp heldigvis fra med noen skrubbsår, bristet ribbebein og kraftig slanket lommebok.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:53:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "926f3bdf127d55036b67b2be3b056bf3a2a74f1d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1188": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9400056, + "lng": 10.7540647 + }, + "type": "LatLng" + }, + "description": { + "value": "Lang, smal gate, med parkerte biler på hver side av veien. Ikke plass til møtende trafikanter av noe slag. Burde vært enveiskjørt. Men som syklist: Bruk det brede og fine gang- og sykkelfeltet som går parallelt på oversiden av gata. Det er raskere, sikrere og mye mer oversiktelig trafikkbilde. Ta hensyn til skolebarna.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:52:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "36493243988615e957b8388eb02fae75a75362e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1187": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92120899, + "lng": 10.75121372 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundkjøringer utelukker syklister uten førerkort. Biler som ikke overholder vikeplikt utelukker alle syklister i rundkjøring.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:52:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "32c801c399132645ce834d825f5600916ccf2c27.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1186": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85063508, + "lng": 10.80299377 + }, + "type": "LatLng" + }, + "description": { + "value": "Alt for bratt til å kunne kalles tilrettelagt. Det er forbudt for biler å kjøre på gangstien, men den er omtrent ikke mulig å sykle oppover. Særdeles dårlig tirlettelagt. Når man kommer ned bakken ender sykkelstien direkte i Ljabruvegen. Dette er et uoversiktlig og meget farlig kryss.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:51:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "660318516c6cc5b1895430ec9c98950a63206fa9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1185": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93722512, + "lng": 10.78473329 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette skal være en tilrettelagt del hovedsykkelveinettet. Dessverre ser det ut til at noen har glemt skiltingen. Så vidt jeg kan se er dette en gangvei. Mange fotgjengere som føler seg utrygge her på grunn av syklister i høy hastighet.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:50:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "3bedfff09e922852482d70e7b1efe86583fd59de.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1184": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85646505, + "lng": 10.80144882 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal veg hvor det mangler nødvendig bredde for syklende. Stadig vekk farlige forbikjøringer hvor bilister ikke holder nok avstand. Det er avsatt plass til syklende fra Kolbotn til Hauketo, deretter et opphold fram til krysset på Norstrand, og der fortsetter sykkefeltene helt inn til byen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:49:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "f56a736afd6b27bb435e20ff90b349b9aeb03e67.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1183": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92627392, + "lng": 10.77620118 + }, + "type": "LatLng" + }, + "description": { + "value": "Hva skjedde her under planleggingen? Det er ikke lengre mulig å sykle til/-fra Carl Berner nordfra. Her har jeg hatt flere nesten-ulykker. Arkitektene bak presenterer fortsatt løsningen som en suksess(!). Å kjøre i rundkjøringer krever førerkort, og jeg lurer på om noen av planleggerne hadde turt å sende tiåringen sin gjennom CB...", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:48:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "59658ee70412bab143040c35d668e391f30c2826.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1182": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93499996, + "lng": 10.73020935 + }, + "type": "LatLng" + }, + "description": { + "value": "Busser har most meg inn i veikanten ved flere anledninger", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:47:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "0b133493a486fc176a318a5eedd745677416da92.jpeg", + "type": "String" + } + } + }, + "aftenposten-1181": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92497953, + "lng": 10.70918083 + }, + "type": "LatLng" + }, + "description": { + "value": "Busser har most meg inn i veikanten ved flere anledninger", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:47:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "8cc75eb0c40e39ec4b54685c9d1e64637efbe6f8.jpeg", + "type": "String" + } + } + }, + "aftenposten-1180": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93515046, + "lng": 10.78496932 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ofte biler som er parkert helt inntil eller oppå fotgjenger overgang om morgenen. Dette fører til at barn som krysser veien kommer veldig brått på.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:47:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "7ce9161b159b3d0e9bcfe463fbfe1e1b2fab3ed4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1179": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9227428, + "lng": 10.70390224 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveimerking forsvinner og biler legger seg inn i sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:46:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "5842cb892afb28f1ac36585ab7b9ce38c7f4f6b3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1178": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91224535, + "lng": 10.63425064 + }, + "type": "LatLng" + }, + "description": { + "value": "Nesten påkjørt flere ganger, hverken biler eller syklister overholder vikeplikten", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:45:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "fe90e49e8a790d5fd3d006dad77c1ccd3b114683.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1177": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88109917, + "lng": 10.78557014 + }, + "type": "LatLng" + }, + "description": { + "value": "Kø ned Raschs vei møter køen på Ekebergveien, vanskelig å flette når det er mange syklister hvor en del har høy fart. Ble vitne til en ulykke en morgen akkurat i krysset, heldigvis uten alvorlig personskade. Burde vært lysregulert i rushtiden.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:44:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "c151b53f967695a97fe5ec3b2cfde86294c6b038.jpeg", + "type": "String" + } + } + }, + "aftenposten-1176": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91357923, + "lng": 10.64231872 + }, + "type": "LatLng" + }, + "description": { + "value": "Kræsj mellom syklister og syklister og biler", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:44:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "fe223fd83e82bd3f848b514677f22cedf1ff6eeb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1175": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90570428, + "lng": 10.63025951 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler, syklister og fotgjengere om hverandre i uoversiktlig kryss", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:43:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "f36a8211143ab2aa073a48d1ee3c05447b18abd7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1174": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92919719, + "lng": 10.76964318 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkel- og gangveier i kulverter er alt for utrygt på nattestid. Har ikke noe med god byplanlegging å gjøre.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:42:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "d72e44635d01bf941d57694e655fc1d179e725c8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1173": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9418362, + "lng": 10.74359893 + }, + "type": "LatLng" + }, + "description": { + "value": "Enveiskjørt gate, smal og uoversiktelig med parkerte biler på samme side som fortau og inn/ut direkte fra hager på andre siden. I denne trange gaten velger mange syklister ulovlig å sykle i veibanen i motsatt kjørerettning, noe som skaper mange farlige situasjoner. Jo, her finnes det anternative ruter for syklister som ikke tar lenger tid: På vei inn mot hagebyen, sykle Spångbergveien rett før, eller rett etter krysset mellom Jutulveien og Tåsenveien. Her er det ikke enveiskjørt i retning Hageby", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:41:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "6ceee9ce05bdaabd69bfa6bfcc0a5c38aa768f17.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1172": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93026698, + "lng": 10.77273309 + }, + "type": "LatLng" + }, + "description": { + "value": "Etter veiarbeider tidligere i år er en lyktestolpe plassert midt i innkjøringen til sykkelveien. Saken er blitt meldt inn til Bymiljøetaten, uten at noe har skjedd. Asfalten i Rosenhoffgata er for øvrig under enhver kritikk.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:40:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "64eef8c1de69c95293fb85a35a26f6e981ee1cfa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1171": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91271867, + "lng": 10.76149463 + }, + "type": "LatLng" + }, + "description": { + "value": "biler kjører forbi i sykkelfeltet. det parkeres og det spaseres i sykkelfeltet. har vært utsatt for nesten ulykker flere ganger. Bilister og gående i dette området må kurses i trafikkregler", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:38:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "79fdafdd8d9d144299d493c471bcee0e55d7e160.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1170": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92810855, + "lng": 10.80153465 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei ikke skilt fra gangvei. Veiene er laget på bilenes premisser, det vil si mye opp og ned. Slike øde sykkel- og gangveiløsninger er dessuten kilde til utrygghet om natten, og har ingen ting i en by å gjøre.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:37:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "475118492519ed1c1458393b8344883b05b89149.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1169": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9146703, + "lng": 10.76457729 + }, + "type": "LatLng" + }, + "description": { + "value": "sykkelfeltet er ikke merket. folk bruker det til parkering og gangfelt", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:36:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "fe83088bb5f72a77be0b9f67b19b8bc74970970d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1168": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93614481, + "lng": 10.7351768 + }, + "type": "LatLng" + }, + "description": { + "value": "Sniddet av elbil i kollektivtrafikkfeltet", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:31:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "53fc2e9e692fcf6cbb02f030faf7c1be34e1ae16.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1167": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92014564, + "lng": 10.69173574 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt sykkelfelt i krysset. I svingen fra Halvdan Svartes gate til Drammensveien, ligger det to kumlokk i sykkelfeltet. Et ved ingangen til svingen, og et ved utgangen. Disse er utrolig glatte og skumle ved regn og snø. Sklir man på disse sklir man rett ut i trafikken.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:28:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "4b21d31db9a700558a838e62bb49c2a1d8216569.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1166": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91305214, + "lng": 10.73474764 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er mange bilistar ikkje merksame på sykkeltrafikk sørover, altså ut frå Roald Amundsens gate. Eit langt fotgjengarfelt tett ved krysset forvirrar kanskje, ved at enkelte bilistar trur syklistane trillar i sjølve feltet, og dermed har vikeplikt? Trafikkbiletet herifrå og ned mot Rådhusplassen er elles ofte uryddig pga. turbussar, fotgjengarar utanom fotgjengarfelt og \"tunnelsyn\" hjå enkelte bilistar i jakta på ledige parkeringsplassar. Nødvendig å vera særs årvaken her!", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:27:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "d8edc568b9e5c3bc446bf2c2746d78c008d7856a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1165": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93124803, + "lng": 10.72149753 + }, + "type": "LatLng" + }, + "description": { + "value": "Nesten ulykke. Stillestående kø, hvor jeg kom syklende i sykkelfeltet. Plutselig dukket en fotgjenger opp mellom to biler. Ettersom feltet er såpass smalt, er det minimalt med klaring for overraskelser.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:24:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "997ba58fef0fac9451050e27052b4f9c6c3e4f06.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1164": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94306142, + "lng": 10.75733184 + }, + "type": "LatLng" + }, + "description": { + "value": "Stavangergata er en skandale. Få bort gateparkeringen og lag sykkelfelt snarest ! Og senk fartsgrensen til 40. Utrolig mye biler som suser forbi i 70. Utrolig at denne gata ikke er bedre tilrettelagt for myke trafikkanter med tanke på at en av byens største barnehager ligger her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:22:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "7f0cfbc842e0f355569c39207006f6959a698cd9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1163": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91107278, + "lng": 10.82532048 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler fyrstikkbakken for å unngå Tvetenveien. Broen er dessverre ofte /alltid (!) blokkert av parkerte biler, veldig irriterende!", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:22:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "46a57408e890910eba210e961ccd6a621ecfde83.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1162": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91066399, + "lng": 10.82552433 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler fyrstikkbakken for å unngå Tvetenveien. Veien er dessverre of blokkert av parkerte biler, veldig irriterende!", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:21:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "ad0d5acf56f2a8062fb7dcad5e46de46b034a6fd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1161": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9355697, + "lng": 10.73143243 + }, + "type": "LatLng" + }, + "description": { + "value": "Her mangler det sykkelfelt, og bussen presser sykler av veien. Kaos i krysset ved sognsveien. Det er en skam at byens offisielle politikk er å gi bil/buss prioritet foran sykkel/fotgjenger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:21:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "37e2db720e2d227a6a3bf0a3a09aea72bed212c2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1160": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9126111, + "lng": 10.63796281 + }, + "type": "LatLng" + }, + "description": { + "value": "Lysakerlokket: Feil utformet kryss hvor gående og syklende blir blandet på toppen av sykkelbrua/rampa: Sykkelbrua skulle ha fortsatt som bru med de gående under. Istedet for gang/sykkelsti på selve toppen; sykkelsti i veibanen. (Her sykler og kjører (!) forøvrig mange i feil retning. Veldig synd at dette ikke ble gjort da sykkelrampen ble bygd noen år tilbake.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:17:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "aa970d05352b8a9eba9b7f7fd205ee1d33c772df.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1159": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8557862, + "lng": 10.78437387 + }, + "type": "LatLng" + }, + "description": { + "value": "Mopedist svingte av Mosseveien for å kjøre ned på Katten badestrand. I det han krysset gang- og sykkelsti kolliderte han med syklist som stupte over sykkelen som slo en salto og landet på rumpa. Sykkelen var totalvrak, men syklisten hadde englevakt og komme litt mørbanket i fra ulykken.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:13:17Z", + "type": "DateTime" + }, + "bilde": { + "value": "f1223a52c15147870ba639b90352306a.jpg", + "type": "String" + }, + "streetview": { + "value": "8de9dcd0254048bf07ad56016423a2ed8d314374.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1158": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91086839, + "lng": 10.73268771 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Rådhuskaia og begynnelsen av Aker brygge er enhver syklists verste mareritt, gående og syklende i alle retninger og trikk! Her trengs godt oppmerket og fysisk avsperret sykkelsti.", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:08:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "0cdd7b44832def7d14d1c5e8ae556c025e07831a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1157": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90522279, + "lng": 10.74270844 + }, + "type": "LatLng" + }, + "description": { + "value": "Ny sykkelvei ender dessverre rett i et uoversiktlig (for syklister) gangfelt. Til tross for sperringer fungerer dette ikke. Sykler i bilvei da det er lite trafikk her,", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:05:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "323042bafea5b98e9b759c354d747d31957fe2ec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1156": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90617769, + "lng": 10.7756567 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei meget dårlig tilrettelagt: brostein mellom sykkefelt og vei gjør feltet smalt og uten vedlikehold. Sykler i veien. Meget uoversiktelig veikryss når en kommer fra byen og på toppen av bakken,", + "type": "String" + }, + "date": { + "value": "2014-09-11T08:03:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "dbc27e912789e1d5e4ee4b28d0029d42a4f08798.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1155": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90639287, + "lng": 10.77329635 + }, + "type": "LatLng" + }, + "description": { + "value": "Stripe med brostein skiller sykkelfelt fra biler, men er altfor bredt og spiser av bredden til syklistene fordi det er umulig å sykle oppå brosteinene. Dermed blir brukbar del av sykkelfelt ubrukelig smalt. I tillegg virker det som asfalten på syklistenes del av veien ikke er vedlikeholdt i samme grad som den til bilene – svært mye små hull og ujevnheter. Sykler dermed ute i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:56:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "6308c3f040771e56a3a9febc6b6ad2ab7a6efad6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1154": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90743649, + "lng": 10.78070998 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussbom - her tar folk sjanser og sniker seg inn sammen med bussen igennom bommen. Opplever biler i vanvittig høy fart for å rekke bommen og noen parkerer i sykkelfelt mens de venter på å passere sammen med bussen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:53:26Z", + "type": "DateTime" + }, + "bilde": { + "value": "b58138253a2dacc6e0b77fd651414cab.JPG", + "type": "String" + }, + "streetview": { + "value": "9fc1e5c313edc9c11a27e64b4bb56b7029fd8747.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1153": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93159207, + "lng": 10.76355457 + }, + "type": "LatLng" + }, + "description": { + "value": "Helt nytt, livsfarlig, sykkelfelt, fordi feltet for bilene er for smalt. Jeg har flere ganger blitt skremt når større biler suser forbi PÅ streken. Jeg er nå tilbake på fortauet!", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:52:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "cc12f02b47b804893c54b37e98837120d8dabada.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1152": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91811293, + "lng": 10.74555158 + }, + "type": "LatLng" + }, + "description": { + "value": "Så vidt jeg vet er Thor Olsens gate blitt en miljøgate. Man skulle tro at det har noe med lav fart og tilrettelegging for syklister og gående, men her er det både trangt og uten noe sykkelfelt slik at det stadig er nestenulykker hver dag. Det hjelper heller ikke at det er endel oppussing på ene siden av gaten slik at gangfeltet på den siden er stengt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:52:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "0b86e7eb3f96319bea08841352867373d083dfec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1151": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90744725, + "lng": 10.78072071 + }, + "type": "LatLng" + }, + "description": { + "value": "Nærmest daglig står det biler i sykkelfeltet som venter på at bommen skal åpnes. Har ofte opplevd at de svinger ut idet man skal passere. Her må det være mange ulykker. Aldri sett noen som blir bøtelagt. Sier man i fra blir man møtt av en agressiv holdning.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:52:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "14fdecbcf28aa67b5fe545ac4278753d2e69083b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1150": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93737561, + "lng": 10.74989676 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette krysset er mørkt, men oversiktlig. Likevel er det mange nesten ulykker her. Mange som kommer Uelandsgate nordover ser ikke, eller tar ikke hensyn til syklister i rundkjøringen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:50:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "4b20c73631ce38cad30c8379abbee94537a124c0.jpeg", + "type": "String" + } + } + }, + "aftenposten-1149": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94114834, + "lng": 10.86010336 + }, + "type": "LatLng" + }, + "description": { + "value": "Her mangler det gang/sykkel-felt. Biler med stor fart som kommer av Østre Aker vei.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:50:38Z", + "type": "DateTime" + }, + "bilde": { + "value": "962043c094f727433b65cfdd968d1e7d.JPG", + "type": "String" + }, + "streetview": { + "value": "635856937c399b939bb76a5b3b75ff0571e4b01a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1148": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9202091, + "lng": 10.72323759 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Oscarsgate er en sykkelfelle, dype hull i asfalten gjør den livsfarlig.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:49:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "67b09dc504fdb99c30100e4d83ff944b293908d9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1147": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90525238, + "lng": 10.74338436 + }, + "type": "LatLng" + }, + "description": { + "value": "Sperresøylene på ny sykkelvei er så smale at et vindpust vil få rattet til å slå inn i søylen og hvordan har de tenkt seg at dette skal fungere på vinteren med måking?. Ser allerede at de fleste tar veien gjennom rundkjøringene istedet for denne fellen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:49:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "f71c818ab2ce35ad8359da048ecd4111fc6b6826.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1146": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91113733, + "lng": 10.74461817 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjenger syklet ned av syklist på trangt fortau ved betongsperring i veikrysset.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:48:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "d8e7c4650de6e7b7606aac481b48fef7298bfb4d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1145": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94011115, + "lng": 10.76567888 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktelig kryss. Hvis man kommer fra Brochmanns gate ser man sjelden bilene som kommer fra venstre, og de ser sjelden deg. I tillegg er det helt random om vikepliktsregelen blir fulgt. Har vært borti et par dusin nestenulykker", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:47:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "f710aac347f81084db94b6229a27ec811ae55d98.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1144": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.97779996, + "lng": 10.92830657 + }, + "type": "LatLng" + }, + "description": { + "value": "Det stikker noen stålstenger ut fra fjellveggen mot sykkelfeltet. Denne sykkelstien er forøvrig skummel, da den er smal, fjellveggen stikker ut mot feltet, og det kommer syklister i stor fart ned bakken, og syklister i krabbetempo opp.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:47:10Z", + "type": "DateTime" + }, + "bilde": { + "value": "496705b116012a1b18b6a0fb5f28686d.JPG", + "type": "String" + }, + "streetview": { + "value": "6e5884933aed614a3fae1534dff4f9c9f579645b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1143": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91806184, + "lng": 10.75957953 + }, + "type": "LatLng" + }, + "description": { + "value": "Føler meg sjeldent trygg i krysset foran Schouss bryggerier. Krysset er fullt av trikkeskinner, og som syklist blir man lett oversett av taxisjåfører og forvirrede billister. Her hadde det nok hjulpet med oppmarkert sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:46:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "ee93d7e3571ec28cc8ecaeba752a52e4aba043e8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1142": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92683978, + "lng": 10.81156611 + }, + "type": "LatLng" + }, + "description": { + "value": "Kryss med misvisende kantbelegging. Ser ut som avkjørsel til parkering da det er forsenkede kantsten som \"kutter av\" Kabelgaten fra Risløkkveien, men her tror jeg det er vanlig høyreregel. Ser mange bilister og syklister som tviler og gjør feil i dette krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:46:02Z", + "type": "DateTime" + }, + "bilde": { + "value": "f0ff7e807ff0464b1fe00d93b0c0e812.JPG", + "type": "String" + }, + "streetview": { + "value": "df0a50e162d8ccb6119441c99a882e0ab278357e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1141": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89208008, + "lng": 10.80857276 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal vei, men svært bredt fortau som har \"ramper\" opp og ned ved kryssende vei. Mye trafikk, både biler, sykler og fotgjengere. Hvis det er meningen at syklister skal sykle på fortauet bør de skilles fra fotgjengere, og vikeplikt for kryssende trafikk må avklares. Hvis det er meningen at syklister skal sykle i veien må veien gjøres bredere, og sykkelfelt må merkes opp.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:43:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "4c88162eb83c912640f2b53e7f0ce8fc8d123a66.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1140": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89954933, + "lng": 10.81655502 + }, + "type": "LatLng" + }, + "description": { + "value": "Meldte fra om glasskår på fortau/sykkelvei i juni. Oslo Kommune sender videre til vegvesenet som ikke gjør noe med dette etter gjentatte purringer. Først i september blir det feid her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:41:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "1c5035304ffd6377b33fa95564a907233c3efaa6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1139": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95311936, + "lng": 10.76089382 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig kryss i sykkelvei/gangsti spesielt med hensyn på de som kommer med god fart ned undergangen vestfra (Tåsen). Speil ville hjelpe her.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:40:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d14922a3cc9d819be16f80ca40817934b806769.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1138": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89914039, + "lng": 10.8159542 + }, + "type": "LatLng" + }, + "description": { + "value": "Vegvesenet har sperret fortauet på begge sider av Ring 3, så her måtte jeg ut i vegbanen på E6.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:38:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "2b45390ff23f5af9ded6873298b10a75af37c60f.jpeg", + "type": "String" + } + } + }, + "aftenposten-1137": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93362395, + "lng": 10.80715656 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist rett i gata i går utenfor mitt hus, der det dessverre er manglende sykkelsti. Til tross for at Lørenveien er den offisielle sykkelrute langs Ring 3. Her mangler sykkelsti i ca 300 meter fra sinsenkrysset fram til sinsenveien ( hvoretter sykkelstien fortsetter ned til Økern). Hvorfor? Statens vegvesen ved Jon Johannesen nekter å male opp sykkelfelt på denne strekningen. Uff. Det blir håpløst farlig når en sykkelvei plutselig får et slikt gap. Veien blir rett slett for smal. Er det hensy", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:31:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "38a4bd6184ef00ae539493be9e7061b910b89c44.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1136": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92894855, + "lng": 10.77039688 + }, + "type": "LatLng" + }, + "description": { + "value": "Nyanlagt sykkelvei ledes rett inn i parti med bussholderplass og fortgjengere. Typisk nok ingen markering for å veilede syklister bak sykkelskur og forgjengere/passasjerer forran.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:29:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "ae196281f49b63463dca82b4c5235cc4683144a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1135": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90233641, + "lng": 10.79801559 + }, + "type": "LatLng" + }, + "description": { + "value": "Svartdalsveien mellom Kværner og Manglerudveien er skummel oppover, fordi man ligger i innersving innenfor bilene og bussene. Både som bilist og syklist har jeg hjertet i halsen her. Nedover (yttersving) er det bedre sikt for bilistene, men de ligger ofte rett bak syklistene, og om en syklist velter (her holder alle ca 40-50 km/t) vil det ikke gå bra. Den merkede sykkelveien, Konows gate, er et latterlig alternativ for de fleste - den er stupbratt og har enda dårligere sikt for bilistene. Med en", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:28:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "cce594da5279b68db6a01f0ef9d5ec68be768e4a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1134": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93653448, + "lng": 10.73141098 + }, + "type": "LatLng" + }, + "description": { + "value": "Asfalten i sykkelfeltet er svært ujevn flere steder langs denne veien, og det oppleves dermed utrygt å benytte feltet. Sykkelfeltet blir også smalere når veien nærmer seg krysset samtidig som biler skjener inn på feltet for å legge seg i høyre fil.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:27:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "de2e8dc40b89bb9f21c2dd389cdfc4a1b4b3e317.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1133": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93315093, + "lng": 10.72621822 + }, + "type": "LatLng" + }, + "description": { + "value": "Busslomme ligger i sykkelfelt. Må ut i bilfelt for å passere bussen. Ikke alltid bussen legger merke til el tar hensyn til sykkel før de svinger inn i felt rett foran sykkel eller svinger ut av bussfelt mens syklisten skal passere bussen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:26:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "43fd94198d7297f637244f5cb93c2457bd73682b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1132": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92318371, + "lng": 10.84017992 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilfører krysset sykkelveien uten å oppdage syklisten", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:25:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "ddae7e227b8b91bcae3d46777137ee1c3d04691e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1131": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9289042, + "lng": 10.71502804 + }, + "type": "LatLng" + }, + "description": { + "value": "Majorstukrysset er vanskelig å sykle i annet for erfarne bysyklister. Kommer man fex fra Sørkedalsvn og skal svinge oppover Kirkeveien er det ingen sykkelfelt, konkurrerer med bilister og busser som maser for å komme over på grønt, dessuten mange fotgjengere som går og løper på rødt lys gjerne rett foran særlig syklister. Ligger man i hø felt og skal oppover Kirkevn kommer man rett inn i busslomme og må svinge ut i bilfelt rett etter krysset for å passere bussen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:22:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "b99d83d1441a38fb8cc607b76d7f6025461d9474.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1130": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95064814, + "lng": 10.68879604 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig kryss. Biler ser ikke syklister som kommer nedover. Biler kaster seg ut foran syklister fordi de tror de har god tid. Bilene overholder ikke vikeplikten sin. I mai var det en bil som kjørte ut i veien rett foran meg. Det resulterte i at jeg smalt inn i bilen, og fikk skader i bein og nakke.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:22:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "025e3a1fbcbd5246aa23421ebab2781f5181c51d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1129": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92515696, + "lng": 10.73900699 + }, + "type": "LatLng" + }, + "description": { + "value": "Benytter ikke sykkelveien da biler står parkert innenfor. Har flere ganger opplevd at bildører åpnes og hindrer hele sykkelfeltet, fare for kollisjon!", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:19:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "13c59f03b06892e59645c208f1abb6e8879aff34.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1128": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92693655, + "lng": 10.63658952 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti langs Bærumsveien går over i fotgjengerfelt som krysser Hartmannsvei. 30 % av bilistene som kommer ut fra Hartmannsvei dundrer inn i fotgjengerfelt og stopper så og ser seg til venstre, men nesten aldri til høyre. Jeg har vært flere ganger akkurat på vei til å krysse fotgjengerfelt da biler har kommet dundrene. Generelt er det et stort risikomoment at sykkelstier plutselig går over til å bli fotgjengerfelt. Det oppleves veldig usikker og ødelegger flyten i sykkelstiene. Ved enkle grep", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:17:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "6bad0518b6202b648ef94ac2339ea4343b9978fb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1127": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93185546, + "lng": 10.72283864 + }, + "type": "LatLng" + }, + "description": { + "value": "Nylig nestenulykke pga bil som svingte til hø uten å blinke eller se at jeg syklet like ved siden av bilen i sykkelfelt. Samme problem nesten daglig i alle kryss nedover Kirkeveien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:15:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "3d73307030f4d9f74cbf4af74e1f27f4ba960445.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1126": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85692839, + "lng": 10.80114841 + }, + "type": "LatLng" + }, + "description": { + "value": "Ekebergveien fra til Ljabrubakken til Sæter, forbi Nordstrand kirke, er uten sykkelfelt, trafikkert, trang og gjengrodd.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:10:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "bc9e250563ac931bedb70f62f6a35deade59ef83.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1125": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94819823, + "lng": 10.77149391 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange syklister og farlige forbikjøringer av biler. Strekningen trafikkeres av buss. Kun ensidig/smalt fortau, ingen sykkeltrase. Mange barn til og fra Tåsen skole.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:10:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "622584c323d715321a71431d63e222a8cd4d55eb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1124": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92568654, + "lng": 10.63222289 + }, + "type": "LatLng" + }, + "description": { + "value": "Stikkvei fra parkeringsplass går rett ut i sykkelsti langs Bærumsveien. Syklister som kommer ovenfra har ikke sjans til å se stikkveien. Her komer det fotgjengere hver dag rett ut i sykkelsti. Har sett en alvorlig ulykke mellom syklist og fotgjenger og flere nesteulykker. Klassisk eksempel på hvor lite gjennomført opplegget for sykkelstier er i Norge. Alt for mange sideveier og stikkveier går rett inn i sykkelsti, uten sperringer, markeringer,advarsler.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:10:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "1c5a6d1496c1aad73132a340fb6b790d595d68a9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1123": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91085763, + "lng": 10.73664665 + }, + "type": "LatLng" + }, + "description": { + "value": "Hull i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:07:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "ff0f12bac3390e02e47d7e7b1084d836d8615110.jpeg", + "type": "String" + } + } + }, + "aftenposten-1122": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84067541, + "lng": 10.80488204 + }, + "type": "LatLng" + }, + "description": { + "value": "\"Mangler tilrettelegging\" er tydeligvis offisiell status. Det stemmer det. Trafikkert, trangt, ingen sykkelfelt og elendige, gjengrodde fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:05:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "d0b7268ca7c35baa9f90d5412889b7a068296c75.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1121": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89583105, + "lng": 10.75667738 + }, + "type": "LatLng" + }, + "description": { + "value": "\"Midlertidig\" sykkelbro, belagt med stålplater, antar 110 cm bred, ender i en kort, men bratt helning (anslår denne til ca 15%) før 90 graders sving i kryssende sykkelvei når man skal sørover. Som skapt for å lage ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:04:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "4c8c9405b418f4b1eed93fc0d00549d92d6cf3b3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1120": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91396647, + "lng": 10.75080871 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt kombineres med trikketrasse, smal vei gjør det farlig å møte busser og lastebiler.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:01:51Z", + "type": "DateTime" + }, + "bilde": { + "value": "3cd97cb8e6d78ce546c4786eda97bdb0.jpg", + "type": "String" + }, + "streetview": { + "value": "e62bdaa7cb047fe06394f8de3295fb5aa2e71a62.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1119": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92082855, + "lng": 10.68192958 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det tilrettelagt med sykkeltrase deler av veien (Fra Karenslyst Alle 9), men svært få tar hensyn til sykkeltraseen. Privatbiler parkerer i sykkelfelt stort sett hele tiden og også transportbiler. Her er faktisk et område jeg tror hadde vært tryggere/mer oversiktlig uten sykkeltrase.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:01:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "4442448f4f8ae97e8180a5c9c6d94bba51193ba1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1118": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89767679, + "lng": 10.76033592 + }, + "type": "LatLng" + }, + "description": { + "value": "Kongsveien ved sjømansskolen (hva den nå heter om dagen) er en dødsfelle for syklister og fotgjengere. Sykkelfeltet, i nedoverbakke, opphører å eksistere noen meter før svingen, trikkeholdeplassen og fotgjengerovergangen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T07:00:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "8aa1c3c57f418efe5775286dcc263717543a4c71.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1117": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92694193, + "lng": 10.8666265 + }, + "type": "LatLng" + }, + "description": { + "value": "Bom som gjør gang-sykkelvei veldig smal med betongblokk gjemt bak grønne vekster", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:59:57Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1116": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88219742, + "lng": 10.78162193 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil i sykkelfelt i krysset Kongsveien-Pareliusveien. Jeg syklet mot Holtet i sykkelfeltet og bilen kom fra Holtet og skulle inn Pareliusveien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:55:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "0a0b04d4446cd01075ad3b8c65b2ea171be3fa14.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1115": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9126864, + "lng": 10.76261043 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet på sykkelveien da en taxi la seg rett ut forran meg og je gog sykkelen deisa rett inn i siden på taxien. Jeg og sykkelen kom uskadet fra det, men taxien måtte nok på verksted å rette opp en stor bulk i siden.", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:48:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "1c9b162943dba8e459d8a8c0f170942ec2929038.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1114": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92442036, + "lng": 10.73115348 + }, + "type": "LatLng" + }, + "description": { + "value": "Pilestredet fra Bislet til Parkveien har smal vei med trikkeskinner, og altfor mange fotgjengere på fortauet til å kunne sykle der. For å unngå å ligge i klem mellom innerste trikkeskinne og fortauskant, er det mest forsvarlig å legge seg midt i veien. Dette gjør imidlertid enkelt billister provoserte, og ikke sjelden får jeg en bil opp altfor tett bak. Jeg må svinge inn hver stikkvei for å slippe forbi. Krysset ved Parkveien igjen er også en felle.", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:48:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "acdc92343571176badbe5cfacbba646d8a15c86d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1113": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92729138, + "lng": 10.67551374 + }, + "type": "LatLng" + }, + "description": { + "value": "Klassisk konfliktområde mellom sykkel, gående og biler. Smal bilvei, syklister ofte på fortau og en busstopp med tidvis mye mennesker. Det blir bedre lengre oppe i Hoffsveien, men nedre del har kun et smalt fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:44:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "cb5090cd841b336912e6334e6c539ba7c5aaa4bf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1112": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92147021, + "lng": 10.75086954 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti ikke tilpasset mengden syklister. Enkelt sykkelfelt og veldig mange syklister med ulik fart samt busstrase og fotgjengerovergang gir veldig uoversiktlig trafikkbilde. Mange syklister i veibanen som sykler inn og ut av sykkelsti.", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:34:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "72993aec43f243907074b60b8994cbc82aa9a961.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1111": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87332819, + "lng": 10.7791849 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelrute krysser trang og uoversiktlig vei over til Ulvøya - stadig farligere situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:25:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "8dc8ec262b7e41fa8987bbefec31a5789955a46d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1110": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9507341, + "lng": 10.69377422 + }, + "type": "LatLng" + }, + "description": { + "value": "Slemdalkrysset om morningen er rene dødsfellen. Det er esktremt mye trafikk og utolmodige bilister, meget uoversiktelig og jeg har personlig blitt nesten overkjørt flere gnager i krysset og/eller rett etterpå da jeg ofte sykler ned stasjonsveien og folk på død og liv skal foreta en forbikjøring selv om jeg selv sykler rundt fartsgrensen på denne veien selv. Lifsfarlig områrde!", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:21:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "9c037f5c9bc389d865e1e4e0d49a56d6deaab745.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1109": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93515584, + "lng": 10.74410319 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg ble påkjørt av en syklist som kjørte rundt svingen PÅ fortauet. Fikk hjernerystelse og langtidskade i beinet .", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:18:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "b0002cf6d1771309c9039c02979c24ee63e19c2d.jpeg", + "type": "String" + } + } + }, + "aftenposten-1108": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93737829, + "lng": 10.68259477 + }, + "type": "LatLng" + }, + "description": { + "value": "Kun fortau, syklsiter i begge retninger og fotgjengere som skal av og på buss ikombinasjon med uoversiktelig undergang med krappe svinger og kryssende gå/sykkelfelt gjør Smestadkrysset til en ulykkesutsatt strekning", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:18:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "32db11d77f204d36252192c228eb651b425ae59e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1107": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92921869, + "lng": 10.71611702 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg syklet langs ring 2 og ble påkjørt av en bil. Jeg var heldig. Brakk bare benet, men måtte operere på Ullevål på grunn av åpent brudd. Måtte omskoleres etterpå på grunn av senskader. Jeg ble påkjørt der trikken stopper. Der er det noen meter uten sykkelfelt. Bilen kjørte inn i meg fra siden idet den forsøkte å kjøre forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-11T06:15:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "919ed524201c9da02baae1a33774f0338529dc30.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1106": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95617053, + "lng": 10.62905788 + }, + "type": "LatLng" + }, + "description": { + "value": "Det bor en stor gruppe mennesker i fossumveien, svært mange barnefamilier. Her er det ikke tilrettelagt for sykkel hverken langs Fossumveien eller fra Ekraveien/Griniveien til Røa eller til Tbane. Som sykkelpendler til barnehage på Hovseter er det en nedtur å bo her desverre.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:56:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "4bf5a3145521c1abad928ba425b314f2ff752256.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1105": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92721746, + "lng": 10.7659015 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kommer syklister i fullfart fra Gang vei og over i bilveien.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:51:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "e9f20c8f21652e5b062b8199a7fb62220c746ff9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1104": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92936384, + "lng": 10.7164818 + }, + "type": "LatLng" + }, + "description": { + "value": "Majorstukrysset er livsfarlig for alle trafikkgrupper, men særlig syklistene, siden det ikke er satt av noen veibane til oss. Bilene er hissige på å komme gjennom krysset raskest mulig før det blir rødt lys igjen, og fortauene myldrer av folk på vei inn og ut av t-banen, og fungerer i tillegg som bussholdeplasser. Hvor skal syklistene være uten å sveve i konstant livsfare? Kirkeveien er en av veiene i Oslo jeg prøver å unngå å måtte sykle.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:39:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "7f477766cb6c12d1d6a5cb390e03ad3636043a75.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1103": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91340712, + "lng": 10.65523624 + }, + "type": "LatLng" + }, + "description": { + "value": "Brostei i sving90 grader, kryssende bilvei og kanter.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:39:26Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1102": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92037686, + "lng": 10.75737476 + }, + "type": "LatLng" + }, + "description": { + "value": "Her skal det liksom være sykkelvei, men fortauet er så trangt at alle fotgjengere blir tvunget ut i sykkelfeltet. Parkeringsplassene opptar meste parten av veibanen.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:38:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "56c5806e184dde6f1380d2a4a16ffce7168c559f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1101": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92564084, + "lng": 10.77852129 + }, + "type": "LatLng" + }, + "description": { + "value": "il kom fra Carl Berner og svingte til venstre. Ble sluppet fram av biler som sto i kø mot Carl Berner. det burde vært forbud mot å ta til venstre inn på Hekkveien. Syklist krasjet med bil.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:36:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "2c482206fe644287c55b84fbbe99abd33274c7b4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1100": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9263344, + "lng": 10.74608802 + }, + "type": "LatLng" + }, + "description": { + "value": "De parkerte bilene gjør veibanen smal. Bilene forsøker å passere syklistene samtidig som det er motgående trafikk og skaper farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:35:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "8d2ba3afe86fee155cb5093f373d82efc683c421.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1099": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9130602, + "lng": 10.77698707 + }, + "type": "LatLng" + }, + "description": { + "value": "Nesten påkjørt her i dag. Bilist svinger til høyre over sykkelfelt uten å bruke varsellys. Kun en bråbrems fra min side hindret kollisjon.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:35:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "c21d5ff9e9ae7d1a00633e94969414cb0dae1bc4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1098": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.906175, + "lng": 10.7714188 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei er full av humper, hull og opphøyninger til avkjørsler. Farlig!", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:34:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "a81bbe6bf87fe0670ee1fcdea0af4db9230ddc48.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1097": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90631218, + "lng": 10.77491104 + }, + "type": "LatLng" + }, + "description": { + "value": "Arbeidsgjerdefundamenter er plassert i sykkelvei uten form for varsling.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:33:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "9c88dcd2ac947b0d8c6360d02dd25010fbafe5b4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1096": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96776562, + "lng": 10.78963637 + }, + "type": "LatLng" + }, + "description": { + "value": "En syklist fikk hjulet i et hull i veibanen og falt over sykkelstyret, men skadet seg ikke i fallet. Jeg meldte fra til bymiljøetaten om at veibanen hadde mange hull på den aktuelle strekningen, men fikk til svar at det her var privat ansvar for vedlikehold og at de ikke ville foreta seg ytterligere.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:32:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "24391b47a35d55222ce86a4841de68ca6f2d90b4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1095": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94004666, + "lng": 10.90294361 + }, + "type": "LatLng" + }, + "description": { + "value": "Unaturlig sving på sykkelveien, med blindsone fra trafikk (mye busser) som kommer fra 3 retninger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:30:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "ab4e4d97b317493d4d2b982ba9d280733ba38621.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1094": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92865691, + "lng": 10.70748567 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei fra Frognerparken går over i fortau uten noen form for skille eller markering. Fortau/sykkelvei ligger i en dump uten sluk som ofte ligger under vann. Dårlig skilting, dårlig tilrettelegging og dårlig utført arbeid som fører til at det er uklart hvor man skal sykle. Erlend", + "type": "String" + }, + "date": { + "value": "2014-09-11T05:26:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "18773b697047392b7ac13a05c9644c97ee9b9d22.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1093": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90245478, + "lng": 10.78381061 + }, + "type": "LatLng" + }, + "description": { + "value": "Midlertidig inn- og utkjøring for anleggsarbeid i Kværnerbyen der man kjører inn på gang- og sykkelvei. Her er nå veibanen delvis øelagt av en gravemaskin, dette kan være farlig hvis man ikke er oppmerksom på dette da farten nedover er veldig høy på dette stedet. Det er både betongskillere og gjerde på siden av veien slik at forsøk på å styre utenom kan medføre store skader ved evt ulykke.", + "type": "String" + }, + "date": { + "value": "2014-09-11T04:33:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "598a939c94364f8934771e10f5fc76d29c6c0098.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1092": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96832943, + "lng": 10.63802719 + }, + "type": "LatLng" + }, + "description": { + "value": "Kartet viser at det er tilrettelagt fra Bogstad badeplass og innover i Sørkedalen. Det stemmer ikke med virkeligheten! .Strekningen er svært populær for mosjonister og folk som trener : sykkel, rulleski, løp og hester. Her er ingen gang- og sykkelvei, ikke engang fortau. Dette er en trafikert strekning, med blant annet tungtransport av i tillegg til turbusser og vanlig trafikk. Det er et under at det ikke har skjedd flere ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-11T03:44:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "3893427a39f8379141c0208a4615d2b6bc540bbe.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1091": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92930202, + "lng": 10.76810359 + }, + "type": "LatLng" + }, + "description": { + "value": "mangler sykkelvei, bilister tar yttersvingen rundt syklister i svingen midt i lyskrysset", + "type": "String" + }, + "date": { + "value": "2014-09-11T03:13:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "81b08d7966cd76d43d64a8b5cd62a62d9ade7f69.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1090": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91091142, + "lng": 10.76012134 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele schweigaardsgate er ekstrem skummel med bussene tett på syklisten som prøver å holde seg på veien uten å bli presset ut på siden.", + "type": "String" + }, + "date": { + "value": "2014-09-11T01:55:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "200a4decfd91757f572067921e14782d51c606e5.jpeg", + "type": "String" + } + } + }, + "aftenposten-1089": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95058367, + "lng": 10.64455032 + }, + "type": "LatLng" + }, + "description": { + "value": "Trangt. Mye biltrafikk. Presset ut av bil flere ganger.", + "type": "String" + }, + "date": { + "value": "2014-09-11T01:14:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "614be6d28e8e05d2d25bf11eb9558fa065ae178f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1088": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90914711, + "lng": 10.78823089 + }, + "type": "LatLng" + }, + "description": { + "value": "12 cm fra å bli nedkjørt av bil som ikke så meg, han hadde vikeplikt", + "type": "String" + }, + "date": { + "value": "2014-09-11T00:24:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "d20ee54d9a7899cff42982d7949c76bc6f8fbbd6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1087": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91302323, + "lng": 10.73464035 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveiskilting mot enveiskjøring.", + "type": "String" + }, + "date": { + "value": "2014-09-11T00:12:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "9690db31bc9c0a26e95732626b26c91e9b0e9ad3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1086": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9330933, + "lng": 10.72595969 + }, + "type": "LatLng" + }, + "description": { + "value": "Alt for smalt sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-09-10T23:24:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "7c72593db5c2ff54421d36a85947be457e93d7ae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1085": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87685655, + "lng": 10.84071636 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som skal til barnehagen, parkerer stadig midt i sykkelfeltet og presser syklistene ut i veien. Mange farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-10T23:21:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "80726fe5e0aada2185847b201218cc5e26b458fa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1084": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94917606, + "lng": 10.73111057 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysser sognsveien. Lite oversiktlig!", + "type": "String" + }, + "date": { + "value": "2014-09-10T23:20:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "625b8d0a7edce9fe254708844a19f5ced0c16446.jpeg", + "type": "String" + } + } + }, + "aftenposten-1083": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92416228, + "lng": 10.76286792 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg kom kjørende fra Gøteborggata og skulle ta til høyre inn i Helgesensgate. Da kom en bil rett i mot meg som nesten frontkolliderte. Det var 2 sekunder klaring slik at jeg klarte å svinge hardt mot høyre og komme meg unna i siste liten. Jeg hadde sjokk i tre timer etterpå.", + "type": "String" + }, + "date": { + "value": "2014-09-10T22:06:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "351baab993c914273e93e930f1bcac71e11b03ee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1082": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96014951, + "lng": 10.73358249 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussen stopper midt i sykkelfeltet i Sognsveien. Dette skaper stadig farlige situasjoner for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T22:03:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "2d3bf2ebe5661497b5c2e402b2608164838195ea.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1081": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92577526, + "lng": 10.78200817 + }, + "type": "LatLng" + }, + "description": { + "value": "Carl Berner krysset er helt forferdelig i rushtrafikken. Med biler og busser og trikker må jeg gå av og trille over hele krysset. Akkurat der bussen stopper i Christian Michelsensgate vestover er det vanskelig. Du må sykle på fortauet med mange mennesker eller i gaten hvor bussen kommer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T22:00:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "190c1d440a81ed72cc267f6740eec3f1a98d60c7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1080": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93106526, + "lng": 10.79063415 + }, + "type": "LatLng" + }, + "description": { + "value": "Lørenveien (hovedsykkelveinett) er \"tilrettelagt\" med sykkelfelt som har parkeringsplasser på utsiden. Syklende må bruke kjørefeltet for å unngå den farlige dørsonen. Fjern gate-P fra Lørenveien, og lag aldri mer slike farlige løsninger!", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:59:51Z", + "type": "DateTime" + }, + "bilde": { + "value": "77ad87efb92b8b00e6ad469c63ae789c.jpg", + "type": "String" + }, + "streetview": { + "value": "d74c39b2e891dbfd53ee8b999b290e633d4c5c13.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1079": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90090523, + "lng": 10.76316833 + }, + "type": "LatLng" + }, + "description": { + "value": "Kun fortau på en side av veien som er alt for smalt. Går ikke an å passere en fotgjenger med sykkel. Bilene holder høy fart på denne strekningen. Veldig mange syklister på denne veien og stor fare for ulykker hver dag, spesielt i rush tiden", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:55:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "a24b4c34a14cfb63275d656a7ca3ac8c06c2ab36.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1078": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9602956, + "lng": 10.78943252 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er vanskelig og uoversiktelig å krysse og sykle i Myrerskogveien ved Myrerfeltet. Her kryr det av barn, også på sykkel, og det er ingen trygge steder å krysse veien. Det står nesten alltid plassert store lastebiler/busser/varebiler i veikanten så sikten er svært dårlig, vi må snike oss frem og se om det er klart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:54:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "2967e9b58c28abd0493055e822922a98610aeef9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1077": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92125873, + "lng": 10.71900844 + }, + "type": "LatLng" + }, + "description": { + "value": "Når trikken tar igjen syklister på vei fra Briskebyvn til Uranienborgvn, i Holtegt, er det ikke mulig å komme unna på høyre side på grunn av fjellveggen. På venstre side er det motgående trafikk. Hva skal syklister gjøre da? Fortsette å kjøre foran trikken og sinke den? Gjett om trikkesjåføren blir glaog syklisten kjenner seg trygg", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:54:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "7f62cbc66441cae4da0086ba9ae089527146bc25.jpeg", + "type": "String" + } + } + }, + "aftenposten-1076": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95004642, + "lng": 10.76471328 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene som skal i retning Nydalen videregående skole kjører ofte fort og ser ikke sykkel/gangveien som kommer ut i veien inntil Nydalen bryggeri. Det er heller ingen merking som forteller at det er en sykkel/gangvei her. Men det er her de fleste sykler eller går og løper... Sikten er dessuten hindret av en stor busk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:50:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "288f438e1d7dd2947ddcef1d175af81480d5466a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1075": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93562345, + "lng": 10.78471183 + }, + "type": "LatLng" + }, + "description": { + "value": "Lørenveien er hovedsykkelnett, Statens Vegvesen har ansvaret. I nordlige del er det ingen tilrettelegging, derimot farlig gateparkering med dørsone. Fjern parkerte biler fra Lørenveien!", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:48:03Z", + "type": "DateTime" + }, + "bilde": { + "value": "212693e1c26b2142f80c2714dbb700db.jpg", + "type": "String" + }, + "streetview": { + "value": "d8f551f603a460044131922f5e90c932724463cd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1074": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94905787, + "lng": 10.76458454 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er utrolig at man har bygget ut Nydalen uten å tenke på syklister. Det går en smal og kronglete gangvei langs elva, de aller fleste syklister velger å tråkle seg gjennom parkeringsplasser og veier i stedet. Midt i det hele er det ca 20 meter med sykkelvei sånn i løse lufta. Hvordan kan byen planlegge nye bydeler slik?", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:45:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "24c8e0c770d04f01c3e0da9b48f64e533cfabf22.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1073": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94843463, + "lng": 10.64090251 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen tilrettelegging for syklister, smalt fortau kun på en side og ingen veiskulder. Har hatt flere nestenulykker her, og har endt opp med å sykle sakte på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:43:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "9895f61191931424e846077fd145b7a4d2bf9cfa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1072": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9148935, + "lng": 10.6855671 + }, + "type": "LatLng" + }, + "description": { + "value": "Det mangler sammenhengende sykkelvei fra Bygdøylokket til Huk. Dette er et generelt problem, men det topper seg på utfartsdagene. Ekstremt farlig blanding av syklister og biler på en smal og svingete vei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:42:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "05498bad701fca446257dc951accc894bd8a2ad0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1071": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9096701, + "lng": 10.7418397 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkeltraseen fra Christiania Trov mot Bjørvika har etter hvert så ujevnt dekke at stadig flere syklister velger gaten i stedet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:38:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "83a54211b968675e49661fd65592cf3c07f4fe29.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1070": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91514969, + "lng": 10.75499296 + }, + "type": "LatLng" + }, + "description": { + "value": "veiarbeid gjør at det er fort gjort å støte på trikk i motsatt retning.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:37:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "d3b0fd973cf3dbef327f670ff003f864543d199d.jpeg", + "type": "String" + } + } + }, + "aftenposten-1069": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9096701, + "lng": 10.7418397 + }, + "type": "LatLng" + }, + "description": { + "value": "På strekningen fra Rådhusplassen til Christiania Torv er sykkeltraseen umerket, som skaper problemer med at fotgjengere forviller seg ut i sykkelfeltet. I tillegg er det en trikkeholdeplass midt i sykkeltraseen, uten at det er lagd noen tydelig omkjøringsmulighet. Dette er en felle.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:36:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "83a54211b968675e49661fd65592cf3c07f4fe29.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1068": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91090189, + "lng": 10.7357868 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler merket sykkeltrase over plassen, syklister fra alle kanter blandes med fotgjengere (bl.a. fra Nesoddbåtene) og trikk, samt at plassen brukes til store arrangementer som gjør det hele uoversiktelig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:32:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "535af434167b2a7127e495ac0b08b481fdd32956.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1067": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92057044, + "lng": 10.76848983 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele nedre del av Trondheimsveien burde være parkering forbudt slikt at det finnes en god rute fra CB ned til sentrum for syklister. Gaten er uansett gjennomkjøring forbudt for biler. Da kan kollektivtransport og syklister komme seg raskt fram", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:32:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "4dc683b6af5bbdbf5afe46da73791e8bc0ec9c0c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1066": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93416146, + "lng": 10.7306385 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble forbikjørt av buss, med møtende trafikk. Bussen presset meg inn i parkert bil.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:32:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "c3dfc1150337813a014a7d97ee76f8e85839b68b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1065": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92995787, + "lng": 10.73668956 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet i sykkelfelt, påkjørt av bilist som ikke så seg for før hun kjørte inn på ledig parkeringsplass.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:31:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "d7664575c85cdee6d2c296b85885319365312256.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1064": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93825703, + "lng": 10.73151826 + }, + "type": "LatLng" + }, + "description": { + "value": "Store skader i asfalten. Utrygt for både bilister og syklister. Siste notis fra meg foreløpig. Godt initiativ. Spent på fruktene det kan bære.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:30:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "4feda6e2e9191fe4c404729e56a8cb47827bf9c7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1063": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92589219, + "lng": 10.73094427 + }, + "type": "LatLng" + }, + "description": { + "value": "Theresesgate er kanskje Oslos farligste sykkelvei. Trikkespor og biler tar hele veien og fortauene er tettpakkede av folk. Hendelse: En drosjesjåfør som har stoppet slenger opp døren uten å se seg for. Jeg kjører rett i døren. Sykkelen ødelagt, jeg fortumlet, men nokså uskadd.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:29:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "7ac9bce7136031c249b4c71bcdeb3ff157032c5e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1062": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93373145, + "lng": 10.91345787 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkering på gang- og sykkelvei. Gjør det til tider svært uoversiktlig for gående og syklister som kommer langs Gamle Strømsvei, eller som kommer fra en av gangstiene mellom husene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:28:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "a1d9d771e5531807cea12d0884e7f1bd0e193dc6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1061": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92788276, + "lng": 10.77737331 + }, + "type": "LatLng" + }, + "description": { + "value": "Trondheimsveien er ikke i det hele tatt anlagt for sykkel, og er direkte farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:28:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "e0b1e05600ce84308d3366249d61703c607f161a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1060": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89363003, + "lng": 10.80715656 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal vei med svært mye trafikk. Hvis jeg sykler i veien opplever jeg stadig at bilene kjører alt for nært meg eller at de svinger inn rett foran meg på en farilig måte når de møter en bil i motgående retning. En lastebil presset seg inn slik at jeg ble presset inn mot fortauskanten og veltet. På fortauet går det mye folk så rask sykling vil være uforsvarlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:26:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "6156f2b203c82ab123e89edf1f68b41c3d518dfa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1059": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92728063, + "lng": 10.76467037 + }, + "type": "LatLng" + }, + "description": { + "value": "Stor fare for dører som åpnes i sykkelfeltet. Parkering i sykkelfeltet er en gjennganger i denne delen av Toftes gate og Schleppergrellsgate", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:26:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "367555796587e3e0cacfee9dc8fc6ec60a07f71d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1058": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92586128, + "lng": 10.73033809 + }, + "type": "LatLng" + }, + "description": { + "value": "Taxiholdeplassen er \"i\" sykkelfeltet...taxidører som blir slått opp ut mot vei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:20:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "b1485aa7b0d39233ace6dd7e18a363dd7a151459.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1057": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92896871, + "lng": 10.76932668 + }, + "type": "LatLng" + }, + "description": { + "value": "Håpløs rundkjøring der oversikten en minimal fra både høyre og venstre. Folk sykler desverre ofte mot kjørerettningen på dette doble strekket med sykkelvei/fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:19:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "ac1b9e0dd4cc74fef8885dcb5aae0b49837393c8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1056": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91540784, + "lng": 10.74434995 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:18:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "ecbcf9df9fea54f994e13ceec88995686f16899c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1055": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92944314, + "lng": 10.76830744 + }, + "type": "LatLng" + }, + "description": { + "value": "Hekken/gjerde hindrer sikt mot høyre fra Chr.Mikkelsensgate og mot venstre fra Fagerheimgata. Uheldig for både gående og syklende.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:17:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "b490ec0b74f4fd935e097774e48499d42b7de78b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1054": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90656502, + "lng": 10.76222419 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er mange biler (stort sett taxi og busser) som kjører VEL sent på gult/rødt her. Hender ofte at man er kun cm ifra kjøretøy som krysser sykkelfeltet selvom det er grønt for syklistene", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:17:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "907bcc74b3722af449322f34e226a4b8955dc64a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1053": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91534868, + "lng": 10.7226777 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:15:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "c1e2a948daaad7bc14eb90a1f24aec4c26ce0834.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1052": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91465489, + "lng": 10.71802139 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:14:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "dd9e7c06a4a1d868598e006f1f6807c60b19177e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1051": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9056989, + "lng": 10.76807141 + }, + "type": "LatLng" + }, + "description": { + "value": "Senest i går la bussen seg over i sykkelfeltet da jeg var midt på siden av den. Kunne endt stygt - for meg..", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:12:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "217f40487b26902dd7dfacf8ec3a36246110e9a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1050": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90023805, + "lng": 10.76063632 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelvei nedover. Farlige forbikjøringer fra bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:10:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "37845adf727e31e29d2f4ad8be96c363ff68b499.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1049": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92136627, + "lng": 10.67774534 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det fine sykkelfelt, men de brukes som parkeringsfelt av biler. Står nesten alltid en bil utenfor ICA her, gjerne på begge sider av veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:08:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "9897b9129d8af8b55dfb14bffd82b62bf0900bf4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1048": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92274146, + "lng": 10.70522725 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler/Busser kutter svingen å presser oss syklister ut i kantsteinen", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:08:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "8b785fad2a6880072b14fe15212a920427b3db14.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1047": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91777413, + "lng": 10.76312541 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke tillrettelagt for sykkel", + "type": "String" + }, + "date": { + "value": "2014-09-10T21:08:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "1a4d35b2347e15f31bf776c360b00bf269385013.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1046": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91085629, + "lng": 10.72968095 + }, + "type": "LatLng" + }, + "description": { + "value": "Om morgenen: Da blandes oftest hensynsløse syklister fra vest som triller i stor fart gjennom en pakke gående fra nesoddbåten. Vanligvis skjærer de gjennom oss. Tips: Se deg rundt før du endrer retning. Vær tydelig på hvor du går hen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:36:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "451477618b687b0b8cb2050ff11b9c166ee6eda6.jpeg", + "type": "String" + } + } + }, + "aftenposten-1045": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92074252, + "lng": 10.72484493 + }, + "type": "LatLng" + }, + "description": { + "value": "Uranienborgveien er \"ferdig bygget hovedsykkelvei\",men har ingen tilrettelegging. Parkerte biler gir farlg dørsone,\"og vi må sykle godt ut i kjørefeltet. Dette misliker noen bilførere. Få bilister respekterer fartsgrensen på 30 km/t. Fjern all gate-P og tilrettelegg for sykkel!\"", + "type": "String" + }, + "date": { + "value": "2015-01-28T14:06:33.87Z", + "type": "DateTime" + }, + "bilde": { + "value": "4caae7d9b7a6f4ebd67fc14255a436c0.jpg", + "type": "String" + }, + "streetview": { + "value": "049448179d5cdb9be97c29f942407fc3de45a5c6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1044": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84367225, + "lng": 10.81960201 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig kryss der gang- og sykkelvei langs Ljabruveien krysser Bjørnerudveien. Syklister ser ikke bilder som sykler sydøstover i retning Klemetsrud ser ikke trafikk som kommer ned Bjørnerudveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:13:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "33c8d4f49e7f3443373571a33f12f5c1893ff0fb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1043": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84789754, + "lng": 10.80522537 + }, + "type": "LatLng" + }, + "description": { + "value": "Stor stein ligger i veien for å hindre innkjøring for biler. Steinen er ikke merket på noe vis, og kan være vanskelig å se i mørket for syklister som ikke er lokalkjent.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:10:26Z", + "type": "DateTime" + }, + "bilde": { + "value": "6933b0cb9a6ada7390fc60b9429f1499.jpg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1042": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91983912, + "lng": 10.72254896 + }, + "type": "LatLng" + }, + "description": { + "value": "Oscars gate har tre felt, hvorav to brukes til bilparkering og det midterste er enveiskjørt. Bilparkering fører til dårlig sikt spesielt i kryssene. Her bør det være lett å lage et sykkelfelt som separerer bilister og syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:10:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "16442b382f78f05008dfc9c2263218339b9289d6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1041": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92907899, + "lng": 10.73275699 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelvei. Mye trafikk. Dårlig vei og trikk. Daglig farlige situasjoner. Parkeringsplassene som kunne blitt sykkelvei er erstattet med potteplanter, benker og sykkelststativ (?!)", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:09:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "bf708f2dfd8365fe3cdb65e814e3e4414ea0ea0a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1040": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9255602, + "lng": 10.73218345 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det veldig dype spor i asfalten etter bussen. Tydeligvis blitt utført elendig arbeid. Livsfarlig å få sykkelhjulet i et av sporene i høy fart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:08:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "4a6bffb23f1f1c7ae14ee3f596a93232ad2f6bee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1039": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94460899, + "lng": 10.59086322 + }, + "type": "LatLng" + }, + "description": { + "value": "70-sone for biler, uoversiktelig og ikke sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:07:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "cfbd314f3d985b131d8d329fd99c58edf233c87c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1038": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92295788, + "lng": 10.73196887 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette krysset er lite og trafikkert. Det er vanskelig å komme seg inn i veibanen som syklist. Sykkelfelt hadde hjulpet mye på situasjonen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:06:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "da4fd2c0d6dcfb8c86b5a16a5f0677b77ee3e243.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1037": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92383968, + "lng": 10.77561378 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvis man sykler langs ring 2 i retning Galgeberg forsvinner plutselig sykkelfeltet her en periode. Veldig forvirrende for både syklister og biler, og skummelt i stor fart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:06:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "ee239a83ca24f33d38a104d9f15ff79386e85bb5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1036": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9177096, + "lng": 10.75445652 + }, + "type": "LatLng" + }, + "description": { + "value": "Stod å ventet på grønn mann som fotgjenger. Ble påsykklet av sykkelist som fotgjenger selv om jeg stod på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:05:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "e4b1dd391e8596f3fdbcf95ba2626914954db9b6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1035": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85608791, + "lng": 10.67077159 + }, + "type": "LatLng" + }, + "description": { + "value": "bratt, mye trafikk, ikke sykkelvei eller gangsti, livsfarlig", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:05:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "11c727b91fa9ade7e3c717745ddfaafdd2e2a6da.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1034": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92650645, + "lng": 10.7463026 + }, + "type": "LatLng" + }, + "description": { + "value": "Har blitt kjeftet på av Taxisjåfør her for å sykle i veien (på vei nedover).", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:04:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "06a66cca049019027ff64597e9b32434930fcae7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1033": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92146172, + "lng": 10.76126396 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet oppover i sykkelfeltet, ble såvidt tatt igjen av bil som brått svingte inn til høyre. Klarte så vidt å unngå kollisjon.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:04:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "04b8c0bb7bbc63321f2c0a4d0dc5566f51de1ee2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1032": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91906477, + "lng": 10.75737476 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig fotgjengerfelt. Sykkelister kommer i full fart ned bakken. Fotgjengere blir nesten påkjørt av sykkelister selv om fotgjengeren går på fotgjengerfelt", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:04:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "ccebc67c17d4235015a2be284953f9c24d8ab53d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1031": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92822683, + "lng": 10.75432777 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig vedlikeholdt vei i kollektivfeltet gjør at man må legge seg midt i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:03:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "7a1227be5ac1cba15291498a5b4d882e512e1404.jpeg", + "type": "String" + } + } + }, + "aftenposten-1030": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92850638, + "lng": 10.76149463 + }, + "type": "LatLng" + }, + "description": { + "value": "På østsiden i krysset Toftes gate / Sannergata er det ett felt som etter 50 meter blir til to felt. Her presser biler seg forbi i stor fart med centimeters mellomrom istedenfor å vente til veien åpner seg til to felt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:03:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "82671c568a7bf9c07dba54ed8980753c3d7a3ccb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1029": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91553692, + "lng": 10.75613558 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig ujevn asfalt, trikk og buss i høy hastighet og ofte overfylt fortau gjør at denne strekningen ikke er veldig sykkelvennlig,", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:01:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "3b97e897ea7f77852c4cd8f6e1fa711ae84a0570.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1028": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92731289, + "lng": 10.76559305 + }, + "type": "LatLng" + }, + "description": { + "value": "Nordfra kommer fin sykkelvei som plutselig stopper opp og løper inn i et trafikkert kryss uten noen åpenbar måte å komme seg over til neste bruddstykke sykkelvei vestover.", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:01:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "59629dec09610898b7595a35e2f48b4df626d99e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570493507196096500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.948827, + "lng": 10.768147 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas Moen", + "type": "String" + }, + "description": { + "value": "I dag holder vi i #Fanbooster inspirasjonsforedrag for sultne studenter. Alltid like gøy! (@ Handelshøyskolen BI) https://t.co/R34YcLVdbv", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:00:26Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/450927318140059648/-NfOOFMo_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + }, + "streetview": { + "value": "cbcd8143ca656e59d7c167aea4300973834cb25e.jpeg", + "type": "String" + } + } + }, + "tweet:570487090313596900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.47151, + "lng": 6.17293 + }, + "type": "LatLng" + }, + "author": { + "value": "Cecilie Helle", + "type": "String" + }, + "description": { + "value": "@MackPerryAITG @qazmlp54 @MikeyGuitar_ @MauriceJohnMoro Yeah! Let's keep swimming!! \\m/ \\m/", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:34:56Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570231728506040320/Xwo0MRGZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "9f914d76-dde9-490a-b21e-8aedd79650d0": { + "type": "master:utmost:almost", + "properties": { + "location": { + "value": { + "lat": 59.96095084, + "lng": 10.76173067 + }, + "type": "LatLng" + }, + "description": { + "value": "ceci est un chien", + "type": "String" + }, + "_utmostIcon": { + "value": "almost-bike", + "type": "String" + }, + "streetview": { + "value": "5b0e023a7cfe898744aa8e7329ad8de2536263ca.jpeg", + "type": "String" + } + } + }, + "tweet:570511073163546600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.1215, + "lng": 11.38452 + }, + "type": "LatLng" + }, + "author": { + "value": "erik.gaybisexual yes", + "type": "String" + }, + "description": { + "value": "@TiffanyAngelx hello Tiffany angel erik gay bisexual yes erik single yes erik man yes erik grilfriend maybe no", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:10:14Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570354882859646976/-pVG1K2H_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570508422644441100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.912384, + "lng": 10.771182 + }, + "type": "LatLng" + }, + "author": { + "value": "Therese F. Mathisen", + "type": "String" + }, + "description": { + "value": "Enig @NorumMartin -hva søren er egentlig \"clean food\" og \"clean eating\"?? @Melk_no #frokostdebatt #sunnmat #ernæringsformidling", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:59:42Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561231096973508609/1whKwTkV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "a66c94fee429b760bd6c499cc0e1464ffbeb2890.jpeg", + "type": "String" + } + } + }, + "tweet:570519539722686460": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.910105, + "lng": 10.724997 + }, + "type": "LatLng" + }, + "author": { + "value": "Hans-Petter N-Hansen", + "type": "String" + }, + "description": { + "value": "#KI15 Mobilen er det beste eksemplet på konvergert infrastruktur, i følge @MortenHJohansen fra @HPNorge \"Gjør det enklere m teknologi\"", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:43:52Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562329672713662464/vNeJqE4g_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "f7433051d41a55917b2ad6b0cbbdb1ce00d2c227.jpeg", + "type": "String" + } + } + }, + "tweet:570519757511917600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.401141, + "lng": 10.659255 + }, + "type": "LatLng" + }, + "author": { + "value": "Marte Sjøvold", + "type": "String" + }, + "description": { + "value": "@BrettCullen4_ yes indeed, he's strong af, no doubt about that!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:44:44Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560412512152461312/w5ozDSyQ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F71313", + "type": "String" + }, + "streetview": { + "value": "9d8958e8ae66b787afb77b4dcd1fb8ec3b5f9958.jpeg", + "type": "String" + } + } + }, + "aftenposten-114": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91719871, + "lng": 10.71761369 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig i Colbjørnsens gate ved Den Franske Skole alle hverdager 0800-0845. Foreldre i bil som parkerer ulovlig for å slippe av unger. Skaper kø, aggressivitet og farlige situasjoner mellom alle slags trafikanter. Strekningen er meldt til Bymiljøetatens aksjon mot parkering i sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:37:16Z", + "type": "DateTime" + }, + "bilde": { + "value": "04a62a82084d0f1960070ec34caf2e4c.jpg", + "type": "String" + }, + "streetview": { + "value": "44a8b1acbdb51db875550c5a644b51e5e72e5a6c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-135": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92766771, + "lng": 10.71347236 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke plass til sykkler mye trafikk og hissige biler. Bygg separat sykkelsti", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:59:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "b35f7fe7fa7ac094727716f8908fe43fa3e2683b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-134": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94847761, + "lng": 10.77775955 + }, + "type": "LatLng" + }, + "description": { + "value": "Utkjørsel fra bensinstasjonen langs Ring 3 mellom Storo og Nydalen (på Storosiden) bilsjåfører som kjører ut av stasjonen krysser sykkelfelt og ut i enveiskjørt veg. Syklistene kommer i stor fart pga bebyggelse er det ikke sikt. Har ligget på panseret av biler flere ganger- det har gått bra. Sykkel", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:56:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "e78708b0ab95755f35eacadb4b68707a5a714cd7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-133": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94142779, + "lng": 10.74446797 + }, + "type": "LatLng" + }, + "description": { + "value": "Trang enveiskjørt gate med smalt fortau og parkerte biler. Vanskelig å sykle til universitetet med motgående biler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:56:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "04b747a218605f4807925a516d984baca219e22b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-132": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93570945, + "lng": 10.73162555 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt stopper plutselig rett før veikryss", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:53:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "131385a21583501fa3dac01558eb0bc9bb2dbb2b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-131": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91343939, + "lng": 10.74417829 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig vei, blanding av biler og trikk. Ingen dedikerte sykkelområder", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:51:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "2bd5d39e91f3745d5397bab6abe580961e9082b3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-157": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9330933, + "lng": 10.72595969 + }, + "type": "LatLng" + }, + "description": { + "value": "Tilrettelegging for sykkel er ikke bra, dette gjelder kirkeveien gjennom hele ring 2 og forbi majorstuen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:17:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "7c72593db5c2ff54421d36a85947be457e93d7ae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-156": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93257039, + "lng": 10.75934886 + }, + "type": "LatLng" + }, + "description": { + "value": "man vet ikke om man skal sykle på veien med biler eller på gangstien", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:16:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "380892d9b3ffbd27663673c54c483d9e9709fdc3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-155": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9145043, + "lng": 10.74162483 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien kan bli en god sykkelvei gjennom sentrum, men den er enveiskjørt så man må finne annen rute østover. På tross av det er den skiltet som hovedsykkelvei når man kommer fra vest. Veien er mer enn bred nok, så det burde være en smal sak å tilrettelegge.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:16:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "2ef3913de0660a6fd8557e548cf918d43c8330c6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-154": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9521433, + "lng": 10.7853595 + }, + "type": "LatLng" + }, + "description": { + "value": "Storo-krysset er farlig for syklister, men er dessverre eneste mulige sykkelvei fra Grefsen mot sentrum når snøen kommer", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:14:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "1d608bcacc04ac40060db27d22fd4d2b3e472d08.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-231": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94884296, + "lng": 10.79016208 + }, + "type": "LatLng" + }, + "description": { + "value": "Fryktelig dårlig asfalt og infrastruktur hele veien ned fra Grefsen. Syklister må krysse trikkesporene og skifte fil flere ganger på vei ned og er dermed utsatt for uoppmerksomme bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:55:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "8ed0ce2ba19b0e02828b576a34971ae42b227063.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-230": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90985715, + "lng": 10.71244239 + }, + "type": "LatLng" + }, + "description": { + "value": "Kjørte på fotgjenger/barn. Brakk arm og kragebein. Ikke separate felt fotgjenger/syklist.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:54:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "ef503b1c4c0d0c9ad2a24fee3fce7bdf6c604e9a.jpeg", + "type": "String" + } + } + }, + "aftenposten-229": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91318724, + "lng": 10.64134454 + }, + "type": "LatLng" + }, + "description": { + "value": "Både før og etter Lysakerlokket må sykkelveien krysse vanlig vei flere ganger + 2 ganger innkjøringen til Gjensidige.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:54:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "d2572e0527bad62414e8998c1627248070d872ff.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-228": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9305062, + "lng": 10.71922302 + }, + "type": "LatLng" + }, + "description": { + "value": "Generelt for smale sykkelfelt i Kirkeveien. Som daglig syklende fra Rælingen til Majorstuen oppleves høy hastighet og for liten avstand hos biler og busser ved forbikjøring av syklende som skremmende. Det bør innføres fartsbegrensning på 40 km/t i bykjernen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:54:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "f0eeb6c2e0b0f0a631d01c0c4ab2f1a23e3994ce.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-227": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89156341, + "lng": 10.76522827 + }, + "type": "LatLng" + }, + "description": { + "value": "Opp Kongsveien er det 70-sone, og ikke sykkelfelt. Man har \"valget\" mellom fortau (sammen med gående) eller det relativt brede kjørefeltet. Mange bilister \"kjører forbi\" i samme kjørefelt, selv med møtende trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:53:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "90c6f750af83af2f6e7eecbf6cd29cc52ff5942d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-226": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92792577, + "lng": 10.71351528 + }, + "type": "LatLng" + }, + "description": { + "value": "Malingen som markerer sykkelfeltet er kjørt bort av billister som kutter svingen. Like etter forsvinner sykkelstien helt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:52:16Z", + "type": "DateTime" + }, + "bilde": { + "value": "b39fe085aaf0dd69236d3d1c4772b96d.png", + "type": "String" + }, + "streetview": { + "value": "282fe82035885c3b5fe50b08ff545d0942b14403.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-225": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91531641, + "lng": 10.74917793 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange som sykler her. Torggata er blitt bra, men må forlenges inn og rundt youngstorget. Ønsker sykkel vei helt opp til ullevålsveien. Denne kan da kobles inn mot sykkelfelt på Grønland.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:52:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "b38030bac73c1b7abf4a4c4ec16d25dcc4e50ca2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-224": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96048895, + "lng": 10.79019963 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange bilister overholder ikke vikeplikt fra høyre her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:51:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "d172befca3fbc28a7eb40c54173d9a5c84091a06.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-223": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90770546, + "lng": 10.75771808 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelforholdene i Bjørvika er livsfarlige. Det går ikke å bruke de smale sykkelfeltene. Eneste løsninge er å sykle forbi operaen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:51:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "e8efbf29afaa3d72b955b92fea592bb23a5b7e68.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-222": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92904398, + "lng": 10.79853057 + }, + "type": "LatLng" + }, + "description": { + "value": "Vegetasjon i sykkelfeltet som følgelig blir alt for smalt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:50:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "2a9f314e75536fa29d98eab7dc40908445e867d9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-221": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92393646, + "lng": 10.73382496 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er en relativt ny vei, men mangler sykkelfelt!", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:50:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "dd72cea4e634cb509b2aef05d92cd8cd19e0f0f2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-220": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91344525, + "lng": 10.64258163 + }, + "type": "LatLng" + }, + "description": { + "value": "Bare helt håpløs planlegging. Farlig og uoversiktlig!", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:50:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "e5231bd855b32b2493968a2432c5cb69ee6a9dd0.jpeg", + "type": "String" + } + } + }, + "aftenposten-219": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9475319, + "lng": 10.6424755 + }, + "type": "LatLng" + }, + "description": { + "value": "Det mangler sykkelvei fra Røa-krysset og ned bakken til Lysakerelven. Her oppstår det daglig farlige situasjoner når biler og busser passerer syklister i veibanen i høy fart", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:50:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "c82d1d1f9b21108cae0fb06448af67e538c1fb77.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-218": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91153536, + "lng": 10.73304176 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister kolliderte. Det er kaotisk på Rådhusplassen med mange gående og syklende på store ujevne heller.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:49:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "992d917f6536aa352f2a87703319f0c1667d4e59.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-217": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91340712, + "lng": 10.7544136 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelfelt. Kan lett kobles til sykkelfelt over Grønlandsleiret", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:49:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "2c0f21cbd3b136be3c680ced436e9d09bd021c3e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-216": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9079314, + "lng": 10.75707435 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet i Dronning Eufemias gate vestgående slutter brått pga. bussholdeplasser, og syklister tvinges ut mellom biler i venstre felt og busser på holdeplass. Farlig og komplett idiotisk planlegging!", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:48:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "e591071e2c93c0fa4e41aefe4446f66b172e5548.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-215": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92616236, + "lng": 10.77621459 + }, + "type": "LatLng" + }, + "description": { + "value": "Carl Berners plass - tilrettelagt for kollektivtrafikk, bilister og fotgjengere. Bare ikke for syklister. Tilfeldig?", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:48:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "f1e7c9129bc3e161da00efe8bcbb45f705a81201.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-214": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92744326, + "lng": 10.73900163 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner når man svinger til høyre i lyskrysset. Kommer tilbake etter ca. 100 m.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:48:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "ab99344f12cc1b9183beb6a6c67350451376a6c0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-213": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91312744, + "lng": 10.75947761 + }, + "type": "LatLng" + }, + "description": { + "value": "her står biler parkert i sykkelfeltet, man må kjøre sikk sakk forbi dører som åpner seg og folk som går inn og ut av bilene og hovedveuen. livsfarlig!", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:47:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "0e6cb9a1bc67938260b13ab8d871d57baa5787ee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-240": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92125873, + "lng": 10.7510662 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet slutter rett før rundkjøringen. Der har bilene en tendens til å legge seg ved siden av syklisten, for så å svinge til høyre ut av rundkjøringen - gjerne uten å bruke blinklys.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:58:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "715b71ec0f21b8b52595545a2f3728252d92a719.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-239": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91616077, + "lng": 10.74587345 + }, + "type": "LatLng" + }, + "description": { + "value": "Trangt og mørkt i tunnelen ned mot youngstorget.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:58:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "bae29079a992f7a4c8a0b5e2e5c0ec71b4f2ecaa.jpeg", + "type": "String" + } + } + }, + "aftenposten-238": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9188174, + "lng": 10.79501152 + }, + "type": "LatLng" + }, + "description": { + "value": "Her må en kjempe med bilene som riktignok har to felt et stykke, men som ofte foretrekker å presse seg tett forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:57:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "b8b43ebb76a0b9897b6e4151c76eb23588993154.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-237": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93775183, + "lng": 10.7544136 + }, + "type": "LatLng" + }, + "description": { + "value": "Arendalsgata over Sagene ble opprustet for noen år siden og dte ble laget brede fine fortau, men ikke sykkelfelt! Her er det mye trafikk og og både 20-, 37-, og 54-bussen har sin trasè her. Det er ikke plass til syklist og kjøretøy i begge retninger så det er kontinuerlig farlige forbikjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:57:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "a42a0da75695507449c19a7f270d13b90bc7a5af.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-236": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.920205, + "lng": 10.78191504 + }, + "type": "LatLng" + }, + "description": { + "value": "Økernveien mellom Haslekrysset og Kampen Park: Svingete og bratt landevei uten gangfelt eller sykkelfelt. Kombinert med hissige bilister og vintertid er dette en svært utsatt strekning. Er også skolevei. Trenger enten gang- og sykkelfelt eller nedsatt fartsgrense, helst begge deler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:57:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "54e3a2e1805ddf84e15b315b60996bd6f486af02.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-249": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88092689, + "lng": 10.78621387 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler legger seg inn mot høyre fortauskant. Det er ikke plass til syklister i vegbanen, og siden dette er et trafikkert fortau er det lite egnet for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:02:24Z", + "type": "DateTime" + }, + "bilde": { + "value": "203887cc484cec8719a3bde40f1ab76c.jpg", + "type": "String" + }, + "streetview": { + "value": "a3f44937bd3f8a6f60dc0ec658c106ecd53a8098.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-248": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92437735, + "lng": 10.75042247 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilisten her ventet på kompisen sin. Som vi ser, er bilen registrert i en av våre vestlige nabokommuner, hvor den unge mannen sannsynligvis også er født og oppblåst", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:02:21Z", + "type": "DateTime" + }, + "bilde": { + "value": "dc23fe039aab7c8f8cda2e9471aa3bc6.JPG", + "type": "String" + }, + "streetview": { + "value": "215c0c465ec26c0401799c3419f91fbbf5fc0a62.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-247": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89472787, + "lng": 10.7580614 + }, + "type": "LatLng" + }, + "description": { + "value": "I snart to år har dette vært en byggeplass med en standard for myke trafikanter som er ulovlig. Entrepenørene står for sikkerheten og de gjør faktisk det som kan forventes. Nedenfor går en alternativ vei, -hvorfor har Oslo havnevesen fått lov til å stenge denne?", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:02:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "80c4cb3594a5f8e6af8b1e1028f10b05efdddf2b.jpeg", + "type": "String" + } + } + }, + "aftenposten-246": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9214308, + "lng": 10.7510662 + }, + "type": "LatLng" + }, + "description": { + "value": "Varebilder parkert i sykkelveien; her fra Bring", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:01:07Z", + "type": "DateTime" + }, + "bilde": { + "value": "7a63a43758ef95d4b96edf7fd16c562a.JPG", + "type": "String" + }, + "streetview": { + "value": "319f74c89f77946e6d64fa240230a7eda7dd1e51.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-245": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90690931, + "lng": 10.76814651 + }, + "type": "LatLng" + }, + "description": { + "value": "Her deler busser, trikker, biler, syklister og andre på en trang og hullete vei. Mye mennesker på trange og humpete fortau gjør dem uegnet for syklister. Denne strekningen er en god kandiat til Oslos farligste for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:01:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "bc1fd0caa2bbb39c70554c3299632d963c9f4d73.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-244": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91634631, + "lng": 10.74718236 + }, + "type": "LatLng" + }, + "description": { + "value": "Buss presset meg inn i betongskille mellom fotgjengerfelt og vei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:59:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "016c37933c09a22473d6cebbf6b454ade6fbaefd.jpeg", + "type": "String" + } + } + }, + "aftenposten-243": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92095761, + "lng": 10.7505083 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien utenfor Vulkan/Mathallen er et yndet parkeringssted for varetransport. Noen ganger får man beskjed om å \"værra rasshøl et anna sted\" hvis man gjør oppmerksom på feilparkering. Andre ganger bruker sjåførene sin innsikt i finjussen og argumenterer med at så lenge nødblinken er aktivert,", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:59:35Z", + "type": "DateTime" + }, + "bilde": { + "value": "6dfa16e67cf878e98cbf0cbfc2da110b.JPG", + "type": "String" + }, + "streetview": { + "value": "95ca6a64fdbf3ceebd5b8ddfa7e5325eb2b09c23.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-242": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92347406, + "lng": 10.79231386 + }, + "type": "LatLng" + }, + "description": { + "value": "Store deler av ring 2 mangler sykkelvei. Stor trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:59:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "23551d0664d1cfde369daf0de1aecd1e3b9d75c1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-241": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92916784, + "lng": 10.77768401 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler tilrettelegging. Vei med mye trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:58:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "4bd64abe33acf20a9d0e5e7a3ead20a5c748a742.jpeg", + "type": "String" + } + } + }, + "tweet:570490286650089500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.928764, + "lng": 10.708644 + }, + "type": "LatLng" + }, + "author": { + "value": "Fredrik Hoel", + "type": "String" + }, + "description": { + "value": "H2020 Fast Track to Innovation (@ NHO - Næringslivets Hus - @nho_no in Oslo) https://t.co/wQ2ZussdvY", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:47:38Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3634806143/d361397ecb5ef2fb43ee0814d29fa5d0_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "4b9cddcc0cf2c07661724137ee4a2e6e78b6ccf4.jpeg", + "type": "String" + } + } + }, + "aftenposten-256": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9147517, + "lng": 10.71767807 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen plass til syklister ned Frognerveien. Er alltid redd når jeg kommer ned mot rundkjøringen. Selv om jeg indikerer at jeg skal rundt rundkjøringen er det alltid en bil som prøver å presse meg ut/kjører unødvendig nærme fortauet så jeg føler meg utrygg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:09:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "940ef8f8ffb53452d115e248769263442c3f37f9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-255": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91710729, + "lng": 10.74454307 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler ofte med henger, inngang til sykkelbane i nordlig retning på innsiden av betongkant for smal, betongkant har utragende kant i bunn som ikke synes, sykkelhenger krasjer med denne og henger velter, i mitt tilfelle førte det til lettere hodeskader for min sønn", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:09:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "7eac719353ae7cd42c3aa900c7f876b64119838b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-254": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95371839, + "lng": 10.86685352 + }, + "type": "LatLng" + }, + "description": { + "value": "Masse trær hindrer sikt slik at når man kommer ned bakken sørover ser man ikke biler i Doktor Londonsveien før halvveis ned i bakken, like før myk trafikant og bil møtes i krysset. Mest relevant for rulleskigåere som har begrensede bremsemuligheter.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:07:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "06d7f92a2394812abe521d9276780261c7d1a96f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-253": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92743116, + "lng": 10.73894262 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset Collets gate/Ullevålsveien har gitt meg gåsehud mange ganger. Det er knapt grønt nok til at man klarer å tråkke seg over krysset og det er totalt ti innkjørselsveier bilene kan komme fra.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:07:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "4b8934ad6c162af0374380239becf4d8f526530c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-252": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93608569, + "lng": 10.73216199 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kommer ned Sognsveien til krysset stopper plutselig sykkelstien, og man blir klemt inne mellom busser og biler. Farlig sted.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:07:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "265e73e9f57abad0a1b1c10964d43af18c1eaa9a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-289": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94122358, + "lng": 10.74691414 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange syklister velger Tåsenveien mot byen, men krysset mot Jutulveien er farlig. Mange biler overholder ikke vikeplikten her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:20:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "1376ad37056cf837fcec3827a4d141f2b4eeff97.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-288": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93562345, + "lng": 10.73909282 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele strekningen her er utsatt, selv om man kjører i et kollektivfelt. Mangler tilrettelegging og både bilister og syklister sloss om plassen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:20:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "e2172dd3b37ff9107e9bcc81e137fae8d7745789.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-287": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92500642, + "lng": 10.75931668 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelbanen mellom Birkelunden og Sofienberggata er dårlig merket hvilket medfører at syklister og fotgjengere ofte kommer i konflikt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:19:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "4f28929adcb1a33d155c5b924e1fbba4c67b122b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-286": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91229376, + "lng": 10.80644845 + }, + "type": "LatLng" + }, + "description": { + "value": "Helt ny rundkjøring hvor fortauet langs kirkegården er gjort bredere for syklister. Men dårlig løsning for å få syklene gjennom rundkjøringen. Blant annet store kanter og ingen merking som gjør bilister oppmerkesomme på at syklister også ferdes i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:19:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "3acfcdd922fecccfd32da317f0152cfa38721101.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-285": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93716062, + "lng": 10.81315398 + }, + "type": "LatLng" + }, + "description": { + "value": "Lundliveien er veldig smal i fra Oreliveien til Økernliveien. Biler står av og til parkert på begge sider. Om et hus skulle begynne å brenne kommer ikke brannbilen frem.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:18:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "c812638cee27cec18e5e502261ba928757fc5b17.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-284": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94816599, + "lng": 10.90281486 + }, + "type": "LatLng" + }, + "description": { + "value": "Lang nedoverbakke som ender i et uoversiktlig kryss. Blir fort til at man krysser gaten i uforsvarlig hastighet. Kryssende vei har 40km/t, men trafikken kan fint kjøre det dobbelte.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:18:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "0eb8842a8e49a3024dc2d290eefcd4adfc0a3ca1.jpeg", + "type": "String" + } + } + }, + "aftenposten-283": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92926977, + "lng": 10.7591772 + }, + "type": "LatLng" + }, + "description": { + "value": "Thorvald Meyers gate er her enveiskjørt uten sykkelvei. Veien er forholdsvis lite trafikert, så her savner jeg et sykkelfelt. Det burde være enkelt å få til. Alternativene er enten Toftes gate, hvor trikken kjører eller den stupbratte bakken langs Akerselva.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:18:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "b1038ec85e05539c4c0f6486401025f6dd8c3c80.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-282": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94005204, + "lng": 10.72965145 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt opphører pluttselig før rundkjøring. Fortsetter på andre siden av krysset. Bymiljøetaten holder på å omgjøre Sognsveien til Miljøgate her, men glemte å fulløre sykkelfeltet", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:18:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "3fd2334ff8f27d03461feb587bb69f5ff55c0085.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-281": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92128562, + "lng": 10.75101256 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelbane forsvinner før rundkjøring, det er i kryss og farlige områder sykkelbaner er viktigst.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:17:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "ce240047af0888506b64d62704cd198042186848.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-280": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93239838, + "lng": 10.76007843 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelvei, blir nesten daglig forsøkt presset opp på fortauet av bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:17:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "32b8f3080e06f4ab1319803ae1812cae3f10d428.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-279": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9051663, + "lng": 10.82127571 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som skal til venstre, ut på E6, risikerer å kolliderer med syklister på vei oppover.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:16:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "f2b3a38c9a6e3a1e6bd0d78289d4fd3e174e91b5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-278": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93528752, + "lng": 10.8087337 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig uoversiktelig kryss", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:16:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "e59587549990f66611949b49cbc2d62cf17a68f9.jpeg", + "type": "String" + } + } + }, + "aftenposten-277": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91498834, + "lng": 10.74377059 + }, + "type": "LatLng" + }, + "description": { + "value": "Stygge monsterblokker av betong vanskeliggjør passering med sykkel med sykkelhenger.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:16:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "a4f8ec3db864c2c493f794e113f0fd497561dfa9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-276": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93940176, + "lng": 10.81488132 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene i økernveien kjører for fort fordi det er en lang fin strekning. Selv om de har vikeplikt for bilene som kommer opp Økernliveien er det mange nestenulykker i dette krysset. Bilister som ikke er kjent i området skaper ofte farlige situasjoner. Fartsdump eller fotoboks. Eventuelt gi Økernveien", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:15:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "6ed8ae0f7d1eea46618a2c9eb18c232f95f89f8d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-275": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9159833, + "lng": 10.7445538 + }, + "type": "LatLng" + }, + "description": { + "value": "Stygge monsterblokker av betong vanskeliggjør passering med sykkel med sykkelhenger.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:15:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "d7927ef578f3db37461c9f8dba063fe88e6e3b94.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-316": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92943104, + "lng": 10.71690559 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet i kirkeveien er i for smalt, og forsvinner helt før man sykler igjennom krysset, valkyriegaten/kirkeveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:28:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "dcaca0dd90338cf492fc7e0a6921f4560e33e583.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-315": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91237444, + "lng": 10.7641983 + }, + "type": "LatLng" + }, + "description": { + "value": "I lyskrysset vedGrønlandsleiret - Tøyengata, er det en farlig løsning med at sykkelfeltet dras til høyre - uten at dette er markert godt nok. Blir konflikter med biler som skal rett frem i neste lyskryss. Det er i tillegg veldig dårlig asfalt her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:27:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "0bd8302c559948d5bf3dd546f71821f3b3320708.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-313": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94167499, + "lng": 10.7444787 + }, + "type": "LatLng" + }, + "description": { + "value": "Problematisk å sykle her da det er enveiskjørt og smalt fortau. Finnes ingen alternativ kjørerute fra Sagene til Universitetet som er i nærheten av like rask.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:27:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "84c4c28bbe0505267851794ad1d46953695f9023.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-312": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9238031, + "lng": 10.73145249 + }, + "type": "LatLng" + }, + "description": { + "value": "Tett med gående på fortauet, men farlig i sykle i veibanen. Mye trafikk og skumle trikkeskinner overalt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:27:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "1f1a37de175329b57aaf735a2ea7440e6bb7dbb4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-311": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92904398, + "lng": 10.76921939 + }, + "type": "LatLng" + }, + "description": { + "value": "Her bør det merkes med farlig kryss slik at syklister fra nord gjøres oppmerksom på kryssende vei som kommer svært brått på.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:26:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "40a01ebc2d00f9a49464de9a3f1aa580c9a44ab2.jpeg", + "type": "String" + } + } + }, + "aftenposten-310": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96893081, + "lng": 10.76574325 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært mange bruker Maridalen til å jogge, sykle eller gå på rulleski. Men det er også en del trafikk her, noe som medfører svært mange farlige forbikjøringer. Det er bare et tidsspørsmål før det skjer en alvorlig ulykke her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:25:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "2235a584b7ff6509cd1388218d18a271f7277077.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-318": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91376209, + "lng": 10.73883533 + }, + "type": "LatLng" + }, + "description": { + "value": "Brostein i krysset Karl Johansgate Rosenkrantzgate lagt feil slik at den definerer parallelle baner rader og kolonner i mellom slik at sykkelhjul setter seg fast/kan sette seg fast.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:29:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "e9f647bc275d991c1054c75dcc4d378267c9aee9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-325": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90615617, + "lng": 10.82024574 + }, + "type": "LatLng" + }, + "description": { + "value": "Har blitt farlig etter at sykkelmerkingen er fjernet. Det går nesten ikke en dag uten en farlig situasjon mellom bil og sykkel", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:32:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "a1612a3615c6bcf92c194757ebe68163fee4ebe7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-324": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92267828, + "lng": 10.75089454 + }, + "type": "LatLng" + }, + "description": { + "value": "Ofte parkerte biler i sykkelfelt, dette er et generelt problem. Slik parkering tvinger syklister ut i kjørebanen. Spesielt i tilfeller der biler kaster seg inn foran syklister kan dette være skummelt. I mange byer unngås problemet svært enkelt ved at det arrangeres høye kantsteiner mellom sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:32:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "6a843d8db56e3aacc3967dc5f8db7ed3ae929d21.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-323": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93180373, + "lng": 10.73556572 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er merkingen av sykkelfeltet blitt borte, etter at bilene \"kutter\" svingen ved å kjøre nærme kanten. har flere ganger blitt \"sneiet\" av biler som kjører tett på kanten i svingen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:30:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "0312ef7caefa50bebed4d4d77a20907550c58b59.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-358": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91132021, + "lng": 10.74842691 + }, + "type": "LatLng" + }, + "description": { + "value": "I Skippergata er det sykkelfelt begge veier, mens biltrafikken går bare en vei. Her er det mye arbeid på bygninger, slik at sykkelfeltene er sperret. Her møter jeg stadig på syklister i feil retning i sykkelfeltet, mopeder i sykkelfeltet, parkerte biler... Kryssningen med Karl Johan er også et fa", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:54:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "4136f7f14c94fd16a3e8cd741ea0493edc615900.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-357": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94603828, + "lng": 10.77630043 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele veien fra Storokrysset og forbi Storo Storsenter har sykkelfelt som ikke respekteres av bilister. Biler krysser feltet uten å se seg om, og stopper i feltet for å slippe av passasjerer. Jeg ser nestenulykker hver eneste dag. Spesielt senteret bør pålegges å endre kjøremønster inn og ut av sine", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:54:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "7022a9e3cb2261b77d641c08093ce31ef462fc6d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-356": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96830795, + "lng": 10.7661724 + }, + "type": "LatLng" + }, + "description": { + "value": "Stor bruk av Maridalen til løp, rulleski og sykkel. Mange bilister gjør svært tette og korte forbikjøringer, gjerne i svinger med motgående trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:54:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "cebc02125bce615fb0d8d5733b9dd393a7d56d97.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-355": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92896334, + "lng": 10.76932668 + }, + "type": "LatLng" + }, + "description": { + "value": "Må merkes som en rundkjøring for sykler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:53:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "e7b52d4e4fbe93b20909613778a5017dc7b2113b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-354": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91166445, + "lng": 10.72390079 + }, + "type": "LatLng" + }, + "description": { + "value": "Innkjøring forbudt i \"Park Sommerfryd\" mellom Ruseløkkveien og Munkedamsveien, selv om det er del av hovedsykkelveinettet!", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:53:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "9ed803f3005ae0bc486f41e2dd7f6a9e709f4ae7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-353": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91164832, + "lng": 10.8243978 + }, + "type": "LatLng" + }, + "description": { + "value": "Inn-/utkjøring fra gang- og sykkelbro over jernbanen er som regel blokkert av parkerte biler. Her er det parkering forbudt, men det håndheves åpenbart ikke.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:53:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "f7193c62c633efff32e3376290ca0cbfc75eb450.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-352": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9121533, + "lng": 10.75259929 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister sykler på fortau foran ventende passasjerer på bussholdeplassen. Det er ofte trengsel i rushtiden og da er det håpløst å sykle forbi. Jeg bare venter på at det skal skje en ulykke her. Enten ved at syklistene kjører ned noen, eller at noen skal blir presset ut i veien når bussen kommer i h", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:53:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "8e450d8d7c02155e7cc505ed913093ecc6ed3f0d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-351": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93620393, + "lng": 10.73325634 + }, + "type": "LatLng" + }, + "description": { + "value": "Her fins det ingen god løsning for syklister som skal rett fram og krysse Sognsveien. Dermed velger mange fortauet, hvor det er bussholdeplass og mye fotgjengertrafikk, og det oppstår farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:53:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "6932d6fe916de722345bb2e65827079166a75dd6.jpeg", + "type": "String" + } + } + }, + "aftenposten-350": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92842036, + "lng": 10.76831817 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei krysser gate. Ingen skilting Høye kantsteiner--> faremoment", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:52:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "d3cb0c329f8d6a87cf9cb37d25286f6b5bab888f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-349": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91099748, + "lng": 10.82539558 + }, + "type": "LatLng" + }, + "description": { + "value": "Innløpet til gang- og sykkelbro over jernbanen er \"alltid\" blokkert av parkerte biler som tilhører bilverkstedet på andre siden av gata. Kombinert med høy fart og manglende tilrettelegging i Jernbaneveien er dette farlig for både syklister og gående.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:52:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "51f7c299281a9fb5249a1b8c17321248b21abddb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-348": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92734514, + "lng": 10.765872 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei stopper opp. Ingen skilting eller klar regulering for hvordan syklist skal forholde seg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:51:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "27dc64930b1530bd7c99ed3859fc636491d7cb8c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-347": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94623172, + "lng": 10.70866584 + }, + "type": "LatLng" + }, + "description": { + "value": "Her mangler det sykkelfelt og man må enten ned vanlig vei til vinderen eller inn i boligstrøk for å komme seg mot smestad igjen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:50:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "8a5ffc6d2f70f7257ba30d52aef4cb2caa95389d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-346": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90710297, + "lng": 10.77527046 + }, + "type": "LatLng" + }, + "description": { + "value": "Var centimetere fra å kollidere med en møtende bil som svingte til venstre for å kjøre inn i en sidegate. Jeg kom syklende ned Schweigaards gate og hadde ganske høy fart. Bilføreren så meg antagelig ikke. Rask reaksjon og god håndtering av sykkelen hindret en kjempekrasj.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:50:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "7f20a59d173ca6857d94887a48ffa06e2791c998.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-345": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91760205, + "lng": 10.75475692 + }, + "type": "LatLng" + }, + "description": { + "value": "Kort tidsintervall med grønt lys når man sykler eller går i retning sentrum. Lang ventetid gjør at mange sykler på rødt og det oppstår farlige situasjoner daglig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:50:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "f9df114c06df48132a7813580788bfcbcea6289d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-344": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9096701, + "lng": 10.7418397 + }, + "type": "LatLng" + }, + "description": { + "value": "Alt for mange gående i sykkelfeltet på begge sider, slik at det i praksis er et utvidet fortau. Umulig å sykle uten ringeklokke, mye start og stopp. Merkelige overganger over kryssene, spesielt vestover.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:49:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "83a54211b968675e49661fd65592cf3c07f4fe29.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-343": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91446128, + "lng": 10.74703216 + }, + "type": "LatLng" + }, + "description": { + "value": "Siden hovedfartsåra for sykler, Torggata, er en enveiskjørt gate, havner mange syklister på vei til Grünerløkka eller Kiellands plass i Møllergata. Denne er enveiskjørt og relativt trang og uoversiktlig. Her har det oppstått mange farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:49:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "ef40cfed9bb1bab5ef80cdd41facb2f2040a754c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-342": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91162142, + "lng": 10.7236433 + }, + "type": "LatLng" + }, + "description": { + "value": "Gatekafe sperrer hele Ruseløkkveien. Tvinges til å sykle på et veldig trangt fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:49:22Z", + "type": "DateTime" + }, + "bilde": { + "value": "083da5ca8dceff230b7e5f239457e2a2.jpg", + "type": "String" + }, + "streetview": { + "value": "3c3a3921fb6052047cc5bb19e49d122a27c96719.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-341": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8862994, + "lng": 10.76756715 + }, + "type": "LatLng" + }, + "description": { + "value": "Føles utrygt å sykle når busser og trailere kjører i 60-70km/t uten fysisk skille mellom fortau og vei. Burde vært etablert skille slik som lenger syd langs Mosseveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:49:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "e7b4632f2a2abe4ea2517a8d7f80a62b5e6cb991.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-387": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90973881, + "lng": 10.75681686 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg sykler denne broen fordi det mangler sykkelvei inn til Oslo Sentrum Øst. Jernbanetorget har jeg sluttet å sykle, ikke trygt med alle menneskene, trikker og busser som får grønt lys med en gang de kommer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:05:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "41dad3ae9a1ccebab126f7b1d4f6ae87eafa98a6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-386": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90750374, + "lng": 10.78079044 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det buss-bom, og mange bilister vil snike seg gjennom sammen med bussen. I utgangspunktet ikke noe en syklist trenger å bry seg om... bortsett fra at de da venter på bussen i sykkelfeltet. Skaper unødig mange farlige situasjoner daglig!", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:05:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "9cae3c5651971a0b79861a3219d8db6b7fd88081.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-385": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87084704, + "lng": 10.79084873 + }, + "type": "LatLng" + }, + "description": { + "value": "Når biler som kommer sørfra og skal til venstre må vente på trikken, ønsker biler bakfra å bruke sykkelfeltet for å komme forbi. I sykkelfeltet kommer jeg på sykkel og bråbremser.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:05:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "cb9eec3580a446be5f72c0499015f0b1086d65b8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-384": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93126299, + "lng": 10.73245398 + }, + "type": "LatLng" + }, + "description": { + "value": "Hej! Vilken spännande undersökning. Problemet med hela Oslo är att det inte finns cykelbanor. Jag är en mycket försiktig cyklist men vägar som Theresesgata är livsfarliga. Ingen plasts för oss cyklister. Jag brukar cykeln till Högskolan i Nydalen flera dagar i veckan, denna rutt är väldigt farlig då", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:05:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "cc9459a02fb98c3dc4bf1965f6ec3a617a242e7b.jpeg", + "type": "String" + } + } + }, + "aftenposten-383": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94667231, + "lng": 10.76866149 + }, + "type": "LatLng" + }, + "description": { + "value": "Alltid biler og lastebiler i forbindelse med byggeplasser parkert i sykkelfeltene i Kr Aamots gate.I tillegg kjører mange biler alt for fort.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:04:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "0a8b64c4884bc57c80c0175fba80dc9d4427e382.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-382": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90960433, + "lng": 10.78993678 + }, + "type": "LatLng" + }, + "description": { + "value": "I utgangspunktet er Strømsveien veldig fin, men ved hver buss-stopp er asfalten i sykkelfeltet (og veien forøvrig) veldig sliten med mange humper og dumper.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:04:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "ede0f3e7753eb72b8111cec116938a9a4da963cb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-381": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90009815, + "lng": 10.75969219 + }, + "type": "LatLng" + }, + "description": { + "value": "Kongsveien er smal/uoversiktlig og mange bilister kjører for fort her, uten nødvendig hensyn til sykler og gangfelt ved Kongshavn vgs. Fortauet er til tider veldig smalt, og det er dessverre ikke trygt å sykle Kongsveien pr i dag, især oppover. Fram til det blir gjennomført en utbedring av denne str", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:04:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "34315435a8c0f3042a962373c0acb0779d975bac.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-379": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9179032, + "lng": 10.79904556 + }, + "type": "LatLng" + }, + "description": { + "value": "Manglende sykkelfelt vestover. Bilene presser seg forbi med svært liten margin til syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:03:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "4909fffa78e29e225d8f1da632fe074cb1a90ee7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-378": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95054069, + "lng": 10.75072288 + }, + "type": "LatLng" + }, + "description": { + "value": "Liten plass for sykler og mange biler, noe som gir farlige situasjoner", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:03:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "d19c48a3b2b6643cba692731c0b0715d532b9ce4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-377": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9097657, + "lng": 10.79447507 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kommer ofte biler som svinger av rett etter Vålerenga-tunnelen i meget høy fart inn i rundkjøringa. Føles utrygt når man kommer ned fra Etterstad.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:02:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "c1b1048f9df97bc94b73ee9a2a12aaee80f8b3bc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-376": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9210544, + "lng": 10.64772605 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister stopper i sykkelfeltet før de svinger ut i veien. Har sett flere nestenulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:02:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "aa17a8773fe3bb1298700a2d649ca57bd07fb94f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-375": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.83496127, + "lng": 10.84144592 + }, + "type": "LatLng" + }, + "description": { + "value": "Håpløse forhold for gående og syklister i forbindelse med langvarig veiarbeid. Mørklagte midlertidige gangfelt og absolutt ingen bilister som respekterer nedsatt fartsgrense.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:01:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "26732640586fa9085082bd49fe1ff3031e8f5eb8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-374": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9120033, + "lng": 10.7523803 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler ofte trikkesporet i Schweigaardsdagate for det føles tryggere en bilveien, men hva hjelper det da man MØTER BIL som i tillegg kjører på venstre side i trikkesporet!", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:01:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "d542165b9ad5d0943afbec699552bc5437004911.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-373": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91628984, + "lng": 10.78544139 + }, + "type": "LatLng" + }, + "description": { + "value": "Skulle ønske det var tilrettelagt for å svinge inn på sykkelstien. Nå må jeg ofte gå av sykkel og trille over gangfelt", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:00:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "4dbf647b5c58ce728244b345a7c2895316024a3e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-391": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9404121, + "lng": 10.7287234 + }, + "type": "LatLng" + }, + "description": { + "value": "Dekket i trikkeskinnene og slo knærne såpass at jeg ikke kunne reise meg for egen maskin. Utålmodig trikkefører tutet gjentatte ganger for å få meg ut av sporet istedenfor å sjekke hvordan det gikk med meg. Jeg fikk heldigvis hjelp av forbipasserende som halte meg ut av veien og fikk meg til legevak", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:06:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "ede693c705f30241c8f56d848c74db3873b50601.jpeg", + "type": "String" + } + } + }, + "aftenposten-390": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95380966, + "lng": 10.86711466 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig kryss i bunnen av en bratt bakke, trærne gir dårlig/ingen sikt for de som kommer på sykkelveien nordfra, og det er ikke åpenbart for alle som ikke er godt kjent at de faktisk krysser en bilvei. Jeg har sett flere eksempler på nestenulykker her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:06:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "15a9ac9f375aa900086d7a9acc186b561330fc3a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-389": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91311668, + "lng": 10.76047539 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har jeg blitt påkjørt av biler som krysser sykkelfelt for å parkere på innsiden. Generelt farlig sykkelvei pga svært mange personbiler, drosjer og lastebiler som stanser i sykkelfeltet gjennom hele Grønlandsleiret.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:06:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "08d8376cce60a8e486cb2f1950ba95f958f4673a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-395": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92472146, + "lng": 10.70832252 + }, + "type": "LatLng" + }, + "description": { + "value": "På grunn av trikkestoppet, er veien her smalere. Dette går utover sykkelstien (hvis maling er slitt bort). Har flere ganger vært farlig nære bilister, da det virker ut som om sykkelfeltet bare forsvinner for en periode.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:09:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "c7b37add50a4375af2d0ede6df87a3fcaa00b72a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-394": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92157061, + "lng": 10.74164628 + }, + "type": "LatLng" + }, + "description": { + "value": "Ofte varelevering på Rimi med både varer og mennesker i sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:08:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "5f5a25db5a656ceb25ef98cbb508778d88d5d1e8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-398": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91369755, + "lng": 10.7568705 + }, + "type": "LatLng" + }, + "description": { + "value": "Motgående biler har flere ganger brutt vikeplikten og svingt inn Christian Krogsgate inn foran meg og andre syklister som skal rett fram. For øvrig problemer med biler som skal fra Grønlandsleiret og inn i samme gate og svinger uten inn foran syklister uten å bruke blinklys.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:10:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "ccfa2f74c2eda17c48581b291dda402b88510936.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-397": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91824737, + "lng": 10.74385643 + }, + "type": "LatLng" + }, + "description": { + "value": "Står stadig vekk i fare på å bli påkjørt av biler som kjører opp fra Edderkoppen uten å sjekke for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:10:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "e2579e494e10c1727d2d862f8928884e2c543f73.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-396": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91097059, + "lng": 10.73277354 + }, + "type": "LatLng" + }, + "description": { + "value": "Her burde det være et eget sykkelfelt over plassen. Her er det alt for mye mennesker som skal krysse plassen, samt omtrent all sykkeltrafikk fra øst-vest og motsatt. Kunne vært anbefalt med opphøyd sykkelbane så fotgjengere med headset osv. må være våkne ved kryssing av felt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:09:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "4839c286f98c5ba86568b087cb665646af3955c3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-406": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90809816, + "lng": 10.77878952 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg har ofte problemer med biler som ikke respekterer syklister i denne rundkjøringen. Jeg har flere ganger nesten kollidert med biler på vei inn i rundkjøring mens jeg er på vei ut.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:13:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "8e044944cf1e9f46dba1dc8e031e0416422e1381.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-405": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91379436, + "lng": 10.68210124 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien/fortauet forsvinner på deler av strekningen slik at syklister må sykle i veibanen. Det er forøvrig mange turgåere her og det er trangt om plassen slik at syklister sjeldent sykler på fortauet som egentlig er en sykkelvei og turvei for gående. På strekningen er det 50-60km/t fartsgrense o", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:12:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "5ad034e1cc057e3c3631b5ee2dd24dd1e0f962ab.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-404": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92499029, + "lng": 10.64701795 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står det en bom i sykkelstien som skal hindre bilister å misbruke sykkelveien. Problemet er at bommen er så bred at jeg føler jeg må velge mellom fortauskant eller bom i siden. Sykler forbi med hjertet i halsen hver gang.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:12:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "e7cbbc610424ff12b474dd8457b0d5bdf2ea562f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-403": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92472146, + "lng": 10.7272911 + }, + "type": "LatLng" + }, + "description": { + "value": "Kanskje Oslos værste vei og sykle på? Ikke lang, kanskje 30 - 40 meter, men Herre så dårlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:12:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "354aa24730e68c5342e55708c60c2f99a54436ea.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-410": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91508246, + "lng": 10.76026618 + }, + "type": "LatLng" + }, + "description": { + "value": "I denne rundkjøringen er det farlig å være syklist. Biler på vei inn i rundkjøringen har vikeplikt, men respekterer ikke syklister. Flere ganger har jeg måtte bremse for ikke å kollidere med biler på vei inn i rundkjøringen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:14:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "feb960c1a51da5688064c57d1ce312fb5528e97f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-409": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92031233, + "lng": 10.75123786 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussen legger seg ut i veien uten å blinke og det er ikke så lett for en syklist å flytte seg like fort som en bil.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:14:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "91cfb0d17ff1377c091ff85fc2cba520715603b7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-408": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93287679, + "lng": 10.7420969 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg har opplevd busser som i stedet for å bremse ned litt tidligere og legge seg bak syklisten, som allerede er inne på holdeplassen, gir full gass, kjører forbi syklisten og bråbremser 30 meter etter holdeplassen og sperrer veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:14:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "eb52730a9e7c86bb0521773ed944a86840f68adb.jpeg", + "type": "String" + } + } + }, + "aftenposten-407": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91613926, + "lng": 10.74456453 + }, + "type": "LatLng" + }, + "description": { + "value": "Selv om det er mulig for syklister å fortsette inn til Akersgata så lenge man svinger gjennom betongblokkene, er det ikke merket - noe som gjør at mange syklister stopper litt før og går av sykkelen for å gå inn på fortauet. Også et typisk sted for taxisjafører å stoppe. Plutselig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:14:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "70e0201beb184adf29c0e087680ee3250318c8df.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-413": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9464144, + "lng": 10.72269916 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig fotgjengerfelt på G/S langs Ring 3. Nå blitt enda mer utsatt med nybygd vei mellom trimveien og Gaustadadalleen som vil 10-doble trafikken, minst. Eksempel på nytt veiprosjekt der syklister og fotgjengere er glemt", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:16:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "ecd09be609c5a86714e1557f7bb1bec82103789d.jpeg", + "type": "String" + } + } + }, + "aftenposten-412": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93487096, + "lng": 10.74412465 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet blir borte for å gjøre plass til to kjørefelt i krysset. En vanskelig og farlig løsning.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:16:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "f6efca86e3dcdeb3f8431639a3e9bab4ecfab544.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-414": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92048441, + "lng": 10.74267625 + }, + "type": "LatLng" + }, + "description": { + "value": "En helt håpløs plass for varelevering, der det 90% av tiden står en bil, der sykkelveien plutselig stopper og tvinger syklister ut i trafikken. Flytt vareleveringen enten ti meter opp der man kan kjøre inn, eller femten meter ned der man kan gjøre det samme.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:16:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "726e2771a904c76ac18113db9773374d0e5c50b2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-421": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91295532, + "lng": 10.75183868 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvis man skal ligge i veiskuldra på vei mot Grønland sykler man rett over noen sluk med tilgrensende hull i asfalten, og kan risikere å punktkere, i verste fall falle over styret, om man har for høy (dvs helt ordinær ca 15 km t) fart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:21:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "b1fa3957dc322d730f4d532e0382bd2d4dcedc0f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-420": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92538815, + "lng": 10.75014352 + }, + "type": "LatLng" + }, + "description": { + "value": "\"T\" krysset i Uelandsgate mellom AHO og A Kiellandsplass. Midtdeleren ved overgangsfeltet får en del biler til å trekke mot høyre. Jeg har kjent sidespeil streife venstre armen min mange ganger der.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:19:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "2f22f92e268d2789aaa5899e7c571eefefbb1bcc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-438": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9082434, + "lng": 10.75291156 + }, + "type": "LatLng" + }, + "description": { + "value": "Turistbusser stopper og slipper passasjerene rett ut i sykkelveien. Det er bare et spørsmål om tid før noen blir skadet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:26:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "bb314b9b6aefc8c99cb6f5da24c1cb956c483072.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-437": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.922603, + "lng": 10.70520311 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjengerfelt markert med steinheller. Steinhellene er i dårlig forfatning og det har oppstått hull og langsgående kanter som kan velte en syklist som sykler i veibanen. Sikreste måten å passere gangfeltet på med sykkel er å sykle på diagonalen, noe som forvirrer bilene bak", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:26:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "f224fb6b183c7a662ca5e527eccca6987fe8def3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-436": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9320006, + "lng": 10.72335362 + }, + "type": "LatLng" + }, + "description": { + "value": "Ekstremt smalt sykkelfelt, 80-90 cm. Bussen ligger ofte med hjulet på den hvite stripen. En liten feilberegning, isflekk eller løs sand og dødsulykken er et faktum.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:25:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "ee20904a3a2a407982dca20ed78eff5df4ad10f6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-435": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92820532, + "lng": 10.74960708 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt stopper før rundkjøringen på Alexander Kiellands Plass.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:25:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "8e8704184993b086675cda3eb1c18177d5f0bcd8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-434": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91805378, + "lng": 10.66416263 + }, + "type": "LatLng" + }, + "description": { + "value": "Lastebil stod stille i innkjørselen til marina, da jeg kom langs sykkelvei rygget han plutselig ut i sykkelbanen, dette medførte at jeg traff bilen i siden. Heldigvis lav fart og ingen personskade, bilen fikk seg en kraftig bulk", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:25:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "90ecb3d22217e0211b4a865bda51e16ab7a815b0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-433": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93188234, + "lng": 10.74926376 + }, + "type": "LatLng" + }, + "description": { + "value": "Styret mitt ble truffet av speilet på en forbipasserende bil her, mistet deretter kontrollen og landet på en dame som var gående, hun ble fraktet med ambulanse. bilen kjørte videre men ble senere funnet av politiet. Sykklen min fikk en", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:24:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "c41257a5f5d3a104516a09656d22edc40f5df558.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-432": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90572579, + "lng": 10.60704231 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktelig, manglende sykkelsti, bilister hissige på forbikjøring. Skaper unødvendige farlige situasjoner", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:24:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "991ab16181e52742b853589add28a384482b776e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-431": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91607472, + "lng": 10.75934886 + }, + "type": "LatLng" + }, + "description": { + "value": "Det burde helt klart vært tilrettelagt for sykling mot enveiskjøring bak legevakten i Cr. Krogsgate, og fortsatt tilrettelagt for sykkel begge veier ned mot Vaterland. Eneste alternative sykkelvei mot sentrum er Torggata (som forresten har vært helt kaos i halvannet år fram til nå), Storgata er umul", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:24:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "4e8fb59f7d31dd7767a13da14f5b310f19d9d5ba.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-430": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93790231, + "lng": 10.74986457 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt slutter før rundkjøring. Hvis man fortsetter rett frem risikerer man å havne i blindsonen til biler som skal til høyre i rundkjøringen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:24:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "f4cf47227f01cb1d1723e614e0a7cc4dadbed3e1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-429": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9120302, + "lng": 10.76597929 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil svingte inn i sykkelfeltet og sneiet forhjulet mitt da han skulle svinge inn til høyre i Platous gate.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:23:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "3c260ebee7bcf71ab92223c98ab88ea9d0af91a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-454": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91224266, + "lng": 10.80590128 + }, + "type": "LatLng" + }, + "description": { + "value": "Her var det brått slutt på sykkelfeltet for de som kommer fra Brynseng, gitt. Trist for de som skal videre mot Helsfyr, Carl Berner eller resten av Oslo. Mange hissige bilister som vil komme først til det røde lyset før brua. At denne pendlerruta ikke er tilrettelagt for syklister er meg en gåte.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:33:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "d20ec91e703829cb29228132b44e8529403a8089.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-453": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92314204, + "lng": 10.70219099 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet opphører i krysset pga. small veibane. det er ikke noe forvarsel om dette (skilt) slik at bilister eller syklister kan forberede flettingen av bil og sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:32:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "70e97291af254357f5ef4542627def4106a850ec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-452": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92284765, + "lng": 10.70349991 + }, + "type": "LatLng" + }, + "description": { + "value": "Hva er greia med trafikklyset her (inn mot rundkjøringen) Halvparten av bilene overholder ikke det røde lyset. Og gjelder det syklister (det er ikke noen hvit stopp-linje i sykkelfeltet)?", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:31:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "097e22c7f972385dace88382a178de7b1210c054.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-451": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91288002, + "lng": 10.76123714 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene respekterer ikke sykkelfeltene i denne gaten, står ofte parkert i sykkelfeltet og svinger inn eller ut fra parkering uten å sjekke om det kommer en syklist. Norske veimyndigheter sier det er lagt opp til bilparkering mellom sykkelfelt og fortau fordi det er sikrere å ikke føle seg trygg. Men", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:30:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "f153470f1635b7877e5e1857d644e310a630ae1a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-461": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91286927, + "lng": 10.82204818 + }, + "type": "LatLng" + }, + "description": { + "value": "Umulig å komme fra Tvetenveien inn på den dårlig merkede gang og sykkelveien uten å stoppe og løfte sykkelen over kantstein. Fort gjort å ende opp på tungt trafikkert vei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:37:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "3495174c45327337471f40e97704692ab128ba3e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-460": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92171041, + "lng": 10.68012714 + }, + "type": "LatLng" + }, + "description": { + "value": "Koblingen av E18 og Ring 2 fungerer ikke. virrvarr av små stubber og halvløsninger på skøyen", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:37:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "3d4f3e4564aa24c3a629b1eee046739582c65f4c.jpeg", + "type": "String" + } + } + }, + "aftenposten-470": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92815963, + "lng": 10.75024008 + }, + "type": "LatLng" + }, + "description": { + "value": "Står som nummer 3 i kø ved krysset. Varebil kjører med vilje på sykkel og skyver den fremover. Roper \"kom deg til helvete opp på fortauet der du hører hjemme\"", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:42:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "d3d58300ef0802fa8f8d81dcd9d6910b72a1bd8e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-469": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92472146, + "lng": 10.77552795 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står det ofte biler parkert midt i sykkelfeltet. Pass på!", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:42:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "ae51cdf16a4aecce1f7bb3e2fa45a8dd7226452c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-468": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93622543, + "lng": 10.73199033 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kommer nedover sognsveien stopper plutselig sykkelfeltet ved krysset, og det er igen enkelt måte og komme seg opp på fortauet annetenn gå av sykkelen midt i veien og løfte den opp på fortauet. Veien er også såpass trafikkert av biler, og smal at det føles utrygt å sykle ned her. Biler komme", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:42:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "5547254e183c5130153f409339480f09002c4b51.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-467": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91340712, + "lng": 10.84288358 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler man østover opp bakken og skal mot Haugerud, opplever man til tider biler som prøver å smette forbi i stor fart opp til krysset. Den beste løsninga hadde nok vært å lage sykkelvei som ikkegikk gjennom krysset, men langs Tveita senter og bort Nåkkves vei og så opp mot rundkjøringa i Haugerudve", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:42:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "27edc57aa6c5d0e8a7827f57ae3dd826fe2a7b72.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-466": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93330143, + "lng": 10.74952125 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvorfor er det ikke sykkelfelt her? Veibanen må da være bred nok til dette uten større arbeider?", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:42:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "0c0b5eda0d1b249c9c0447a216d449cfa7d756ab.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-465": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94314739, + "lng": 10.74840545 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen biler overholder vikeplikten for syklister som skal ut på Uelandsgate her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:41:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "c072eeaae32f564d0c2acb2d7dc3bfbd62a968f9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-473": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9242268, + "lng": 10.81110477 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti og fortau mangler totalt på denne strekken..", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:44:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "d69feec228f38ec4893e32c3bd816e9601a14aa2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-485": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92148592, + "lng": 10.67894965 + }, + "type": "LatLng" + }, + "description": { + "value": "Det står ALLTID biler parkert i sykkelfeltet i denne gaten. Tydelig at det ikke er etablert nok parkeringslommer for korte stopp.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:50:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "c800e11c34398573c25439c403823d1c75fafcd9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-498": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92891495, + "lng": 10.76913356 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved regnvær samler det seg mye vann her. Dammen kan bli ca. 40 cm dyp og så stor at det ikke er mulig å sykle rundt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:56:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "371e8c1961ddbce0962a9aacd16e987bb5d3917a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-497": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95242905, + "lng": 10.75128078 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet slutter, og man kastes ut i område med bussholdeplass og skolebarn. Fotgjengerfelt krysser alltid med en viss uro.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:55:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "9b386beb90a04cfee96b25291df2e257c8f9a95f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-496": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90962047, + "lng": 10.71467399 + }, + "type": "LatLng" + }, + "description": { + "value": "Skalledeler: gjerdet som er satt opp i gang- og sykkelveikrysset har skarp kant som vil fungere som en skalledeler dersom en syklist kjører inn i det", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:55:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "972aed3101877f8cc66bceb153280fb9ee2a863b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-495": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94269601, + "lng": 10.78458309 + }, + "type": "LatLng" + }, + "description": { + "value": "Flott sykkelvei fra sinsen til Skeidbanen (med all aktiviteten der) kun avbrutt av parkeringsplassen til Rema 1000. Her må man ut i veien, og det er samme sted som det er en kryssende vei og innsnevret fotgjengerovergang. Fjern 4 parkeringsplasser og få sammenhengende sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:55:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "3f0a7798631381e7c7ba9a6c149ccc88a2953f83.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-494": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94480243, + "lng": 10.77709436 + }, + "type": "LatLng" + }, + "description": { + "value": "Katastrofalt dårlig veidekke - lapp på lapp i mange lag, dype hull rundt trikkeskinner, ubrukelig kantfelt mellom trikkeskinner og fortau, og humpete fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:55:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "baa091d3bec3e6ef5a8c9aa9fae97fca66084c3f.jpeg", + "type": "String" + } + } + }, + "aftenposten-493": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92573493, + "lng": 10.73083698 + }, + "type": "LatLng" + }, + "description": { + "value": "Alt for smalt i hele Theresesgate mellom trikkeskinne og veikant/blomsterpotter/granittblokker(!). Havnet med forhjulet i trikkesporet og lå langflat. Bilister hadde heldigvis kjapp reaksjonsevne og klarte å stoppe, ellers kunne det gått mye verre. Slapp med skrubbsår. Hvis fjerning av parkeringspla", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:53:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "48beea7a48460c76218d536aebc172ffce4b4151.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-492": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93526333, + "lng": 10.74439287 + }, + "type": "LatLng" + }, + "description": { + "value": "Skal du til venstre å sykle igjennom Folkehelseinstituttet rett etter krysset er det farlig pga ikke tilrettelagt for venstresving.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:52:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "bcfeef4bacba772f1d3ade637aba0e528f5074b4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-512": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92769191, + "lng": 10.73202252 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikker kjører sykt fort i thereses gate om dagen - gjør det ekkelt og utrygt å sykle her nå.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:04:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "a3794972b748a54b6b829fdd3e9779f1652d6995.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-511": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91408479, + "lng": 10.64656734 + }, + "type": "LatLng" + }, + "description": { + "value": "Brå sving i nedoverbakke som ender i ett fotgjengerfelt. Sykkelveien burde hatt prioritet. Tydelige vikepliktskilt eller stoppskilt på den kryssende veien hadde vært en god løsning. I tilleg burde brostein i sykkelveien vært fjernet, denne er veldig ubehagelig og farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:04:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "9958b167837faf75737f0d902683572f64d2ab2d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-510": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92222123, + "lng": 10.73157727 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkeskinner gjør at syklister må sykle langt ute i vet - billister irriteres og presser. Og mange trikke skinner gjør det ekkelt å sykle her", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:03:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d489a33734452ed18d495e085662f1fc4a6f320.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-509": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92632365, + "lng": 10.77649354 + }, + "type": "LatLng" + }, + "description": { + "value": "Om man klarer å tvinge seg gjennom firkantkrysset og skal nordover har man ingen andre val enn å kjøre i en trang betongkulvert. Fortauet går opp en trapp, så det er ikke et alternativ. Utrivelig, og svært vanskelig å unngå selv om man prøver.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:03:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "96f10bf08876a84076096afb5462dfe25cf160d4.jpeg", + "type": "String" + } + } + }, + "aftenposten-508": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92388269, + "lng": 10.70727109 + }, + "type": "LatLng" + }, + "description": { + "value": "Trafikk ut fra Gyldenløves gate (biler og syklister) overholder ikke vikeplikten. De fleste syklistene ser seg ikke til venstre i det hele tatt, bare antar at sykkelfeltet er klart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:03:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "5f6eb716b9f0dce6f00f0a8ed1da516d3a16f384.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-507": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90551061, + "lng": 10.74452161 + }, + "type": "LatLng" + }, + "description": { + "value": "Hyppige brudd på trafikkregler ved at bilister krysser dobbel heltrukken linje for å kjøre forbi syklister mellom rundkjøringene. http://youtu.be/T-hsSc3ysgo?", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:03:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "a97d0f5b3f21e58eabead9b785bd137405a8b4a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-506": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93859024, + "lng": 10.68733692 + }, + "type": "LatLng" + }, + "description": { + "value": "Skiltstolpe midt i gang- og sykkelveg. Burde vært flyttet og bygget om til sykkelveg med fortau. Her er det plass til dette.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:01:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d326de428e9fe948ac5f14b7ff2a19714fb9794.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-505": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91059407, + "lng": 10.72929739 + }, + "type": "LatLng" + }, + "description": { + "value": "Har sett og vært innblandet i nestenulykker her flere ganger. Både trikk, fotgjengere og syklister mikses inn i en herlig blanding der alle kommer fra ulike retninger.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:01:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "2971335c929e3e5afb7779bc0758b964fa5e6672.jpeg", + "type": "String" + } + } + }, + "aftenposten-504": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92433434, + "lng": 10.73992967 + }, + "type": "LatLng" + }, + "description": { + "value": "trangt for syklister ved bussstopp. og bussene presser syklistene ut av vegen", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:01:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "57b933ae7ec41e7ea6b9648861cabd3a679badf1.jpeg", + "type": "String" + } + } + }, + "aftenposten-503": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90144328, + "lng": 10.76552867 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt fortau og trafikkert bilvei med en del lastebiler som kommer tett på i Kongsveien. Farlige situasjoner for syklister så og si daglig på vei oppover, særlig ved passeringer. Kan bare krysse fingrene for at ingen mister balansen og faller - da blir det rett på bilveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:00:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "6363a4daad20ebf3f1f97dcd354bc30c50c2b132.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-502": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93879446, + "lng": 10.68760514 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset ved Munkengveien er uoversiktlig og svingen her er skarp. Burde vært rettet ut, og egne lys for syklister burde være satt inn.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:00:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "e42c5e4d519ca011c03d55f6cd866c004e4f5cec.jpeg", + "type": "String" + } + } + }, + "aftenposten-501": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92114043, + "lng": 10.68966507 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil svingte opp Madserud alle fra Drammensveien. Overholdt ikke vikeplikten for sykkelfeltet. Bilen hadde 50 meter oppi veien gjort en stor innsats for å kjøre forbi meg, så sjåføren må ha hatt gullfiskminne. Bil stakk av etter sammenstøtet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:59:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "f164e9add33af56d84fc7ec8ae0cbb8aaaf27b98.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-500": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90568276, + "lng": 10.76737403 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært trangt i krysset Oslogate/Bispegata. Ingen sykkelfelt i Oslogate og blanding trikk/bilar. Fikk bildør i fleisen frå bil somsto og venta på grønt. På passasjersida.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:58:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "0c30a8b585e89d1a063c178c4f8b279fc2219b23.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-518": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93291441, + "lng": 10.7493925 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien stopper rett før lyskrysset rett nedenfor avkjøringen. Nesten hver eneste dag opplever jeg nestenulykker her ved at biler som skal til høyre i Collets gate ikke tar hensyn (de må krysse den sykkelfila som forsvant)", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:07:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "2ac603e9b870f88ac5b2fb1ea93e4005acd71e1d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-517": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93734873, + "lng": 10.6838715 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig undergang der sykelister ofte kommer i stor fart rundt hjørnet", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:07:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "e6314243db084d125c7152345e3c85aa746d69ae.jpeg", + "type": "String" + } + } + }, + "aftenposten-516": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94110535, + "lng": 10.77110767 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummelt å kjøre over trikkesporene, da asfalten rundt er helt slitt bort.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:06:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "204145a1f15dbad0ee2cc7e1f387c7f0cedd4d8b.jpeg", + "type": "String" + } + } + }, + "aftenposten-515": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91907015, + "lng": 10.74354529 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykla i sykkelfeltet langs Ullevålsveien ned mot sentrum, da en bil i motgående kjørefelt plutselig svingte inn i Nordahl Brunsgate uten å overholde vikeplikten. Resulterte i hjernerystelse, nakkeskade og kronisk hodepine. Selv nå 9 år etter.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:06:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "d89a9d4c3971705f2a356e41952a3de4645af375.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-523": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92106515, + "lng": 10.75449943 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom ned Møllerveien og over brua på sykkel. Bil kom ut fra Nedre gate men måtte stanse på grunn av vikeplikt for biler fra høyre i Nordre gate. Mens bilføreren ventet på at det skulle bli klart, rullet han et stykke ut i veien, slik at han blokkerte passasjen for meg. Jeg ble samtidig forbikjørt av", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:11:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "3742c80f6486b3db1fd377db9dda429624bb2355.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-522": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92205454, + "lng": 10.75059413 + }, + "type": "LatLng" + }, + "description": { + "value": "Innsnevring av vei i kryssene medfører farlige situasjoner da biler ikke tar hensyn til syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:10:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "91f359d7bb058128ae9b1868304966a9c2ef05e2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-521": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92495803, + "lng": 10.73085308 + }, + "type": "LatLng" + }, + "description": { + "value": "Bor på Ullevål og går på Høgskolen i Oslo og Akershus, ved Pilestedet. Å sykle til skolen går helt fint, fram til Adamstuen. Å sykle ned Thereses gate er uforsvarlig. Derfor må jeg ta trikk eller gå. Takk for meg!", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:09:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b08c83292e17369014fc62faa3c6c25d16d5245.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-520": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93870847, + "lng": 10.75010061 + }, + "type": "LatLng" + }, + "description": { + "value": "Innsnevring av veibane i kryss medfører til stadighet farlige situasjoner i og med at ikke alle biler tar hensyn til syklister", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:09:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "f037f9c0c40486d1e0157bccfe1de7d760448371.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-519": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93003313, + "lng": 10.74917793 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien ligger langs en to-felts vei hvor det kjøres veldig fort. Dette kombinert med at særlig yrkessjåfører ikke holder tilstrekkelig avstand er veldig skummelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:08:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "6ada4f015c2dee2f1e0cb16abed45d0b3e8a5793.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570499370879229950": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.919447, + "lng": 10.701113 + }, + "type": "LatLng" + }, + "author": { + "value": "Emily Victoria", + "type": "String" + }, + "description": { + "value": "@jizziemcguire @edwarddroste this mini pig is almost as cute as you http://t.co/t8NtcSD9Lg", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:23:44Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rSJbaWkAAHiBl.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/505345041158897664/pHU0gz6S_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "3071f0ade2acc5a046dd5846d07b70a70a973f56.jpeg", + "type": "String" + } + } + }, + "aftenposten-525": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91293381, + "lng": 10.73475837 + }, + "type": "LatLng" + }, + "description": { + "value": "«Innkjøring forbudt»-skilt (302) her når man kommer sørfra og skal nordover. Må minst byttes ut med «forbudt for motorvogn» (306.1).", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:11:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "08ba692aa39a53e80edfb94ea5d24c64ae058d96.jpeg", + "type": "String" + } + } + }, + "aftenposten-527": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91155688, + "lng": 10.73415756 + }, + "type": "LatLng" + }, + "description": { + "value": "«Innkjøring forbudt»-skilt (302) her når man kommer sørfra og skal nordover. Må minst byttes ut med «forbudt for motorvogn» (306.1).", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:12:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "85b0430509a079a4d91498e2038d7f246056df17.jpeg", + "type": "String" + } + } + }, + "aftenposten-526": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94526454, + "lng": 10.89946746 + }, + "type": "LatLng" + }, + "description": { + "value": "Bom stenger veien på en slik måte at bevegelsen fremover begrenses hardt og en må passere trafikk/inn ut av veibane", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:11:51Z", + "type": "DateTime" + } + } + }, + "aftenposten-532": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9176612, + "lng": 10.68755686 + }, + "type": "LatLng" + }, + "description": { + "value": "Uklar vikeplikt mellom syklister i krysset. E18 hovedsykkelveien burde vært prioritert med avjørsel for sykkelvei til bygdøy. Fortau for fotgjengere hadde vært en fordel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:15:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "14d8718ebd2bc3a813b246b09b546b09ec293d55.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-538": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91274556, + "lng": 10.63906788 + }, + "type": "LatLng" + }, + "description": { + "value": "Når jeg kommer fra Fornebu er eneste løsning å krysse bilveien på skrå, altså hoppe ned fra fortauet, for å slippe å stoppe helt opp før man krysser veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:20:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "b576149bb74c90ba9537429249904a9db2715e86.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-537": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92772685, + "lng": 10.93562364 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktelig om en sykler på sykkelveien nordover langs gamleveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:17:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "ba3278316a87580eb7e26cd09cff273446fbede7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-536": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93204898, + "lng": 10.93454003 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig spesielt for syklister som sykler nordover da de kan ha fart og veien kan være uoversiktelig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:16:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "e9e005f561f09e4e059762d57b17684ace1bcfd1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-539": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93628724, + "lng": 10.68060725 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt midt i veien, med biler som vrenger over sykkelfeltet for å kjøre opp mot Smestadkrysset. Majoriteten av bilene skal krysse sykkelfeltet. Stadig kø med biler som det ikke er mulig å komme gjennom da de står på tvers av sykkelfeltet. Andre biler følger ikke med i blindsonen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:21:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "3349a1f8637b5bbcb4cad48603ece370570203af.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570503251638018050": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "Everyone seems to think that shooting ppl through the head with CGI bloodspatter is cool. #PowerRangers What? http://t.co/06bC3CvT5B", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:39:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "aftenposten-541": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92840961, + "lng": 10.70800065 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen god løsning her, der syklister kommer fra Frognerparken ledes inn på «innsiden» av lyskrysset fra Essendrops gate og kommer i konflikt med gående som krysser Middelthuns gate eller venter på grønn mann. Her må man bestemme seg om man ønsker segregering eller ikke, og male opp sykkelsymboler og", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:21:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "50a13182341e79827d3c5eefa3642065e147dda7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-543": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91017585, + "lng": 10.7094115 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien slutter brått og man må kjøre i motsatt kjørefelt der hvor vogntogene kommer fra Filipstad for å komme opp på sykkelveien i gjen når man kommer fra Skøyen", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:23:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "6056347b05a3e6951035bff8ddf5acd2564db5ca.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-542": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91005079, + "lng": 10.71034491 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussholdeplass i sykkelveien. Ofte trangt med mange fotgjengere på denne strekningen. Fortau hadde vært en fordel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:22:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "37304072d3e01d3db5e88e1e12ed6a8aa58c554b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-552": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95479002, + "lng": 10.76115667 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler ned Maridalsveien har vikeplikt for biler som kommer ut Korsvollbakken. Men utkjørslen er svært uoversiktlig, og biler må kjøre langt fram for å være sikker på at det ikke kommer trafikk ned Maridalsveien som er mye mer trafikkert. Sykler som kommer ned Maridalsveien kommer ofte ganske fort, o", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:31:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "6b57e9f1f0052d2edac204efe691800b65547ee2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-551": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91095445, + "lng": 10.77724456 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkeringsplasser innenfor sykkelfeltet. Har opplevd en rekke ganger at når bilisten skal kjøre ut fra parkeringsplassene, så \"glemmer\" de å se etter syklister og å bruke blinklys. Jeg har begynt å kjøre over Kampen istedenfor...", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:30:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "13847abbb08380a1c18565acfb964d02c5368b12.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-550": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91079308, + "lng": 10.73596 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien går gjennom en trikkeholdeplass. Dette er veldig dårig planlagt sykkelvei. Farlig og uframkommelig når det er mange som venter på trikken.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:29:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "b81c831583b613fcad3a106728c80d479df0e203.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-549": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94346981, + "lng": 10.70081233 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelvei langs ring 3 mot Gaustad", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:27:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "2c2c80db00fe60d2954c6e2d66a6e97d20d1935c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-547": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93329068, + "lng": 10.77793121 + }, + "type": "LatLng" + }, + "description": { + "value": "Så en syklist krasje med en som kjørte longboard her. Vanskelig å si hvem sin feil det var, men om man sykler på stien på vei nedover så kan det fort oppstå ulykker i krysset her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:27:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "ff2472eb83759f48ab79018303912681cf0856bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-554": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93762284, + "lng": 10.73057413 + }, + "type": "LatLng" + }, + "description": { + "value": "Ny fartsdemper på Sognsveien oppover fra ring 2, ved Ullevålsalleen er en fare for sykkeltrafikk.\nDet er en ny fartsdemper på Sognsveien. Den er byget slik at sykklister kan ikke pasere den trygt. Heller ikke er det ivaretatt sykkelveien som er merket nedover. Demperen skaper farlige situasjoner si", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:35:23Z", + "type": "DateTime" + }, + "bilde": { + "value": "b12c5715612f11f1a23c0632283466b3.jpg", + "type": "String" + }, + "streetview": { + "value": "99cfecce2b7cf15253348a096701ec323c217a9e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-553": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89487855, + "lng": 10.80505371 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kommer opp undergangen og skal videre ned enebakkvenein er det veldig rotete, ingen mulighet til å krysse veien og komme seg på riktig side og ikke noe sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:32:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "f36a5b0261daae8349eb5498b0f4d092db6c7af5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570498645029732350": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "QuEen Hhh", + "type": "String" + }, + "description": { + "value": "It brings God much joy when you come to Him like a little child, and depend on Him for His grace.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:20:50Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569937249806995456/N5ybUTwZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "7C0EB3", + "type": "String" + } + } + }, + "aftenposten-562": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92794727, + "lng": 10.80964565 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke lys i undergangen. Syklister fra Risløkka,får stor fart og det er gående som kommer fra banen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:44:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "a41619d7e8f7b77c6b093bef05e06a05d8ac1378.jpeg", + "type": "String" + } + } + }, + "aftenposten-561": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91718795, + "lng": 10.75360894 + }, + "type": "LatLng" + }, + "description": { + "value": "Torggata er nå full med biler og fotgjengere, det er knapt mulig å sykkle gjennom uten avbrudd. Gaten bør stenges for biltrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:43:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "4104af771256f15a04f14cf0f15d48b7845c46f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-560": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91095983, + "lng": 10.73005914 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen trase for sykkel. Når nesoddbåten kommer går sykkelveien gjennom ett folkehav. Uoversiktlig, farlig og dårlig framkomlighet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:42:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "0a27bfca393aced2e3b7367c3172ba894cdaae77.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-559": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92324823, + "lng": 10.83603858 + }, + "type": "LatLng" + }, + "description": { + "value": "Utkjøringene fra Staples og de andre storbyggene langs Breivollveien er farlige for syklister på sykkelveien. Det er ofte kø, og de som kjører ut har fokus på å komme seg ut i trafikken, og ikke på sykkelveien de krysser. Vikeplikten deres brytes ofte.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:42:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "7df12d50643d2c654667bae3f84bed4b209f7a75.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-565": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92746342, + "lng": 10.84703564 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien går her fra å være en rett og rask strekning til å bli en del av en trang bussholdeplass. Utrolig dårlig løsning, og stressende både for folk som blir forbisyklet og for syklister som må snirkle seg forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:48:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "dd8223e2a9d602658b4d1c43dc9a123eb3db678a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-568": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93813879, + "lng": 10.72089672 + }, + "type": "LatLng" + }, + "description": { + "value": "Stressa mamma med barn i bil og mobilen in hånden kjørte ut av parkeringsplassen uten å se til venstreb over sykkelfelt - rett foran min sykkel. Crashed inn i bilsiden. med nesten full fart. Ribbebrudd. I mellomtiden har steded fått traffiklysanlegg - den oppleves nå mye tryggere.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:49:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "018d9342d556fc28703a0133f2f227d36e6e6df0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-567": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9374186, + "lng": 10.68304538 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er ingen sykkelvei. Traseen går på fortau og praktisk talt innom t-baneholdeplassen. Farlig og uoversiktlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:48:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "135e6ff48e259ac6e87d61054132ec7ebe896734.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-566": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89427152, + "lng": 10.83271694 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står biler og trailere parkert på begge sider av veien, og det skaper farlige situasjoner når det knapt er plass til to biler i bredden. Som syklist har jeg flere ganger opplevd å bli sneiet av billistene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:48:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "508fd88006a0527f2b6fcd327f24f3882e6d39f9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-570": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92602257, + "lng": 10.77582836 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet blir \"kuttet\" av busser som svinger - livsfarlig å passere dersom man ikke kjenner forholdene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:51:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "65f03bf457a07ce786d7f2766cdcaff794b1fbf1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-577": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92637956, + "lng": 10.77552795 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen steder å gjøre av seg som syklist, og mange usikre situasjoner oppstår.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:54:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "689896d69b8a4f12a6b3c6219df2a64b66343af6.jpeg", + "type": "String" + } + } + }, + "aftenposten-576": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93558045, + "lng": 10.74003696 + }, + "type": "LatLng" + }, + "description": { + "value": "Nettopp blitt re-asfaltert, men ikke tatt hensyn til syklister ved å skille feltene eller gjøre andre tiltak, selv om det var en dødsulykke her for noen år tilbake. Tragisk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:53:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "f0f86f679d5004ab165994dc8b6ee9bf69b9710e.jpeg", + "type": "String" + } + } + }, + "tweet:570516589608620000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "@JasonCopland I think you're putting to much emphasis on the word \"friends\" there, hehe.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:32:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + }, + "streetview": { + "value": "30deae915343243873a947b894375ac5ffc236f2.jpeg", + "type": "String" + } + } + }, + "aftenposten-578": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92541638, + "lng": 10.73092818 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig traffikert og tidvis uoversiktelig rundkjøring med trikkeskinner og biler som plutselig stopper midt i rundkjøringen når man skal sykle ut, siden de må stoppe for fotgjengerfelt på vei ut av rundkjøringen. Jeg opplever det verst når jeg kommer fra Adamstuen (Thereses gate) og skal videre nedo", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:54:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "1d44812b11c9819de87651c197b4945cde04a882.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-585": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90835098, + "lng": 10.81631898 + }, + "type": "LatLng" + }, + "description": { + "value": "I Østensjøveien, på Bryn Bru, skal mange syklister krysse veien (til venstre) og kjøre ned på gang/sykkelvei under t-banen for så å fortsette på gang/sykkelvei langs alnaelva eller bort til Etterstad/Helsfyr. Fordi alle syklistene velger å krysse veien på forskjellig måte er det mange farlige situasjoner her.... Men (!), det er mulig å sykle til venstre bort Nils Hansens vei og så ned til Bryn stasjon og under t-banen den veien. Hadde alle gjort (som meg) det, ville trafikken glidd bedre her! Ma", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:00:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "7d78a6dfb7a29591b4675e7aecbaaa2f8e2d3780.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-584": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92970521, + "lng": 10.6610459 + }, + "type": "LatLng" + }, + "description": { + "value": "Fotgjengerfelt. Ikke tilrettelagt. Sykkelveien fortsetter på fortau. Sykklende burde hatt prioritet iom att dette er ring 3 for sykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:59:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "24c711b116b9cc7f75a760e5ad6780bf72a66c7b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-583": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9267301, + "lng": 10.63919448 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig tunnelkryss for sykler og fotgjengere. Her kommer syklister i høy fart fra Bærum, Røa og vestover fra Åsjordet. Dette kombinert med et høyt antall barne- og unge på vei til nye Bjørnsletta skole, gjør dette stedet til en alvorlig ulykke \"waiting to happen\". Her må noe gjøres både for å sikre syklistene, men også barna!", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:58:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "3210b63ad5a327d85105779c6643fd2ab37d1617.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-582": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91819628, + "lng": 10.76370477 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil som skulle svinge inn på Lakkegata, men ikke overholdt vikeplikt/ikke så meg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:56:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "f43d1d5ee7ccc8724703e76a084952a09b5b88d5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-581": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93334874, + "lng": 10.75607872 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelvei, fortauet er humpete, hullete og først og fremst beregna til gående. Blir pressa ut av bilene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:56:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "0278501bd6919b42125935d63fb8d4f7168c3785.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-586": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93452696, + "lng": 10.72945833 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkler man ut Blindernveien og over til Ullevålsveien, så begynner sykkelfalt bare ved Fagerborggata. Foran hus #13 er det trangt med biler som kjører forbi ganske nær sykklistene når de skal over krysset og inn i Ullevålsveien. Sykkelfeltet bør merkes helt fra Kirkeveien inn i Ullevålsveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:00:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "df65cd3b0eb790af3fa531712503d5f2c6f99c57.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-592": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87935481, + "lng": 10.82303524 + }, + "type": "LatLng" + }, + "description": { + "value": "Utkjøringen fra Statoil og til hovedveien mangler gangfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:04:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "6741977f2dc1645b657d91a64238b8c9f2c96e7d.jpeg", + "type": "String" + } + } + }, + "aftenposten-591": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91498834, + "lng": 10.74990749 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man sykkler fra Torggata inn til Youngstorget star man plutselig foran en bom som blokkerer hele bredde hvor fortauet er lav nok for sykkling. Før sto det sperrestolper her - det var en bedre løsning for sykkeltrafikken. Samme problem bak Stortinget, dessuten. Bommen sperrer hele kjørebanen og lår ingen plass til sykkeltrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:03:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "0100a37dd9aa0992a3216d2fdb5de119023d31f0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-590": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94957364, + "lng": 10.73089599 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette knutepunktet fungerer ikke på noen god måte for sykkel. Nord- eller sørfra må man over til en gangbro med mange fotgjengere. På begge sider går gangbroen rett inn på fortauet. Når man kommer vest- eller østfra står man i fare for å bli påkjørt av biler på vei til eller fra motorveien, også når man triller sykkelen. – JER", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:03:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "6054cf5b0b7585ded4758ebe2e1336c6009a2a87.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-589": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92418379, + "lng": 10.74133515 + }, + "type": "LatLng" + }, + "description": { + "value": "Utilstrekkelig merking fører til vanskeligheter når man skal svinge til venstre Waldemars Thranes gt/Ullevålsveien. Tung trafikk fører til usikre situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:02:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "76c989f79817c067de6260684ef14e7672d1af1f.jpeg", + "type": "String" + } + } + }, + "aftenposten-595": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92931277, + "lng": 10.84966421 + }, + "type": "LatLng" + }, + "description": { + "value": "Utkjøringene fra boligene her er ekstremt farlige for syklister som kommer nedover. Sykkelveien er smal, det er vanskelig for syklister å å se at det er utkjøringer her (porter i høy støyskjerm) og vanskelig for utkjørende å se om det kommer noen, og det er naturlig å holde god fart. (Det må sies at jeg har bare opplevd forsiktige sjåfører her så langt.)", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:06:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "3da181e1653e137d2c5dbbcc5c02b117d0d093e2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-594": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93067822, + "lng": 10.80222129 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykling over Økern kryssets nye lokalveisystem føles farlig fordi man veksler mellom sykkelfelt og flere rundkjøringer uten sykkeltilrettelegging.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:06:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "e9b584c9da81c78a416ab5806bdfca92202d5b90.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-602": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92125873, + "lng": 10.7510662 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet slutter rett før rundkjøringen. Der har bilene en tendens til å legge seg ved siden av syklisten, for så å svinge til høyre ut av rundkjøringen - gjerne uten å bruke blinklys.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:10:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "715b71ec0f21b8b52595545a2f3728252d92a719.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-601": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92921601, + "lng": 10.86569309 + }, + "type": "LatLng" + }, + "description": { + "value": "Passering av to rundkjøringer som mangler sykkeltilrettelegging. De har mye trafikk og føles utrygge.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:10:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "39224f033915325e781c8060be9e767d3d88db68.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-600": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89285506, + "lng": 10.76286792 + }, + "type": "LatLng" + }, + "description": { + "value": "Som mange nevner er det ikke trygt å sykle opp Kongsveien. Her burde fartsgrensen vært 50, kjørefeltene smalere og det ville vært plass til sykkelfelt også oppover. Synd ikke det ble vurdert da det ble asfaltert og oppmerket i sommer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:09:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "a683eadf202f1f782431466d231d33b56b976e32.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-599": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94263152, + "lng": 10.86590766 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye svevestøv langs Østre Aker vei, føles farlig å sykle rett ved siden av tungtrafikk i 70 km/t.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:08:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "cda4aff32d9250efe9e1bee2209cc4c3719a8b2b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-598": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91723635, + "lng": 10.73922157 + }, + "type": "LatLng" + }, + "description": { + "value": "Her går sykkelmerking rett inn i fortau (som dermed tvinger frem den sedvanlige, oslomessige konflikten mellom syklister og fotogjengere). Det er stor mulighet for konflikter mellom bilister og syklister der, til tross for et forsøk på å løse det med et lite trafikklys. I Pilestredet er det heller ikke sykkelfelt. Altså, på noen korte meter beveger man seg fra sykkelfelt til fortau til vei. På den andre siden av Pilestredet finner man tilsvarende merking, som på samme måte blir borte etter noen", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:08:45Z", + "type": "DateTime" + }, + "bilde": { + "value": "b78ada57b00b40e67a4c08c088d5042f.jpg", + "type": "String" + }, + "streetview": { + "value": "47310151b3b135acba2f8dcefda88aa5d93ca0a6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-597": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9418362, + "lng": 10.85831165 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundkjøring med høy trafikk uten sykkeltilrettelgging, mye tungtrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:07:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ab12d6ccdc6530fd6fef48a5dbd9eb4e277e6c3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-596": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91107278, + "lng": 10.73505878 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkeskinnene begynner/slutter like etter bunnen av bakken langs Rådhusgata. Disse er ikke merket på noe vis og det er fare for å kile forhjulet og gå skikkelig på trynet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:06:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "a0e5610f8f4539a12f600b12e55e3ed7dd54880d.jpeg", + "type": "String" + } + } + }, + "aftenposten-603": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95969943, + "lng": 10.88226914 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang og sykkelvei (G&SV) retning vest. Uoversiktlig i enden av undergangen. Selv om inn/utgang til G&SV/grorudsenter er 4-5 meter fra undergangen, velger noen å hoppe ut i G&SV der hvor det er uoversiktlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:11:33Z", + "type": "DateTime" + }, + "bilde": { + "value": "a7bc066b2ba33a97c3a850e55a5793b7.png", + "type": "String" + }, + "streetview": { + "value": "946e7ff0198d16e8eaa94dce4574724bb13e0057.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-615": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91567944, + "lng": 10.76215982 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelvei langs Vahls gate. Trangt fortau og mye trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:22:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "ea04c26f94e68ac7c40add3505f3cc26aeda99ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-617": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92240405, + "lng": 10.74110984 + }, + "type": "LatLng" + }, + "description": { + "value": "En idiot av en bilist legger seg inn i sykkelfelt, meg bak bilen i sykkelfelt. Tenker at bilen skal til høyre, legger meg til venstre for å passere i og med at bilisten blokkerer. Bilisten svinger så uten forvarsel til venstre. Jeg rekker ikke å stoppe, faller over fremre del av panser, lander heldigvis på bena, uskadd. Men dette var nedover, kunne gått riktig ille.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:23:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "c93592669bdd56a3ff6ce6970570ab4dbc6942ce.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-616": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92063497, + "lng": 10.73390007 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvor skal man sykle? Fortau smalt og veien full av biler og trikker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:22:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "0bb2a839245d78985786c9147d25d6bc0658f891.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-618": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90632832, + "lng": 10.77775955 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet her blir overtatt av biler som bruker det til forbikjøringsfelt (i nordlig retning, oppover mot Vålerenga). Blitt sneiet av bilister som brått slenger seg in i sykkelfelt foran meg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:25:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ae44cfdeb892a09d071d4c5c082d8ef6da4fca1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570493499373543400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "1. #NashsNewVideo\n2. #viasatfotball\n3. Norway\n4. Norge\n5. Barca\n\n2015/2/25 08:52 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:00:24Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-620": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90723208, + "lng": 10.77992677 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset. Sykkelvei inn til krysset, men ingen markerte sykkelfelt i selve krysset. Blir stadig presset ut av krysset av biler her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:25:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "f42957e59fa3b0b164679485c707f5fae31edcfa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-619": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95612755, + "lng": 10.78900337 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig forkjørskryss. Ofte brudd på vikeplikten. Uoversiktlig pga høy hekk (se bildet). Hvor ble det av vikelinjene malt på veien? Når kommer de tilbake?", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:25:30Z", + "type": "DateTime" + }, + "bilde": { + "value": "82e41e1e33f7501d319d85a6b963ca45.png", + "type": "String" + }, + "streetview": { + "value": "3b4f2bfd7d1443005501838301b84e847a2c84ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-621": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93022666, + "lng": 10.71909427 + }, + "type": "LatLng" + }, + "description": { + "value": "Kirkeveien er beryktet blant syklister. Trang, høy kantstein, mange kryss, masse trafikk. Etter å ha opplevd selv to ganger, og observert utallige ganger, at biler svinger til høyre like foran en sykkel velger jeg og mange andre å sykle andre ruter, selv om de er lengre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:26:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "0ffff539e48bc24425c29592906a5f69ac6d26a1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570489741319278600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Andreas Marienborg", + "type": "String" + }, + "description": { + "value": "@acpettersen da glir jo du inn da :)", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:45:28Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3766427417/6b5b41e2dbdd956ba3091ac2ed97b88f_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-626": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91876094, + "lng": 10.72179794 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil kjørte meget tett innpå meg mens trikk i motsatt rettning kom mot oss. Ble presset ut mellom fortau og trikkespor. I det bilen kjørte farlig nære forbi, satt hjulet seg fast i trikkeskinnen, og jeg fløy av sykkelen og landet 2 meter forran sykkelen. Bilen stoppet ikke.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:29:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "313ae083c5d98f651cc218545ebc51577ecddff6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-625": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84943878, + "lng": 10.80256462 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det viktig å sykle tydelig dersom man ikke skal opp Ekebergveien. De aller fleste biler svinger til høyre, så her må man enten legge seg mot midten av veibanen eller signalisere tydelig at man IKKE skal til høyre...", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:29:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "e37d3a65d3cb7e206794b44145abc2c3502df2a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-624": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91340712, + "lng": 10.64216852 + }, + "type": "LatLng" + }, + "description": { + "value": "Under rampen ned fra Lysakerlokket tar sykkelveien en 90 graders sving ned mot bilveien. I innersvingen er det høye busker som skjuler alle motkommende sykelister i motsatt retning, samt gjør kryssingen av veien ekstra uoversiktlig. Har kollidert her med motgående sykelist som kom opp bakken fra veien, med skade på egen sykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:28:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "08f38f5b9101c42db810008290057bc933527ddb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-638": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90131415, + "lng": 10.68210124 + }, + "type": "LatLng" + }, + "description": { + "value": "Fredriksborgveien har veldig smale og skjeve fortau, og dette er en falsk trygghet spesielt for småbarn som er tilfots/påsparkesykkel/påsykkel. Det er trangt om plassen, spesielt der det er busstopp. Biler og busser kjører fort (50km sone), og det skal lite til før en liten og kanskje litt vinglete syklist kan velte ut i veien. Vi var utfor en nesten-ulykke der bussen måtte bråstoppe for vår 5 år gamle sønn som veltet ut i veien etter å ha prøvd å passere bussholdeplassen som tar opp all plass p", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:41:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "ed9fe70e3d6000d7e2012dff036f098d56b380d6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-637": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95642836, + "lng": 10.78252315 + }, + "type": "LatLng" + }, + "description": { + "value": "Høy og tett hekk skjuler bilveien fra høyre omtrent helt når man kommer fra Grefsenveien, og man må ligge midt i veien eller helt til venstre ved fortauet for å få litt oversikt. Dette er en mye brukt skolevei med høyt ulykkespotensiale hvis syklister og bilister møtes her i stor fart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:39:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "9914645292af80029d81e33312b70767959b8287.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-636": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92444725, + "lng": 10.70789873 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av buss som svingte inn til parkeringen til Frognerparken. Feltet smales inn, samtidig som det er dårlig sikt for sjåføren. Takket være lav sykkelfart, kom jeg mirakuløst av sykkelen i tide - men sykkelen ble totalvrak.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:39:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "07bd3d1f71a218abb0e59dda463631b734cb6633.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-635": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91291229, + "lng": 10.74568033 + }, + "type": "LatLng" + }, + "description": { + "value": "Fulle fortau presser syklister ut i gata, og gata er et kaos av trikker, trikkeskinner og biler. Ikke tilrettelagt for syklister, selv om Grensen er en del av hovedsykkelveinettet. Bør sperre av gata for biler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:38:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "76adc51504ff0a056ddc5e1d56a542eedf0d7dbd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-634": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91618228, + "lng": 10.76813578 + }, + "type": "LatLng" + }, + "description": { + "value": "Store huller i veien", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:37:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "c359a54a151bde94bc39cc1a988d9e21a50b70b0.jpeg", + "type": "String" + } + } + }, + "aftenposten-633": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91312206, + "lng": 10.79009771 + }, + "type": "LatLng" + }, + "description": { + "value": "Nybygget sykkelfelt i retningen mot tøyen (nordvestover) punkteres på noen 100 meter av 10 avkjøringer til ulike p-plasser. Biler legger seg over i sykkelfelt uten forvarsel. Livsfarlig i rushen når bilene går i saktegående kø (10-15 kmt) mens syklisten kommer i 20-40 kmt på innsiden i sykkelfeltet. Syklisten må holde lav fart å se på bilenes forhjul for å se om de svinger.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:37:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "e29d2edf9793fe08d7f791078cc17cbf167af067.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-632": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94675828, + "lng": 10.71793556 + }, + "type": "LatLng" + }, + "description": { + "value": "Krasjet på sykkel med varebil som skulle inn til varelevering. Lå på Ullevål i 2 uker samt måtte gjennom lengre rehabiliteringsprosess", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:36:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "3c2aee524cc24b241cf3d88d532070d9e19145d1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-631": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92687203, + "lng": 10.71215916 + }, + "type": "LatLng" + }, + "description": { + "value": "Et uoversiktlig kryss som gjør det vanskelig å svinge opp til Kirkeveien fra Middelthunsgate. Som syklist kommer du i skvis mellom bilene som skal inn samme vei, og motgående biler som skal NED Kirkeveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:35:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "854f64ab164f5dd9de84ca0344a97eb4222d0247.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-630": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92520804, + "lng": 10.77529728 + }, + "type": "LatLng" + }, + "description": { + "value": "Her snevrer det seg inn, og det er vanlig at bilistene gjerne vil være først framme i krysset. Har opplevd å bli pressa opp på fortauet flere ganger.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:34:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "87b3e95b0b416e7387095f16609332533fe23668.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-653": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91066668, + "lng": 10.72892725 + }, + "type": "LatLng" + }, + "description": { + "value": "Kllisjon mellom sykkel og taxi. Syklist havnet på bilpanseret. Taxisjåfør så seg ikke for da han skulle kjøre ut av taxiholdeplass", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:51:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "cefd6d77281c9a2c81c7f52ba21b71d437ef2dbf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-652": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91594565, + "lng": 10.73351383 + }, + "type": "LatLng" + }, + "description": { + "value": "Flere hull i veien og skumle kanter. Farlig på landeveissykkel!", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:50:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "1aff1c3590d8da6c55b922c293a2dbb327a34766.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-651": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91164294, + "lng": 10.72664737 + }, + "type": "LatLng" + }, + "description": { + "value": "Her stopper plutselig sykkelveien. En vei med tusenvis av syklister hver dag. Få egne veier!", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:49:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "19b66a87a75b5f6c95d37ba6bda4e2b17ef1ea24.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-650": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94050883, + "lng": 10.72983652 + }, + "type": "LatLng" + }, + "description": { + "value": "Opplever daglig at bilister ikke overholder vikeplikten.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:49:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "0e2e241fdb27f5a009b9b6416695fdcd9fc075c4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-649": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91823124, + "lng": 10.66552519 + }, + "type": "LatLng" + }, + "description": { + "value": "Her pungterte jeg seneste for noen dager siden. Sykkelfeltet skal plutselig opp på fortauet eller ut i bilveien. Overhodet ikke tilpasset landeveissykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:48:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "f281d5c04a1b86e8be6d6a8a15566cca948f3cec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-648": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9180968, + "lng": 10.68401098 + }, + "type": "LatLng" + }, + "description": { + "value": "Her går plutselig sykkelveien over til å bli kombinert barnevogn-felt, gangvei, lufte-hunden-vei. I tillegg håpløst mange komlokk og kanter mot Skøyen. Sinnsykt og svært farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:47:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "1c72074821048229df2e31a5375310f4ffbe2274.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-647": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9176952, + "lng": 10.72402039 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne veien er smal for biler i begge retninger og fortauet er alt for smal for både sykkel og gående, man blir nesten påkjørt når to biler paerer hverandre og sykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:45:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "d798c4f8f6f39a757f62a35fce25bae79f3b1c9d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-665": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91043808, + "lng": 10.74754714 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei stengt pga. graving i sykkelveien. Blå merking som tilrettelagt er feil.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:16:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "fe80a8a6742082de0a15ef65f875761e58940b43.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570494627637276700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.934266, + "lng": 5.641014 + }, + "type": "LatLng" + }, + "author": { + "value": "Bharti", + "type": "String" + }, + "description": { + "value": "@TheRahulMahajan @dimpy_mahajan What an amicable attitude you guys showed... Great..good wishes to both of you..", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:04:53Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568360445074210816/c0Gw0g8a_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570489548867813400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.833313, + "lng": 10.440612 + }, + "type": "LatLng" + }, + "author": { + "value": "Khurram Dawood", + "type": "String" + }, + "description": { + "value": "@ABpolitiops glatte veier på Borgen og andre steder i Asker", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:44:42Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569411061410181120/L70uA2Vs_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "038543", + "type": "String" + }, + "streetview": { + "value": "8897626dc2311d51a3f4f9bf7c3ecfd9f61c4832.jpeg", + "type": "String" + } + } + }, + "tweet:570511749356650500": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 67.26423, + "lng": 15.38742 + }, + "type": "LatLng" + }, + "author": { + "value": "Tor Håkon Bjørnli", + "type": "String" + }, + "description": { + "value": "@TorBjornli @NatGeo @NRKNordland @nrknyheter @wunderground SUNRISE here in Fauske, just above the Arctic Circle. http://t.co/EGzi9T9Wya", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:12:55Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rdaWcUsAA4hht.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506720265141637120/F59AU3OW_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "aftenposten-673": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93071047, + "lng": 10.77812433 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er utgangsdørene fra blokka rett ut på fortau. Noe som gjør at det å sykle i full fart nedover Trondheimsveien både er risikabelt for den som tar sjansen og den som går. Samt at det er veldig trafikert. Må være mulig å holde litt på bremsen? Eller hva syklister? Skal også nevnes at folk bruker denne veien til å teste hvor fort de klarer å gjøre", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:34:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "077a838a70c53c0b9b540f290bd730db215ceb47.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-676": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94368475, + "lng": 10.58897495 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke sykkelvei, farlig for syklister", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:36:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "185191a096c0cc0869732601a99cc2ece8971890.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-675": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90856615, + "lng": 10.68205833 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det veldig trangt, men bilene insisterer likevel på å presse seg forbi, mange syklister på denne strekningen og bilistene er vel lei. Her burde det tilrettelegges bedre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:36:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "cc64cfbe6419cee22eefed0aa1ceb46a67c823aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-674": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94274974, + "lng": 10.80852985 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig trangt rundt hjørnet mellom bussholdeplass og krysset der sykkelveien kommer opp fra undergang og ut på fortauet. Uoversiktlig grunnet støyskjerming", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:34:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "18087b93429ba8e1324cc617a38a6af3f9b1ec3a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-677": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92629139, + "lng": 10.7311964 + }, + "type": "LatLng" + }, + "description": { + "value": "Opp på fortau..ned fra fortau..krysse veien..opp på fortau..ned fra fortau..dodge trikkeskinner..passe på høy fortauskant..opp på fortau..sure fotgjengere..sperra fortau på grunn av vedlikeholdsarbeid..ned fra fortau..full stans..der kommer trikken..hjelp..skal ikke den bilen stanse..krysse veien..opp på fortau..", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:36:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "6ee2339398203fbcfc763eec50fddbd97864309f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570510296122581000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.835856, + "lng": 10.4351 + }, + "type": "LatLng" + }, + "author": { + "value": "Iara Heidempergher", + "type": "String" + }, + "description": { + "value": "Nooooo ho saputo che #Stereomood chiude! :( uffi una bellissima idea e startup italiana chiude. #ciaostereomood", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:07:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/515421144430563328/vvcr-7NM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + }, + "streetview": { + "value": "ad66cae70b786d4cac239e4dae717f27f3530991.jpeg", + "type": "String" + } + } + }, + "aftenposten-678": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92707096, + "lng": 10.71210443 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet nedover mot Frognerparken blir plutselig \"borte\" de siste 50 metrene før krysset Middelthunsgate. 2 felter med biler overtar, og vi syklister blir skviset bort. Biler som svinger til høyre inn Middelthuns gate ser heller ikke syklistene før de svinger.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:37:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "b161be7b8788fd19cca1f394149aeac18abb9df6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-679": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92066186, + "lng": 10.67572832 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet er gravd bort. Det er OK nok, men den midlertidige veien er ikke asfalt, ikke fast grus, men løs stor stein. Jeg tror ingen bilister ville funnet seg i en så dårlig \"mellomløsning\". Hvertfall ikke for en såpass lang periode.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:38:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "fa338fa0aa4581e49630ad2c6bbd3af56e2d40a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-682": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92893915, + "lng": 10.71595072 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet popover Kirkeveien blir plutselig borte gjennom Majorstua-krysset. Biler i to felter, fotgjengere i alle retninger, og man må karre seg opp på fortauet for å unngå å bli skviset mellom biler og fortaus-kanten.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:40:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "93b28d5a3023585a5c65eb5cc8f02697e51db254.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-689": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94901488, + "lng": 10.66926956 + }, + "type": "LatLng" + }, + "description": { + "value": "Blindveg med gjennomkjøring for syklister som er mye brukt av skoleelever og pendlere. Nesten alltid delvis eller helt sperret av parkerte biler. Gjør det uoversiktelig og mindre attraktivt å bruke. Oslo kommune må prioritere sykkel og tørre og bøtelegge parkerte biler her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:45:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "957014ea1c1aa677b7964120ea350e76358ed693.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-688": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91274018, + "lng": 10.76231002 + }, + "type": "LatLng" + }, + "description": { + "value": "Generelt en farlig og uoversiktelig strekning. Jeg har vært i flere nesten ulykker og blitt dunket borti av biler som kjører inn i eller ut av sykkelfeltet uten forvarsel. Det er også alltid en eller flere biler som parkerer i sykkelfeltet slik at syklistene må svinge ut i trafikken for å omgå den.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:43:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "cc2f9872ac2fbafebc68d31ea60198638cf60d2a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-687": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96257276, + "lng": 10.6403017 + }, + "type": "LatLng" + }, + "description": { + "value": "Fryktelig trangt her i Sørkedalsveien, og gang- og sykkelvegen inviterer heller ikke til trygg sykling. Denne siste burde rustes opp til en ordentlig sykkelveg med fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:43:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "2989c736e8553193b6d1e2d48dcd7cb54898d357.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-686": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88624557, + "lng": 10.5191946 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er en farlig løsning for syklistene som kommer vestfra og skal følge \"sykkelveien\" som her går til høyre og ned en rampe til en parkeringsplass: 1) hotellgjester på Thon og billister til garasjeanlegget på Sandvika storsenter har en naturlig forkjørsvei da syklisten må ned fra fortauet og inn i bilveien. Her har jeg måttet stoppe mange ganger; 2) når man kommer ned fra rampen og på parkeringsplassen bender sykkelveien til venstre - dette er svært uoversiktelig og igjen må syklisten bråb", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:42:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "bd3454fba0067eb1661de9e107306aa94d799f7d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-685": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9366984, + "lng": 10.68235874 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg syklet på fortau, en bil svingte inn til bolighus og jeg falt over panseret.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:41:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "8dc1c01c9e293fed0cce43e5d67af072088563cf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-684": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96261036, + "lng": 10.9216547 + }, + "type": "LatLng" + }, + "description": { + "value": "Parallell vei til Fossumveien ned fra Bussholdeplass ekstremt smal. Ikke plass til både sykkel og møtende buss. Biler holder stor fart her, siden det er en litt lovløs rest av gamle fossumveiplaner.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:41:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "846c0a717c880aec86d1b657cbf70dd38d527467.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-693": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93850425, + "lng": 10.68012714 + }, + "type": "LatLng" + }, + "description": { + "value": "Lov å parkere rett etter gang- og sykkelvegbro her. Gjør det trangt og uoversiktlig på et sted som er kategorisert som «hovedsykkelvei». Oslo kommune må prioritere sykkel og gjøre det ulovlig å parkere motorkjøretøy her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:48:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "eae2877de758549efc7e8397b3ba79f0027c8049.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-692": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93620931, + "lng": 10.73254823 + }, + "type": "LatLng" + }, + "description": { + "value": "Stor forvirring og daglige nestenulykker hver morgen når syklister tvinges opp på fortauet pga manglende sykkelfelt og stor trafikk og må navigere seg gjennom jevn strøm av gående på kryss og tvers mellom buss- og trikkestopp.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:48:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "4609d263ff590088d5d09c85167d1d042afb94e2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-691": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94344832, + "lng": 10.70609092 + }, + "type": "LatLng" + }, + "description": { + "value": "Hullete asfalt gjorde at jeg gikk rett i bakken en dag det regnet mye og hullene ikke var synlige.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:47:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "c68a3b647ab06b5b6238ef8312a5481d1759d530.jpeg", + "type": "String" + } + } + }, + "aftenposten-690": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92116194, + "lng": 10.73678612 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig kryss, dårlig belysning,farlig for syklister og gående.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:46:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "5fe8eede162e7178fca1c6ce7e28f1ed05b50524.jpeg", + "type": "String" + } + } + }, + "aftenposten-695": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91238116, + "lng": 10.75032055 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelsti. TGF har satt uteserveringen så langt ut på fortauet at det kun er 1 meter igjen for fotgjengere og syklister å passere på.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:49:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "c6ef0aa470f99f525bdece55dd05e30323c10757.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-694": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91047035, + "lng": 10.72069287 + }, + "type": "LatLng" + }, + "description": { + "value": "Uklar skilting der gang/sykkelvei krysser bilvei. Før og etter overgangen er det skiltet gang/sykkelvei med separat felt for sykkel og opphøyd fortau for fotgjengere. Der fortauet krysser bilveien er det markert fotgjengerstriper på veien, men det er ingen markering der sykkelfeltet krysser veien. Samtidig er det et fotgjengerskilt som står før krysspunktet. Dette gjør det forvirrende om hvilke rettigheter og vikeplikt som gjelder i forhold til sykkel og bil i krysningspunktet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:48:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "7e3683b80c4027c80f37f5592551ebb720155321.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "cab4c2d8-0ca9-4261-900c-9e7d95fcd648": { + "type": "master:utmost:red", + "properties": { + "location": { + "value": { + "lat": 59.91720409, + "lng": 10.76855421 + }, + "type": "LatLng" + }, + "description": { + "value": "This is required", + "type": "String" + }, + "date": { + "value": "2015-02-04T10:08:56.615Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "red-snowmobile", + "type": "String" + } + } + }, + "aftenposten-696": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92263257, + "lng": 10.70414364 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet blir borte før rundkjøringen på Frogner Plass. Bilene ser til venstre (mot trafikken i rundkjøringen), legger seg til høyre og presser syklistene overende, eller inn på fortauet blant fotgjengerne.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:50:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "a23e8abd1a97846deeee8a0e051c9bcb8159cbdf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-702": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94568365, + "lng": 10.71300029 + }, + "type": "LatLng" + }, + "description": { + "value": "Gaustad har sykkelvei, men ved broa over Ring 3 er det et rot av forskjellige gang- og sykkelveger. Dette burde rettes opp og få til en anbefalt rute på en sykkelveg med fortau. Her er det god plass til og med.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:57:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "8c071f36a46852668d90ddc107b90d91406c6347.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-701": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90650046, + "lng": 10.7630825 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister respekterer ikke trafikklys eller kjøreretning og er overalt i kjørebanen og over hele veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:56:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "806f774da9e0fc8c5650d94713fe25ed4ea8a494.jpeg", + "type": "String" + } + } + }, + "aftenposten-82": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91422463, + "lng": 10.75252532 + }, + "type": "LatLng" + }, + "description": { + "value": "Oslo (og Norges?) farligste kryss, en bråte ulykker er registrert. Trikker, busser, biler og sykler. Og mange fotgjengere som går på rødt lys. Svært uoversiktlig trafikkbilde.", + "type": "String" + }, + "date": { + "value": "2014-09-09T09:43:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "99d0eeebdb8e8917735a8c9cb1b988ae45a88918.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-703": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94914383, + "lng": 10.64004421 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig vei, bare et spørsmål om tid før det skjer en alvorlig ulykke på strekningen Røakrysset-kommunegrensen tilBærum. Det mangler en strekning på ca 700m med sykkelvei. Her er griniveien smalrtauet er smal og hullete og ikke et alternativ å sykle på pga fotgjengere, hull og farlige utkjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:59:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "41fdeaee94c48381d6a1942200ecf36024c9c0fd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570512354527584260": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.94178, + "lng": 10.76844 + }, + "type": "LatLng" + }, + "author": { + "value": "Sætre Hanssen", + "type": "String" + }, + "description": { + "value": "Litt rart for norske forlag å si de er \"godt rustet\"'i konkurransen mot Amazon, når Amazon i praksis er stengt ute fra konkurransen.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:15:19Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000529008550/7550f1aeffb4214cb56195f0f385dcdd_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "3efcfa3f3ebee11dd9ddbf7168a4f93e8ab00b97.jpeg", + "type": "String" + } + } + }, + "aftenposten-709": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91759936, + "lng": 10.68763196 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummelt kryss - dårlig oversiktlig, og mange kommer i høy hastighet fra flere hold. Syklister kommer fra toppen av \"lokket\" og ned til sykkelstien. Burde vært skilt bedre med mer oversiktlig sone.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:07:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "e5bf0a82b237d7cc84af2aaa45dddc7271811f23.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-708": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91704275, + "lng": 10.81123352 + }, + "type": "LatLng" + }, + "description": { + "value": "At man fortsatt må sykle 180 graders svinger, opp bratte bakker og alt dette deles med gående er en god indikasjon at Oslo ikke er en sykkelby. Her burde det vært bygget en dedikert sykkelveg-bro med fortau over Ring 3 for lenge siden.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:06:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "2fd28995dab531ce52a3660b68a904b45fc9fa9a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-707": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92149533, + "lng": 10.67924737 + }, + "type": "LatLng" + }, + "description": { + "value": "Her krysses det mye trafikk inn i parkeringshus, og det parkeres i sykkelfeltet på daglig basis. Parkeringsplasser langs veien lager klassiske \"døråpnerfeller\" slik at mange sykler på hovedveien. Det er også brukt 3 rader med brostein for å skille feltene, som gjør det skummelt for smale dekk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:06:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "bcfe2d3fc414c78c65adb233d975a4c037fba1ee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-706": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93730036, + "lng": 10.78428268 + }, + "type": "LatLng" + }, + "description": { + "value": "Mørkt og trangt her. Hvorfor er ikke taklysene alltid på i kulverter?", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:03:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "a8c267d0a0fabcdb6872fd7790b57c1e0b1c8d9f.jpeg", + "type": "String" + } + } + }, + "aftenposten-705": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9256516, + "lng": 10.73091745 + }, + "type": "LatLng" + }, + "description": { + "value": "Må være med i kåringen av Oslo verste rundkjøring for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:00:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "ded5a633fdb8af49b49f530e7981e81edffbfb82.jpeg", + "type": "String" + } + } + }, + "aftenposten-704": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94976705, + "lng": 10.7323122 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang- og sykkelveg ved bussholdeplass har fått reklameboards som sperrer for oversikten. Vanskelig å se om det kommer gående som vil krysse GS-veg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:00:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "f038ecae12186ed31ea67d02c2d66472647fc65f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570500539139518460": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "The largest number of Trends in Norway for Tuesday 24 was at 18 hours: http://t.co/HPpeAZ2ODq http://t.co/0cCIMX9nlq", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:28:22Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rTN7iUEAE3Odo.png", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-716": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88389857, + "lng": 10.77638626 + }, + "type": "LatLng" + }, + "description": { + "value": "Opplever ofte at biler som svinger ned Solveien ikke bruker blinklys eller ser i speilet. Det er alltid mange syklister på vei mot Holtet på ettermiddagen og har opplevd mange nestenulykker", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:21:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "7fa0d43733dc0ae0bd04858b9e0778408c792a20.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1006": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95799679, + "lng": 10.73269844 + }, + "type": "LatLng" + }, + "description": { + "value": "Nedoverbakke med eget sykkelfelt, ikke forkjørsvei og uoversiktlig kryss. Bare tidsspørsmål før det kommer en syklist i litt for god fart som ikke opprettholder vikepliken fra høyre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:38:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "b1f278e346074967757cefdfd5f17f938862d69d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-212": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92015101, + "lng": 10.72798848 + }, + "type": "LatLng" + }, + "description": { + "value": "En klassikker som gjelder for de fleste rundkjøring i Oslo med oppmerket sykkelsti på veien. Denne opphører ca. 2 meter før rundkjøringen begynner, noe som tvinger syklister og bilister til å flette. Dette glemmer bilister ofte - og da norske bilister - motsatt danske - ikke er vant med å kikke over", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:47:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "164ccdfd24c04b5b58f2743b04eba6aa07f707b3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570514831222165500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.910107, + "lng": 10.724985 + }, + "type": "LatLng" + }, + "author": { + "value": "Hans-Petter N-Hansen", + "type": "String" + }, + "description": { + "value": "IT-sjefer bruker mindre enn 20% av tiden sin på #innovasjon, 80% på å holde løsningene operative #KI15 @Teknisk", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:25:10Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562329672713662464/vNeJqE4g_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "38f0bf240b51d34b275cd04b7dfffffa4626d7d6.jpeg", + "type": "String" + } + } + }, + "aftenposten-264": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87475658, + "lng": 10.81127643 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister står konsekvent i utenfor Lambertseter senter (ikke Sæter som det står på kartet) for \"skal bare\"-ærend, typisk levere bøker til biblioteket, ta ut penger i minibanken m.v.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:12:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "6caffd071995bcef305555bb37922883c00756c9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1012": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9111933, + "lng": 10.7278373 + }, + "type": "LatLng" + }, + "description": { + "value": "Skrekk eksempel på hvor dårlig løsning det er laget for alle myke trafikanter. Her er det trikk, anleggsmaskiner, ulovlig parkerte biler, taxi og vanlig biltrafikk - godt blandet med sykler, folk på rulleski, fotgjengere, barnevogner og forvirrede turister. Her er det totalt kaos for de fleste myke trafikanter hver morgen og ettermiddag.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:44:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "81c491bb913ab13259731e39ec4d225c2fcd5abf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-929": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.942739, + "lng": 10.75647354 + }, + "type": "LatLng" + }, + "description": { + "value": "Alle veier med (bred) midtrabatt og fortausparkering er dessverre risikable for syklister, selv om de som her har et visst grønt/miljøaspekt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:59:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "d6a7b8013cbb0c3e1c667b80cb38b3034c25d4cc.jpeg", + "type": "String" + } + } + }, + "aftenposten-875": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90875981, + "lng": 10.75072288 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg var kun cm fra å bli presset mellom betongklosser og en stor SUV Toyota. Det er plutselig slutt på gangfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:57:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "bf79eb4ceb39c01e00fec2bd8f95b144ec5b14ff.jpeg", + "type": "String" + } + } + }, + "aftenposten-970": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90632025, + "lng": 10.7743746 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien er av dårlig fatning, i tillegg er det brodsteinsskille mellom sykkelvei og bilvei. Pga dårlig sykkelvei og parkerte biler må man ut i veien. Å krysse brosteinene med landeveissykkel er farlig, Derfor sykler de aller fleste i bilveien lang hele denne veien. Veien driftes av Statens Vegvesen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:38:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "d14f89ef095f0479a6f232bf5f0b0314685b93fa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-743": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91927449, + "lng": 10.69788336 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved bussholdeplassen i vestgående kollektivfelt (som vanligvis er det beste stedet å sykle) er det store fordypninger i asfalten etter bussdekkene. Fort gjort å kælve om man ikke ser disse og her skal man følge med på biler, busser og fotgjengere + lyskryss rett før.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:51:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "f7163cb94e175b70508c08d0821819b10d1e1969.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-263": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92157061, + "lng": 10.68838834 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist på sykkelvei påkjørt av bilist som svingte inn i Thunes gate, kollision i 40 km/t.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:12:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "8942182e1864cc8a4723ceed1eea55cd55f86f75.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-974": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92222661, + "lng": 10.74136734 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussen må over i sykkelfeltet for å komme inn på holdeplassen. Ble nesten overkjørt da bussen klemte meg ut av sykkelfeltet så jeg måtte løfte sykkelen opp på fortauet for ikke å bli klemt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:50:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "d96c3a93cbdb43e6ebfb5410481954b6937f91a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-979": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92936653, + "lng": 10.74261188 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt stopper før krysset", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:02:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "34cf09e32ae2a09f48b31c4c42abb1c2f621486e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1021": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94020789, + "lng": 10.91477215 + }, + "type": "LatLng" + }, + "description": { + "value": "Kryssende bilvei, ingen sykkelveier av denne typen kan lykkes før syklister har forkjørsrett når man krysser bilvei ved fortsettende sykkelvei", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:55:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "c7c235c94e95aab6f6d4cc0dc5154f4ff357a7ef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-850": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9127617, + "lng": 10.76205253 + }, + "type": "LatLng" + }, + "description": { + "value": "Taxi-køen ender ofte midt i sykkelfeltet, sånn at syklister må svinge ut via anlig kjørebane.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:18:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "8ba7bd5ea024b58bd7fb12e99c38988afdc7c3ab.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-718": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88198746, + "lng": 10.78299522 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner 10m før krysset, og syklister presses inn inn i annen trafikk. Her er det daglig skumle situasjoner. I tillegg er det store hull langs trikkeskinnene, og lett å velte.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:24:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "e764bdc98f8a342608956db0be97278e5a0f04f5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-211": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95217387, + "lng": 10.75059413 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang- og sykkelvei i retning østover slutter ved rundkjøringen, og syklister må enten ut i kjørebanen eller benytte gangfeltet for å krysse Tåsenveien. Det oppstår ofte farlige situasjoner med biltrafikken der", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:47:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "1bd0b0b77dd128d2d226b2eb30a173732401e012.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-978": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92908698, + "lng": 10.79844474 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkerte biler på innsiden av sykkelfelt, står delvis i sykkelfeltet pga for smale parkeringsplasser.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:02:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "f18d21b474a2ddf5d057f072bf084fcacbed6db0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570494883997335550": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Vesle Nusse", + "type": "String" + }, + "description": { + "value": "@MartinArseth Det er vel heller dei som set «nye» stadar på kartet som må spørje seg om dei i utgangspunktet hadde for dårlege kart.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:05:54Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/553287492867088384/he6cUbMB_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570514028902133760": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 63.401161, + "lng": 10.659206 + }, + "type": "LatLng" + }, + "author": { + "value": "Marte Sjøvold", + "type": "String" + }, + "description": { + "value": "Really nigga 😒😒😒😒😒 http://t.co/rWT3BA8WmK http://t.co/gfnEmGJwMX", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:21:58Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rfeODUEAAobsT.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560412512152461312/w5ozDSyQ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F71313", + "type": "String" + }, + "streetview": { + "value": "f751125f7cdcb2e427b4e76f6089d4d35e7ce73f.jpeg", + "type": "String" + } + } + }, + "aftenposten-896": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89756917, + "lng": 10.76012134 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei ned Kongsveien slutter sykkelfeltet plutselig. I svingen. På vei opp har man, før Sjømannskolen, valget mellom å sykle i den smale og svingete veibanen til stor irritasjon for bilistene eller å sykle på det smale fortauet med fotgjengere og store ujevne kantsteiner.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:41:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "26a758e37b49d172e76cfcccd3d98e6c0dcb3744.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-917": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91090189, + "lng": 10.7357868 + }, + "type": "LatLng" + }, + "description": { + "value": "Masse syklister og fotgjengere i et eneste kaos", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:43:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "535af434167b2a7127e495ac0b08b481fdd32956.jpeg", + "type": "String" + } + } + }, + "aftenposten-450": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92896871, + "lng": 10.76998114 + }, + "type": "LatLng" + }, + "description": { + "value": "Nyanlagt sykkelvei som sender syklistene ut i veibanen med ryggen mot trafikken. For å gjøre det værre skjer dette mellom noen trær slik at det blir veldig uoversiktlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:30:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "6b2be06fddd9a5c2b25988993a4313b5841ca06b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-965": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93207586, + "lng": 10.70583343 + }, + "type": "LatLng" + }, + "description": { + "value": "To filer fra vest inn mot rundkjøringen medfører at biler kommer fort og ikke trenger å ta hensyn til syklister. Farlig kryss for syklister som skal mot Majorstuen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:34:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d9e127d412dabeb8b8a00f34342ad527940a9ac.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-725": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91349317, + "lng": 10.7618916 + }, + "type": "LatLng" + }, + "description": { + "value": "Motzfeltsgate har på vestre side delt fortau som ser ut som at det er rester av en sykkevei. Respekteres ikke, og i krysset mot Nordbygata er gangdelen av fortauet benyttet til grønnsaksbutikken på hjørnet som gjør det helt ufremkommelig på sykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:31:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "e7eab9025d9fdb31a202e1c6b432f72272da0ba2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-449": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88006548, + "lng": 10.82668304 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter sykkelfelt temmelig brått og plassen til syklistene \"forsvinner\".", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:30:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "abb1b8db7344ed339d776fb864e155ade5b9c195.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-340": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91230989, + "lng": 10.7537806 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne rundkjøringen.... Jeg kan våkne om natten av mareritt om den. I ti år var den siste del av jobbveien min, utrolig at det gikk bra; biler, busser, kjappe drosjer, man måtte ha overblikk som Pirlo for å klare seg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:48:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "5cbe1c733e8bce65b430461e23d5fee2873c0ffb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-113": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93217262, + "lng": 10.7614088 + }, + "type": "LatLng" + }, + "description": { + "value": "Plutselig slutt på sykkelvei. Mye trafikk og hissige bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:36:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "b6038210a70ea26c6cc4907b544b25c33a4839be.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-977": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.86210009, + "lng": 10.78436851 + }, + "type": "LatLng" + }, + "description": { + "value": "De som jobbet tok en dag i August vekk 50m asfalt fra fortauet, - som ble stående i 3-4 uker (fikset nå). Veldig farlig for rulleskjøyter når det kommer brått", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:58:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "891391a18f379792646f00975dc42d2e258559c8.jpeg", + "type": "String" + } + } + }, + "aftenposten-139": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91090189, + "lng": 10.7357868 + }, + "type": "LatLng" + }, + "description": { + "value": "ingen skille mellom gående og syklende. Store langsgående sprekker mellom belegningssteinen", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:03:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "535af434167b2a7127e495ac0b08b481fdd32956.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-464": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9301944, + "lng": 10.7186973 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil kjørte plutselig ut i sykkelfelt og stanset. Umulig å stoppe sykkelen i tide. Krasjet i venstre side og gikk over panseret. Billist- \"Jeg så deg ikke\". Sykkel utstyrt med frontlys, reflekser, to baklys og hjelmmontert lys.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:41:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "4b5297805dd0487253080818a0088602618d1847.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570519541903527940": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Aleksander Dye", + "type": "String" + }, + "description": { + "value": "@hpnhansen @Teknisk her har vi helt klart mye å ta tak i, legacy systemer kan ikke bare sees bor i fra, men det bør fokuseres på å skape!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:43:53Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/524869950322638851/p9cTai3e_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + }, + "streetview": { + "value": "30deae915343243873a947b894375ac5ffc236f2.jpeg", + "type": "String" + } + } + }, + "tweet:570486098444619800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.43101, + "lng": 10.39211 + }, + "type": "LatLng" + }, + "author": { + "value": "Håvard Wigtil", + "type": "String" + }, + "description": { + "value": "Hurra for medlemsavgift i alle trossamfunn. Spennende å se hvor mange som ville ha blitt igjen i statskirka... http://t.co/rM5nYAWzpM", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:30:59Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/146917432/n563565845_27899_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570490698010656800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Espen Skorstad", + "type": "String" + }, + "description": { + "value": "@HandelshoyskBI sin årskonferanse \"It's not about luck\" har 15 talere, men savner Dag Engen Nilsen, forfatter av \"Luck management\"...", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:49:16Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/425277875026026496/0nXWrF7I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-877": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91569374, + "lng": 10.7373981 + }, + "type": "LatLng" + }, + "description": { + "value": "Universitetsgata - Karl Johans gate: Syklende nordfra eller sørfra har ingen trafikklys å forholde seg til, og forventer derfor vanlige vikepliktsregler i krysset. Samtidig har trafikken i Karl Johans gate grønt lys.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:01:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "0061f431381cdb6ddb637e9a791ea07f46b67743.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-872": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91475945, + "lng": 10.73086981 + }, + "type": "LatLng" + }, + "description": { + "value": "Ifølge dette kartet er Ruseløkkveien \"hovedsykkelveinett\",\"men den er enveiskjørt sørvestover. Ingen tilrettelegging for sykkel verken i Ruseløkkveien eller videre mot Frederiks gate.\"", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:50:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "8730638fa1f0bcdba13dc93783b5c6f44e93c8aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-717": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90843705, + "lng": 10.74720382 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det et eget lys for syklister, men det følger lyset for biler. Sykkelfeltet fortsetter rett frem, og det er ingen grunn til at syklister skal ha rødt lys samtidig med bilene. Det er ikke noe problem at biler kommer opp fra tunnelen, de har eget felt. mange sykler derfor på rødt, her, uansett. Dårlig løsning, men neppe veldig farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:22:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "e58f1f99f2c67316d99f8669e47a9b7316b66a7c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-112": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92014026, + "lng": 10.68467617 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det parkering innenfor sykkelfelt. Mange dører farer opp i sykkelfeltet. Dessuten utstrakt feilparkering av biler i sykkelfeltene til tross for god parkeringshusdekning.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:35:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "ed869c9eaecee6855365ea4ffdeb0effe09ddb85.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-91": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90970115, + "lng": 10.79029083 + }, + "type": "LatLng" + }, + "description": { + "value": "Strømsveien gjennom Vålerenga er risikofylt på grunn av dårlig sikt for biler som kommer inn fra høyre side og fordi det er mye dårlig asfalt her.", + "type": "String" + }, + "date": { + "value": "2014-09-09T11:13:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "082dabde3e2488a77e4c3a89cfcd58eb8411e883.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1020": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8983225, + "lng": 10.8313179 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien stopper ved rundkjøringen, bilister tar ikke hensyn til syklister, verken de som kjører forbi syklister i rundkjøringen eller de som kjører inn i rundkjøringen til tross for vikeplikt for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:55:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "30264528ee7a59d44d018112d59ef34a2ba46163.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-90": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92399023, + "lng": 10.84269046 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det to rundkjøringer med mye trafikk og vanskelig å komme greit gjennom for en syklist.", + "type": "String" + }, + "date": { + "value": "2014-09-09T11:10:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "5642d2e29ffc6ab89d962e1200decf437fb8c241.jpeg", + "type": "String" + } + } + }, + "aftenposten-997": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9132108, + "lng": 10.64183861 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg ser for meg innsiden av hjernen til Homer Simpson når jeg tenker på hva slags tilbakestående fjols som har kommet frem til denne livsfarlige løsningen hvor sykkelveien tar en 90 graders sving hvor man ikke kan se hva som kommer bak svingen pga busker, over brostein (som er helt håpløst for landeveissykler) og så leder direkte ut i en bilvei. Ding dong.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:31:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "644d099da48faebcb9392a715f5e1739f5e7a57e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-761": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91351469, + "lng": 10.75746059 + }, + "type": "LatLng" + }, + "description": { + "value": "Ofte værelevering på sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:03:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "d62c7c9171a8baa109c77901a611caece170c362.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-959": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93171033, + "lng": 10.73411464 + }, + "type": "LatLng" + }, + "description": { + "value": "Fy søren så kjipt det er blitt å sykle i Theresesgate etter at bilene ble fjernet. Slalom mellom \"kunst\"benker og blomsterkasser, og en trikk som bare skrur opp farta mer og mer. Høl i huet!", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:27:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "0eec80fc7fecc09df09688ed5b62a4c2a34d311d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-958": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9061092, + "lng": 10.77680529 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har man faktisk forsøkt å lage sykkelfelt på hver side av vegen. Det tragiske er at man har valgt å bruke 4 (fire) rader med brosteiner for å skille sykkelfeltet med bilene. Dette er nesten like bredt som de få cm man kan sykle på. Fjern brosteiner, asfalter på nytt og bruk vegoppmerking som ellers ved sykkelfelt. De fleste syklister unngår å bruke sykkelfeltene slik de er i dag. Veldig dårlig planleggingen av kommunen dette.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:26:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "a7ab31a6ed682b84e46bdb8cc66986ece3041d3d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570492068654678000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Espen Skorstad", + "type": "String" + }, + "description": { + "value": "@HandelshoyskBI burde inkludert flere av sine egne vitensk ansatte som foredragsholdere på årskonferansen, fremfor å dyrke kjendiseriet.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:54:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/425277875026026496/0nXWrF7I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-724": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93523646, + "lng": 10.73038101 + }, + "type": "LatLng" + }, + "description": { + "value": "Plutselig slutt på sykkelvei. Syklende blir i veien for trafikk og det er ikke plass på fortau. Strekning er nettopp nyasfaltert og det er utrolig at de ikke benytter sjansen til å legge inn er felt for syklister", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:29:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ab3da22a7aac6063908a367dc1b0032fbcf5f46.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1025": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93175333, + "lng": 10.78831672 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister tar ikke hensyn til syklister til tross for vikeplikten.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:59:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "ef904fa14b927b7b847a2df0d77e109884d8bfca.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-111": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92467844, + "lng": 10.75046539 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig farlig å være syklist når veien snevres inn mot enden av Alex Kiellands Plass på vei sydover og sykkelfeltet blir borte. Hvor skal vi sykle?", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:33:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "4d6fc772cde4dc538e073a86a7e315432d520e67.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-88": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92457091, + "lng": 10.73973655 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble påkjørt av taxi som uten å blinke svingte over sykkelveien og opp på fortauet like foran meg. Jeg kom i full fart på sykkel ned bakken og hadde ikke sjanse til å svinge unna. Ble truffet i siden av taxien og gikk rett i bakken med nakke- og håndleddskade som resultat.", + "type": "String" + }, + "date": { + "value": "2014-09-09T10:42:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "29dfd78dc9f938495371caed80f72789637e14cb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-309": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89537364, + "lng": 10.75728893 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal sykkelvei blir ledet inn i en 90-graders sving, i en kort, bratt oppoverbakke inn i en smal \"tunnell\". Umulig å se om det kommer noen imot. Midt i den krappe svingen er det dessuten umulig å passere en annen syklist. Skummelt nok med fotgjengere som går der, gjerne midt i veien. Denne vei", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:25:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "1fec175c853007c2fa332b9ebbe5afd188b95be8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-895": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92881819, + "lng": 10.8058691 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er sykkelveien lagt igjennom bussterminalen, som fører til at syklister i sykkelfeltet blir skivset enten mellom buss som skal til holdeplass og fortau, eller (om man legger seg forbi bussen) mellom buss og øvrig trafikk i venstrefeltet. Skjer statid nestenulykker og det er VELDIG FÅ som sykler her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:39:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "efbfce42199b892c5f9b0f748dda0499cbd6d2a5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-933": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93757984, + "lng": 10.76748132 + }, + "type": "LatLng" + }, + "description": { + "value": "Du skal ha is i magen for å sykle i veibanen nordover herfra mot Storo.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:04:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "c577aa9fa5ff7b73cf2ee8104d248dbefcf13b27.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-472": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9173224, + "lng": 10.85474967 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har ofte syklister en fart på rundt 40 km/t når de sykler nedover bakken. Likevel insisterer biler på å kjøre forbi når det er 40-sone i Haugerudveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:43:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "b844d6764f7789e3b14b115b9515ea4c122d3200.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-87": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9190457, + "lng": 10.7092976 + }, + "type": "LatLng" + }, + "description": { + "value": "I hele Frognerveien fra Frogner plass til Solli plas er det konfikt mellom sykkel og trikk, nødt til å sykle på fortauet, særlig problematisk ved trikkeholdeplassene på Elisenberg og Frogner. Er spent på ombyggingen på Solli plass.. Sendt inn av Liv Berit Tessem", + "type": "String" + }, + "date": { + "value": "2014-09-09T10:30:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "5f46eba359ca197b8b8801341f8d0358d7121c6c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-138": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9209361, + "lng": 10.76123714 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei er for smal. Når bussen kjører forbi er det knappt plass. Ut over det er det parkerende biler på andre side. Meget farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:01:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "478bad5ec4168eee3102c1f7ab4af15892b469e0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-966": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93990156, + "lng": 10.67562103 + }, + "type": "LatLng" + }, + "description": { + "value": "For smal sykkelvei, her sykles det i begge retninger kombinert med mange skolebarn er denne veien kaotisk. Det burde være bredere sykkelvei, alternativt sykkelvei på den andre siden av veien også.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:36:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "c141b3ffa62219d60390db2c4718f0249fc11a12.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570498165033607200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Gisle G. Stokland", + "type": "String" + }, + "description": { + "value": "Alexandra Joner og Jørn Hoel på P1 $$$", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:18:56Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/563646708022652928/x2LSlJFH_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-964": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93474196, + "lng": 10.72917938 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er sykkelvei i Ullevålsveien helt frem til den krysser Kirkeveien. Når man krysser Kirkeveien over til Blindernveien er sykkelveien borte. I Blindernveien er det parkeringsplasser i ca. 500 meter før det igjen blir sykkelvei. På grunn av parkeringsplassene er det for trangt for både syklister og bilister og dette skaper farlige situasjoner hver dag. Fordi bilene prøver å komme før syklistene for ikke å ligge bak i 500 meter. Det store spørsmålet er hvorfor det er lov til å parkere på dette k", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:33:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "ea13efb8d127947269f8bdbde0c449181ab11357.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-957": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91406866, + "lng": 10.74781537 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det veldig mange fotgjengere på dagtid, som gjør det nesten umulig å sykle her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:26:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "672df839d0cac331b4d180bb9bde49b5f416e3fe.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-854": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91802925, + "lng": 10.74395899 + }, + "type": "LatLng" + }, + "description": { + "value": "Ullevålsveien (hovedsykkelveinett) sørover mot Thor Olsens gt: Sykkelfelt forsvinner før krysset, to kjørefelt er prioritert.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:22:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "9a1fdd690cc4caf660f9b782886d7ca6bb485fb5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570521894308487200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "@SpirOxy nie musi pisać, wystarczy żeby mówił w #PR1, geniusz!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:53:14Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "aftenposten-942": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.99426495, + "lng": 10.75372695 + }, + "type": "LatLng" + }, + "description": { + "value": "Maridalsveien fra Brekke til Skar er farlig for myke trafikanter på begge sider av veien grunnet mange hasardiøse forbikjøringer fra bilisters side. Det markerte krysset er et av flere på denne (og mange andre strekninger) som er farlige fordi man aldri kan vite om trafikanter vil følge vikepliktsreglene eller (stort sett) gjengs praksis med å vike for trafikk på hovedveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:13:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "71d659f0c6366924dd0571894072d4181af2908c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-916": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92768922, + "lng": 10.7133007 + }, + "type": "LatLng" + }, + "description": { + "value": "Kaos med bil, drosje, buss, syklist, blomstersalg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:42:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "0c3d92e4e983ffa087d44fd1cf69e994fc5df8b7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-308": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.932264, + "lng": 10.74152022 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister er veldig usikre på hvordan de skal ferdes i dette krysset. Mange nesten ulykker daglig. Trenger ordentlig markering for sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:25:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "8c231d7d9829afa1e950180e757c014295e312f3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-723": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95052995, + "lng": 10.68996548 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal vei gjør det umulig for biler å passere uten å presse syklister i grøften. Noe som hyppig skjer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:29:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "9dd74670cf89317d710c28c3f3f1692b3787dcde.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-784": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94933187, + "lng": 10.73120713 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som svinger til hoeyre inn i Sognsveien fra Ring 3 kan ikke se syklistene som gaar i gangfeltet foer det er nesten \"for sent\". Flere sykler over fotgjengerfeltet i fart, heller enn aa gaa av sykkelen som paakrevet. Disse utsetter seg selv for fare!", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:22:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "678654ba8076446945525d3e5ee79a9c6fab6a5e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-911": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92011337, + "lng": 10.69136023 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien ender brått der bilveien deler seg i to i krysset Drammensveien - Halvdan Svartes gate. Syyklende som kommer fra Thune og skal opp Halvdan svartes gate må krysse to felt der biltrafikken går i høy hastighet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:33:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "6970daa2d93c28715eca376fb236ea8079c108a6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570503097715429400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Gisle G. Stokland", + "type": "String" + }, + "description": { + "value": "@AlexandraJoner @SichelleMusic Dere var råbra hos #Nitimen. S/o til Jørn Hoel! @UniversalMusicN", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:38:32Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/563646708022652928/x2LSlJFH_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-986": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90813581, + "lng": 10.7560122 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt avsluttes v/ bussholdeplass i to kjørefelt som svinger til høyre mot Nylandsveien (ring 1). Syklister ender opp i mellom disse to felt mens de må rett fram. Livsfarlig og uforståelig, siden hele gaten er nybygd og burde være et eksempel for god tilrettelegging for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:07:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "4ba20b6a852fd64722571e9bc313a205a573dd59.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-307": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90755484, + "lng": 10.78132152 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som står parkert i sykkelvei foran stengt bom, i påvente av en buss eller lignende skal komme å åpne bommen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:25:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "56fe1ce83550f6ac23c9f54be79f8b47661b8edf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570489177277493250": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "Did you know that 'Northug' was Trending Topic on Tuesday 24 for 3 hours in Norway? http://t.co/HPpeAZ2ODq #trndnl", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:43:13Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-130": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91615539, + "lng": 10.7358098 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt ned langs slottsparken forsvinner først og går deretter over til enveiskjørt gate ved Nationalgalleriet. Her burde det vært sykkelsti hele veien og gitt klar beskjed om at den enveiskjørte gaten kun var for billister", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:50:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "ee5be9f2c098d85f34ad14bc249340b64e52da85.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-988": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94194368, + "lng": 10.74269771 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange fotgjengere, små barn, syklister og biler i rushtiden morgen og ettermiddag. Gaten (Jutulveien) er delvis enveiskjørt og uten plass til syklister. Dette medfører at syklistene enten stopper biltrafikken ved å sykle mot kjøreretningen, eller risikerer å treffe fotgjengere på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:08:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "c301c5b68ac7404175dcef3fdf0228f536c0ffc1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-825": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92372677, + "lng": 10.76111912 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkeringsplasser for bil innenfor sykkelfelt. med dører som plutselig åpner.Pass på for her har du god fart nedover. Har selv hatt flere nestenulykker her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:39:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "116f049d432fb7981887ea7cbab58afd2ad8b5e3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-137": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93134479, + "lng": 10.72218418 + }, + "type": "LatLng" + }, + "description": { + "value": "Kirkeveien hele. Hvordan kan dette være hovedsykkelveimettet i Oslo? Det er ikke plass til syklene. Mye trafikk biler busser og trikk! Bussene tar ikke hensyn til syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:01:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "63059bdd44a683bb4852488667d8f8d0da8fd4d5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-210": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93938026, + "lng": 10.75904041 + }, + "type": "LatLng" + }, + "description": { + "value": "Nesten alltid en hvit varebil parkert i veikanten her. Ikke ulovlig, men farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:46:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "11f0c2cc96f3f3028cacf00f1f0926155429b34c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-372": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90995935, + "lng": 10.74059486 + }, + "type": "LatLng" + }, + "description": { + "value": "\"Sykkelfeltet\" i Rådhusgata forsvinner i ingenting - syklistene må enten ut i gata foran aggressive bilister, eller opp på et smalt fortau med svært høy kant.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:00:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "5600ec65a0b3aee8b71503d7ae8c1030251c3ee7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-165": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92041988, + "lng": 10.67557811 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei krysser innkjørsel til Sjølyst Marina. Mange nestenulykker her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:23:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "52e6b4842820263351b1b0636a84819baa7089e1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-861": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91738693, + "lng": 10.66126585 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye merkelig asfalt og innkjøringer forbid Maxbo.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:29:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "268095ba7a9339c464dc61af33f237e3fff2baa0.jpeg", + "type": "String" + } + } + }, + "tweet:570502900352483300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "nie chce mi się myśleć dlaczego ferie powoli się kończą bo myślenie o tym sprawi że się wkurwie a to mi nie jest potrzebne na razie", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:37:45Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-799": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93923516, + "lng": 10.78213691 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved kryssing av avkjøringsveien fra Ring # mot trikkestallen og Nordre Åsen er det et lyskryss som åpenbart har prioritering av biler fra Ring 3. Det står daglig syklister og fotgjengere og venter på grønn mann. Det blir rødt lys for biler i begge retninger, men dersom det kommer en bil ned fra Ringveien, får denne umiddelbart grønt lys, og de myke må vente. Fordi de ser at det blir rødt for bilene begynner en del å gå/sykle, uten at de legger merke til at bilen fra Ringveien får grønt lys. Har", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:50:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "c0c81edc8bcf6d858c5fbbdbe6a3676c8449730a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-853": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91983912, + "lng": 10.72720527 + }, + "type": "LatLng" + }, + "description": { + "value": "Inn mot byen møter man her et trafikert T-kryss med dårlige oversiktsforhold og svært lite respekt for (sykkel)trafikk fra høyre", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:21:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "2b857375c88539de8999339d7678b1b81f09173d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-856": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9108899, + "lng": 10.7284069 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien krysser her trikkeskinner som går parallel. Farlig for for- og bakhjul!", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:24:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "6b15e55c27494c61e0596a5605fae490d6882362.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-815": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91365721, + "lng": 10.74719846 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er faktisk ett av de bedre strekkene jeg har på min daglige rute, ettersom gaten er bred og stort sett bilfri med unntak av varetransport. Avstanden mellom flere av hellene gjør imidlertid at det er fort gjort å sette fast sykkeldekket og spise litt asfalt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:13:35Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-339": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89821489, + "lng": 10.57549953 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble påkjørt på sykkel av en bil som kom i motsatt retning og skulle svinge ut på E18. Bilen hadde vikeplikt og så meg ikke. Heldigvis gikk det bra, men det kunne gått riktig ille.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:48:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "0d86f1416381849268cbb4201267818df40a1605.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-910": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93596744, + "lng": 10.69085597 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil som ikke så meg. Ingen alvorlig skade.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:32:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "0a0c8540a073b4253f7359d42df854888b784001.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-824": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9309685, + "lng": 10.76595783 + }, + "type": "LatLng" + }, + "description": { + "value": "Nesten ny sykkelvei føres ut fra grøntområde og rett ut i vei uten fysisk adskillelse. Hverken syklister eller biler kan se hverandre pga vegetasjon. Prøvde å melde fra til Bymiljøetaten når jeg forstod hva de holdt på med og folk på stedet sa også verbalt at de hadde valgt en uheldig løsning.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:36:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "edae92f640c06123b0d1f2f2b2c6c7bb981353f6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-828": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9271594, + "lng": 10.7200745 + }, + "type": "LatLng" + }, + "description": { + "value": "Bogstadveien er håpløst for sykelister, med trikk som går i begge veier, høye fortauskanter og alltid fullt på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:43:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "1cd71bc8203192c4bc8f7ff1b72f3f86e3197a2f.jpeg", + "type": "String" + } + } + }, + "aftenposten-892": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91710729, + "lng": 10.66005349 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange vareleveranser lastebiler, truck biler med henger, biler som skal inn og ut av butikker, roklubben osv osv som rygger ut over fortauet som er sykkelsti på samme tid.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:35:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "73c712263da590e4ad5b7cb5f8bd399b6273a446.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-985": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94307216, + "lng": 10.81067562 + }, + "type": "LatLng" + }, + "description": { + "value": "Her går gang og sykkelveien over busslomma, eller omvendt... Daglige potensielt farlige situasjoner mellom syklister og busspassasjerer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:06:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "666c909093299f7d39df0ef2e2e3f4077856e7bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-751": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94099787, + "lng": 10.92178344 + }, + "type": "LatLng" + }, + "description": { + "value": "Plankryss med både sykler og biler i fart", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:55:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "f97ae71e67584c3b7fffc44ad078e8ad8701a544.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-814": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9151712, + "lng": 10.7326126 + }, + "type": "LatLng" + }, + "description": { + "value": "Brosten på hver side av overgangsfeltet mellom Karl Johansgate og Slottparken har mellomrom som matcher bredden på et sykkeldekk som hånd i haske. Veldig glatt i regnvær.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:11:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "ce7220e508c7be6424fbdc954632c413abf24f16.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-976": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90062545, + "lng": 10.75857639 + }, + "type": "LatLng" + }, + "description": { + "value": "Ga opp å gå på inline rulleskjøyter til byen i ca 2004, - etter flere fall og småulykker og mye tapt tid i Bjørvika. Fortsatt ingen god løsning, - vi trenger sykkelvei langs E18, både inn i Sentrum (Oslogt) og ned på havna (retning festningen)", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:57:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "68eb6c2d822fefa6690288a640281ff0ce845049.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "a39a26d1-d733-473f-ae2b-b563cfa7a863": { + "properties": { + "name": { + "value": "Command post", + "type": "String" + }, + "description": { + "value": "", + "type": "String" + }, + "location": { + "value": { + "lat": 59.887211583842813, + "lng": 10.758457565116476 + }, + "type": "LatLng" + }, + "_type": { + "value": "response command post", + "type": "String" + } + } + }, + "aftenposten-829": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94557984, + "lng": 10.75567874 + }, + "type": "LatLng" + }, + "description": { + "value": "Biskop Heuchs vei er \"ferdig bygget\" hovedsykkelveinett, men har ingen tilrettelegging. Parkerte biler m/dørsone gjør veien farlig smal ved motgående eller forbikjørende biltrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:48:16Z", + "type": "DateTime" + }, + "bilde": { + "value": "504c0ec0b3abf3dd7ede659cdab4fa2a.jpg", + "type": "String" + }, + "streetview": { + "value": "7acdf6d1f428b3995578863082c700f2dc8426b2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-950": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9114493, + "lng": 10.75005769 + }, + "type": "LatLng" + }, + "description": { + "value": "Utrolig at man ikke tenkte på syklister da man pusset opp jernbanetorget. Dersom meninga er at man skal bruke andre veier i området burde dette skiltes tydelig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:20:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "8d27e8efad2f2c691b53a79a1b8394217bcf968d.jpeg", + "type": "String" + } + } + }, + "aftenposten-293": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93434421, + "lng": 10.87264537 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysser trafikken fra Ikea. Det er mye trafikk og kjørende er distrahert av flere kryss som ligger nær hverandre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:21:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "7f80464a9a5a4c38df44ab768fe5e1015e468ec3.jpeg", + "type": "String" + } + } + }, + "aftenposten-836": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9326106, + "lng": 10.74205828 + }, + "type": "LatLng" + }, + "description": { + "value": "Geitmyrsveien (hovedsykkelveinett): Farlig å bruke sykkelfeltet helt fram til innsnevring ved General Birchs gate, pga. liten bredde. Må skifte til kjørefelt i god tid.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:03:15Z", + "type": "DateTime" + }, + "bilde": { + "value": "302f82151e000a8581ba74a3d3b79a95.jpg", + "type": "String" + }, + "streetview": { + "value": "aea15345b79ed93c8294dcbfa9d6d8bd53bc3023.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-835": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93539771, + "lng": 10.74126005 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er ganske ubehagelig å få bussen bak seg hvis man sykler i veien. Hvis bussen stopper foran deg må man ute blant hissige biler eller inn på fortauet med mange mennesker som går av eller på bussen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:59:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "0254c5e227170ba2ab0c60b802a2a6e2c2526de2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570515091310956540": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.196769, + "lng": 11.103143 + }, + "type": "LatLng" + }, + "author": { + "value": "Jan-Remi Dalen", + "type": "String" + }, + "description": { + "value": "http://t.co/70L8V68Jzt", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:26:12Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2507177019/gjx68k8bxv1ikam7z8b7_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "aftenposten-209": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91329955, + "lng": 10.74437141 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler og trikkeskinner på kryss og tvers. Dekk i trikkeskinne. Megatryn.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:46:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "20bd3a572f2ae72e451eb226e8f0ff25c342ab23.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-849": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91286927, + "lng": 10.76110839 + }, + "type": "LatLng" + }, + "description": { + "value": "Total mangel på respekt for sykkelfeltet. Biler stopper hele tiden. Her så jeg Posten (Bring) stå parkert i en halvtime mens de lesset pakker..", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:17:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "2e4da949d6334ad7913c560aa2c9cfa6c7f93f04.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570498105835175940": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.954473, + "lng": 10.707767 + }, + "type": "LatLng" + }, + "author": { + "value": "Iqbal Al-Zirqi", + "type": "String" + }, + "description": { + "value": "I love new things, beginnings and restarts! I become like a white page thirsty for ink !", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:18:42Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/543094853350227969/lXd4jWmo_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "6251e5ed99ac22e0a0d1a77c53e1803c98ae8621.jpeg", + "type": "String" + } + } + }, + "tweet:570510156573888500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.43101, + "lng": 10.39211 + }, + "type": "LatLng" + }, + "author": { + "value": "Marius Jones", + "type": "String" + }, + "description": { + "value": "Kan Israel-Palestina konflikten løses? @nisrinelm, @MajedAbusalama, @environimus og @bengtoven svarer i dag kl 19:00! http://t.co/lBZw7Ez2vG", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:06:35Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3506066937/8dfc4383dc14750de566dd0a72663a43_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-745": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91659101, + "lng": 10.78338146 + }, + "type": "LatLng" + }, + "description": { + "value": "krysning ikke tilrettelagt for hovedsykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:52:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "48d3b4f2ddf4bb8ba75e40a79ffbb4358c3dbcd6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-614": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92553869, + "lng": 10.72244167 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil som sto parkert rygget plutselig ut i veibanen hvor jeg syklet mellom fortauskanten og trikkeskinnene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:21:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "fd0a7e9449c3723c9c65c8952b705e33ed3542ea.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1005": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90826492, + "lng": 10.74780464 + }, + "type": "LatLng" + }, + "description": { + "value": "De nye sykkeltrafikklysene i Rådhusgata er et godt tiltak - men de er ikke samkjørte. Man rekker akkurat ikke frem fra det ene til det andre før det blir rødt, og da sykler de fleste på rødt lys istedet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:36:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "83c7c9ecf0cc5125196804d6d7cfbb861f3bad0b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-629": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94391044, + "lng": 10.77531337 + }, + "type": "LatLng" + }, + "description": { + "value": "Forferdelig veidekke både for biler og syklister. Eneste fordelen er at det tvinger biler til å kjøre saktere enn de ellers ville gjort. Også utrolig problematisk med parkeringen i veien helt ned mot Coop og trikkeholdeplassen ovenfor Nordpolen, hvor det blir så smalt at sykler tvinges ut i veibanen", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:34:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "1843d46b36d24c0ef770bb77ff9bc9b08ef5a355.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-484": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91416439, + "lng": 10.75220775 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av syklist som kjørte mot rødt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:50:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "83df30b8254383d3a1eba1e4fdd560dad4db554f.jpeg", + "type": "String" + } + } + }, + "aftenposten-260": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92993099, + "lng": 10.74348226 + }, + "type": "LatLng" + }, + "description": { + "value": "Utmerket sykkelfelt ned til lyskryss, helt frem til stopplinje. 90 grader sving til høyre, uten sykkelfelt; i Colletts gate i møtende retning er det utvidelse til to kjørefelt, så syklister fra Geitmyrsveien har ingen plass i svingen. Sykkelfeltet begynner på ny etter ca. 40m i Colletts gate.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:11:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "459a19ea3113d1500720e02b0deed917ec9f159f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-996": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92775373, + "lng": 10.62133312 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye trafikk, mange farlige situasjoner og lite tilrettelagt for sykkel videre ned Vollsveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:30:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "d067c5213e26ba32405e9afb0a8a974fb068d0c6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-153": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89498618, + "lng": 10.75801849 + }, + "type": "LatLng" + }, + "description": { + "value": "Sikkerheten for syklister er overlatt til de som arbeider med det nye krysset. Det er satt opp gummihjul som sperringer. Sykkelveien er ledet gjennom en avkuttet container. Lastebiler og gravemaskiner står iblant ut i sykkelfeltet og skaper farlige situasjoner for oss.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:14:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "2b8af62492b59fd93766792be01f7fba7566a74c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-944": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93613943, + "lng": 10.73179721 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien ned mot Kirkeveien er livsfarlig. Biler presser seg frem i sykkelfeltet ned mot krysset. I tillegg er det både buss og trikkestopp i krysset. Hender at biler som kommer nedover Songsveien stopper i veibanen for å slippe av pasasjerer. Har ved flere anledninger nesten kjørt inn i bildører som åpnes og dermed sperrer sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:14:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "70656efe077079c263c56e1b0a216d2c40d2b5d8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570504787847987200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "chodzi jakaś legenda że ma babka z biologii pytać w poniedziałek nom okej to niech se pyta ja mam np to bajlando jebne se i po problemie", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:45:15Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-722": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88239661, + "lng": 10.77960491 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det sykkelfelt, men mange bilister kutter svingen ved å kjøre i sykkelfeltet. Merkingen slites også raskt vekk. Fysisk skille ville gjort det tryggere å sykle her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:29:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "6a49e90b9df7ec4eb127ed4311f671f59b4fec76.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-742": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94293245, + "lng": 10.72244167 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktelig område med trafikk i flere veier fører daglig til farlige situasjoner", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:50:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "8a97d8a4df63857b721eb74a59a9f605e0f66dc3.jpeg", + "type": "String" + } + } + }, + "tweet:570510164916346900": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.18887, + "lng": 11.096095 + }, + "type": "LatLng" + }, + "author": { + "value": "Herr Haakon", + "type": "String" + }, + "description": { + "value": "Et kamera og ivrige folk fører til varierte kontorer, i mellomtida tror jeg ikke han her tør å kaste… https://t.co/MkNkDywQXZ", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:06:37Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-g-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/11005171_932477346772318_1646147013_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/472804443960791040/kncc1dwM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-897": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88049619, + "lng": 10.78617095 + }, + "type": "LatLng" + }, + "description": { + "value": "Retning nordgående/mot byen står det i morgenrushet hundrevis av meter med biler i kø her. Livsfarlig dersom noen åpner døra på passasjersiden. En morgen måtte jeg ringe 113 for en syklist som opplevde dette. Han lå på fortauet med relativt store smerter. Viktig å sykle rolig her!", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:48:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "1e2a322ea17e8a3520f1751869865fbc39e80c40.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-741": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93330143, + "lng": 10.74926376 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som skal til høye fra Uelands gate til Collets gate sjekker ikke i speilet for å sjekke sykkelfeltet. Har opplevd mange ganger at biler plutselig svinger til høyre og kjører rett foran meg i sykkelfeltet. Sykler ikke lenger i Uelandsgate.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:50:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "494d0e9c1755190e42156b258d499ba5f0bba7d4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-726": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9280754, + "lng": 10.73892369 + }, + "type": "LatLng" + }, + "description": { + "value": "Jeg sykler ofte fra St. Hanshaugparken ned til Oslo sentrum via Ullevålsveien. Det er er svært traffikert gate med mange sideveier. Selv om den delvis har sykkelvei, opplever jeg ofte \"neste-ulykker\". En del av problemet er at selv om det er sykkelvei på høyre side av bilfeltet fra krysset ved Waldemar Thranes, så forsvinner denne sykkelveien halvveis ned Ullevålsveien. Etter trafikklysene ved domkirka oppstår det en ny sykkelvei midt imellom bilfeltene. Jeg føler meg svært utrygg når jeg sykl", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:32:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "4514d4a577d770bae17d9daf35b6642c80dfd9e5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-306": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93448396, + "lng": 10.74377059 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussholdeplass går inn i sykkelvei, stort problem svært mange steder med busser som kommer bakfra og krysser før syklist slik at syklist må hive seg ut i kjørebane uten tid/mulighet til å se seg for.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:25:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "d0a0f492e6a1ab2d476bffbd7abb18ba6121e1a9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-954": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93403246, + "lng": 10.72767734 + }, + "type": "LatLng" + }, + "description": { + "value": "Når du skal sykle fra Ullevål sykehus og til Majorstuen er det malt en stripe hvor syklistene kan sykle på veien. Men med leddbusser og stressa bilister er det med livet som innsats. Bilene som skal i kryss til høyre mot Marienlyst bryr seg ikke om at syklister kommer i stripen sin, de bare tuter med hornet og krysser den lille stripa uten å se seg for\\\\\\\\vente til det er forsvarlig og krysse (her har jeg selv nesten blitt overkjørt). Denne stripa forsvinner plutselig i det store krysset på Majors", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:25:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "adfd52dfc8ba462d557279c92d14e1ad0467cd09.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-767": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91495607, + "lng": 10.74956417 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvorfor en bom her? I en hovedsykkelvei?", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:07:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "02c18307105e97d3346e431ab08ce10d76b83ac2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-371": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93205436, + "lng": 10.76183795 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner brått, og det er vanskelig å vite hvor man skal gjøre av seg. Burde vært laget sykkelfelt, eller i verste fall vært merket bedre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:00:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "a7f6b865a8b3b1e6618d9f75f51d65bb51054247.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570521575126134800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.193863, + "lng": 11.099088 + }, + "type": "LatLng" + }, + "author": { + "value": "Dace Dombrovska", + "type": "String" + }, + "description": { + "value": "I'm at Oslo Lufthavn (OSL) - @osloairport in Gardermoen, Akershus https://t.co/3D6SqiuDM5", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:51:57Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/415974160360566785/JYOJk8nb_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099CC", + "type": "String" + } + } + }, + "aftenposten-670": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92759245, + "lng": 10.77333927 + }, + "type": "LatLng" + }, + "description": { + "value": "om man kommer fra Torshov og tar til venstre langs Ring 2 mot CB kommer man inn på en kjempe fin sykkeltrasè. men når man skal fortsette mot CB må man opplyse om at man burde krysse Ringveien for å slippe å havne i motgående sykkelfelt på ring 2... har selv gjort det et par ganger, men nå har jeg lært.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:21:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "6e7ab59deec33473496e5181f9d1d6579dff1ddc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570512742093877250": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Martin Hayes", + "type": "String" + }, + "description": { + "value": "@AdeccoNorge takk for det :)", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:16:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/537187008959893504/-VcylG0s_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-860": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91029016, + "lng": 10.73924839 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlige kantstein og brostein samt vanskelig å se hvor sykler bør passer denne plassen i østgående retning", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:27:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "f44c23ca7f210f69114af6147d312bd6a5f2d949.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-110": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9224632, + "lng": 10.67956924 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundkjøringer på Skøyen, kryss Hoffsveien/Drammensveien og Bygdøy Allé/Karendlyst allé. Her ender sykkelruter ut i rundkjøringer med svært stor biltrafikk. Mange farlige episoder.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:33:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "237f9a2f917deb26ce5c552e4281ba92ecb239ea.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-878": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90941714, + "lng": 10.742811 + }, + "type": "LatLng" + }, + "description": { + "value": "Kirkegata nordfra mot Rådhusgata. Syklende har ett eneste trafikklys å forholde seg til i krysset. Dette er bygget inn bak et skur, slik at det ikke er synlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:03:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "eafd2faf200244a541b12d6ccab82e9db3b59064.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-871": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91251364, + "lng": 10.72759323 + }, + "type": "LatLng" + }, + "description": { + "value": "Munkedamsveien: Hovedsykkelvei, men ingen tilrettelegging. Stor busstrafikk. Farlige forbikjøringer er dagligdags.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:48:04Z", + "type": "DateTime" + }, + "bilde": { + "value": "ce7cae58c0f6b4c8bb407a66371ee99f.jpg", + "type": "String" + }, + "streetview": { + "value": "1ccb0bd6f1848b20602ade66d4574dcf5f940ef7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-129": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91192263, + "lng": 10.73153972 + }, + "type": "LatLng" + }, + "description": { + "value": "Ulykker ukentlig som et resultat av at syklister sluses inn sammen med gående, anleggsarbeidere/maskiner og trikkeskinner.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:48:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "e61b954fcd769858b242354ab21cc9ff2f665ada.jpeg", + "type": "String" + } + } + }, + "aftenposten-338": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9108899, + "lng": 10.72999477 + }, + "type": "LatLng" + }, + "description": { + "value": "Mann på sykkel sklei på trikkeskinnene. Tør ikke tenke på hva som hadde skjedd hvis trikken hadde kommet rundt svingen akkurat da. Aker Brygge er livsfarlig for gående og syklende.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:48:11Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-613": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93583844, + "lng": 10.73179721 + }, + "type": "LatLng" + }, + "description": { + "value": "Uklart hvorvidt man skal sykle på smalt fortau eller i en litt for trafikkert vei", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:19:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "5d2dfbbd5c449508d18ec09f36819ded6e5cee96.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570501337722581000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.549694, + "lng": 10.18037 + }, + "type": "LatLng" + }, + "author": { + "value": "ALISE", + "type": "String" + }, + "description": { + "value": "Jeg bare elsker å kjøre bil.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:31:32Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/528645960449417216/86iDPgNc_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "D02B55", + "type": "String" + }, + "streetview": { + "value": "930f862e3393c81f415f8024b7fd30dfce4625d8.jpeg", + "type": "String" + } + } + }, + "aftenposten-140": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92379666, + "lng": 10.7339859 + }, + "type": "LatLng" + }, + "description": { + "value": "Siden det ikke er ordentlig sykkelvei så kjører biler ganske fort", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:04:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "04066e60c9b1c64c8e26994da6674bfe2f9b507d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-305": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92925901, + "lng": 10.71669101 + }, + "type": "LatLng" + }, + "description": { + "value": "Majorstuekrysset trenger oppmaling av sykkelveier i asfalten. mange bilister er så stresset her at de ikke engang SER syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:25:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "daaff9f86206577776c95669a93789c33b2223ba.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-845": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92767137, + "lng": 10.73932456 + }, + "type": "LatLng" + }, + "description": { + "value": "Geitmyrsveien (hovedsykkelveinett) sørvestover. Farlig ved sving til venstre i Ullevålsveien (også hovedsykkelveinett) pga. manglende tilrettelegging i krysset. Sykkelboks og reduksjon til ett kjørefelt nødvendig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:12:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "d09be2dc157c1fea29c49320933f28d5d4633757.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570501865298919400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.739833, + "lng": 10.770788 + }, + "type": "LatLng" + }, + "author": { + "value": "Kenneth", + "type": "String" + }, + "description": { + "value": "@HaraldNatvik Carew hælsparker ballen mellom beina på R. Carlos i Madrid og scorer. Det var muligens i en gruppekamp but still..", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:33:38Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560128350354935809/7s3tLWjq_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "5F9DC7", + "type": "String" + } + } + }, + "aftenposten-292": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91420312, + "lng": 10.74825525 + }, + "type": "LatLng" + }, + "description": { + "value": "Gågate - er dette hovedfartsåren for sykler i Oslo? Jeg forstår lit hvordan man har tenkt at man skal komme seg fra Karl Johans gate til den delen av Torggata som er tilrettelagt for sykler etter Youngstorget.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:21:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "8d885a05b91c185389a38556510bee3ea613859c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-119": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91123415, + "lng": 10.73205471 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien vestfra stopper opp når den kommer til Aker brygge/ og Rådhusplassen. Ingen sikre ruter videre, enten i Munkedamsveien uten sykkelfelt eller over Rådhusplassen med ujevne steinheller og i konflikt med gående.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:42:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "5336df35e4309d67071d6449c8d34542db7f5810.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1019": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9319576, + "lng": 10.77280282 + }, + "type": "LatLng" + }, + "description": { + "value": "Nedover her går jeg til jobb hver morgen. Syklistene kommer susende forbi og har verken planer eller muligheter til å stoppe. I går morges endte det med smell da en syklist kom i full fart nedover undergangen og kjørte rett på en annen syklist som kom oppover. Her oppleves det utrygt for fotgjengere.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:53:05Z", + "type": "DateTime" + } + } + }, + "aftenposten-766": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92906548, + "lng": 10.71581125 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er et av de farligste kryssene jeg er bort i til daglig. Det er også eneste kryss som går øst-vest i denne delen av byen. Man tvinges til å gjøre enten bilister, busser eller fortgjengere sure. Evt. står man i fare for å dø. Sykkelfeltene bør merkes tydelig gjennom hele krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:06:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "1b10e8b2966ff17b3bbac3c23e8de10b3b20b6ec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570491847820349440": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.405936, + "lng": 8.469803 + }, + "type": "LatLng" + }, + "author": { + "value": "Martin Årseth", + "type": "String" + }, + "description": { + "value": "I juryens grunngjeving heitte det at Quisling sette Vest-Telemark på kartet.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:53:50Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565844346734673920/wAWqrg0P_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-887": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91622531, + "lng": 10.7804203 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er to kjørefelt oppover Økernveien fra Tøyenkrysset og biler som skal til høyre i krysset ligger i høyre felt. Krysset ved Kampen park er lysregulert og det er ofte rødt lys (rett fram), men grønt lys til høyre. Hvor skal en syklist som skal rett fram (videre langs Økernveien) ligge plassert? Sykkelfeltet er innerst og til høyre, og blir som \"vanlig\" borte rett før krysset. Ved rødt lys (rett fram) må man stoppe, men man står da midt i veibanen til de som skal til høyre (som har grønt lys", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:26:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "d5ba0bf89f0cd7f77fe20f4ef3cc85fa6664005e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-463": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92267828, + "lng": 10.68521261 + }, + "type": "LatLng" + }, + "description": { + "value": "At dette er sykkelveien mellom Thune og Skøyen er ikke lett å forstå. Først nå, pga. denne siden, oppdaget jeg det. Har syklet over Thune i fire år nå. Har alltid valgt å bruke kollektivfeltet i Drammensveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:40:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "90e9751f56b15bd4cf975723eec3a8c47b24e41c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-886": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92215133, + "lng": 10.7573533 + }, + "type": "LatLng" + }, + "description": { + "value": "Den dårligt markerede sykkelvei på Markveien syd for Schous Plass forsvinder pludseligt ved Schous Plass - og nord for pladsen er veien ensrettet. Meget uklart, hvor man da skal køre hen. Sykkelstien på Markveien bør markeres bedre", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:26:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "c8dfee8112946f7b4df37f5c5ec36ba6fe84cab8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1024": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96464034, + "lng": 10.67228704 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilist som kommer opp holmenkollveien kjører rett inn i meg (som er på vei nedover) i det hun krysser mitt felt for å svinge inn Kongeveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:58:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "eaef6a33a1d00d1cb8525bd3280705324eec82cb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "tweet:570492306001944600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 67.282755, + "lng": 14.386021 + }, + "type": "LatLng" + }, + "author": { + "value": "Daniel B.-Simonsen", + "type": "String" + }, + "description": { + "value": "Bra! Enkle mekanismer i kompliserte spørsmål. Volum gir plass i det nasjonale landskapet. Konsolider, så spesialiser. http://t.co/9NjzUftbgy", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:55:39Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/439381743292796928/_g0Y-RmN_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "187e382b22a7f56eaa41bbc9a881a183b51fe083.jpeg", + "type": "String" + } + } + }, + "aftenposten-730": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91868275, + "lng": 10.75737841 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien i Markveien avslutter rett ut i Søndre Gt/Ankerbrua. Syklister kommer gjerne i bra driv norfra og det oppstår konflikter med biler stadig vekk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:42:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "d350f6ffe07d8be02a548f40c4e7eb6d2d5b5803.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570497867594530800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.921215, + "lng": 10.76972 + }, + "type": "LatLng" + }, + "author": { + "value": "rodebjörling", + "type": "String" + }, + "description": { + "value": "@jafastne vad är detta??????", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:17:45Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/563111949576470528/dR4EABR-_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "000000", + "type": "String" + }, + "streetview": { + "value": "f986185f3d7858fa8a5609195aef01fe92ae70d2.jpeg", + "type": "String" + } + } + }, + "aftenposten-975": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87623196, + "lng": 10.77608585 + }, + "type": "LatLng" + }, + "description": { + "value": "Stupte på trynet i bakken her for et par år siden da en pære hadde gått, denne omveien fra E18 har skolebarn, høstløv og er mørk og svingete", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:54:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "7292937bf9b253b6b105c28174d0d385a7958374.jpeg", + "type": "String" + } + } + }, + "aftenposten-1023": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90533845, + "lng": 10.82127571 + }, + "type": "LatLng" + }, + "description": { + "value": "bilister legger seg i hø del av veien for å passere biler som skal til ve på E6 uten å ta hensyn til syklister som sykler der.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:57:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "f135963447768b0d15e8357595f26941abba357e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570485591055441900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.435844, + "lng": 10.483644 + }, + "type": "LatLng" + }, + "author": { + "value": "Tobias FogthJakobsen", + "type": "String" + }, + "description": { + "value": "@AvisenKhrono Gratulerer til @HiB, men ikke glem høgskolene som har økonomisk og faglig mot til å stryke studenter. http://t.co/EY7p3LDR4r", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:28:58Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/452033560594366464/_ad7kb_o_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "93A644", + "type": "String" + } + } + }, + "aftenposten-681": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.84529991, + "lng": 10.80370187 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt bakfra av bilist på vei sørover der det blir to filer frem til lyskrysset, Sykkelstyret traff sidespeilet som ble slått inn i bilen. Bilist stoppet ikke. Uskadet selv.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:40:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "4053bc1f77838bdcf634ca859d0a59ce9459c332.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-973": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94316889, + "lng": 10.69900989 + }, + "type": "LatLng" + }, + "description": { + "value": "Utkjøringen fra gang- og sykkelveien langs Ring 3 er trang (bom) og krapp og kommer ut i fortau(?). Kommer man sørfra må man velge mellom å kjøre videre på fortauet, eller ut i kjørebanen via gangfeltet (som forvirrer bilistene fordi man ikke skal krysse veien, bare pluselig bli en kjørende).", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:44:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "39125bd69ded0b30561a77789a834ebc1f366b9e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-838": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91001583, + "lng": 10.7345277 + }, + "type": "LatLng" + }, + "description": { + "value": "Skummel plassering av P-plasser rett etter passering av smal åpning mellom bom og pullerter. Her sykler det mange hundre om dagen. Bare et tidsspørsmål før noen rygger rett ut i en passerende syklist.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:04:55Z", + "type": "DateTime" + }, + "bilde": { + "value": "6efdbae9248a3bb042214e89bbb47033.JPG", + "type": "String" + }, + "streetview": { + "value": "89ee7bc9a50e116fcf022d4bbd8a16ea919cf89d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-885": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93562345, + "lng": 10.73947906 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er en vei med god plass når en ser fortau og vei i sammenheng. Det er nettopp lagt ny asfalt, men ingenting er gjort for å bedre sikkerhet for syklister. Dette er en skandale! Jeg sykler her hver dag - nesten med livet som innsats!", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:21:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "83d87cf8400cfd8bcbc6aa40f768fa24504e526b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-750": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94063781, + "lng": 10.91644048 + }, + "type": "LatLng" + }, + "description": { + "value": "Plankryss med både sykler og biler i fart", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:55:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "9d010be16b31ebde136e59cedf67a4b54f69e107.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-859": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91050262, + "lng": 10.72055339 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det TOTALT kaos. Mest skyldes det at syklister dundrer over fotgjengerfeltet selv om bilistene ikke har vikeplikt for dem. Det gjør at bilister vender seg til å stoppe for dem, og når jeg som syklist stopper oppstår det kaos. Eget lyskryss med lyssignal også for sykkelveien?", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:26:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "ef73e8904a5023a70269d39bc665bf7b19020ace.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-951": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91406866, + "lng": 10.74781537 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det veldig mange fotgjengere på dagtid, som gjør det nesten umulig å sykle her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:22:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "672df839d0cac331b4d180bb9bde49b5f416e3fe.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570486348408332300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "M83 مِنْيار ", + "type": "String" + }, + "description": { + "value": "تقريبا اسبوع ما وقف المطر أبدا .. بس برضو المطر أهون من التلج ..\n\nصباح الخير ..", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:31:59Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/540943886193946625/mdF7xrck_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "aftenposten-337": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93078573, + "lng": 10.80732822 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye tungtransport i veien. Veldig smalt fortau på bare en side. Ingen plass å gjøre av seg på sykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:46:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "7bb36364e28c92d6db83de50babd5df8fdd87749.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-262": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93523377, + "lng": 10.74445724 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet ligger midt mellom to bilfelt, uten noe forbindelse med sykkelfeltet på høyre side av veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:11:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "1cc91495b5ac8fe6df89636d6063e6856a9716ca.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-744": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92480748, + "lng": 10.73480129 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Sofiesgate er en sykkelveimulighet som ikke er benyttet. Strak og bred vei for sykkel nesten helt til sentrum.I stedet har man enveiskjørt vei i nord, kronglete kryss sør for Bislet stadion, der noe som likner et sykkelfelt i kim dukker opp og forsvinner mellom fotgjengerovergangene. Kan tilretteleges med enkle midler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:52:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "322eff00bf3aaaf57ba44424c0ce43795ca05aee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-762": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9319361, + "lng": 10.7621169 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvant.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:04:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "dab42c1457cf22fef1818e1951d8b1fc6e5a4152.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-317": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89929105, + "lng": 10.75870513 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange bilister, både oppover og nedover Kongsveien, føler behov for å kjøre forbi i denne kurven. Det er umulig å se skikkelig rundt svingen og det oppstår ofte farlige situasjoner når bilisten presser seg forbi på smal uoversiktelig vei for så plutselig innse at det kommer motgående trafikk. Video:", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:28:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "3847bc7adc42afac010e0486acea48280247728b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570497036618993660": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Captain Redbeard", + "type": "String" + }, + "description": { + "value": "@miss_raej Double Brie with some jam/chutney!", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:14:27Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562146030938890240/EyInFFie_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-873": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91172405, + "lng": 10.73416829 + }, + "type": "LatLng" + }, + "description": { + "value": "Hieronuymus Heyerdals gate er angitt som \"hovedsykkelveinett\" på dette kartet, og skal være det ihht. gatebruksplanen. Men den er enveiskjørt sørover.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:53:39Z", + "type": "DateTime" + }, + "bilde": { + "value": "ac3c488b278b1591b91218f24d969e77.jpg", + "type": "String" + }, + "streetview": { + "value": "e5b44441fe1d87430ae4b9877e457255e761cea4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-740": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92765158, + "lng": 10.71307539 + }, + "type": "LatLng" + }, + "description": { + "value": "Kjørte rett inn i bil som krysset sykkelfeltet inn i Maries Vei uten å bruke blinklys. Hadde passert meg sekunder før. Sykkelen hadde 2 sett med baklys samt lys foran. Gikk over styret, knakk forhjulet og noen skrubbsår.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:50:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "8c5d1d51926be0820e92082fb1ab140b62529cc3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-128": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91283162, + "lng": 10.74613094 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen lysregulering inn i sykkelfelt som går i motsatt retning av bilenes kjøreretning.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:46:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "b4aefd6e1d20405e1ef2cf9743a692bfafa15cf4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-164": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91151385, + "lng": 10.72716236 + }, + "type": "LatLng" + }, + "description": { + "value": "konflikt mellom Sykkel,bil og trikk. veldig uoversiktlig med mange sykelister .", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:22:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "769e0cd0b8bb6f3bbf0b194f5bfc7e5172d096bf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570519327893536800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 61.560987, + "lng": 6.400516 + }, + "type": "LatLng" + }, + "author": { + "value": "Frank Anders B. Åmot", + "type": "String" + }, + "description": { + "value": "#pallestol i kosekroken @ Helgheim, Jølster https://t.co/OA50NCDVJy", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:43:02Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-f-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/11015552_993516184009773_976281556_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1538570066/avatar_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-739": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91467641, + "lng": 10.78763008 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig tilrettelagt krysning. Folk kjører in og ut av parkeringsplass foran Reme 1000 over gangfelt og sykkelfelt og ser bare på andre biler. Kompleks og travelt. Utkjøring fra parkeringsplass bør stenges.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:49:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "0bd6cd3d4ec8683dda4373b2a0eac881524dcd03.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1015": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91114809, + "lng": 10.7331705 + }, + "type": "LatLng" + }, + "description": { + "value": "Rådhusplassen burde hatt en oppmerket sykkelvei slik at man unngikk konflikter med fotgjengere. Ofte er også store deler av plassen stengt for arrangement og man må sykle mellom telt og gjerder. Spesielt ille nå de siste dagene hvor store deler av plassen er okkupert. I tillegg står det ofte biler parkert utenfor vestbanen og den \"beste\" veien å sykle er i trikkesporet utenfor gamle Vestbanen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:49:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "1df255af72b0f983a0eca19b2502a85c08bcb14f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-448": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92231936, + "lng": 10.70492684 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler fra Frognerveien overholder sjeldent vikeplikten ovenfor syklister i rundkjøringen. Gangfeltet 10 meter opp veien gjør slike situasjoner verre fordi syklisten ikke kan bruke hele veibanen pga hull og langsgående kanter.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:29:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "f4016be8bdebc0e98fe97bb63afed868946281f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-534": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93583844, + "lng": 10.93255519 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig inn/utkjøring fra industriområde, har nesten blitt kjørt ned.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:15:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "428e7a043f0c8e1365bee4f2da5e92b402e89d6d.jpeg", + "type": "String" + } + } + }, + "aftenposten-483": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91797714, + "lng": 10.79853594 + }, + "type": "LatLng" + }, + "description": { + "value": "Stor varebil fra Hurtiggutta har ikke tid til å vente. Presser seg forbi men må svinge inn for å unngå frontkollisjon før bilen er forbi. Presser sykkelen inn i fortauskanten og jeg velter (heldigvis) opp på fortauet. Ser at varebilen skal til venstre i Gladengveien, et punkt jeg hadde vært ved 15 s", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:50:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "d89520ceb2ede93dfbb711a1a99a8710f1b09acb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-370": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90783457, + "lng": 10.76801776 + }, + "type": "LatLng" + }, + "description": { + "value": "Her forsvinner sykkelfilen rett inn i trikkeskinnene...", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:59:38Z", + "type": "DateTime" + }, + "bilde": { + "value": "dfd7215dee6567d3983f145de55a8692.jpg", + "type": "String" + }, + "streetview": { + "value": "b164a2a086451d59553d037aca62262162808dc7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570489148768956400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "GAFFA.no", + "type": "String" + }, + "description": { + "value": "Sjekk ut den nye singelen til The Tallest Man On Earth (@tallestman) -- http://t.co/EEgyxX3jQh", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:43:06Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561092082480078848/HmfDxO1J_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-628": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93024816, + "lng": 10.79295158 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet Løren-Økern: Her er det bygget p-plasser på innsiden av sykkelveien. Dørene slår ut i sykkelfeltet. Det er nedoverbakke, ingen så syklene holder fort vekk 30-40 km (40 er fartsgrense)", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:33:49Z", + "type": "DateTime" + }, + "bilde": { + "value": "cb00bd5bca2dfc90761c58be3c6d18bd.jpg", + "type": "String" + }, + "streetview": { + "value": "938ba71320dbf23bb47dbb0997711b7081363a0e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-86": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91345014, + "lng": 10.64249038 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelbroen ned fra Lysakerlokket ender rett ut til en vei der bilene kommer rundt en sving og dessuten akselererer ut av en rundkjøring.", + "type": "String" + }, + "date": { + "value": "2014-09-09T10:20:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "835e25beb6629b1831005a6bfa8536b99fd91b4d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-259": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.880725, + "lng": 10.78603148 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står det ALLTID biler parkert i sykkelfeltet – og ingen bryr seg. Skal sikkert bare en kjapp tur inn på apoteket, men det utfgjør en fare for syklister som må legge seg ut i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:10:12Z", + "type": "DateTime" + }, + "bilde": { + "value": "1e634cda73b17203190a71891b5dfe22.jpg", + "type": "String" + }, + "streetview": { + "value": "bee83fec45d8087da08d559217ed7307fb4adc9d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-261": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92826984, + "lng": 10.75304031 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ingen sykkelsti. Der man sykler på høyre side er det fullt av lappete asfalt, store hull og ikke minst er det en stor kum som er ca 20 cm lenger ned enn veien. Livsfarlig hvis man havner oppi der. Også en del biler som kommer ut fra parkeringskjellere på strekningen fra elva til Alexander", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:11:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "d43b587d7e771fbd16720b09a8e99e23e9f200ba.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-664": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92109741, + "lng": 10.76108694 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler kjører stadig inn denne gaten uten å se i speilet etter syklister. Har holdt på å kjøre inn i døra på en bil flere ganger. Nedover denne gaten går det fort. Her er det bare å holde på bremsene og anta at bilene ikke ser deg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:12:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "b3b3a3a36f9c386b36e311ad32b5de6ec656e766.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-1022": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.97446089, + "lng": 10.92137575 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil som skulle inn privat innkjørsel (med dertil tilhørende vikeplikt) kjører rett inn i meg. Brukket krageben og 2 brudd i håndledd. Bilist kom bakfra, men \"så meg ikke\"...", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:56:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "e3c9fdf27ecf62018717be25fb2442e62c079437.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-738": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90755484, + "lng": 10.75763225 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kommer fra Operaen på sykkelvei gjennom anleggsfeltet står det store skilt som både sperrer utsikt og strekker seg ut i sykkelveien. Dette gjør svingen inn på fortau i Dronning Eufemiasgate farlig, særlig når det kommer mange syklende samtidig. Da blir det farlig trang, men ser ikke de som kommer imot og jeg undrer på når jeg får en syklist i magen eller et skilt i hodet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:49:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "94e16e3ae737d4ac364ff82437dc803feb454396.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-274": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93385508, + "lng": 10.72681903 + }, + "type": "LatLng" + }, + "description": { + "value": "I dag hadde noen satt opp et \"veiarbeid-skilt\" midt i sykkelfeltet på slutten en nedoverbakke. Førte til farlig situasjon hvor syklister plutselig må skifte kjørefelt. Generelt dårlig oppmerking av sykkelfelt siste måned.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:15:08Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-663": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94039598, + "lng": 10.75029373 + }, + "type": "LatLng" + }, + "description": { + "value": "Taxi som ikke overholdt vikeplikten for syklist fra Mogata, Påkjørsel bakfra. Ødelagt bakhjul, Taxien kjørte videre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:09:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "0ad08cc900cb47d9039215726c51701e61463fd2.jpeg", + "type": "String" + } + } + }, + "aftenposten-304": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93030192, + "lng": 10.74321269 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussholdeplass går inn i sykkelvei, stort problem svært mange steder med busser som kommer bakfra og krysser før syklist slik at syklist må hive seg ut i kjørebane uten tid/mulighet til å se seg for.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:25:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "d717cd052bc7461beacc5b3cf35e37c4d21cd723.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-558": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90929772, + "lng": 10.74329853 + }, + "type": "LatLng" + }, + "description": { + "value": "Når døren til Statholdergaardens matkjeller åpnes sperres hele sykkelfeltet. Åpnes den innenfra er det umulig å se at hele sykkelfeltet sperres og det er heller ikke mulig å se om det kommer syklister. Fatter ikke at det er lov å ha en inngangsdør som blokkerer hele sykkelfeltet hver gang noen skal", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:40:46Z", + "type": "DateTime" + }, + "bilde": { + "value": "67280ecfc9e6550ec5e191f34284ebca.JPG", + "type": "String" + }, + "streetview": { + "value": "67098348cd5a79b64a6b41fbd253263c0806563e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-642": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91348376, + "lng": 10.64275592 + }, + "type": "LatLng" + }, + "description": { + "value": "super farlig", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:43:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "6af6d44b3b690df934b6248e631e8c62488c050b.jpeg", + "type": "String" + } + } + }, + "tweet:570509954458787840": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.963587, + "lng": 10.731299 + }, + "type": "LatLng" + }, + "author": { + "value": "Aksel Tollåli", + "type": "String" + }, + "description": { + "value": "Ooooh! Ingeborg Gillebo is doing Cardiff Singer of the World! Surely must be the first Norwegian in ages. http://t.co/JWbR864xgL", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:05:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/563830205849280512/9Nah-Rak_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570488978836758500": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "@philhester This was how it looked on my feed... http://t.co/H0JqiL8ZBf", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:42:26Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rIs8iUIAAzdVK.png", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "aftenposten-662": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90934076, + "lng": 10.6288433 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom joggende inn mot Fornebu fra Lysaker langs Fornebuveien, helt inntil kanten på venstre side. To syklister side om side kommer bakfra på høyre side, en syklist i mot på sin høyre side. Ikke plass til alle fire i bredden. Syklisten i mot bråbremser rett foran meg og sparker meg i leggen da han mener jeg bør hoppe ut av veien og i grøfta så han slipper å bremse ned når han kommer så fort. Trivelig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:09:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "6372d215f20084a7ffd8e622814228514d23b606.jpeg", + "type": "String" + } + } + }, + "aftenposten-291": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92148457, + "lng": 10.75743913 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelbanen mellom Sofienberggata og Søndre gate er dårlig merket hvilket medfører at syklister og fotgjengere ofte kommer i konflikt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:21:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "923755a11e0ba73f2c7602332157b8caa0fb17e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-208": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93224384, + "lng": 10.74160873 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet stopper opp før svingen (begge retninger). Det er satt opp trafikkøyer i betong som snevrer inn kjørefeltet slik at det ikke er plass til sykkelfelt gjennom svingen. Utenfor nr. 52B står det ofte parkert en bil like før sykkelfeltet begynner igjen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:45:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "a1391d4fa9f804836d7d00a4381181c5338d6d14.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570485534226812900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.474099, + "lng": 6.226066 + }, + "type": "LatLng" + }, + "author": { + "value": "Christina Sæthre", + "type": "String" + }, + "description": { + "value": "Du veit det e en tung dag når 5 av 30 møte opp te timen", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:28:45Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/564014205435928576/mwH8CNUj_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-251": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88745131, + "lng": 10.77115058 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelsti ender brått i en veldig travel sving med biler, trikk og fotgjengerfelt ed skole - fortsetter i veien, som er ualminnelig smal og har mye rushtidstrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:04:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "da8786c76dd5c1e0bc12d153dbd59aabc8de80db.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570502974415491100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.749027, + "lng": 5.446258 + }, + "type": "LatLng" + }, + "author": { + "value": "ANNA LUNDEN", + "type": "String" + }, + "description": { + "value": "@VGlista2015 ISAC ELLIOT TIL BERGEN💕\n#vglista da kommer eg😍🙏❤💕", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:38:03Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570339980041703424/yEry0mX3_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "a5131ff2ef3bd87cb64f67224203b9ca38545982.jpeg", + "type": "String" + } + } + }, + "aftenposten-646": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90751181, + "lng": 10.75784683 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet brukes som på- og avstigningssone for biler foran Barcode-byggene. Sjansen for døring og pressing mot fortauet er stor.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:45:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "43fea6df11af2244be8dca0293aeef12cb39f89e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-207": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9180968, + "lng": 10.85080146 + }, + "type": "LatLng" + }, + "description": { + "value": "Idiotisk løsning for av- og påkjøring til splitter ny sykkelvei, som skaper forvirring og farlige situasjoner hver eneste gang. Eneste mulighet nå er fotgjengerfeltet umiddelbart før rundkjøringen. Eksisterende sykkeltrase sørover er Haugerudveien og deretter Hellerudveien. Syklister som skal sørov", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:43:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "ea85109dad5bb42581a3fd926a9415e60e865ae2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-719": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91255731, + "lng": 10.79820871 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært hull i veien rett før undergangen opp mot Strømsveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:26:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "0b6e9c562e23511d2fa0fca34d895d8af9632a57.jpeg", + "type": "String" + } + } + }, + "aftenposten-858": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90615617, + "lng": 10.7641983 + }, + "type": "LatLng" + }, + "description": { + "value": "Alle som sykler mot operaen østfra, må her enten a. krysse over meget trafikkert vei b. kjøre på fortau c. sykle i feil kjøreretning i sykkelfelt d. fortsette rett fram og sykle på det livsfarlige sykkelfeltet i Dronning Eufemias gate (det siste gjør ingen).", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:26:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "54cd4c55289c756a282171e83602c3b2b93fd057.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-336": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91189574, + "lng": 10.75486421 + }, + "type": "LatLng" + }, + "description": { + "value": "Fikk forhjulet i en trikkeskinne og gikk i bakken. Slapp unna med et par skrubbsår.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:45:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "7c86327d8e5a10c96db538678d99483a68555e40.jpeg", + "type": "String" + } + } + }, + "aftenposten-303": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95055144, + "lng": 10.90695619 + }, + "type": "LatLng" + }, + "description": { + "value": "Biltrafikk til Haugen Skole på sykkelveien. Mange kommer fort for å rekke skolen. De kommer raskt inn fra høyre når man triller ned bakken.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:24:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "59f5a5ed26e89faf9455f73ddf469630a51657c6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-369": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9201295, + "lng": 10.65042972 + }, + "type": "LatLng" + }, + "description": { + "value": "Høye fortauskanter. Jeg klarte ikke den ene, stupte av sykkelen og kom borti ei som sto med sykkel i hånda og slo av en prat akkurat der fortauet har lav kant.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:59:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "f5596de0db08a5a1064dd91ebb067cf9b4c2d75f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570509163962474500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.914223, + "lng": 10.742109 + }, + "type": "LatLng" + }, + "author": { + "value": "Nordnet Norge", + "type": "String" + }, + "description": { + "value": "@Shareville setter avtrykk - nevnt på seminar @Finnor: Finansnæringen når alt er digitalt. @IKTNorge", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:02:38Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/527370029205970944/NRF8GdKa_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00A9EC", + "type": "String" + }, + "streetview": { + "value": "78d1d138387b63e86f3e4b65726496577e49b193.jpeg", + "type": "String" + } + } + }, + "aftenposten-335": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91713149, + "lng": 10.7391867 + }, + "type": "LatLng" + }, + "description": { + "value": "På vinterstid, pleier de å dumpe snø der hvor det er meningen at du skal kunne sykle for å komme ut i gata når du har krysset veien. Da må du sykle sammen med gående på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:42:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "0084ea52f21813e975cfa1ca9de1fe4833e9b034.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-737": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94129881, + "lng": 10.78137516 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært uoversiktelig inn og utkjøring fra tunell under ringveien på beggesider. Størst fare i utgangen mot Grefsen stasjon da syklister ofte kommer fort der.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:49:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "5fd2162578d0dab97b7bd8f171dc8da5fe0ad4a5.jpeg", + "type": "String" + } + } + }, + "aftenposten-733": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90573454, + "lng": 10.76772272 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil i krysset. Bilen svingte til høyre og enset ikke syklister i sykkelfeltet. Sykkelfeltet bør markeres bedre (rød asfalt) og lysreguleres spesielt for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:45:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "9718c0c61f0726718c7da6ece40c90bcc6c241e5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570486706186657800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.903122, + "lng": 10.604828 + }, + "type": "LatLng" + }, + "author": { + "value": "Honeylee Ramirez", + "type": "String" + }, + "description": { + "value": "Nail biting 3rd! Haaaay sayang. Matapos na sana sa 4th", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:33:24Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3182950484/c7454954f4fbf490ea7aeed7c09ea4df_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "c2a58ba55f804e5f2db1492424c5a2708bae6a70.jpeg", + "type": "String" + } + } + }, + "tweet:570491682699026400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 66.743744, + "lng": 13.552951 + }, + "type": "LatLng" + }, + "author": { + "value": "Hans-Kristian ", + "type": "String" + }, + "description": { + "value": "I just finished walking 2.41 km in 52m:24s with #Endomondo #endorphins http://t.co/cjyDIcFviu", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:53:11Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/551295307666178048/pLcmOBLX_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "aftenposten-118": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92907899, + "lng": 10.73275699 + }, + "type": "LatLng" + }, + "description": { + "value": "Altfor lite tilrettelagt, trikkeskinner og smalt på siden!", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:42:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "bf708f2dfd8365fe3cdb65e814e3e4414ea0ea0a.jpeg", + "type": "String" + } + } + }, + "aftenposten-884": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91987074, + "lng": 10.71442207 + }, + "type": "LatLng" + }, + "description": { + "value": "Gyldenløves gate er i utgangspunktet bred, men parkerte biler og bred midtrabatt gjør den for smal til at bilister kan kjøre forbi syklende på lovlig måte. Alle bør her sykle midt i kjørefeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:19:28Z", + "type": "DateTime" + }, + "bilde": { + "value": "0cd8f0ef669fb150900d40694c8251c7.jpg", + "type": "String" + }, + "streetview": { + "value": "150312c051d21af7b237374c44656bf557f0b804.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-447": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92698494, + "lng": 10.71190595 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen tilrettelegging for syklister som skal inn i Kirkeveien retning Majorstukrysset. Ofte mye trafikk i krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:29:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "577efb6a2d46d6afb0b53c411d121e64d47e4581.jpeg", + "type": "String" + } + } + }, + "tweet:570519215335202800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.920813, + "lng": 10.760345 + }, + "type": "LatLng" + }, + "author": { + "value": "Marita Thorkildsen", + "type": "String" + }, + "description": { + "value": "What do you order when you're on starbucks? #VIVAShawnMendes ❤️", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:42:35Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567794718944559105/FbIAyb1b_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "eabe3b0de12b37e0f98217ade7c65bbd57c37bd7.jpeg", + "type": "String" + } + } + }, + "tweet:570513989991583740": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.742236, + "lng": 10.173534 + }, + "type": "LatLng" + }, + "author": { + "value": "Freddy Bergsvenkerud", + "type": "String" + }, + "description": { + "value": "@RoCastilloOk http://t.co/ltizggkEYU", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:21:49Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rfcvzWoAEJJVA.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/489137428049821696/tU9FVrJj_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-894": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94290021, + "lng": 10.74038028 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er eneste forbindelse mellom sagene og blindern, utenom ring 2 eller 3, men det er ikke lov til å sykle der fordi gaten er enveiskjørt (dvs innkjøring forbudt fra den ene siden)", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:37:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "7976cb4754a040c95dd22c2bb1d3d3774982942e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570518656867676160": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "1. #NashsNewVideo\n2. #ViasatFotball\n3. Norway\n4. Barca\n5. Norge\n\n2015/2/25 10:36 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:40:22Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-891": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94791884, + "lng": 10.79046249 + }, + "type": "LatLng" + }, + "description": { + "value": "Masse hull i Grefsenveien fra toppen av platået og ned til Nordpolen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:35:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "15efd9e9b0bf443b32dec4dbf8e6a34889d1db13.jpeg", + "type": "String" + } + } + }, + "aftenposten-163": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93667691, + "lng": 10.83110332 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang/sykkelvei som krysser bilvei etter bratt bakke. Uoversiktlig og vanskelig spesielt når det er vått og glatt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:22:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "69bcdbe3b5c5b4f9f0ba1d6e460811bfcc5c90e4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-890": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9169008, + "lng": 10.7935628 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler med barna til skolen ned denne veien. her er det en malebutikk med mange parkerte biler utenfor og over på fortauet. Disse kjører stadig både inn og ut på plassen foran malebutikken. Barna må sykle på fortauet da det ikke er egen sykkelsti. Veldig vanskelig for ryggende biler å se eventuelle barn som kommer syklende på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:33:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "54a306e5330a4cf9fed6c3b3541fea6ce7ed227b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-953": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92183946, + "lng": 10.74115276 + }, + "type": "LatLng" + }, + "description": { + "value": "En bil stod parkert i sykkelfeltet. Jeg var litt uoppmerksom i sykkelfeltet og krasjet inn i bilen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:23:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "c23cb895d9ebb116c3edf5ed14396323d569dcd7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-898": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93249514, + "lng": 10.76004624 + }, + "type": "LatLng" + }, + "description": { + "value": "Høy fortauskant, sykkeluvennlig", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:51:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "dd36f0f9b2e27027a8d5956236f24e5f9bfd8875.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-909": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94425166, + "lng": 10.83652138 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kommer syklister i full fart over meget trafikkert fotgjengerfelt. Her går det flere Busser (linje 31,25,60). Har flere ganger nesten hatt ulykke med syklister som kommer i full fart. Er også dårlig oversikt da sykkelsti kommer fra bak bergvegg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:32:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "23f75979af51d0ae0e7036ef920ed4563e018321.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-908": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95484911, + "lng": 10.76106548 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset her(korvollbakken ut i Maridalsveien) går rett ut i sykkelfelt det er tett hekk og 0m sikt før bilene kommer rett ut i sykkelfeltet/veien. Har hatt og sett flere nestenulykker her. Har registrert at flere biler bruker veien når det er kø i Maridalsveien for å snike. Bør bli vikeplikt ut i Maridalsveien og hekken må klippes ned. Forøvrig burde hele Maridalsveien m sykkelfeltet være forkjørsvei for å hindre ulykker m biler som kommer fort ut i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:29:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "970c83d88ab13052536050d443c6fcb2e5a3605b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-901": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92826446, + "lng": 10.71416974 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilparkering mellom sykkelfelt og fortau, førerdører åpnes ut i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:59:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "479b00035cc04753f188373fb6bb302273d318b2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-936": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92947339, + "lng": 10.7427316 + }, + "type": "LatLng" + }, + "description": { + "value": "Fortauet er skikkelig ujevnt, og det er dårlig belysning. Sykler man på fortauet hvis det er litt mørkt, risikerer man å dette av sykkelen. Å sykle i bilveien er ikke helt trygt, i og med at det ikke er et sykkelfelt der. Mange bilister som råkjører", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:06:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "b5b42674f427deb61e3df31af749c2054bd7bb3f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-913": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93609644, + "lng": 10.73179721 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelstien forsvinner i krysset og man blir tvunget opp på fortauet. Altfor lett å bli \"skvist\" ut av bilene som skal rett frem i krysset. Dette når man er på vei nedover sognsveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:35:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "21741f99a21c5e80b24648fffb6ec9425d8f36d1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-907": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92226963, + "lng": 10.67986965 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklende fra Thune mot Skøyen velger bilveien fremfor sykkelveien da det er kortest og bedre tilrettelagt enn sykkelveien. Skal man videre under toglinjen på sykkelvei må man krysse til venstre over fotgjengerfeltet. Her oppstår mange farlige situasjoner når syklister brått krysser fra bilvei og til venstre over fotgjengerfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:29:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "c688e78baf28332a0bd7b68cefee38aa06806649.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-906": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94080441, + "lng": 10.7991743 + }, + "type": "LatLng" + }, + "description": { + "value": "For å komme inn / ut av gang å sykkelsti må en tråkle gjennom biler som står for parkert, ofte veldig tett. Vanskelig å se om det er biler i gata. Har tidligere vært en markering i veibanen med parkering forbudt, men denne er utvasket. Bør merkes på nytt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:27:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "f8417497f1ce4cad5d180c54a723ab43b6e222e2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570495880408797200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.018435, + "lng": 11.123869 + }, + "type": "LatLng" + }, + "author": { + "value": "Annely Abel", + "type": "String" + }, + "description": { + "value": "#Tallinn among 5 global cities of the #future . @Inc \n\nhttp://t.co/lr84TNw4W5", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:09:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/515475436684328960/H8OGBbH8_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "94D487", + "type": "String" + } + } + }, + "aftenposten-912": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96128382, + "lng": 10.73535919 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble påkjørt av bilist som ikke overholdt vikeplikt i rundkjøringen. Jeg hadde på signalfarger og tente lykter foran og bak. Skulderoperasjon, månedsvis med sykmelding og opptrening, og sannsynligvis kroniske skader. Politiet henla saken.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:33:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "72f799b680f6d7218e1a2dc6da0f87fb054c0bc8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "tweet:570518636886159360": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.401325, + "lng": 10.658829 + }, + "type": "LatLng" + }, + "author": { + "value": "Marte Sjøvold", + "type": "String" + }, + "description": { + "value": "@BrettCullen4_ yeeah man, this really trashed my morning :(", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:40:17Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560412512152461312/w5ozDSyQ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F71313", + "type": "String" + }, + "streetview": { + "value": "309b77f2568f1363eb1b3e522f1ea4acf03c1522.jpeg", + "type": "String" + } + } + }, + "aftenposten-883": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92615161, + "lng": 10.72160482 + }, + "type": "LatLng" + }, + "description": { + "value": "Hadde min Jomfrutur på EL-sykkel i Bogstadveien. Følte meg skvisa ut både på vei og fortau. Endte med at jeg gikk av sykkelen og trillet opp til Majorstua. Så mye for EL-sykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:11:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "77df1d0cefd5c80be6d770be5c122c498ba54089.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-669": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92930008, + "lng": 10.71631464 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som ikke overholder vikeplikt/stopplkt", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:19:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "26e62ff187e6749a63cb8176a385f1be0b126f79.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-152": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93198985, + "lng": 10.7619667 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien plutselig forsvinner og man må sykle i meget tett og farlig traffikk på Ring 2.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:12:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "b7acf0a19db318f792ff854f02bbd013a7c717d2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-557": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93708538, + "lng": 10.73038101 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange store sprekk i kjøreretning i asfalten på sykkelfelt på veien ned mot ring 2 på Sognsveien, nedover fra Ullevålsaleen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:38:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "574b6731310c89ba73b17a9de1c0d7e72c0606e4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1018": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92626182, + "lng": 10.77641308 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt felt mellom trikkeholdeplassen og bygningen langs Trondheimsveien. Veldig utsatt som syklist og ingen utvei hvis biler kommer i stor fart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:52:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "f21b7650bca676c1f81ca9e6641efca9b88e01eb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-109": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91945195, + "lng": 10.62880039 + }, + "type": "LatLng" + }, + "description": { + "value": "Elsker å sykle veien selv om det er lang kø. Bussene tør ikke kjøre forbi og jeg late som ingenting. Det er jo ikke min skyld at det ikke er plass til meg, g på fortauet vil jeg ikke sykle.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:32:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "300596dd7ca1b89b98dc5305d2fd7417c263f483.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-612": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9320006, + "lng": 10.7618916 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter sykkelveien, og man må velge mellom å sykle innimellom biler på veien, eller sykle mellom folk på fortauet. I tillegg har fortauet de neste kvartalene altfor høye fortauskanter, og jeg risikerer å punktere.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:18:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "1b5e2f1e1b40579d2898631c656a119226b12953.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-928": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92009724, + "lng": 10.75906991 + }, + "type": "LatLng" + }, + "description": { + "value": "Vanskelig for bilførere å forstå at det må påregnes møtende sykkeltrafikk i denne gata. Mange virker å tro at man sykler ulovlig og enkelte gir derfor syklende små marginer som følge av irritasjon. Et utrivelig punkt på sykkelveinettet, og et vanskelig punkt når man sykler med barn.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:58:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "9f48b787ea0ab03b96a83fa3028f9a9fb405d116.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-334": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90792064, + "lng": 10.85050106 + }, + "type": "LatLng" + }, + "description": { + "value": "Vegen har sykkelfelt lenger framme men fra Tveita T og et stykke opp Hellerudveien er det ikke sykkelfelt, i køsituasjoner er det veldig trangt mellom fortau og biler i kø grunnet manglende merking", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:39:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "28331e2f8bd1ce1284c4b175450eb46fe6b081db.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-319": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91215929, + "lng": 10.74917793 + }, + "type": "LatLng" + }, + "description": { + "value": "Fra Skippergata og sykkelsti, kommer man her over i selve Oslogryta. Doble trikkespor, haugevis av gående og taxier,men ingen klar vei videre for syklisten.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:29:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "52d0f3d77dcc672d5bdbb96b48a65177f8dd31bc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-446": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90638211, + "lng": 10.81992387 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler som kommer sørfra og skal videre nordover prøver ofte å passere på høyresiden av biler som står og blinker til venstre fordi de skal sørover ut på E6-en. Da skjer det ofte at de legger seg rett ut foran syklister. Nå som sykkelfeltet er borte skjer det enda oftere enn tidligere.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:29:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "5357c90189b65aebe61892a60c235850e5f6f048.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-482": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93565033, + "lng": 10.73906064 + }, + "type": "LatLng" + }, + "description": { + "value": "God plass til å etablere sykkelfelt for retning øst. I retning vest rehabiliterte man fortauskanten for en måned siden, men klarte ikke å flytte den en meter inn på det brede fortauet slik at man kunne etablere sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:49:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "64312d3278cbc8cf3a00385124dcf8ef912182ff.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-760": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87289341, + "lng": 10.77908992 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig overgang over Ulvøybrua. Bilene kommer ofte i høy hastighet rundt svingen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:03:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "452995bd284f1c954d2a98ed9bf367a320097030.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-117": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9096701, + "lng": 10.7418397 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig tilrettelagt for syklister med smalt sykkelfelt på fortau som gjør at man har vikeplikt for biler i hver kryssende gate. Ender dessuten opp i områder uten tilrettelegging for syklister i begge ender.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:41:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "83a54211b968675e49661fd65592cf3c07f4fe29.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-529": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91639202, + "lng": 10.73876023 + }, + "type": "LatLng" + }, + "description": { + "value": "Falt da hjulet sked i trikkesporet. Kom heldigvis fra det med blåmerker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:13:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b7280c935e3f33da49ea7291da057cf4c30a596.jpeg", + "type": "String" + } + } + }, + "aftenposten-837": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90906104, + "lng": 10.81857204 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er sykkelfelt i veien der, men asfalten er ruglete og mørk under broen, slik at jeg har hatt problemer med å holde meg innenfor sykkelfeltet. Jeg er nå obs. på det og sykler med lav fart fort å forhindre ulykke. Det har vært flere asfalteringer klattvis langs sykkelfeltet. Jeg ønsker ny ren asfalteringer av sykkelfeltet for å trygge syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:04:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "b1653575478ccdf8f180fff653f9bec060181cda.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-127": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9268207, + "lng": 10.73147642 + }, + "type": "LatLng" + }, + "description": { + "value": "Fint der parkeringsplassene er fjernet men skummelt trangt mellom trikkeskinner og høye perrongkanter og fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:45:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "fa4ba4645d4f1e1a116cbaaa7fcf64f8186bf3db.jpeg", + "type": "String" + } + } + }, + "aftenposten-840": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95011089, + "lng": 10.78999042 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig gangfelt langs Grefsenveien, så å benytte seg av bilveien er eneste gode mulighet på veien nedover. Problemet med det er at det bestandig parkerer biler langs veien, så det oppstår lett farlige situasjoner med biler som kommer kjørende.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:06:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "208ae9501ec849579ccd4a9efea228d4d556bde8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570512491891068900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.210271, + "lng": 9.613202 + }, + "type": "LatLng" + }, + "author": { + "value": "christhuz", + "type": "String" + }, + "description": { + "value": "Hva skjer med at noen aldri har blitt vekket på morgenen,? og dermed ikke er i stand til å vekke andre på morgenen på en god måte.. #idioti!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:15:52Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/430744642464673794/1hw40ZJr_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "acbfa08803e459eb1fa34988f99bc9e59cdd2eb0.jpeg", + "type": "String" + } + } + }, + "aftenposten-368": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9131624, + "lng": 10.6417635 + }, + "type": "LatLng" + }, + "description": { + "value": "Ulykke med sykklist frontalkollisjon i bakken opp mot rampen,", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:59:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "17a499119434bd189178f5744b362e8af03db39e.jpeg", + "type": "String" + } + } + }, + "aftenposten-790": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90142176, + "lng": 10.76548576 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvis man ikke holder samme fart som bilene på sykkel nederst i Kongsveien (40 km/t ++) , kjører bilene forbi selv i de to uoversiktlige svingene og rett før rundkjøringen i bunnen. Min fart (30-35 km/t) gjør at jeg ofte opplever stygge forbikjøringer her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:37:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "e4da644954db090e56fe4d67b166b013005c6df0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-428": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92456553, + "lng": 10.70836544 + }, + "type": "LatLng" + }, + "description": { + "value": "Veibanen blir smalere pga. trikkestoppene, og markeringen av sykkelfeltet er slitt vekk i dette smale partiet før forgjengerfeltet fordi bilene og bussen kjører i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:23:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "b2ea96b6ad5c7c55ae1031b249e692bd55af4624.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-927": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92663548, + "lng": 10.77672958 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykling nordover fra Carl Berners plass er risikosport.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:56:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "f1f1357dcf4a01a7c6f9c0c761767f136f98bfcd.jpeg", + "type": "String" + } + } + }, + "aftenposten-206": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93662316, + "lng": 10.81777811 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister som kommer på Nordalveien og skal krysse Oreliaveien har veldig liten oversikt, spesielt når du kjører nordover. Mange barn/ungdom i området som går til og fra skole, barnehage og parkområdet. Kan løses med et speil som gir innsyn til Oreliveien ferdsel", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:43:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "b6a22a7ad7028d3c7825d6f7f6e9f4cd8575b2ab.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-952": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.97953916, + "lng": 10.46739578 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange farlige situasjoner når tungtrafikk møter morgensyklistene", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:23:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "ee870f4c998f02992d793c7f8ff2d6b835f7c457.jpeg", + "type": "String" + } + } + }, + "aftenposten-729": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9573885, + "lng": 10.67143008 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært uoversiktlig kryss. Skummelt for syklister som kommer nedover Holmenkollveien når biltrafikk krysser motgående felt for avkjøring til Setra vei og det er skummelt for syklister som kommer oppover Holmenkollveien og skal krysse over motgående og inn Setra vei. Det er også et fotgjengerfelt her som krysser ved enden av Setra vei. Har vært vitne til mange nestenulykker mellom bil/sykkel, sykkel/fotgjenger og bil/fotgjenger i dette krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:40:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "679be3a7e492c0d38eedd0dc8826444b7e1bff17.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570513963202568200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "A quick question is never a quick question in IT. There is always other branches to the answers/questions.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:21:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-900": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88191748, + "lng": 10.78346729 + }, + "type": "LatLng" + }, + "description": { + "value": "Nestenulykke. Bil rett foran meg som, uten å blinke, plutselig svingte inn mot lampebutikken(eller hva det er) på høyre side rett før lyskrysset. Heldigvis holdt jeg lav fart, men det ble en bråbrems og sa i fra til føreren. hun hadde ikke sett (etter) meg.. Typisk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:57:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "27e759f6e5a16dec427b78c93d0803e48187d905.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-813": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91796235, + "lng": 10.74412465 + }, + "type": "LatLng" + }, + "description": { + "value": "Meget uoversiktlig kryss, spesielt når du kommer som syklist oppover Akersgt i retning Ullevålsveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:11:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "9225e263f165dc72702c7c93e8db77d82d77fc6d.jpeg", + "type": "String" + } + } + }, + "aftenposten-881": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9125629, + "lng": 10.72459044 + }, + "type": "LatLng" + }, + "description": { + "value": "Uklar vikeplikt. Når man sykler Cort Adelers gate nedover mot krysset Ruseløkkveien, har man da vikeplikt for kjørende fra venstre? \"Vanlig kryss\" tilsier høyreregel, men en slags (flat) kantstein kan tyde på at man krysser en slags fortauskant.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:11:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "ae4d59469d53ec9c51d5cccc7957ae8df680c2d5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-661": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90875174, + "lng": 10.76835572 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er sykkelfeltet frest bort på et 20 meter langt strekke, slik at butikken kan ha varelevering uten å parkere ulovlig i sykkelfeltet. Løste i hvertfall problemet med parkering i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:06:51Z", + "type": "DateTime" + }, + "bilde": { + "value": "c85abfea6c091e2a0176aa50298085b4.png", + "type": "String" + }, + "streetview": { + "value": "64d6e7ed8abed160495e4f40181becb463f07313.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-531": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94783825, + "lng": 10.73268771 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktelig rundkjøring med mye trafikk når en kommer fra Tåsen/Ullevåll stadion og skal mot Forskningsparken (eller retur).", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:14:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "995c84e918ab161778647845e2d15bc39a0ec554.jpeg", + "type": "String" + } + } + }, + "aftenposten-672": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91759667, + "lng": 10.75442433 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister som kommer nedover Hausmannsgate og skal svinge til venstre inn Torggata (mot Ankerbrua) bli ikke registrert, og får ikke grønn pil.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:33:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "e692818ce2d834caed79e54760b89efef8b060f3.jpeg", + "type": "String" + } + } + }, + "aftenposten-580": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92179644, + "lng": 10.74110984 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt nedover Ullevålsveien bare opphører foran kjøreskolen og rensebutikken, for å så fortsette et par meter etter. Det star biler parkert her ganske ofte. Sykklister må vike over i kjørefelt til biler - noe bilister ikke forventer på en vei med merket sykkelsti. Sykkelfeld bør merkes, og par", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:55:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "e4739b042f8dfb8d80a4320d316b3806a4e2e57b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-627": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92900635, + "lng": 10.76929986 + }, + "type": "LatLng" + }, + "description": { + "value": "Å gå eller sykle inn/ut av undergangen, eller også passere den, er farlig. Syklister med fart fra de fire nedoverbakkene som leder rett inn undergangen har ikke sikt. Jeg bruker bjella når jeg nærmer meg krysset, når jeg er fotgjenger skulle jeg ønske jeg hadde en!", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:33:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "18364bab813ee4bca21012083466e985df79e09e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-533": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92740966, + "lng": 10.71089744 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig smalt sykkelfelt med gateparkering på nordsiden. I det minste må en parkeringsplass fjernes.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:15:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "04afff6f6f53106e4d54d4c6042b86c6c5385fb0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-333": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93996068, + "lng": 10.76978802 + }, + "type": "LatLng" + }, + "description": { + "value": "Ubehagelig/skummelt smalt for syklister når biler passerer", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:36:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "8e762533fc2e53f8af763688262f34b6799cafd6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-876": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91375951, + "lng": 10.73539953 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig kryss - Roald Amundsens gate - Stortingsgata. Syklende sørover har ingen trafikklys å forholde seg til, og forventer derfor vanlige vikepliktsregler i krysset. Men buss, trikk og taxi kommer i en viss fart, mot grønt lys, i Stortingsgata.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:59:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "d3564efca0a62d8e7e840b3881f4c2bd2325b90c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570515248119095300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 61.45225, + "lng": 5.852988 + }, + "type": "LatLng" + }, + "author": { + "value": "❀ daddy suho ❀", + "type": "String" + }, + "description": { + "value": "i used to ship the chois so hard back in the days....", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:26:49Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567842117334999040/Zd_pkgPT_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "F5ABB5", + "type": "String" + }, + "streetview": { + "value": "f8e08058a6ac4da6a178345d9879b3c266d758b6.jpeg", + "type": "String" + } + } + }, + "tweet:570516586483847200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Ida Faldbakken", + "type": "String" + }, + "description": { + "value": "Meld deg på! Norges første Music Hackhaton @byLarm. 4 ulike utfordringer skal løses! http://t.co/9ubzXM82CA @InnovasjonNorge @oslobizreg", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:32:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/437566122636763136/exHrzlV0_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3977F5", + "type": "String" + }, + "streetview": { + "value": "30deae915343243873a947b894375ac5ffc236f2.jpeg", + "type": "String" + } + } + }, + "aftenposten-778": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90783457, + "lng": 10.75475692 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien blir plutselig umarkert, og man må navigere mellom masse fotgjengere og noen ganger biler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:14:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "836f06c1dd2cfaf7b1e6e21a32bde95acb1fd0f1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570494712521592800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.934266, + "lng": 5.641012 + }, + "type": "LatLng" + }, + "author": { + "value": "Bharti", + "type": "String" + }, + "description": { + "value": "@TheRahulMahajan @dimpy_mahajan Beautiful pic..", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:05:13Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568360445074210816/c0Gw0g8a_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570502797201948700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.905705, + "lng": 10.572343 + }, + "type": "LatLng" + }, + "author": { + "value": "Kilrogg Deadeye", + "type": "String" + }, + "description": { + "value": "@utdesb2106 @MUL1999 shots", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:37:20Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://abs.twimg.com/sticky/default_profile_images/default_profile_3_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0099CC", + "type": "String" + } + } + }, + "aftenposten-789": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94176097, + "lng": 10.67105054 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene på vei ut Morgedalsveien kommer seint til syne og stiller seg ofte på tvers av sykkelstien for å kunne snike seg ut i sørkedalsveien om morgenen. Syklene kommer i stor fart ned bakken.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:35:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "af341b82808da8cb4725d5d3519b63e2e3eae2bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-736": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94378148, + "lng": 10.75977802 + }, + "type": "LatLng" + }, + "description": { + "value": "Brosteinsrundkjøring med veldig ujevn kjøreflate gjør dette til en felle for syklister. Brosteinene er sikkert valgt for å senke hastigheten til bilene, men er det vått ute blir de superglatte for syklister. Har fått taxi i siden her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:47:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "ae5961b1569c01a191f2e0f3488da721a29556c1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-471": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89268029, + "lng": 10.53918049 + }, + "type": "LatLng" + }, + "description": { + "value": "Potensielt veldig farlig trase etterhvert som antall syklister fortsetter å øke. Dette er hovedtraseen for syklister mellom Asker&Østre Bærum og Oslo. Traseen går på et fortau med tungtransport, busser og biler i høy fart utenom rushtiden om morgenen hvor trafikken står. Et lite dytt, en liten feil", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:43:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "33ebe19a92c9bce8dffeb57b4fe10b4ccce4f591.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-126": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94479169, + "lng": 10.74862003 + }, + "type": "LatLng" + }, + "description": { + "value": "Høyt fortau og trang veibane uten sykkelfelt gjør at bilene snitter syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:45:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "143d19a2e97eddf35d96acc9ec545145b979b24f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-332": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93184471, + "lng": 10.74186086 + }, + "type": "LatLng" + }, + "description": { + "value": "Her burde det vært stans forbudt. Står daglig vareleveringer i sykkelfeltet som sperrer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:36:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "8d508b2362e1fdb0eabb3fb12d97cc5f0c022b0e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-151": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90800671, + "lng": 10.75643062 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har jeg følt meg veldig utrygg når jeg har syklet, for sykkelveien er smal og trafikken, særlig de store bussene, går tett inntil. Ble skvisa ganske langt inn sykkelfeltet av bussen, og det var ingen steder å svinge eller komme seg unna. Vil helst ikke sykle her igjen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:12:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "5a9b5b59b091bd9e0fb8ef9267bbe746f192cad5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570495696467587100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41204, + "lng": 5.26983 + }, + "type": "LatLng" + }, + "author": { + "value": "Even Hye T Barka", + "type": "String" + }, + "description": { + "value": "Har om Twitter-noveller denne skoletimen. Tror jeg må lese litt flere @FrodeGrytten tweets.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:09:07Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560711633970790402/Gl_GT22O_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570515461651214340": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.612852, + "lng": 12.016493 + }, + "type": "LatLng" + }, + "author": { + "value": "Ag-3", + "type": "String" + }, + "description": { + "value": "@NestenUnormal Skal se film i spansken.🌚 og har kortdag, så im good faktisk", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:27:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566684429092159488/DIie19er_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "1F98C7", + "type": "String" + }, + "streetview": { + "value": "55c1ee582a9cff91a0d11f4146178fb8c7b762be.jpeg", + "type": "String" + } + } + }, + "tweet:570518458137321500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Flåten", + "type": "String" + }, + "description": { + "value": "St.Clause :is fighting against Fake science,and tecnology nuts These Idiots have no documentation.Please help us to stop this stupidity?", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:39:34Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/254817315/St_Clause_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "9D582E", + "type": "String" + } + } + }, + "aftenposten-205": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93763359, + "lng": 10.6830883 + }, + "type": "LatLng" + }, + "description": { + "value": "Smestadkrysset er ikke tilrettelagt for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:42:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "560e78149f1b3c6fa5158533f38a7b7fcb29be1f.jpeg", + "type": "String" + } + } + }, + "aftenposten-204": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90783457, + "lng": 10.75462818 + }, + "type": "LatLng" + }, + "description": { + "value": "Manglet oppmerking som skiller fotgjengere og syklister. Allmenn forvirring, og farlige situasjoner. Noen titals meter lenger vest foran operaen er det merking... Forstå det den som kan. Kjell", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:42:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "de7b94405c496320b2c6416bdd48d94ee81aa05e.jpeg", + "type": "String" + } + } + }, + "aftenposten-203": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9063068, + "lng": 10.76421976 + }, + "type": "LatLng" + }, + "description": { + "value": "Vanvittig farlig kryssing av motgående kjørebane pga. ubrukelig sykkelfelt i Dronning Eufemias gate. (Sykkelfelt slutter etter to kvartal, og man befinner seg plutselig mellom busser på holdeplass og biler i andre kjørefelt. Genialt farlig!) Så vi krysser og sykler fortau i stedet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:41:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "fbcc3d4be84cdc4dad0b85fa552e4ce5c53bcbe0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570494356924317700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Roger Pihl", + "type": "String" + }, + "description": { + "value": "Fint at #Dagbladet tar opp viktige ting, som at #Northug starter med susp eller ikke i dag.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:03:48Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/523919148212957184/EFln2n_A_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "aftenposten-1017": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92702795, + "lng": 10.71215271 + }, + "type": "LatLng" + }, + "description": { + "value": "Kirkeveien er generelt farlig, med altfor høy fartsgrense for biler. Sykkelveien forsvinner i kryssene. Her i kirkevn/middelthgt er stopper sykkelfeltet for å gi plass til en ekstra fil slik ar bilene som skal rett fram kan flette ut av krysset. Dvs biler skifter fil og øker farten i krysset. Opplever ofte at bilene son skifter fil ikke ser syklister og nesten kjører dem ned", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:51:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d80a94fb2a0804925bbec12066f089960f8d92d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570509734731771900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.458663, + "lng": 5.270668 + }, + "type": "LatLng" + }, + "author": { + "value": "Marthe", + "type": "String" + }, + "description": { + "value": "Just think about it. What if it isn't a joke and we're just denying it because they're not the typical couple or just bc Leo is..Well Leo", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:04:54Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/559161024088403970/3UAWrxZc_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570496933145518100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Captain Redbeard", + "type": "String" + }, + "description": { + "value": "(I'm fully aware that this might be a natural high point in my mood created by my brain, but fuck it, I'm enjoying it!)", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:14:02Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562146030938890240/EyInFFie_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-108": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93594594, + "lng": 10.74982166 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei mellom kjørefelt og parkerte biler. Jeg har hatt flere farlige situasjoner i Uelandsgate", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:32:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "ac6fdbd115641eae60384cf8a62b4e483d75f4c5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-938": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92850638, + "lng": 10.75930595 + }, + "type": "LatLng" + }, + "description": { + "value": "sykler man vestover herfra og ned mot innkjøringen til mølleparken er fortauet for smalt til å sykle på, en svak høyrekurve og sperrelinje etter lyskysset ved thorvald meyers gate gjør at syklisten ofte havner i skvis på innsiden av biltrafikken.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:08:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "c110d30a169d6a354561e55fb72c0efc8d90ac80.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-765": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92308692, + "lng": 10.70205688 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt forsvinner til ingenting.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:05:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "cbc5819d41dd4d740d30e3c3a9f260d0d49e55a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-459": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90533845, + "lng": 10.74274063 + }, + "type": "LatLng" + }, + "description": { + "value": "Ny sykkelvei fra operaen mot festningen er bra, men sperresøylene som er satt opp midt i veien er sorte helt uten reflekser eller annen merking. Vanskelige å se i mørket.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:36:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "28b52120c72520dee68a1f02dba9b770fddeb653.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-273": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92709784, + "lng": 10.74733257 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det smalt pga parkerte biler. For å være sikker på å ikke få en bildør i ansiktet, må man legge seg ganske langt ut i veibanen. Det hindrer biler bak, som igjen gjør farlige forbikjøringer (farlig både for syklister og motgående trafikk). Det er også mange innsnevringer i veien fra Alexander", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:14:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "a6065ae12fcd4da245035a30a72870e17ae55ae8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-202": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94040404, + "lng": 10.71646034 + }, + "type": "LatLng" + }, + "description": { + "value": "VELDIG glatt bro over Blindern T-banestasjon.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:41:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "7e4d2275b3a5918f32ff45df02e8696574d42223.jpeg", + "type": "String" + } + } + }, + "aftenposten-995": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91243091, + "lng": 10.74841082 + }, + "type": "LatLng" + }, + "description": { + "value": "Ruten er skiltet som hovedsykkelvei, men ikke tilrettelagt. Kommer man bak en buss eller trikk her og skal skal svinge til venstre ned Dronningens gate, risikerer man at det plutselig kommer en trikk ned Kirkeristen. Dette er umulig å se pga svingen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:30:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "69d9c038d9e18044489c188346cddd428b4aedfd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570486824747065340": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "Yesterday at the kindergarten another father had noticed I made comics and said he was a huge comic fan. Where I live this is insane odds!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:33:52Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "aftenposten-85": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93360244, + "lng": 10.72720527 + }, + "type": "LatLng" + }, + "description": { + "value": "Langs Kirkeveien er busstoppene plassert over sykkelfeltet, det kan lett oppstå farlige situasjoner dersom du sykler og bussen ligger foran deg og skal stanse.", + "type": "String" + }, + "date": { + "value": "2014-09-09T10:09:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "2f604e03ec6670903ebde8ed5f2d8d1f81623e6b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-926": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92728063, + "lng": 10.76486349 + }, + "type": "LatLng" + }, + "description": { + "value": "På den ene siden har sykkelfeltoppmerkingen blitt helt slitt bort (det er rapportert til bymiljøetaten for over et år siden), på andre siden ligger sykkelfeltet i \"dørsonen\" på (lovlig) parkerte biler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:55:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "55d6a81256975f7c10ba6c324ad30f478402964f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-798": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90574193, + "lng": 10.76768517 + }, + "type": "LatLng" + }, + "description": { + "value": "Fronkollisjon, sykkel-bil. Kjørte rett fram i krysset. Bill i mot svinger til venstre for seg. Frontkolliderer. Sykkelhjul ødelagt, bilfører betaler for nytt. Ikke meldt inn.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:49:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "209517ee0d239e713631efec0f1d5e40da87c105.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-834": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93595992, + "lng": 10.7357965 + }, + "type": "LatLng" + }, + "description": { + "value": "Kirkeveien østover, innkjøring til Ullevål sykehus: Trafikklys (grønn pil til venstre) skifter aldri til grønt for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:58:19Z", + "type": "DateTime" + }, + "bilde": { + "value": "c43212adfc1131f9143396b0358f6d69.jpg", + "type": "String" + }, + "streetview": { + "value": "f7f2d9b600ad19ae2e52f0b9744a6755ed0d261f.jpeg", + "type": "String" + } + } + }, + "aftenposten-201": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91476246, + "lng": 10.73201179 + }, + "type": "LatLng" + }, + "description": { + "value": "Store dype hull i asfalt langs trikkeskinnene i rundkjøringen. To punkteringer på under 3 måneder.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:38:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "05e228ca4628fe3c7d2e9ce8311aec625977a70f.jpeg", + "type": "String" + } + } + }, + "tweet:570491007822893060": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Lasse Hamre", + "type": "String" + }, + "description": { + "value": "@e2837f43eaed471 Klarspråk er en sikkerhet for demokratiet.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:50:30Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/522722778353393665/QRrIgSGA_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-812": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93484946, + "lng": 10.69549083 + }, + "type": "LatLng" + }, + "description": { + "value": "Firefelts vei uten sykkelfelt eller skulder så man tvinges til å sykle på fortau. Dette fortauet er veldig smalt, og når fotgjengere er på vei til/fra t-banen er de overhodet ikke oppmerksomme på at det kan komme syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:10:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "c42c0db27896147eea4da52e2723613cddb4cea5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570491656492990460": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.97101, + "lng": 5.73064 + }, + "type": "LatLng" + }, + "author": { + "value": "Thor Bjarne Bore", + "type": "String" + }, + "description": { + "value": "\"Norge står til stryk når det gjelder å forhindre og straffe seksuelle overgrep og voldtekt\" (Amnesty) http://t.co/PjoHem8kY9", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:53:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/459261419964231680/0Eiu1Kzl_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "05444bafeff77b812371399622594c4b91058abd.jpeg", + "type": "String" + } + } + }, + "aftenposten-660": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92286378, + "lng": 10.67839443 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er tilrettelagt sykkelfelt på begge sider av Hoffsveien sør for rundkjøringen inn til Harbitzalléen. Likevel velger en stor andel syklister fortauet, og gjerne på venstre side av veien i fartsretningen. Har som fotgjenger flere ganger opplevd syklister ringe med bjella for å få gående til å flytte seg på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:03:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "6d823dd43ae42b9bbbaadc472ba9bcd3f8480cda.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-821": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.74284479, + "lng": 10.22919952 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlige rister i begge ender av undergangen. Smale dekk vil kunne kile seg i de langsgående rillene. Disse ristene har stått på kommunens tiltaksplan noen år, men er fremdeles ikke byttet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:28:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "5ce24c93b5c82673db06443566d90585ae9a38c6.jpeg", + "type": "String" + } + } + }, + "aftenposten-200": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94514364, + "lng": 10.77851593 + }, + "type": "LatLng" + }, + "description": { + "value": "farlige situvasjoner oppstår daglig. Sykkelfelt forsvinner fra vitaminveien rundkjøring ved Storkrysset. Videre over RV150 langs grefsenveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:38:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "cdc471856c53ba8a4e3d779575a3f01a8c00a6ca.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-331": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91553692, + "lng": 10.63892841 + }, + "type": "LatLng" + }, + "description": { + "value": "Bruker denne veien daglig, opplever stadig nesten ulykker når jeg enten må bråbremse grunnet gående ut i veien eller biler som kjører litt for nærme", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:35:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "b1c5212dcc4e602bfa83e97c7ac619971dfdd3f9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-820": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93291979, + "lng": 10.74961781 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien slutter plutselig og pga. den slake svingen for utkjørsel blir det ofte farlige forbikjørsler fra biler når syklister skal rett fram og biler skal ut til høyre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:26:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "690f88942381c9556da6c58de34945d3894a0c20.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-819": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93513971, + "lng": 10.74424266 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig smal passasje for å komme opp på fortauet etter å ha krysset veien, der man i tillegg må passere fotgjengere som venter på grønt lys og på bussen. Denne veien og fortauet ble nettopp pusset opp, uten at det ble laget sykkelvei. Det hadde fint latt seg gjøre da fortauet her er bredt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:22:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "1fd074ced7f4c0dec5b393c769bf371871e6da4f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-141": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90761939, + "lng": 10.75540065 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset Operagata/Nylandsveien/sykkel\"veien\" nedenfor Dr Eufemias gate er svært uoversiktelig med sykler, biler, busser og gående i absolutt alle (kryssende) retninger", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:06:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "d010a18faa2273dfa6626ad02e1ae41f97091363.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-889": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8949808, + "lng": 10.54870158 + }, + "type": "LatLng" + }, + "description": { + "value": "For syklister som ferdes ned Stasjonsveien er det ingen enkel oppgave å komme seg opp på fortauet før rundkjøringen. Dette er en mye brukt sykkelvei for syklister fra Jar, Stabekk og Bekkestua. Generelt sett mangler det en tilrettelegging for syklister på denne strekningen, og man blir syklende i veien, til hinder for bilister som skaper farlige forbikjøringer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:32:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "2535cf22777b70cf797201c1bfd019909dc62b51.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570517009311637500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "@JasonCopland Keeping enemies closer than friends, so you can destroy them!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:33:49Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "aftenposten-818": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92861928, + "lng": 10.76389789 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler overholder ikke vikeplikt for syklister", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:16:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "9e9e6ea0f34d607fb66aa4d4e7e5b8a491a9b555.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570511737109258240": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.458553, + "lng": 5.270786 + }, + "type": "LatLng" + }, + "author": { + "value": "Marthe", + "type": "String" + }, + "description": { + "value": "When did it come out on Spotify? Yesterday? Oh okay http://t.co/1s7OtglUCW", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:12:52Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rdZTXUcAMoWtN.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/559161024088403970/3UAWrxZc_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570496921271443460": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.92896, + "lng": 10.708349 + }, + "type": "LatLng" + }, + "author": { + "value": "Elise Husum", + "type": "String" + }, + "description": { + "value": "@forskningsradet og @InnovasjonNorge informerer om muligheter for bedrifter i Horisont2020 @NHO_no nytt virkemiddel fast track to innovation", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:14:00Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3337855398/35822c6e4eabf7872f6fcef995f9d821_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-882": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93209736, + "lng": 10.76188087 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kjører vestover er det relativt oversiktlig og greit med sykkelvei/sykkelfelt fra Gamlebyen og hit. Her slutter plutselig sykelfeltet. Klassisk norsk sykkelvei med andre ord!", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:11:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "8345bbabd8ad09d0c3179255d07c57a412736566.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1013": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91050262, + "lng": 10.76758861 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av politibil som passerte og avskjærte meg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:47:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "71976e8ccaa8756e64053f0ba1a709fb61fdb821.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-972": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91526263, + "lng": 10.73887825 + }, + "type": "LatLng" + }, + "description": { + "value": "Enveiskjørt. Må opp på fortauet for å ikke kjøre en lang omvei om Karl Johan når jeg skal østover. Forslag: Kutt gateparkering på en side og lag et toveiskjørt sykkelfelt eller sykkelfelt på begge sider av veien. :-)", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:42:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "72b150b861db83f1703b6affd8f39d9971c45a61.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570499277820190700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.717699, + "lng": 10.825946 + }, + "type": "LatLng" + }, + "author": { + "value": "Tonje Kristoffersen", + "type": "String" + }, + "description": { + "value": "@FreddyAmazin my dog has an birthmark on the right cheek,and it looks like an T,.Thats so cool because my name is Tonje:-)", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:23:21Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/477736184383569920/ZqZsPmgz_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "cf26fa334c2c221e0236cf32fab4054a3fddaec6.jpeg", + "type": "String" + } + } + }, + "aftenposten-199": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93207586, + "lng": 10.70568323 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundkjøring med uklare forhold for syklister, særlig når man kommer fra vest og vil direkte til Majorstuen. Syklister blir tvunget ut i kjørebanen uten skiltning til bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:38:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "450ab932b7093cbb79dd34c101360460138f7b57.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-481": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92424831, + "lng": 10.83855986 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig kryss", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:47:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "99bf667d9a579526d2c795596e00721fbc66b9bd.jpeg", + "type": "String" + } + } + }, + "aftenposten-772": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95088453, + "lng": 10.73995113 + }, + "type": "LatLng" + }, + "description": { + "value": "I retning vest kan det komme syklister i stor fra på sykkelfeltet som er parallelt med veien. For skarp sving i enden og klønete krysning av vei for å kunne fortsette videre på sykkelfeltet langs ring 3.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:12:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "4243263556a55b7383896103a000580fef1ddd1b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-817": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91347973, + "lng": 10.64283907 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler viker ikke til høyre for seg her. Det er vanskelig å bedømme om dette er en utkjørsel fra parkeignsplass eller offentligvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:15:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "4ba2fad5362c6cc7c4ec77e31917407f4d2ef42e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-302": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89354392, + "lng": 10.76231002 + }, + "type": "LatLng" + }, + "description": { + "value": "Håpløst tilrettelagt for syklister oppover Kongsveien. OK tilrettelagt nedover, men farlig pga trang vei både i svingen ved Kongshavn skole og nederst i Kongsveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:24:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "2d2063ca50a66f4410c05e1049cea750266a1a83.jpeg", + "type": "String" + } + } + }, + "aftenposten-666": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91127718, + "lng": 10.7446289 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet er merket som stengt ca midtveis i gata. Blå merking i kartet som tilrettelagt for sykkel er feil.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:17:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b5e87eb69a83c52de2d0c157c8704522c8e7a85.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-524": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90464984, + "lng": 10.76681613 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kommer ofte sykkelister og bilister i full fart, men glemmer at de har vikeplikt fra høyre. Hatt to nestenulykker med sykkelister som har holdt alt for høy fart. Husk vikeplikt fra høyre!! Det gjelder for alle som er i trafikken.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:11:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "415368ae23fb5dd63f019bf08fdaea03df7709b8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570504973093609500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "genialna pogoda tak od razu lepiej mi się żyje jak słońca nie ma no po prostu to moje warunki w których moge się realizować życiowo", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:45:59Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-855": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91092756, + "lng": 10.72836399 + }, + "type": "LatLng" + }, + "description": { + "value": "Her star drosjene i kø på fortauet! Er det lov?", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:23:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "9547180e8a12e44618a621a4bb35cd34a97bd649.jpeg", + "type": "String" + } + } + }, + "tweet:570509414807031800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.45867, + "lng": 5.270707 + }, + "type": "LatLng" + }, + "author": { + "value": "Marthe", + "type": "String" + }, + "description": { + "value": "If this whole Rih and Leo things is just a joke they're probably at home laughing their ass off bc of this but WHAT if it's not a joke??", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:03:38Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/559161024088403970/3UAWrxZc_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-795": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91091142, + "lng": 10.73308467 + }, + "type": "LatLng" + }, + "description": { + "value": "Rådhusplassen. Fra Vippetangen til Dokkveien / Aker brygge. Dette er en del av hovedsykkelveinettet i Oslo. Det mangler oppstiplet sykkelvei her, ofte er plassen blokkert av telt/gjerder til arrangetmenter og det tilpasses ALDRI for syklister. Dette burde være et krav for å få lov til å kapre 90% av rådhusplassen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:46:45Z", + "type": "DateTime" + }, + "bilde": { + "value": "753b1230bd4e6107687b30ed6ff24f85.jpg", + "type": "String" + }, + "streetview": { + "value": "c9136bd6ec83b7d96bca045f93a3a88732bb28bc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-546": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9242053, + "lng": 10.73982238 + }, + "type": "LatLng" + }, + "description": { + "value": "Innsnevring i forkant av kryss i hele gata gjør gata veldig farlig for syklister da biler og busser ikke nødvendigvis tar hensyn. I tillegg er det mye parkering i sykkelveien som ofte skaper nestenulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:26:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "baa7cd87f28a36a748f821bd2f8718c679f48629.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-258": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91861843, + "lng": 10.74375987 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvorfor er det slik at det alltid tas masse hensyn til bilbanene ved veiarbeid, mens sykkelstiene blir spist opp uten videre??? Veiarbeid de siste tre åra har presset meg ut av sykkelstien neders i Ullevålsveien mange ganger og inn i en allerede trang veibane.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:09:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "6de14fa50609ad1428f046cd3968896c4f7d691a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-969": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93794531, + "lng": 10.68493366 + }, + "type": "LatLng" + }, + "description": { + "value": "I tillegg til inn- og utkjøring til Statoil og taxiparkering er det her en bussholdeplass rett oppi sykkelvei. Mye å passe på samtidig!", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:37:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "62f1acd3c43f452eb1abb146d159cab8e5937792.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570485467193290750": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "The largest number of Trends in Norway for Tuesday 24 was at 18 hours: http://t.co/HPpeAZ2ODq http://t.co/jXESz2gBBO", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:28:29Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rFgoKUAAATK7K.png", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-198": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91783867, + "lng": 10.74411392 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette krysset er et mareritt.Skal man sykle i sykkelfeltet og fortsette oppover Ullevålsveien er løsningen direkte farlig, med mange biler som svinger til høyre og som ikke ser syklistene. Jeg velger derfor aldri sykkelfeltet og holder meg sammen med bilene og gjør meg mest mulig synlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:38:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "af3daaaa8ac65ced5f6a76d6d1e4dc0083f1840b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570485383781359600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 67.26423, + "lng": 15.38742 + }, + "type": "LatLng" + }, + "author": { + "value": "Tor Håkon Bjørnli", + "type": "String" + }, + "description": { + "value": "@TorBjornli #wunderground @wunderground Sunset just above the Arctic Circle, here in Fauske Northern Norway.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:28:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506720265141637120/F59AU3OW_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570518419252088800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.72961, + "lng": 11.359339 + }, + "type": "LatLng" + }, + "author": { + "value": "ida", + "type": "String" + }, + "description": { + "value": "sorry seems to be the hardest word", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:39:25Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/528599666829819904/Yv9NTx8__normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "BD6BA9", + "type": "String" + }, + "streetview": { + "value": "479cb548bb5e938f393e254fb9b1ac3873a0b791.jpeg", + "type": "String" + } + } + }, + "aftenposten-735": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90796905, + "lng": 10.76780319 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig vei. Trikkeskinner, mye biltrafikk og en sykkelvei som plutselig flettes inn i bilveien. Her kan det skje alvorlige ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:47:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "cce577a53174963fda97e31b0c49a1a7d439a2e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1004": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92162438, + "lng": 10.77548503 + }, + "type": "LatLng" + }, + "description": { + "value": "Lysset i dette krysset fungerer ikke for sykler som kommer ned fra Tøyenbadet, da du enten ikke veier nok eller inneholder nok metal som syklist, til at sensoren reagerer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:35:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "e42c9eea699872b4e296dded0026cfebf6a43d46.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570515058268237800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.47151, + "lng": 6.17293 + }, + "type": "LatLng" + }, + "author": { + "value": "Cecilie Helle", + "type": "String" + }, + "description": { + "value": "@emarjmanere @YouTube #riffmaster #sindremyskja #guitarist #polepositionofficial \\m/", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:26:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570231728506040320/Xwo0MRGZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-777": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92966758, + "lng": 10.76119422 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvor er det tenkt at jeg skal sykle her? Supertrangt! Skvises mellom trikk/bil/fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:14:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "835cc31639edc7934c96e5088dff5bb73057e941.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-659": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94607052, + "lng": 10.76055049 + }, + "type": "LatLng" + }, + "description": { + "value": "Som syklist er det svært vanskelig å få plassert seg riktig i denne rundkjøringen om man kommer sørfra og skal videre nordover på Maridalsveien. For langt til høyre og det oppstår farlige situasjoner med biler som skal ta av til høyre, og legger man seg i venstre fil er det mye tuting og farlig kjøring av irriterte bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:01:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "3373d2c18fc79aa99c9a0f01a552a7919622e1e1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570514118739939300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.93248, + "lng": 5.59444 + }, + "type": "LatLng" + }, + "author": { + "value": "Reidar Humlestøl", + "type": "String" + }, + "description": { + "value": "@truckeradamuk @jack_kyte @ESlibrarian @LongHaulLife @gluttnous nope, it just stood ready at the dealer for a customer", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:22:20Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/519111905324322816/uxZXoPlI_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570512913217277950": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Ingeborg Senneset", + "type": "String" + }, + "description": { + "value": "@DanielHanSelv @SteinarBl Eller motsatt.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:17:32Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/472523292625342464/imx4OcPq_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "6CA1CF", + "type": "String" + } + } + }, + "aftenposten-671": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91323501, + "lng": 10.64214706 + }, + "type": "LatLng" + }, + "description": { + "value": "Foruten de farlige trafikale forholdene her er det sjokkerende at det er lagt grov brostein i sykkelveien før og etter inn/utkjøringen til Gjensidige. Alle syklister mister fart og risikerer å punktere, personer på rulleski kan lett falle. På marginen bidrar dette til at folk velger bilen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:25:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "cb2061203bf6f80ce61dfa64e833f47ebea8487f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-833": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94038523, + "lng": 10.79863786 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang- og sykkelvei ender ut i kryss hvor biler parker i krysset. Ofte så trangt at man ikke kommer ut mellom bilene, og dårlig sikt. Bør få opp parkering forbudt i krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:56:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "284ba70e80285c3d175a8dbc9e46ab3d511b00e9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-235": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92347406, + "lng": 10.79247951 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen steder å gjøre av seg når du skal fortsette over krysset og ikke ta til høyre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:56:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "e0c5b1d7d7e04489562cc7b154bff539faa211f1.jpeg", + "type": "String" + } + } + }, + "aftenposten-925": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93046319, + "lng": 10.75904846 + }, + "type": "LatLng" + }, + "description": { + "value": "Innføring av enveiskjøring tvinger lovlydige syklister på denne viktige nord-sør-aksen opp på fortauet. Problemene fortsetter ved kryssing av Sannergata; det er svært trangt på fortauet for de mange myke trafikanter som her må vente i lange stunder på grønt lys mens bilene (og en og annen buss) dundrer forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:53:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "003d14b5bd822edf8bdc678501336ea48e73f959.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-994": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92284496, + "lng": 10.72640061 + }, + "type": "LatLng" + }, + "description": { + "value": "Eneste sykkelvei fra Majorstuen inntil sentrum. Det er mange syklister her. Høy fortauskant spesielt ved trikkeholdeplass. Trikkeskinner, nedoverbakke og mange drosjer gjør veien utrygt å sykle. Det finnes ikke et god alternativ.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:28:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "f58671a449ef5599de0943813f8092a4d88490d8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-197": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92828328, + "lng": 10.81094384 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig uoversiktiglig uttkjøringfra parkeringsområde. Mange farlige situasjoner oppstått i dette krysset. Bilene som kommer ut fra Østre Akervei 18-24 er ikke oppmerksomme nok når de kjører ut på Risløkkveien. Et vikepliktskilt/stopp skilt kan løse hele problemet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:37:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "ab6b553d4005529781ae27eed814dd309ff98612.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-125": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93620393, + "lng": 10.73162555 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien forsvinner i løse lufta ved lyskrysset, og bilene blokkerer slik at man ikke syns eller kommer forbi. Det er høy fortauskant så man kan heller ikke komme seg opp på fortauet", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:45:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "85dae2ce93c56142c5ba687a4d21d00bced5e29e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-402": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91511204, + "lng": 10.76987385 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig for syklister i sykkelfelt. Sykkelfeltet fortsetter ned Tøyengata, mens bilene er tvunget til høyre eller venstre. De som skal til høyre svinger ofte uten å passe seg for eller markere for syklister som skal rett fram.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:12:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "aa4365a3951aab04c3bb1dda9c97b65b275a3c6a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-84": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91940893, + "lng": 10.74347019 + }, + "type": "LatLng" + }, + "description": { + "value": "Her nederst i bakken stopper sykkelveien brått, for at trafikkskolen skal kunne stoppe bilene sine utenfor sitt lokale. Syklistene må svinge i full fart ut i trafikken. Livsfarlig!", + "type": "String" + }, + "date": { + "value": "2014-09-09T10:07:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "943d52d627a7db8b7f08d582fea949bf1174edfd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-721": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.85401896, + "lng": 10.8025217 + }, + "type": "LatLng" + }, + "description": { + "value": "Strekningen Ljabru-Sæter er smal og det er stor trafikk med mange busser. Føler meg utrygg hver dag når jeg sykler, spesielt på morgenen mellom 0700 og 0730", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:27:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "ee00acf5c9bce55fd41b0c3e1f1ead9d2fbbdf9c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-935": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92693655, + "lng": 10.76149463 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er et generelt innlegg. sykkelfelt stopper uten skilting. Veien blir smal og syklis og billist må plutselig dele 1 felt. Dette vil aldri skje uten god skilting og merking i veien hvis bilistene opplever innsnevring til 1 felt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:06:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "aa2217f55bca318340e66e1bc871529462269ec6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570509231041990660": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.946956, + "lng": 11.006653 + }, + "type": "LatLng" + }, + "author": { + "value": "Sebharikketwittah", + "type": "String" + }, + "description": { + "value": "@aminklungseth jeg drikker ikke øl lenger, bare søte bobler http://t.co/My53bMGoL5", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:02:54Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rbHb6WwAAqBK0.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560967257732284416/X5LZiTDK_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "tweet:570518725499211800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.397897, + "lng": 5.325747 + }, + "type": "LatLng" + }, + "author": { + "value": "Kong Mathias", + "type": "String" + }, + "description": { + "value": "@Hobbersten Det er tøft når noen du konstant slenger dritt mot (og som viser seg å være en bedre samfunnsborger) er «frekk» tilbake.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:40:38Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1802216880/Follomatch_3_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-914": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8849106, + "lng": 10.81732749 + }, + "type": "LatLng" + }, + "description": { + "value": "Her var halvparten av fortauen tidliger brukt som sykkelfelt. Dette ble fjernet siden det bare var en hvit strek som skilte syklende og gående. langs denne strekningen får jeg mange lydsignaler fra bilister som vil ha meg over på fortauet. Det er mange farlige forbikjøringer selv om de fleste er ok. Her er det plass til alle hvis deler av fortau og vei blir brukt til sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:37:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "5b5be2447cddd2df4fdfdacad762fbb74989257f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-540": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95623498, + "lng": 10.78881025 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig kryss for syklister som følger Kjelsåsveien, på grunn av at biler i Lyngåsveien ikke overholder vikeplikt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:21:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "d3f06ff4af0f96865da63696aac6ca63d1b66afd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-993": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95102421, + "lng": 10.73984743 + }, + "type": "LatLng" + }, + "description": { + "value": "Massevis av syklister som ikke forstår at de har vikeplikt kommer i full fart her hvis du skal kjøre mot parkeringsplassen på Ullevål Stadion. Ikke enkelt å oppdage hvis en syklist krysser veien i 20km/h og du samtidig er på vei ut av rundkjøringen", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:27:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "3a07360e7ce2e601446f969a977a4c70569c02d7.jpeg", + "type": "String" + } + } + }, + "aftenposten-932": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95098123, + "lng": 10.6369543 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kommer biler i stor fart. Det er dårlig sikt rundt svingene og det er ikke plass til både fotgjengere og syklister på fortauet. Veldig mange fra nærområdet krysser denne veien hver dag til og fra skole eller jobb for å ta T-banen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:03:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "5417bd328cbbae8d3bf5f1af846f4a05b3b03a28.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-930": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92375602, + "lng": 10.64477605 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig sving med mange nestenulykker mellom syklende og syklende/gående. Lett å forbedre sikten med beskjæring.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:01:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "41771ba3fa5531d3558ee2dcfe0d5a3660d20468.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-734": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94086889, + "lng": 10.74999332 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom fra Ullevål Sykehus og skulle gjennom rundkjøringen til Stavangergata. Ble påkjørt av bilist inne i rundkjøringen, bilisten kom på Uelandsgate og skulle nordover. Bilisten overholdt ikke vikepliken og kom veldig fort inn i rundkjøringen. Jeg så han tidlig og antok at han ikke kom til å stoppe for meg, så jeg bremset så mye jeg kunne og svingte kraftig til venstre for å unngå kolllisjon. Bilist kjeftet på meg fordi jeg \"ikke skulle sykle på den siden av veien\",\"tydeligvis forvirret ang. vik\"", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:46:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "efc730c4ff3292983af34679088a39c7801454a2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570502468783738900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Hr. Haukedal", + "type": "String" + }, + "description": { + "value": "@spildrejordet haha", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:36:02Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/502558630336421888/FX5B5J9O_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "aftenposten-764": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91342863, + "lng": 10.75449943 + }, + "type": "LatLng" + }, + "description": { + "value": "Hva har skjedd med sykkelfeltet her? Den ble tatt bort og har ikke kommet tilbake. Ofte værelevering her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:05:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "255c05dd2d1e38566cbc1202d80ca0d0527dd232.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-196": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91724711, + "lng": 10.74433922 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet ligger mellom to kjørefiler (en for de som skal rett fram, og en for de som skal svinge av til høyre). Har både opplevd selv, og sett at blier har vrengt seg over fra en fil en annen uten tanke på at det kommer sykler i sykkelfeltet i mellom.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:37:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "a6db378c3601862a9aef737503e940e641f385c0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-83": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92112968, + "lng": 10.75331926 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig kryss for syklister som kommer ned bakken og biler som har forkjørsrett, og som kommer svært fort ut fra Brenneriveien.", + "type": "String" + }, + "date": { + "value": "2014-09-09T09:45:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "1990455ab695d847dae0e770e6654ff6df8fb9d4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570499209172033540": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.919758, + "lng": 10.760644 + }, + "type": "LatLng" + }, + "author": { + "value": "Tommie Cau", + "type": "String" + }, + "description": { + "value": "Now let's kick off #agilepeople Norway. Full day with hr, it and management. Of course @ComprendCom is here. http://t.co/Dft4KlXJH7", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:23:05Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rR-deWkAANfCH.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2841646222/43129513b6772cb10998cec8f8ac1cdf_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "01010A", + "type": "String" + }, + "streetview": { + "value": "f78bd6bd2ca1be5c1bf34e761a738d255afe57f1.jpeg", + "type": "String" + } + } + }, + "aftenposten-572": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92108666, + "lng": 10.75119495 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundkjøring hvor sykkelfeltene bare forsvinner et par meter i forkant. Bilister og sykklister må sortere dette selv.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:52:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "ba25d340afa98d9dc80f4c70a6755caf87b6ca6e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570490108538957800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.132413, + "lng": 7.957878 + }, + "type": "LatLng" + }, + "author": { + "value": "Marianne Laukvik", + "type": "String" + }, + "description": { + "value": "@withtsjalling rot voor je! Veel succes .et het vinden van nieuw ruimte!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:46:55Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3409095870/6bf9f9a3c359719f1fe320a0da83c518_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "1F98C7", + "type": "String" + }, + "streetview": { + "value": "6583b78804ee5717f55f2504a8588e08feb25d43.jpeg", + "type": "String" + } + } + }, + "tweet:570512487277309950": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 67.26423, + "lng": 15.38742 + }, + "type": "LatLng" + }, + "author": { + "value": "Tor Håkon Bjørnli", + "type": "String" + }, + "description": { + "value": "@TorBjornli Just before SUNRISE, not not enough coffe yet .... ;-)", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:15:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506720265141637120/F59AU3OW_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "aftenposten-556": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93616093, + "lng": 10.73162555 + }, + "type": "LatLng" + }, + "description": { + "value": "Merket sykkelfelt nedover Sognsveien opphører et par meter for veien møter ring 2. I tilleg står det altid biler i 2 køer ved siden av hverandre og blokkerer sykkelfeltet. Dette bør merkes tydeligere.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:37:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "09b1216d7e4c70203882582e1f0fe98c1b05d904.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-759": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92253579, + "lng": 10.70522725 + }, + "type": "LatLng" + }, + "description": { + "value": "Steinhellene som er brukt til fotgjengerfelt er ekstremt glatte når de er våte. Skled med sykkelen og hadde flaks da jeg landet i blomsterbedet i stedet for veibanen, da bilen bak ikke rakk å stoppe og mest sannsynligvis hadde truffet meg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:02:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "1c4c1601ae76c438543aa809b786d4e7fbe565c8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-658": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93080723, + "lng": 10.74632406 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært mørkt som følge av masse trær. Det blir liggende løv i veibanen, og det holder seg vått lenge. Gateparkerte biler med dårlige siktforhold. En skarp hump midt i veibanen i krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:59:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "6213be505800a2764d793fc9dc7c474a38122df6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-427": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87702721, + "lng": 10.77578201 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkeltraseen langs E18 går inn på en svært smal og uoversiktlig bro der det ikke er mulig å møtes uten å stoppe og gå av. Farlig dersom noen sykler fort, svært kronglete og mange syklister velger heller å sykle på den svært trafikkerte og farlige E18 for å unngå denne omveien", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:22:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "88e6575e16d3b0ead0b30e0d6162312695319b28.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-918": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9213604, + "lng": 10.71265189 + }, + "type": "LatLng" + }, + "description": { + "value": "Kjørebanene er delt av en alle i midten. Veien brøytes ikke ordentlig om vinteren. Smale hjulspor i snøen i veien og biler kan ikke passere. Farlige situasjoner. Fint mulig å lage sykkelsti mellom trærne i midten av gaten.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:43:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "c1343f19479f91d8f16c8e1cf0479394d89b4efb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-844": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94236129, + "lng": 10.7044361 + }, + "type": "LatLng" + }, + "description": { + "value": "vinderen-krysset er et av byens farligste. mange nesten-ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:12:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "aeafa75dfb43593b4c6d6715023160a91d29e37f.jpeg", + "type": "String" + } + } + }, + "aftenposten-728": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92106515, + "lng": 10.74179649 + }, + "type": "LatLng" + }, + "description": { + "value": "I denne bratte bakken av Ullevålsveien er det faktisk sykkelfelt, men jeg vil ikke anbefale syklister å bruke det på vei ned bakken, og heller legge seg midt ut i kjørefeltet for biler. Om man bruker sykkelfeltet her, er det fort gjort at biler på vei ut av Frimanns gate ikke vil se langt nok til venstre, og slik ikke få øye på en eventuell syklist her, som kommer i forholdsvis stor fart ned bakken. Etter en del ubehaglige episoder ligger jeg nå alltid midt ute i kjørefeltet her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:35:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "eca32a135eb92a7904d857940f1cc0b461faa56d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-905": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93024816, + "lng": 10.73351383 + }, + "type": "LatLng" + }, + "description": { + "value": "Theresesgate er en hinderløype for syklister. Midt i trikkesporet er beste mulighet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:15:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "f53b283927dd409b42f90e0c9c8b318c97953476.jpeg", + "type": "String" + } + } + }, + "aftenposten-893": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92885044, + "lng": 10.71531772 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet tar slutt i krysset. Skal man rett frem og videre bortover Kirkeveien må man passe på biler som bytter felt til høyre og skal opp Sørkedalsveien, da det plutselig blir tre felt midt i krysset. I tillegg kommer bussen ut av holdeplassen på Majorstua og skal videre bort Kirkeveien. Daglig farlige situasjoner.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:36:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "288fd636b3014927bd41dac79701a2d848bc89b7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570485726305001500": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.909462, + "lng": 10.747686 + }, + "type": "LatLng" + }, + "author": { + "value": "Бандурка Елена", + "type": "String" + }, + "description": { + "value": "#art #hotel #Oslo #Norway #design #happy #beautiful @ Comfort Hotel Børsparken https://t.co/1Vv1ppTUrl", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:29:30Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-b-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10983568_437561819733817_393255841_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/462734289604739072/QO5PtV8J_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "b450588f57d203392bb1cc7c432d81141afe2437.jpeg", + "type": "String" + } + } + }, + "tweet:570516959693017100": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Olav Skaar", + "type": "String" + }, + "description": { + "value": "Ny «inspirasjonsplakat» på kontoret. Ja, eg er ein arbeidsmaur i dag. http://t.co/50X1i9WOhb", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:33:37Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-riJr9WsAEuk0k.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/470254864799260672/F6W2JxZQ_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "4C9949", + "type": "String" + } + } + }, + "aftenposten-732": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93540846, + "lng": 10.79046249 + }, + "type": "LatLng" + }, + "description": { + "value": "Ny miljøgate planlegges med adskilte sykkelfelt for øst/vestgående retning på hver side av veien, til tross for at store deler av sykkelveien langs ring 3 forøvrig, inkl. det tilsvarende prosjektet på Teisen, er utført som en samlet gang og sykkelvei for begge retninger på innsiden av \"ringen\". Å benytte en annen løsning kun på en 1km delstrekning blir meget inkonsekvent. Sykkelfeltene er dessuten planlagt slik at de slutter i kryssene og videre overgangene fra sykkelfelt til fortau og videre", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:43:22Z", + "type": "DateTime" + }, + "bilde": { + "value": "ce03a9b92e4c5ecfdd731abf9cae3061.png", + "type": "String" + }, + "streetview": { + "value": "ca04a6277606131d11ce5d200ecab987f0d0fbb4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-445": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91114809, + "lng": 10.74458599 + }, + "type": "LatLng" + }, + "description": { + "value": "Både i Kirkegata og i tilsvarende strekning i skippergata er det altfor mange biler som gir faen og parkere i sykkelfeltet, særlig når de \"bare\" skal levere eller hente noe. Entreprenører som jobber med byggene har dessuten fått (eller tatt seg) rett til å ta sykkelfeltet som en del av arbeidsromm", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:29:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "a294f95647090a07a6a77127cf865647819a620b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-571": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92805479, + "lng": 10.74956417 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundkjøring på Aleksander Kjellands plass har ingen tilrettelegging for sykkeltraffik. Sykkelfeltene bare forsvinner et par meter for rundkjøringen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:51:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "6081d07f609ea504a08b59b2c12835d9b930f02a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-195": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92087157, + "lng": 10.7573533 + }, + "type": "LatLng" + }, + "description": { + "value": "Folk går i sykkelfeltet. Alt for liten plass.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:37:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "58364cf31703cd6d1dfdc44cbe074dad02d17237.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-899": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91929062, + "lng": 10.69797992 + }, + "type": "LatLng" + }, + "description": { + "value": "Meget farlig. Dype spor i veien som er vanskelig å se kan få selv den mest erfarne syklist til å miste balansen midt i trafikken", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:52:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "6e954b0def41b6fbba98673e13cf902071d8ebbc.jpeg", + "type": "String" + } + } + }, + "tweet:570487963806789600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "M83 مِنْيار ", + "type": "String" + }, + "description": { + "value": "@HananAbuNaser التلج هو الي بيسوي خبصة والواحد لا بيعرف يمشي ولا يسوق ولا يعمل اشئ. المطر بيكون الجو أدفي شوي كمان.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:38:24Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/540943886193946625/mdF7xrck_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570493497851060200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "6. Suarez\n7. Takk\n8. #2hockey\n9. Messi\n10. #vglista\n\n2015/2/25 08:52 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:00:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-480": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95317845, + "lng": 10.79728603 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig utkjørsel ! Syklister (og rulleski, skatere) kommer i svært stor fart nedover Grefsenkollveien. Et boligsameie har satt opp en kompakt støyskjerm her som skjuler biler som kommer ut fra utkjørselen (godt over 100 boenheter med minst like mange biler !) og bilistene kan heller ikke se sykl", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:46:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "f03ce2702aafa05bd2fe283ef9319e7065b6a175.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-816": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93751535, + "lng": 10.68274497 + }, + "type": "LatLng" + }, + "description": { + "value": "Ekstremt uoversiktlig undergang med mange fotgjengere og syklister som overlapper med t-banestoppet. Inndeling i høyre-/venstrefelt kunne bidratt til at fotgjengerne hadde fulgt litt bedre med?", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:14:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "952b8eaf11e17025a9324866174c7d25f6f99f75.jpeg", + "type": "String" + } + } + }, + "aftenposten-367": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91364377, + "lng": 10.74716091 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler i torggata fra sentrum til løkka hver dag hjem fra jobb - svært uheldig at syklister må bruke denne gata hvor det også går gående på kryss og tvers (pluss varelevering). Har opplevd flere nestenulykker hvor gående brått bestemmer seg for å skulle gå inn i en av gatens butikker. Storgata er ik", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:58:26Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-915": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8810561, + "lng": 10.78531265 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil krysser sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:41:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "59b09ae9075e1bcee9faa3a11c562f79be779428.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-479": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9466938, + "lng": 10.76855421 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet mellom Sandakerveien og Kristoffer Aamots bro mangler/ødelagt etter byggingen av Statsbygg sitt kontorbygg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:46:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b1472d900de066b46d3e9cd417420406517259b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-857": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9143322, + "lng": 10.74162483 + }, + "type": "LatLng" + }, + "description": { + "value": "Mot vest kjører trikkesporene mot høyre, hvilket gjør at biler ofte glemmer forkjørselsrett og dreier med sporene til høyre uten å se etter syklister", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:25:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "60063a1a624c21be51ca246bccd0b917aa13da3e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-924": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91298759, + "lng": 10.64054846 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig å se syklister komme fra Frantzebråtveien inn i rundkjøring Strandeien. Både busker og skilt sperrer utsikt. Flere nesten ulykker her,", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:53:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "06a221970d83e4603e6e43ee0b552532c948cf15.jpeg", + "type": "String" + } + } + }, + "aftenposten-874": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91297942, + "lng": 10.73466095 + }, + "type": "LatLng" + }, + "description": { + "value": "Roald Amundsens gate er \"hovedsykkelvei\" ihht. dette kartet og gatebruksplanen. Men innkjøring forbudt fra Fridtjof Nansens plass. Ganske utrolig - 50 meter fra Rådhuset. Sykler Oslos politikere selv noen gang?", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:57:16Z", + "type": "DateTime" + }, + "bilde": { + "value": "7eaba7eeaf084d7a3d9b0d3db2d0bc4a.jpg", + "type": "String" + }, + "streetview": { + "value": "824bb8cfc08782fe1f71a1a7a4e1178b9b7cf56c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-555": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91041387, + "lng": 10.73869585 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelskilt med pil til venstre. Det er veldig uklart hvor sykkelveien går her. Er det meningen at man skal følge veien eller krysse over på fortau? Bedre merking og tilrettelegging i veien hadde vært en fordel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:35:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "8a7d6027678652013b36bc526607943b86942505.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570504970237300740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.484354, + "lng": 6.387375 + }, + "type": "LatLng" + }, + "author": { + "value": "PERFECT TUNE©", + "type": "String" + }, + "description": { + "value": "@mohamed_nasr_m @PoleOfficial Hey 👏🎵🎵", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:45:59Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566919243615051776/cK3ro78r_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-366": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9115757, + "lng": 10.72685122 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig kryss med mange syklister og fotgjengere på samme sted. Årsak: Sykkelveien stopper/starter her. Løsning: Lag sammenhengende sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:58:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "4383065def6af87fe21dc2191a083b314e235319.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-290": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9267215, + "lng": 10.74660301 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkerte biler langs veien i kombinasjon med busstrasé gjør at bilene ofte presser seg forbi meg med lite klarering. Oppleves utrygt fordi man samtidig må følge med på om noen kommer ut av de parkerte bilene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:20:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "2f99428864f44c23577b9d72fdb7c6309f707b13.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-150": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9063068, + "lng": 10.76359748 + }, + "type": "LatLng" + }, + "description": { + "value": "Alle syklistene som kommer ned Dyvekes vei må krysse denne trefelts veien, for å komme riktig inn på venstre side av Dr eufemias gate (der _alle_ sykler). Dette skjer i en bakke der alle sykler fort. Kryssende anleggstrafikk inn fra venstre, fra uoversiktelig innkjørsel. I dag hadde de satt opp et s", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:11:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "db51933c483f0710c13627aab3bc0e33fbce8cda.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-478": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92783975, + "lng": 10.70982456 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkering på innsiden gjør sykkelfeltet trangt. I tillegg står det ofte feilparkerte biler her. Mange barn sykler her, men de blir tvunget til å sikksakke mellom fotgjengerne på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:46:36Z", + "type": "DateTime" + }, + "bilde": { + "value": "62abbbb8c5cbd446da8a2cb6f0dc94ef.jpg", + "type": "String" + }, + "streetview": { + "value": "86c536689aeca25dc06913e49ca721b41eae2433.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-162": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93863323, + "lng": 10.76831817 + }, + "type": "LatLng" + }, + "description": { + "value": "Vogts gate mister sykkelstien der den går over fra Toftesgate. Her er både trikk og biler som gjør det vanskelig for syklister å slippe til. Opplevd farlige forbikjøringer fra biler flere ganger.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:22:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "e93adca58672ead8568d76f3775c7d634dbf46d8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-419": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92579676, + "lng": 10.70991039 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble dyttet av en bil mens jeg lå i sykkelfeltet, sånn at jeg traff fortaukanten og stupte inn på fortauet. Fikk bare skrubbsår.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:19:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "7a1a96744fad7aea96d7aa78813d3773f2f6a849.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1003": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91719333, + "lng": 10.63068866 + }, + "type": "LatLng" + }, + "description": { + "value": "Fortauet langs store deler av Vollsveien er nå så trangt at det ikke er plass til både syklende og fotgjengere, selv om om man sykler hensynsfullt og forsiktig. Syklistene må da stort sett ut i veien, men der er det for trangt for både syklende og biler. Burde vært utbedret for lenge siden.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:35:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "673d5d1f750b9a407a13aa491905cde76bb2f297.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-149": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90671564, + "lng": 10.74600219 + }, + "type": "LatLng" + }, + "description": { + "value": "Grønt lys varer så kort at trafikken begynner igjen når du er i farta igjennom krysset, retning mot Operaen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:11:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "520cf26c899575001c6814aeb204da7e295af007.jpeg", + "type": "String" + } + } + }, + "tweet:570498897799471100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.97101, + "lng": 5.73064 + }, + "type": "LatLng" + }, + "author": { + "value": "Thor Bjarne Bore", + "type": "String" + }, + "description": { + "value": "De er enige: \"Det grunnleggende ledelsesproblemet ligger selvfølgelig på toppen\" http://t.co/pjVObwZf4F og http://t.co/6B1HcbEwJL", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:21:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/459261419964231680/0Eiu1Kzl_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-1014": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92065648, + "lng": 10.74248313 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussstoppet er i sykkelfeltet. Når 37-bussen (som kjører svært ofte) stanser for å slippe av/på passasjerer må syklistene ut i veibanen. Anbefaler syklistene å holde seg i veibanen hele tiden, ikke ligge i sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:49:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "6208eecde3272443b19ee8400ce02fa54065e757.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-880": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91318789, + "lng": 10.74993323 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler man Skippergata og vil videre østover i Storgata, har man ingen trafikklys å forholde seg til. Men det har kryssende trikk, buss og taxi.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:08:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "e77612ad8a566cefc8786fde737006a82234b932.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-272": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89600864, + "lng": 10.76091527 + }, + "type": "LatLng" + }, + "description": { + "value": "Utrolig trangt fortau, som ikke kan benyttes av sykler. Videre trang vei, som er veldig trafikert.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:14:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "c598b515e7e0e545692119e01d6266a397f5846b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-699": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95436565, + "lng": 10.65379858 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang- og sykkelveg ned i Merradalen brukes mye av skolebarn. Dette burde gjøres om til en sykkelveg med fortau for å separere gående og syklende.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:54:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "4a951c9603a06b9d37fe71be635f8e57485c084f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570498623726882800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.91941, + "lng": 10.701091 + }, + "type": "LatLng" + }, + "author": { + "value": "Emily Victoria", + "type": "String" + }, + "description": { + "value": "@babyhaim @edwarddroste pat* not pay. Never pay.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:20:45Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/505345041158897664/pHU0gz6S_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "eaca6cb28bc0eb04d327b4d735c436abf20d8869.jpeg", + "type": "String" + } + } + }, + "tweet:570508740434272260": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "GAFFA.no", + "type": "String" + }, + "description": { + "value": "Kristoffer Lo & Trondheim Jazzorkester tar turen innom Øya! @Trondheim_J_O @kristofferlo -- http://t.co/2kt6i0ozvD", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:00:57Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561092082480078848/HmfDxO1J_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570510025724186600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.727398, + "lng": 11.265763 + }, + "type": "LatLng" + }, + "author": { + "value": "Hallgeir", + "type": "String" + }, + "description": { + "value": "Tror ikke pressekonferanse er noe av det Rune Velta liker best #vmfalun #nrkvm", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:06:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/433126738508644352/yAZVqgZ2_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-955": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94325487, + "lng": 10.82732677 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det en passasje gjennom et gjerde hvor fotgjengere kan benytte. Syklister har meget høy fart her og får ikke bremset opp hvis noen kommer ut i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:25:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "cd46bfed714b1813a8ffa28e95a7898edcde95f5.jpeg", + "type": "String" + } + } + }, + "aftenposten-727": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89749384, + "lng": 10.75997114 + }, + "type": "LatLng" + }, + "description": { + "value": "Strekningen Gamlebyen-Sjømannsskolen. Her er det farlig å sykle i veien på ettermiddagen. Har opplevd å bli sprutet på av spyleveske. Da blir det å sykle på det smale fortauet som skaper konflikter med gående.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:33:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "462715b8ca5de21094247549e8ff0a5010bc2888.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-937": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91342863, + "lng": 10.68077087 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kjører busser og biler i høy fart (60). Fortau er veldig dårlig og vanskelig å sykle på, så du må nesten ut i veien for å komme frem. Denne svingen er bussene flinke til å kutte, noe som gjør det skremmende å sykle.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:07:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "54621b5b5943a9cd73a844a0cc01bdd5a2f06078.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-301": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92678601, + "lng": 10.76104402 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussholdeplass går inn i sykkelvei, stort problem svært mange steder med busser som kommer bakfra og krysser før syklist slik at syklist må hive seg ut i kjørebane uten tid/mulighet til å se seg for.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:24:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "ad21fff223497990bdc1fd39b8e2e0a1d0537c3f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-949": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93510746, + "lng": 10.78509807 + }, + "type": "LatLng" + }, + "description": { + "value": "En del av hovedsykkelveinettet, langs Ring 3. Her går traseen på for smal vei, med massevis av lukeparkerte biler. Fare ved åpning av bildør og utkjøring fra luke og ut i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:17:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "db69f5204df2e089ce75edff0f3a587bb92b4fd8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-870": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91622316, + "lng": 10.73565916 + }, + "type": "LatLng" + }, + "description": { + "value": "Kristian IVs gate er \"hovedsykkelvei\",\"men det er ikke tillatt å sykle østover (enveiskjørt).\"", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:44:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "1bfb63ecd7d04ab3c438119ee07ff8859a39b29a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-832": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91407673, + "lng": 10.64650297 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det lagt pyntefelt med brostein i gå/sykkeltrasé på begge sider av vei i enden av en bakken, som er såpeglatt når det er vått.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:53:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "d1d2a9545b94611743b95b7188a831ad602270c6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-588": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92533438, + "lng": 10.71184158 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom fra Jacob Aallsgt, og ble påkjørt av drosje som kom i full fart fra min venstre side. Bilen kom så fort at jeg ikke så ham på den trange veien, og man regner med at biler tar hensyn til at de har vikeplikt fra høyre i denne gaten. Etter alle ulykkene jeg har vært utsatt for, tenker jeg at man ikke kan være forsiktig nok, men må tenke at bilførere IKKE følger trafikkreglene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:02:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "d4a8d205760a6505cb5c8de5ca862e7185657339.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-564": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9255602, + "lng": 10.72257041 + }, + "type": "LatLng" + }, + "description": { + "value": "Det mangler oppstillingsplass og sykkelstativer for personer som handler i Bogstadveien med sykkel. Den store sykkelstativ foran Clas Ohlson er forsvunnet under byggearbeidene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:46:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "26b993251ad12555c264a4d40047275ee33b1a98.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-941": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9067802, + "lng": 10.76076507 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved det nye lyskrysset som både syklister og fotgjengere bruker respekterer ikke bussene traffiklyset. Når fotgjengere får grønt lys og bussen/ biler rødt pil, svinger busser likevel over fotgjengerfeltet. Her er det bare spørmsål om tid før noen blir påkjørt!", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:09:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "785afe0dcdc43dc93ffbe8cf29656fcecd40e14c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570492290667585540": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 62.47151, + "lng": 6.17293 + }, + "type": "LatLng" + }, + "author": { + "value": "Elias Øvregård", + "type": "String" + }, + "description": { + "value": "Gymnasiaster dopar seg med #adhd-#medisin http://t.co/Ger2PrfpRO\nSkremmende når en ser bivirkningene http://t.co/VBF0QYxjOh", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:55:35Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rLtvuXIAABZP3.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000747862053/8fbe3389568119fd8131910e8758cfb3_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "DD2E44", + "type": "String" + } + } + }, + "aftenposten-794": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91078771, + "lng": 10.72914719 + }, + "type": "LatLng" + }, + "description": { + "value": "I morgenrushet fikk jeg plutselig en fotgjenger hoppende ut i min trasé mellom trikkeskinnene på vei ned mot rådhusplassen som gjorde at jeg måtte svinge unna, fikk forhjulet i trikkeskinna og tryna, knakk lårhalsen og endte til slutt opp med hofteprotese. Håpløst sted å sykle og alle må sluses gjennom her. Burde vært sykkelbru fra Fillipstad til Vippetangen eller der omkring. http://www.terrengsykkel.no/ubb/ubbthreads.php?ubb=showflat&Number=437032", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:46:02Z", + "type": "DateTime" + }, + "bilde": { + "value": "77c298176edc0110a8be2e127c3e4d67.jpg", + "type": "String" + }, + "streetview": { + "value": "deb6f2e00f8ed3ebfd646bb8d329f439a5ca5920.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-1002": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91286927, + "lng": 10.74750423 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne ruta er IKKE tilrettelagt, men ekstra farlig pga alle busser og trikker som skal gjennom svingen i Kirkeristen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:34:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "f0d0af63d21e9446249137b679303c782f4ec067.jpeg", + "type": "String" + } + } + }, + "tweet:570506634109329400": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 63.434617, + "lng": 10.413603 + }, + "type": "LatLng" + }, + "author": { + "value": "Sverre A Weldingh", + "type": "String" + }, + "description": { + "value": "Har en stein i skoen, men først kaffe. #jada #neida @ Starbucks Solsiden https://t.co/fch597AN9A", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:52:35Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-c-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/11008185_1557493074520458_796492277_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1207347855/SAW_1_SH_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "3f4eebb4a964edbcf8fadab3442111e40477864d.jpeg", + "type": "String" + } + } + }, + "aftenposten-804": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92943104, + "lng": 10.69493293 + }, + "type": "LatLng" + }, + "description": { + "value": "Turistbusser og biler parkerer langs sykkelfeltet på vei mot Frognerparken. Plutselig kommer en japansk pensjonist vaklende ut rett foran sykkelen eller en bildør smeller opp. Pga. av barnehage og gravlund i nærheten er det ofte passasjerer som er lite oppmerksomme på trafikken bakfra.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:00:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "6cdea3a1785262ed7f9eec538c425fd6dca2fe74.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-963": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94564067, + "lng": 10.84477186 + }, + "type": "LatLng" + }, + "description": { + "value": "Her kommer fotgjengere fra sletteløkka som skal til bussholdeplassen. Syklister må holde meget lav fart for ikke å skape ulykker. Her er det meget uoversiktlig og jeg har sett mange nestenulykker her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:30:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "85d16336aa98c4e25eca93719751f6c7ade826a8.jpeg", + "type": "String" + } + } + }, + "tweet:570497375703339000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.930075, + "lng": 10.877572 + }, + "type": "LatLng" + }, + "author": { + "value": "Morten Christensen", + "type": "String" + }, + "description": { + "value": "@Sigvald Det er en viktig oppklaring. Om han hadde sagt noe slikt vet jeg ikke hvordan jeg ville ha reagerte.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:15:48Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/491622864798220288/ksDl6snV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-1027": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94937888, + "lng": 10.73135867 + }, + "type": "LatLng" + }, + "description": { + "value": "Livsfarlig kryssing, stakkars de syklistene som tror de har forkjørsrett ved kryssing her", + "type": "String" + }, + "date": { + "value": "2014-09-10T20:01:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "87fa7cb54f9f3cdbf9fb1706f26a97bcc0fe081a.jpeg", + "type": "String" + } + } + }, + "aftenposten-803": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94168036, + "lng": 10.78095674 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig høy fortauskant ved bussholdeplass Grefsen Stasjon retning syd, stanår man skal inn på gang/sykkelvei retning nord (mot Storo).", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:56:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "30328fcc066f43e0963d9b20f01a98fa39bf023a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-491": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89776289, + "lng": 10.7591772 + }, + "type": "LatLng" + }, + "description": { + "value": "Kongsveien føles utrolig ubehagelig og farlig å sykle i, særlig den nederste delen. Sykkelfeltet opphører rett i en sving ved trikkestasjon og Kongshavn skole. Oppover tvinges man til å sykle på et altfor smalt fortau. Veien er også meget smal. Farlig!!!", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:52:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "7b8fd4bc4d3191b54fd8b4d93386c3d81504e195.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570514080357855200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.28324, + "lng": 11.10659 + }, + "type": "LatLng" + }, + "author": { + "value": "Madeléne Leidland", + "type": "String" + }, + "description": { + "value": "@EplehusetNO Den burde vel strengt tatt vært her om det tar 1-2 virkedager å sende den.Men den som venter på noe godt, venter ikke forgjeves", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:22:11Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568869434434260992/XlsH5VwZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "990000", + "type": "String" + } + } + }, + "aftenposten-843": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93490859, + "lng": 10.72826743 + }, + "type": "LatLng" + }, + "description": { + "value": "Strekning på ca. 50 meter med bilparkering før sykkelvei starter. Skaper farlige situasjoner når syklister og biler skal sluses gjennom den samme smale passasjen - det er også fysisk midtdeler i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:11:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "2bcad8c301f5c1b99db82a7b42b6a5b762b99373.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-194": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91284775, + "lng": 10.81058979 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvordan er det mulig at det ikke er tilrettelagt sykkelvei mellom Tveita og Helsfyr? det oppleves helt utrygt å dele veibanen med aggressive bilister som kjører fort. Det hadde ikke folk på Vestkanten funnet seg i.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:37:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "2a3c8c00bc3e7de620127fa5777549a0962bdcc9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-788": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92639892, + "lng": 10.62335014 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien raser snart. Ikke noe fundament under gang og sykkelvei. Utbedret med masse asfalt men gangveien senkes med kanskje 10cm hvert år likevel. Det har ikke skjedd noe siden 2012: http://www.budstikka.no/nyheter/vegvesenet-oppgraderer-vollsveien-i-2013-1.7413491", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:31:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "ed71ae61651dc3eec55f98ce264185ad86715ac9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "f713cdec-ba16-460b-b68d-9a3f20375c73": { + "type": "master:utmost:almost", + "properties": { + "location": { + "value": { + "lat": 59.93911961, + "lng": 10.59427768 + }, + "type": "LatLng" + }, + "description": { + "value": "auie", + "type": "String" + }, + "name": { + "value": "Motorcycle near miss", + "type": "String" + }, + "_utmostIcon": { + "value": "almost-moto", + "type": "String" + }, + "streetview": { + "value": "105acbf227a6b5658eb75635e429934549b0b137.jpeg", + "type": "String" + } + } + }, + "tweet:570502420461199360": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.749173, + "lng": 5.446321 + }, + "type": "LatLng" + }, + "author": { + "value": "ANNA LUNDEN", + "type": "String" + }, + "description": { + "value": "@tamzzzku soo true😂", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:35:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570339980041703424/yEry0mX3_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "a0fb0eabc98024ad97ae19118745555bb9e63265.jpeg", + "type": "String" + } + } + }, + "tweet:570518296430317600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.358589, + "lng": 10.369367 + }, + "type": "LatLng" + }, + "author": { + "value": "Martin Finne", + "type": "String" + }, + "description": { + "value": "@SteinarWestin historisk:\n2008. Rydding i feilaktig implementasjon av ny tekn ( bransje/community action). Bør vises i helsedata. #icnirp", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:38:56Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566163962786758657/JPJ6_hdM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "C7203C", + "type": "String" + } + } + }, + "aftenposten-869": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91370895, + "lng": 10.74710855 + }, + "type": "LatLng" + }, + "description": { + "value": "Torggata, vestre del er \"hovedsykkelveinett\" i gågate Derfor er fartsgrense=gangfart (selv om det skulle være tomt for gående).", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:42:36Z", + "type": "DateTime" + }, + "bilde": { + "value": "916c1b1775400444ec5ecf31265f9bcc.jpg", + "type": "String" + }, + "streetview": { + "value": "9f1959540cd6f19a6e44a805bf41a2b0e9f38256.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-940": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94791884, + "lng": 10.64266204 + }, + "type": "LatLng" + }, + "description": { + "value": "Etter en lang og fin sykkel- og gangvei (som er delt på midten så alle vet hvor man skal gå\\\\\\\\sykle) fra Smedstad og opp forbi Hovseter kommer man til krysset på Røa (mot Ekraveien) hvor det plutselig er stopp på den fine veien. Nedover fra Røa til Ekraveien er det en smal gangsti med mange avkjørsler. Dette tvinger syklisten ut i den relativt smale og, i rushen, meget trafikerte veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:09:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "50c01e683fd5ea6fbac3e9424825f5829a0a5801.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-426": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9420834, + "lng": 10.7548964 + }, + "type": "LatLng" + }, + "description": { + "value": "90% av bilistene på vei opp Stavangergata \"glemmer\" at de har vikeplikt for en syklist som kommer fra høyre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:22:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "37c31686dde0a9edd3d13d8fd6a91689f61e46f5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-593": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91297415, + "lng": 10.7412064 + }, + "type": "LatLng" + }, + "description": { + "value": "Akersgatr, bak Stortinget: Bommen sperrer hele kjørebanen og lår ingen plass til sykkeltrafikk. Bommen bør forkortes. Det samme problem fins på Youngstorget når man sykkler inn fra Torggata.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:04:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "2d7a05b179ee5175af237c2785551dcc8177f228.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-611": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92719461, + "lng": 10.73135733 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært mange hull i gata gjør at syklister må kjøre slalom. Veien er trang og bilister kjører fort.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:18:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "67c64cc4b9e11732c2895fd6d339a9db4bd81be7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-393": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92925901, + "lng": 10.70664882 + }, + "type": "LatLng" + }, + "description": { + "value": "Hvordan er det meninga man skal krysse her hvis man kommer østfra?", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:07:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "03f555a8a634ba00b2b73d279f674c75a5c09ac2.jpeg", + "type": "String" + } + } + }, + "aftenposten-107": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91291229, + "lng": 10.76102256 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien er svært ofte uframkommenlig fordi den benyttes som parkeringsplass og lastesone.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:29:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "862b4b2aa62bf2cf1ce325121da17c9645236a01.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-106": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91269715, + "lng": 10.70076942 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilkjøring på sykkelvei. Mange kjører bil til båtplasser til tross for at dette ikke er tillatt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:29:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "0c79819543d27e8ec2b5a791d4109af07f040f28.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-868": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9288827, + "lng": 10.7155323 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Majorstuen er et sammenhengende, uoversiktelig kryss. Egentlig rart at ikke flere ulykker skjer. Sykkelfeltene oppheves før kryssene, det skjer flere feltskifter for bilene og bussene, som i tillegg har bussholdeplass foran T-banen (innebærer et ekstra feltskifter), MYE fotgjengere (mange går i tillegg på rødt), trikker, sykler, uniformerte fartøyer i utrykning....", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:38:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "26817679ccd9f9baa533484d8e29a5b3ce4bfcee.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-271": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91626026, + "lng": 10.7443875 + }, + "type": "LatLng" + }, + "description": { + "value": "Utkjøring i vei stengt, for syklister, uten merking, syklister ender opp på fortau ikke greit for fotgjengere eller syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:13:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "7d129c15566744f5fae25a70b1a0dce7e295e215.jpeg", + "type": "String" + } + } + }, + "aftenposten-683": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93446246, + "lng": 10.67875385 + }, + "type": "LatLng" + }, + "description": { + "value": "Hoffsveien har generellt ekstremt dårlig asfalt, noe som gjør det vanskelig for syklister å finne et godt sporvalg.Hoffsveien har også bare sporadisk fortau, og det finnes ikke gode alternative ruter Smestad-Hoff.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:40:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "e26ce888b6f212c17bcad92beff6f8420be144c5.jpeg", + "type": "String" + } + } + }, + "tweet:570507858594439200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "@marcandreyko What's their latest move? It's still airing at the end of March, I hope?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:57:27Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "aftenposten-270": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92703332, + "lng": 10.73885679 + }, + "type": "LatLng" + }, + "description": { + "value": "Styret mitt ble snidda av speilet til en forbipasserende bil, mens jeg syklet på den trange sykkelveien her. Jeg mistet kontrollen og kjørte heldigvis bare ut i grøfta til høyre (uten å pådra meg skader). Bilen kjørte videre, uten å stoppe.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:13:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "da7b5996c13d9f892890509a37130c3482b6a101.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-105": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92183946, + "lng": 10.75746059 + }, + "type": "LatLng" + }, + "description": { + "value": "I Markveien burde alt ha ligget til rette for trygg sykling, men sykkelfeltet er dårlig merket og det brukes også av fotgjengere og barnevogner", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:29:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "8a02ea4b40b9ab3ec616444ff963ce2f8ff20a05.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-811": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94929426, + "lng": 10.73141098 + }, + "type": "LatLng" + }, + "description": { + "value": "Der sykkelveien som går parallelt med ringvei 3 møter Sognsveien, går sykkelveien plutselig over i fotgjengerfelt (hvite striper), og jeg opplevde nylig at en bilist som kom fra venstre ble illsint fordi jeg sykla på de hvite stripene. Det finnes mange slike steder i Oslo. I Sverige deler de opp overgangene (halvparten stiper, halvparten uten) slik at sykkelveien fortsetter uten hvite striper. Dermed blir det klarere både for syklistene og bilistene at sykkelveien er en vei og at det er høyrereg", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:10:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "e67d3811204770d726f5572beec80187d084411f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570516779786764300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Adam Scheuring", + "type": "String" + }, + "description": { + "value": "@BenedictEvans I'm curious how it will impact branding. Cars are going to be more utilitarian.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:32:54Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/441237343182151680/VeCid2DP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-879": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91094929, + "lng": 10.7479926 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkeringsplassene på vestsiden av Skippergata gir livsfarlig dørsone mot sørgående sykkelfelt. P-plassene må bort før syklister dør eller lemlestes!", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:06:05Z", + "type": "DateTime" + }, + "bilde": { + "value": "937ee9c92f4a1d7085c71f1aa13fab1b.jpg", + "type": "String" + }, + "streetview": { + "value": "caa9d59681a62bb101c1c8e74a4e569cbc03f034.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-948": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94011653, + "lng": 10.72965145 + }, + "type": "LatLng" + }, + "description": { + "value": "de fleste billistene respekterer syklister i rundkjøringen, men det er ca 10% som ikke gjør det. kombinasjonen biler, trikk, rundkjøring og sykkelsti som bare forsvinner er ikke trygg", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:17:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "c04a663fc45ecd3b55a3f0fe999a5849d990896e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-831": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94124206, + "lng": 10.74689054 + }, + "type": "LatLng" + }, + "description": { + "value": "Kjørende i Jutulveien har vikeplikt for syklende i Tåsenveien (hovedsykkelveinett). Vikeplikten respekteres sjelden.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:52:18Z", + "type": "DateTime" + }, + "bilde": { + "value": "fafba0e53d3f7fae333bfaeb6304564d.jpg", + "type": "String" + }, + "streetview": { + "value": "1d0237a1fd526537442f07cc83ac243ca7568677.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-444": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90882436, + "lng": 10.75046539 + }, + "type": "LatLng" + }, + "description": { + "value": "For å komme fra Tollbukaia og inn på sykkelfeltet i Bispegata må man opp på fortauet og gjennom alle som venter på grønt lys på hjørnet. Videre er \"sykkelfeltet\" for smalt og fullt av fotgjengere.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:28:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "d02e6fca8014267bc5a41e86171e54c0c1549215.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570519529639567360": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "\"zanurzanie się w smole polskiego piekła\" kocham prezydenta poetę #PBK #PR1", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:43:50Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "aftenposten-148": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91723635, + "lng": 10.81239223 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt og med store kumlokk som folk sykler rundt. Intet skille mellom sykkelvei og gangvei, og mye folk i rushtid. Stor fare for møteulykker. At dette skal være en såkalt \"tilrettelagt vei\" er ganske skremmende.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:11:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "92982abab9b9b2a7d05ddfa765838770a2497e1d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570513628023033860": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "1. #NashsNewVideo\n2. #viasatfotball\n3. Norway\n4. Barca\n5. Norge\n\n2015/2/25 10:18 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:20:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-443": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92245379, + "lng": 10.70456206 + }, + "type": "LatLng" + }, + "description": { + "value": "Gangfelt markert med steinheller: i dårlig forfatning. Langsgående kanter og hull. Man holder ofte lav fart akkurat her, så denne går som regel greit å krysse.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:27:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "e72a759da754e3addd767c7384fefcc3891d3b2a.jpeg", + "type": "String" + } + } + }, + "aftenposten-827": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93482796, + "lng": 10.74801921 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelvei. Mange sykler på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:43:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "bca20b65f550702163b8188d9ceb290037f20d80.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570521632789413900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.374532, + "lng": 10.338351 + }, + "type": "LatLng" + }, + "author": { + "value": "Linnsky", + "type": "String" + }, + "description": { + "value": "Kjæresten vil at jeg skal tvitre mer om han. (Okei da..) Verdens herligste i mine øyne,min klippe i livet og han jeg vil gifte meg med 💘", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:52:11Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569190525820219392/qLJNWJ1o_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "020F14", + "type": "String" + }, + "streetview": { + "value": "b751676bb540b1da727bdf301e39244ff6fe65e6.jpeg", + "type": "String" + } + } + }, + "tweet:570484744607174660": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.962592, + "lng": 10.906224 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas Indrebø", + "type": "String" + }, + "description": { + "value": "@BrentCorrigan @BoomerBanksXXX Good night, sleep well", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:25:36Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000099358157/65173a420efa617dc05edfa5fbcd4360_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "dceddc84046975dcf23b5d646e5065b5e67b4be9.jpeg", + "type": "String" + } + } + }, + "aftenposten-787": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9298396, + "lng": 10.85144519 + }, + "type": "LatLng" + }, + "description": { + "value": "Flere små utkjøringer i bakke, gjør det livsfarlig å sykle mot Oslo sentrum.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:30:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "872e7da6580f2c13dd83283d0fc390accaa534a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-848": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9163974, + "lng": 10.76763153 + }, + "type": "LatLng" + }, + "description": { + "value": "Masse huller i asfalten som gjør at syklister må legge seg ut i veibanen, med fare for å bli \"sneiet\"", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:17:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "9b2a6baa975ae255546ddd0e94bb64eafdd6e576.jpeg", + "type": "String" + } + } + }, + "aftenposten-847": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90602706, + "lng": 10.76788902 + }, + "type": "LatLng" + }, + "description": { + "value": "Forferdelig for alle syklister, her er det fullt busser, trikker og biler. Har opplevd å bli komplett oversett i dette krysset flere ganger, farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:16:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "b2523593b346e1b410064386af8e4cdfc206fe41.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-888": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93530096, + "lng": 10.74222564 + }, + "type": "LatLng" + }, + "description": { + "value": "Opplevd flere ganger å bli tutet på av buss/taxi. Sykkelfeltet blir borte i krysset mellom Kierschows gate og Kirkeveien, og plutselig er det der igjen etter krysset ved Vestre Aker kirke. Veien nylig utbedret med veldig bredt fortau, men ikke gitt plass til sykkelfelt. Dårlig og skummel løsning for syklistene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:26:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "27b9e4fc363d3024c5a53157dad625932f88852a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570492891694542850": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.918834, + "lng": 10.74934 + }, + "type": "LatLng" + }, + "author": { + "value": "Harald Jacobsen", + "type": "String" + }, + "description": { + "value": "Kjedelig bursdagsgave. http://t.co/aFnGbmPhBq http://t.co/6Rvm8MxWJd", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:57:59Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rML0ZW4AAZRTu.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2721677032/9ad325c3795cc06b8dca9e53fc714968_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FF3300", + "type": "String" + }, + "streetview": { + "value": "c5b8a428bb7220f6fac33b26a704d9e6997f0cb5.jpeg", + "type": "String" + } + } + }, + "aftenposten-793": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91038832, + "lng": 10.70668637 + }, + "type": "LatLng" + }, + "description": { + "value": "Høy fart. Ryggende biler, fortauskanten , syklister kjører ulovlig i rundkjøringen når de kommer fra Aker brygge. Knakk hånda forrige uke", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:44:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "62d40e32fe4f160b54666e7b5b575d75b73504cf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "386db87c-7e0f-42f7-b308-cb0591da3c43": { + "type": "master:utmost:almost", + "properties": { + "location": { + "value": { + "lat": 59.96045673, + "lng": 10.76180041 + }, + "type": "LatLng" + }, + "name": { + "value": "Bike near miss", + "type": "String" + }, + "_utmostIcon": { + "value": "almost-bike", + "type": "String" + }, + "streetview": { + "value": "bcb32bacf1151ab5311bd06a10ece8317bde8bc6.jpeg", + "type": "String" + } + } + }, + "aftenposten-490": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90613465, + "lng": 10.76436996 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er en av de farligste plassene på min jobbsykkelrute. Her er syklistene i flokk, ofte i høy fart, midt mellom biler, busser og anleggsmaskiner. Som for de fleste andre syklistene er det uaktuelt å holde til høyre rett foran Barcode. Der er det utallige lyskryss, bussholdeplasser, busser og bil", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:52:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "5a4c4935a48f660ed7a8ec223fc63801607cb44f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-418": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89776289, + "lng": 10.75926303 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig inn- og utkjøring ved Ekebergsresturanten. Sykkelfelt opphører i krapp sving, svært tett biltrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:19:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "d17e88b42e0f1a35837b4c278d031e2c78997333.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-987": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94562992, + "lng": 10.77722311 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig utkjøring fra Thaugland og Statoil, mange nesten-ulykker, sykkelfelt, fotgjengere på fortau og kryssende biler i en salig blanding.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:08:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "f0b9027e33c520643e129ce1214bb9ebf57938aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570514916219723800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Morten Borøchstein", + "type": "String" + }, + "description": { + "value": "Me? I'm where the magic happens! http://t.co/jYfZY3CuHq", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:25:30Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rgSuPVEAAT16f.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/459032545846235136/ri0uoEuD_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "5844C7", + "type": "String" + } + } + }, + "tweet:570514373657153540": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Ida Faldbakken", + "type": "String" + }, + "description": { + "value": "Norges første Music Hackhaton 4 ulike utfordringer! Les mer og delta: http://t.co/9ubzXM82CA @StartNTNU @MESHnorway @Musikkmagasinet", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:23:20Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/437566122636763136/exHrzlV0_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3977F5", + "type": "String" + } + } + }, + "master-summary": { + "type": "master:wiki", + "properties": { + "title": { + "value": "UTMOST Twitter&AftenPosten experiment", + "type": "String" + }, + "content": { + "value": "", + "type": "String" + } + } + }, + "aftenposten-657": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93038524, + "lng": 10.74553012 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig av-/påkjøring til St. Hanshaugen omsorgssenter. Tett med gateparkerte biler, mørkt under tette trær. Ofte svært glatt veibane som følge av vått løv som ikke tørker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:56:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "226fa1b06be49ce2b143406efad3656a9776fdf8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-656": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93599969, + "lng": 10.73238193 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig kryss for syklister, spesielt hvis man kommer ovenfra i Sognsveien og skal svinge til venstre, og spesielt hvis trikken kommer. Kommer man ikke over i tide er man ille ute.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:56:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "251a58d5d43f0e3986b5c5cce9e5074c48d4ca01.jpeg", + "type": "String" + } + } + }, + "aftenposten-623": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89817184, + "lng": 10.8316183 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved utkjøring fra rundkjøringen i retning sørover har jeg flere ganger blitt sneiet av bilister som kommer bakfra og kjører forbi (eller prøver på )på venstre og høyre side! Det er smalt ved utkjøringen pga trafikkøy. Syklist må være nøye med å legge seg midt i rundkjøring for å blokkere forbikjøringsmuligheter", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:27:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "33d694bb8ab1537b23376e620ccdb99b342a2c43.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-786": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90622072, + "lng": 10.77449798 + }, + "type": "LatLng" + }, + "description": { + "value": "Er dette tilrettelegging for syklister? Det er veldig farlig med brostein midt på gata og uklar om syklister bør sykle til høyre eller venste av det.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:28:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "aa424518b3b81b2d96139409fbf78263e5a0f3ec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-193": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9127617, + "lng": 10.74780464 + }, + "type": "LatLng" + }, + "description": { + "value": "Tryna etter å ha fått dekket i trikkesporet. Brakk hånda.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:36:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "98a02a0afba449df4f678b8ea2b2b2913bc976ad.jpeg", + "type": "String" + } + } + }, + "aftenposten-992": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91282624, + "lng": 10.76164484 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står det alltid biler i sykkelfeltet uten noen reaksjon fra politiet som kjører her ofte. Noen ganger er det tilogmed politibiler (uten blålys) som sperrer veien for syklister. Kanskje denne holdningen hos politiet er det første som må endres for at Oslo skal bli en trygg by å sykle i ?", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:25:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "a755e541a9886232a1137917f821d75524ab9756.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570511686412722200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.876846, + "lng": 11.56283 + }, + "type": "LatLng" + }, + "author": { + "value": "Tulla Myrvold", + "type": "String" + }, + "description": { + "value": "Every time I eat sweets, I eat until I feel sick. To feel better I then eat even more sweets... #logic", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:12:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/490415882662051840/gb2DHgtP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570498749476315140": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.717709, + "lng": 10.82596 + }, + "type": "LatLng" + }, + "author": { + "value": "Tonje Kristoffersen", + "type": "String" + }, + "description": { + "value": "@oyafestival @runjewels yeeee!@! enedelig ØYA FESTIVALEN OM NOEN MÅNDER:-)", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:21:15Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/477736184383569920/ZqZsPmgz_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "22b08ef6377887af5164709aec3656fbd0386921.jpeg", + "type": "String" + } + } + }, + "aftenposten-458": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92315279, + "lng": 10.70220708 + }, + "type": "LatLng" + }, + "description": { + "value": "Gangfelt i forlengelse av gangvei som kommer ut fra bak en mur. Fotgjengere går rett ut i veien uten å gi signal om at de ønsker å krysse.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:34:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "a4d6d2bc06c14807ff7823367a19e42e92901966.jpeg", + "type": "String" + } + } + }, + "aftenposten-867": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94006278, + "lng": 10.77295303 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det mye sykkeltrafikk, barneskole og rikelig plass til sykkelfelt. Likevel er blomsterpotter prioritert.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:38:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "960bf6182b4bb017c6db960438b3daaa701e859f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570496367182938100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Even Sandvold Roland", + "type": "String" + }, + "description": { + "value": "Lyst til å hjelpe en norsk student med å produsere kortfilm? Selvfølgelig vil du det: https://t.co/zFrn6jlnhw #crowdfunding", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:11:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000477630602/a6ba4085ecfa272fcd53ddf8b4c5c413_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9D582E", + "type": "String" + } + } + }, + "aftenposten-758": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92917031, + "lng": 10.71463912 + }, + "type": "LatLng" + }, + "description": { + "value": "Smale fortau fulle av fotgjengere og biler i høy fart. Ingen tilrettelegging for syklister, selv om det faktisk er en del som sykler her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:02:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "8336df6465c01ecfca22ae3879dc9663afd1210c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570511531642884100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "@runehak Vi stresser noe fælt med navnet. Det må jo være 100% tipptopp, i tilfelle man ikke når opp i selve konkurransen!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:12:03Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "tweet:570502074263314400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Erlend Aasland", + "type": "String" + }, + "description": { + "value": "Meget bra svar frå Christian Orderud til teologistudent Øivin Berg: http://t.co/3if8fdQxck @nrkytring #vitskap #rasjonalitet", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:34:28Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/62937256/n677086927_1083237_3512_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "088253", + "type": "String" + } + } + }, + "aftenposten-124": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92614085, + "lng": 10.77591419 + }, + "type": "LatLng" + }, + "description": { + "value": "Carl Berners plass. Ikke noe sted å gjøre av seg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:44:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "7baef299191cb0b15e8ce0b1e9bc5a9f597d3cc2.jpeg", + "type": "String" + } + } + }, + "aftenposten-810": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93596744, + "lng": 10.73214054 + }, + "type": "LatLng" + }, + "description": { + "value": "mangel av merking i kryss og etter frem til neste kryss", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:09:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "aaa3315bf8e943761f6fb203e27d7cb878fef038.jpeg", + "type": "String" + } + } + }, + "aftenposten-830": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91614733, + "lng": 10.72125613 + }, + "type": "LatLng" + }, + "description": { + "value": "Et lappeteppe av en veibane. Mangler asfalt det meste av strekningen, og brostenen er svært hullete. Trafikk fra Henrik Ibsens gate ligger ofte over mot motgående kjørefelt, dermed presses syklisten inn mellom trikkeskinner og hullete asfalt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:49:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "502d322ea2953814c1327ae98f18d7ebba31073b.jpeg", + "type": "String" + } + } + }, + "aftenposten-771": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92315144, + "lng": 10.7572031 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen respekt for syklister over hodet. Barnevogner og folk som krysser sykkelfeltet uten å se seg for.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:12:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "71fa3a82f8dc8a0bca71e1f21147dc5d2b82902b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-489": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94937485, + "lng": 10.73133587 + }, + "type": "LatLng" + }, + "description": { + "value": "Har opplevd flere ubehagelige situasjoner når jeg krysser fotgjengerfeltet. Bilene holder høy fart og ser ut til å ha dårlig oversikt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:52:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "38c855b1da9101d41a25fb93ac7fa41541e5b894.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-991": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93101151, + "lng": 10.72076797 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil svingte til høyre Schønings gate like etter å ha passert meg på sykkel, i sykkelfeltet. Ble så overrasket og bråbremset så hardt at sykkelen vippet over framhjulet og jeg stupte inn i bakenden på bilen. Bilen ble bulket og vindusviskeren bak ble revet av. Jeg måtte sy i albuen og fikk flere delvis avrevne sener i skulderen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:22:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "26e93b16243bf9acfaaa2347983b2985c05ba88a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-116": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91123415, + "lng": 10.73205471 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien vestfra stopper opp når den kommer til Aker brygge/ og Rådhusplassen. Ingen sikre ruter videre, enten i Munkedamsveien uten sykkelfelt eller over Rådhusplassen med ujevne steinheller og i konflikt med gående.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:38:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "5336df35e4309d67071d6449c8d34542db7f5810.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570516625952268300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.465878, + "lng": 5.359621 + }, + "type": "LatLng" + }, + "author": { + "value": "✖️Celine - Irwin94✖️", + "type": "String" + }, + "description": { + "value": "#NashsNewVideo", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:32:17Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569849634613645312/FOSOixn0_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "42a2370e66038c11633e097e9a021b8f7ba7b70e.jpeg", + "type": "String" + } + } + }, + "aftenposten-823": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94509023, + "lng": 10.77773895 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundkjøring Vitaminvn-Grefsenvn: Sykkelfelt forsvinner og dukker aldri opp igjen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:33:39Z", + "type": "DateTime" + }, + "bilde": { + "value": "5d7e1b62b967c41f470080a7f54c9baa.jpg", + "type": "String" + }, + "streetview": { + "value": "cb1a2f7b8db503b771ded8d912e2614b0f9bcc02.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-785": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93493546, + "lng": 10.7295227 + }, + "type": "LatLng" + }, + "description": { + "value": "Rundt ring 2 er det ingen sykkelvei, så syklistene blir skvist mellom biler, busser og fortau. Særlig farlig i krysset opp til Blindern", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:25:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "5516249fbb887e296fd65981c57d2711879e77ae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-192": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.86104426, + "lng": 10.49198627 + }, + "type": "LatLng" + }, + "description": { + "value": "Fekjan er veldig skummel. Veldig tett trafikk. Selv om det er gang- og sykkelvei krysser denne drøssevis med uoversiktlige sideveier og avkjørsler. Den tette trafikken frister hurtigsyklende inn på sykkelveien, men disse er uoppmerksom på den kryssende trafikken. Biler som skal inn- og ut av sidevei", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:35:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "a0e3551f747528237b1a39107a517966d69d7913.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-136": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.82635587, + "lng": 10.77913284 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykler daglig mellom Kolbotn og Oslo. Denne delen av sykkelveien mangler skikkelig dekke. Alltid gjørmete underlag, slik at sykkelen blir skikkelig møkkete med de konsekvenser det får for sykkel og syklist. Ellers veldig fornøyd. Synd av den lille biten skal ødelegge.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:00:35Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-655": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90650046, + "lng": 10.76136589 + }, + "type": "LatLng" + }, + "description": { + "value": "Når det skifter til grønt i fotgjengerfeltet, som syklistene også bruker, har det akkurat blitt rødt for biler og busser. Det gjør at noen gir gass for å rekke over, og jeg har sett noen akkurat unngå å bli meid ned av en buss her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:53:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "f276c1833037b25b2ea3dec36b1fac37b8593f49.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-809": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91050397, + "lng": 10.72071969 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det altfor mange syklister som krysser bilvei over fotgjengengerfelt. Bør settes opp særskilt skilt om vikeplikt for kryssende syklister. Å gå av sykkelen med sykkelsko og skubbe seg sagte over for å ikke vrikken foten er ikke et godt alternativ. Eventuelt lysregulering av forgjengerfelt?", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:07:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "605b35f4f74341558acd07a59f1c5a55bb5fb76e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-191": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91947077, + "lng": 10.75451552 + }, + "type": "LatLng" + }, + "description": { + "value": "En TRAPP midt i sykkelstien", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:35:42Z", + "type": "DateTime" + }, + "streetview": { + "value": "5c626b8b1f157728a5006751d7d0a468d896cde7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-190": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93381745, + "lng": 10.70111274 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelvei, men fire feltsvei. Motoristert traffik kjører for fort (max 60 kmt) og sykler blir tvunget til å kjøre på fortorv for å unngå dette. Mange gående. En helt sentral vei for syklister fra vest til/fra sentrum.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:35:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "4a8da216e122427c31788debcfab7fac38516e74.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-797": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9200112, + "lng": 10.82545995 + }, + "type": "LatLng" + }, + "description": { + "value": "fortau på hele caspar storms vei er brukt til hensetting av utrangerte lastebiler, campingvogner, biler uten skilt og diverse søppel. umuligt å gå/sykle sikkert til og fra skole.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:49:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "611f4e1a312f5251fdaeebbf3fa8ae77a9c588c3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570487369079631900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "He's also one of my neighbors, makes it even more insane. Must drop him a bunch of books, just gotta find out his name, haha. #socialskilz", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:36:02Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "aftenposten-234": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9194061, + "lng": 10.7480008 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble påkjørt av bil", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:56:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "63324eec9de8375a2324e74ddfe50750df0a7bf8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-300": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9134851, + "lng": 10.64259231 + }, + "type": "LatLng" + }, + "description": { + "value": "Sterkt trafikkert sykkelsti krysser trafikkert vei, samt kraftig knekk i sykkelvei rett før overgang over vei. Mange ulykker her, både bil mot bil og sykkelist mot sykkelist.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:24:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "04b3b56d48299f765d9826aab211e026acd90769.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-457": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9320006, + "lng": 10.76192378 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen tilrettelegging for sykkel vestover. Fortau er ikke noe alternativ og trafikken presser knallhardt på.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:34:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "f1a28f83b7e077d3523d2d69670f94ede9047d14.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570518244982972400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.903091, + "lng": 10.604824 + }, + "type": "LatLng" + }, + "author": { + "value": "Honeylee Ramirez", + "type": "String" + }, + "description": { + "value": "@GatoradePH 35pts against ADU #AlyssaPlaysHard", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:38:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3182950484/c7454954f4fbf490ea7aeed7c09ea4df_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "0211c2b45ab9851369599836033afdaa1272ca8c.jpeg", + "type": "String" + } + } + }, + "aftenposten-575": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92289335, + "lng": 10.750916 + }, + "type": "LatLng" + }, + "description": { + "value": "Hotel Vulkan, ved trappen ned til mathallen: Her parkerer det veldig ofte busser og drosjer på sykkelfeltet når de har kunder på hotellet. Det trengs tydelig skilting av absolutt parkeringsforbud og patruljevirksomhet fra Bymiljøetaten..", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:53:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "2d8ff3f5d25e47e96ec16f4a2e8434e66a5d93bf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570504642439868400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "@sayhellobvb no ja sama nie rozumiem siebie czasami XD", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:44:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-488": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92453596, + "lng": 10.78747987 + }, + "type": "LatLng" + }, + "description": { + "value": "Her smalner veien inn i ca 1 billengde østover. Biler prøver ofte å presse seg forbi akkurat her på det smaleste. Flere nestenulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:51:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "62420bcefbc20bde133a847b0f3c50e118b03f02.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-654": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.925743, + "lng": 10.73187768 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det dype spor i veien. Jeg hold på å tryne skikkelig da jeg kjørte forbi 21 bussen som hadde stoppet på holdeplassen. Det kunne oppstått en alvorlig situasjon om jeg ikke hadde fått sykkelen i balanse, og det hadde komemt en bil i motsatt kjørefelt. Dette skjedde på dagtid. På kvelden, med dårlig sikt er dette skikkelig skummelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:53:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "94159245b53451829ddf9f471a5c99034623de51.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-147": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93706388, + "lng": 10.73081016 + }, + "type": "LatLng" + }, + "description": { + "value": "Her står det mange bilder langs veien uten sykkelfelt, blant annet en taxikø. Hver dag lurer jeg på om en dør kommer til å fly opp.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:10:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "faf4c66d3e2bfaa147c13ad3fa303802b04eb391.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570505057839546400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.484458, + "lng": 6.388219 + }, + "type": "LatLng" + }, + "author": { + "value": "PERFECT TUNE©", + "type": "String" + }, + "description": { + "value": "@BonitzMG hi have a Nice day🎵🎵", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:46:19Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566919243615051776/cK3ro78r_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-123": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93558045, + "lng": 10.7404232 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelfelt. Svært trafikkert med biler, sykler og gående. Opplever ubehagelige situasjoner daglig. Det er oftes den uklare situasjonen og ikke folka oppførsel som gjør det.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:44:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "3500d568a463c6491fa630af4751d93689fd97bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570507776683839500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Peder Lofnes Hauge", + "type": "String" + }, + "description": { + "value": "@siwarth Faen. Eg får prøve på nytt. (@bareenmann )", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:57:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/520242744477106178/N3rY5lkP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-715": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91039505, + "lng": 10.73435068 + }, + "type": "LatLng" + }, + "description": { + "value": "Her skal syklende passere en bom, og åpningen er temmelig smal, selv om man kommer i liten fart. Lett å velte. I mørket er det i tillegg vanskelig å se hvor man skal sykle.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:19:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "68f9dd4a6311f891ab52e399c24daec671689cf6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-115": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92747417, + "lng": 10.65626621 + }, + "type": "LatLng" + }, + "description": { + "value": "Ulykke syklist/gående barn. Sykkelveien går ikke her, se kartet!", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:37:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "94e70e3c3cb20f7707844f93ef793b815faa6ee0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-487": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92150608, + "lng": 10.68827033 + }, + "type": "LatLng" + }, + "description": { + "value": "Flere mindre avkjøringer der biler tar av tidvis uten å sjekke blindsoner, spesielt når det er saktegående trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:51:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "f86f13e32babbfdc2e295458f1e0f23af3e5c2f6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-1001": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91335602, + "lng": 10.75378596 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelruta er skiltet, men sykkelfeltet gjennom Grønland har plutselig opphørt. Det oppstår lett misforståelser og nestenulykker når bil og sykkel må dele plass.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:33:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "aca1914c8d7c0103a3b7fc6f100cc26291273686.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-866": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91229914, + "lng": 10.74179649 + }, + "type": "LatLng" + }, + "description": { + "value": "Akersgata bak Stortinget er av en uforståelig grunn sperret med en bom som gjør at også syklister må opp på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:33:36Z", + "type": "DateTime" + } + } + }, + "aftenposten-528": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92450639, + "lng": 10.7594347 + }, + "type": "LatLng" + }, + "description": { + "value": "uoversiktlig sykkelvei. Bilparkering mellom bilvei og sykkelvei som ofte står ganske langt inn i sykkelveien. I tillegg er det masse fotgjengere i sykkelveien som kan føre til ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:13:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "900a2b50b47348b7ad59ef4baaa1d8b373a1895f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-865": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91317046, + "lng": 10.64191102 + }, + "type": "LatLng" + }, + "description": { + "value": "Oslos dårligste sted for sykling! Hvordan noen kan finne på å legge store brostein på tvers av veien er katatrofe. På landeveissykkel må man nesten ned i stillestående, og foretrekker alle muligheter for å ligge i bilveien i stedet. Og don\\\\'t even get me started når det kommer til løsnignen i bunnen av rampen fra Lysaker-lokket. Et par 90-grader-svinger, en bratt bakke rett ned i veibanen osv. Her trenger man egentlig ikke forklare noe, bare send et menneske med IQ over 60 til å se på det.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:32:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "ec4020ea61f2e53a0ecd067cac3fe3dfce5f650f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570517843126722560": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 69.375944, + "lng": 20.269105 + }, + "type": "LatLng" + }, + "author": { + "value": "Terje Bergli", + "type": "String" + }, + "description": { + "value": "...og så oppvasken etterpå... I'm in heaven! Fantastiske gutta vi har! @ Bjørnstua, Skibotn https://t.co/VSJDKYLBIm", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:37:08Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-a-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/11015533_634686239995000_890331476_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1180985520/41638_716340778_3859_n_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570513365644255200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.60447, + "lng": 5.8063 + }, + "type": "LatLng" + }, + "author": { + "value": "Even Hye T Barka", + "type": "String" + }, + "description": { + "value": "Jeg spår FKH innenfor topp sju, rett under @Joacim_Jonsson. Kan bli en kjekk sesong for oss som jobber med Rogalandsfotballen.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:19:20Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560711633970790402/Gl_GT22O_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-746": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92748492, + "lng": 10.71342945 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil i kø, passasjerdøren slenges opp halvmeter foran meg. Grunnet min forholdsvis lave fart og \"hjertet i halsen\" fra tidligere nesteulykker unngikk jeg så vidt et sammenstøt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:52:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "e9ef88ab47871fbde34792176aeee3434285cdcb.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-808": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93515046, + "lng": 10.74381351 + }, + "type": "LatLng" + }, + "description": { + "value": "ny utbedret fortau, men ikke merking i vei el på fortau", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:05:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "b005b082987ca3a06f4b2fe7952b66a2700bd1b2.jpeg", + "type": "String" + } + } + }, + "aftenposten-189": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.916349, + "lng": 10.74509024 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelfelt, altfor smal fortau. 37-bussen presser syklistene. Har to ganger opplevd å bli presset mellom fortauet og bussen. Sjåførene på 37-bussen presser også syklistene ut av sykkelfeltene når de er lagt gjennom busslommen. En idiotisk og livsfarlig løsning.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:35:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "71d043cf347386bae06428a94b4d01278ba446a6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570488885517652000": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.9101, + "lng": 10.724993 + }, + "type": "LatLng" + }, + "author": { + "value": "EMCnorge", + "type": "String" + }, + "description": { + "value": "Inspirerende start på #ki15 med @hpnhansen - konvergert infrastruktur trender oppover http://t.co/nLFafhWskc", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:42:04Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rIk60XIAEKqB4.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3779840771/5428e97e160e4395c81503b33b74b4a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "0a5e008c51a2f4a78eb2cf512b9effe3368d029a.jpeg", + "type": "String" + } + } + }, + "aftenposten-401": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93476346, + "lng": 10.74377059 + }, + "type": "LatLng" + }, + "description": { + "value": "Bussene kommer ned Kierschows gate og gir gass for å komme forbi syklisten i krysset for så å svinge inn i sykkelfeltet og bråbremse på holdeplassen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:12:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "7ad29126ec6ffd1a5d772024974e47207afd50de.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570517771978706940": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Aldridge", + "type": "String" + }, + "description": { + "value": "I denne saken om Cappelen Damms økonomi gjemmer det seg en skikkelig gledelig nyhet: Har solgt 20.000 eks. av Stoner! http://t.co/HAA4jepNVR", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:36:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1750629614/310419_10150884918045007_518285006_20914173_343725547_n_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-330": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93917067, + "lng": 10.78222274 + }, + "type": "LatLng" + }, + "description": { + "value": "Kanskje ikke så fasrlig, men svært uoversiktlig område med sykkelstier, dårlig merking og sykkelkryss kommer brått på.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:35:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "f30edec479b526f566d02d3ce5260be2862cb491.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1009": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91269715, + "lng": 10.81689834 + }, + "type": "LatLng" + }, + "description": { + "value": "Ved undergangen ved Ringveien møtes to gang/sykkelveier. Det er uoversiktlig. Etter to nesten ulykker der sluttet jeg å sykle til jobben.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:41:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "21b9501940cb44f631fffefd52dde978ac5f0433.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-822": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94528173, + "lng": 10.77845735 + }, + "type": "LatLng" + }, + "description": { + "value": "Storokrysset har ingen tilrettelegging for sykkel i øst-vest-retning. Her sykler man f.eks. i midtre kjørefelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:30:02Z", + "type": "DateTime" + }, + "bilde": { + "value": "371c4211107a55ec64d2874bbc71dd09.jpg", + "type": "String" + }, + "streetview": { + "value": "4956b8a8bf0593d68f2cf944f9802ffb02c43f56.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-486": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94164274, + "lng": 10.78256607 + }, + "type": "LatLng" + }, + "description": { + "value": "Gutt på sykkel kom nedover Kjelsåsveien på gang- og sykkelsti. Påkjørt av bil som kom ut fra Åsensvingen. Uoversiktlig kryss mellom vei og gang- og sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:50:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "8f60ae1689a2ac3ae77c94808c2dc1c9a44a86d6.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-731": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91416009, + "lng": 10.75231075 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er veldig styrete og vanskelig å komme seg fra vaterlands bru og over på en rute som kan ende i Ullevålsveien/Pilestredet, og i det hele tatt klare å krysse byen \"på tvers\". Det er sykkelfelt som forsvinner/sperres av parkeringer og byggearbeider, rolige gater er typisk avsperret i en ende for biltrafikk og det er høydeforskjeller eller tunneller (Hammersborg) med dårlig eller ingen merking for ferdsel med sykkel. Jeg kan ikke være den eneste som sliter med å finne en farbar rute fra øst", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:42:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "633a913dd1edaecdc11923c8abd4c22011187fbe.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-757": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92946598, + "lng": 10.71693778 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler i kø sørover i kirkeveien, er rødt, så bremser ned. Lyset blir så grønt og jeg fortsetter å sykle. Bakerste bil i \"køen\" slenger opp bakdør da vedkomne skal av (på tross av grønt lys). Klarer stort sett å stoppe, men treffer døren så vidt. Hadde jeg hatt større fart (noe jeg kunne hatt, men tidligere erfaringer i dette krysset tilsier at jeg som syklist er usynlig) gikk det \"greit\".", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:59:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "48d4d5ed3b65d24d8c38b29ce2250f4d2bdfd131.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-763": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.86205699, + "lng": 10.8237648 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt bare delvis merket opp. Alle de tre påkjøringene på vei ned er uoversiktlige og trenger siktrydding.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:04:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "d63ec7e1411cc6196a5f5aae9ecdda5c28e3948a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570486522572640260": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.47151, + "lng": 6.17293 + }, + "type": "LatLng" + }, + "author": { + "value": "PERFECT TUNE©", + "type": "String" + }, + "description": { + "value": "@BonitzMG hey, enjoy your day", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:32:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566919243615051776/cK3ro78r_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-990": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94974556, + "lng": 10.63884258 + }, + "type": "LatLng" + }, + "description": { + "value": "Mange transportsyklister sykler her fra Bærum til Oslo hver dag. Ingen sykkelfelt, smalt fortau bare på nordsida. Syklister i retning sentrum må sykle på en svært smal veiskulder. Det kjører mye tungtransport her med kun centimetres margin til syklistene. Jeg har blitt forsøkt presset av veien av en varebil, og blir skreket til av bilister som vil ha veien for seg selv.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:18:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "eb87bc3211e40b4979c4f51804c1f8ade2e75ccc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-641": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91054566, + "lng": 10.7062304 + }, + "type": "LatLng" + }, + "description": { + "value": "Et (av en trillion) kumlokk som ligger midt i sykkelveien. Såpe glatt i regn og når det i tllegg ligger skjevt med en 2 cm. kant, endte jeg på Legevakten.Takk for elendige sykkelveier.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:43:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ab015cdf6881e0ca84248a037ada79927033c81.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570510579800129540": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.958561, + "lng": 5.757611 + }, + "type": "LatLng" + }, + "author": { + "value": "Ingri", + "type": "String" + }, + "description": { + "value": "@CecilieMadland Dette et min kampsak. Fader, så mye stygge bryn det er der ute!!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:08:16Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566899331035168769/P740og3o_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B40B43", + "type": "String" + } + } + }, + "aftenposten-947": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92317295, + "lng": 10.7363677 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei ned fra Waldemar Thranes gate så er det skummelt å svinge venstre ned Dahlsbergstien. Sykkelfelt hadde hjulpet mye!", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:16:45Z", + "type": "DateTime" + }, + "bilde": { + "value": "fd309d9402a33b8afaeb51a211ce4199.png", + "type": "String" + }, + "streetview": { + "value": "4f621b8a12dd7e49252c87352c9fb257b7ed49d8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570496911343521800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41204, + "lng": 5.26983 + }, + "type": "LatLng" + }, + "author": { + "value": "Even Hye T Barka", + "type": "String" + }, + "description": { + "value": "Synes Edin Dzeko og Samir Nasri underpresterte kraftig i går. Kanskje er førstenevnte preget av Bony-kjøpet? #2pl", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:13:57Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560711633970790402/Gl_GT22O_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570508049342967800": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 63.74558, + "lng": 11.29698 + }, + "type": "LatLng" + }, + "author": { + "value": "Kirsten Juni Nilsen", + "type": "String" + }, + "description": { + "value": "http://t.co/5AcJZRhAW3 http://t.co/Bcz8TCOFAj", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:58:13Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-raDB5XEAAXY63.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/534823904611561472/ryesslCT_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "aftenposten-783": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93925665, + "lng": 10.78200817 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal undergang, uoversiktlig på begge sider. Kunne vært nyttig med speil for å se om det kommer noen utenfor.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:19:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "1ca71872b0e47a8198680c978dddd18efdbb090e.jpeg", + "type": "String" + } + } + }, + "aftenposten-188": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92047634, + "lng": 10.6755647 + }, + "type": "LatLng" + }, + "description": { + "value": "Utkjøring fra bobilparkering/båtopplag på Sjølyst. Her må det merkes skikkelig at trafikken har vikeplikt for kryssende sykkelvei. Alt for mange som legger seg rett ut i sykkelveien mens de venter på å kjøre inn i kryss/rundkjøring.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:34:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "8a7aa35ea43a034aa5bf0f79e22e92afe257b865.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-81": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91986063, + "lng": 10.74329853 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilene må for langt ut i krysset for å se om kysten er klar - de kjører ut i sykkelfeltet. Og farten ned Ullevålsveien kan bli ganske høy", + "type": "String" + }, + "date": { + "value": "2014-09-09T09:43:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "7dc0f4c3ab4dfbcecc69d5ad356c8d2fa16a2778.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-680": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91397924, + "lng": 10.73453709 + }, + "type": "LatLng" + }, + "description": { + "value": "Er merket innkjøring forbudt. Dette burde kun gjelde for bilister, ikke syklister. Resultatet er at du må opp på fortauet sammen med gående. Daglig trangt utenfor McDonalds som får pallevis med levering hver morgen som står på fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:38:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "3758bac95909a0ab80a32872b157bf3a10faaa0b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-989": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93336594, + "lng": 10.78720092 + }, + "type": "LatLng" + }, + "description": { + "value": "Lørenveien har delvis sykkelfelt, men her finnes det mange kryssende veier og utkjøringer fra butikker, skole med mange biler som snur i veien etter å ha sluppet av elever etc. Mye bedre å sykle over Sinsenkrysset, men der har det vært stengt i hele sommer pga gravearbeider.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:10:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "ed98a92cdfe86a223082df1a2712c9714bc1c468.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-579": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92311918, + "lng": 10.6808567 + }, + "type": "LatLng" + }, + "description": { + "value": "Her ender tilretteleggingen opp i \"ingenting\" - helt meningsløst. Skilting av retninger og veien videre er mangelfull.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:54:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "6c03f26156a1b420ad3a13a7c9737a285c561909.jpeg", + "type": "String" + } + } + }, + "aftenposten-365": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91375134, + "lng": 10.73553085 + }, + "type": "LatLng" + }, + "description": { + "value": "Krysset Universitetsgata/Stortingsgata mangler lysregulering for trafikk nordfra. Det er ikke biltrafikk nordfra, men Universitetsgata er markert på HSVN, så der bør forventes sykkeltrafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:58:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "75196b2c386b234e034be39ae0633aa31cfb739f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-782": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9169836, + "lng": 10.75786828 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen sykkelfelt på denne veien i begge retninger. Det er separate felt for buss og trikk, med hver deres lyssignal. Umulig for syklister å vite hvor på veien man skal kjøre, hvis man kjører mot sentrum.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:19:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "f5af7bc90bc6d8b8302c4d73b6efcc014f9ae6a4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-574": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92957081, + "lng": 10.66385149 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal tunnell med dårlig sikt og brå sving. Farlig og uoversiktlig i begge tunnellåpningene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:52:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "a62cf3871902b09e67957df84c7d9be038016161.jpeg", + "type": "String" + } + } + }, + "aftenposten-962": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9442221, + "lng": 10.70501804 + }, + "type": "LatLng" + }, + "description": { + "value": "Hullete asfalt her som gir ekstra farlig vei i et uoversiktlig område uten sykkelvei", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:30:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "26fb75ad3d3a516562e3338653d690aa2e944510.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-668": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91123415, + "lng": 10.81037521 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet er blitt fjernet. Det er uklart om det kommer tilbake, men heller tvilsomt siden fortauene er utvidet og bilbanen er blitt smalre. Blå merking som tilrettelagt er feil.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:18:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "22153fac76dcfab59713907324d653c184296afa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-143": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91057255, + "lng": 10.72883605 + }, + "type": "LatLng" + }, + "description": { + "value": "Utydelig hvor man skal sykle og hvor man skal gå som fotgjenger. Dette skaper mange farlige situasjoner og nesten ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:07:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "cfe4e7f2605ea2afa454d53f7db43d7a18f9b686.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-749": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91502061, + "lng": 10.76994895 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig krysning. Uklar hvem som har forkjørsrett. Syklister som skal rett fram på sykkelvei eller bilister som tvinges til høyre?", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:55:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "dcca18abb98f2856ffe8937ad93f8a8394297968.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-364": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9116268, + "lng": 10.74505269 + }, + "type": "LatLng" + }, + "description": { + "value": "Her skal det være ferdig tilrettelagt, det er rød sykkelbane og lyskryss, men trikkeskinnene går langt inn på sykkelveien og kanten på fortauet er høy og bratt. Det gjør det trangt og ubehagelig å sykle der. Fortauet er nesten like bredt som veien, så de kan ikke skylle på bredden.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:57:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "719259ff89db36be231b41f14cf20e050bce3643.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570503622355775500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "oko mnie swędzi nie wiem co tu się odpierala ale to jest zastanawiające", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:40:37Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-796": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93624693, + "lng": 10.73441505 + }, + "type": "LatLng" + }, + "description": { + "value": "Dødsulykke, Sykkel mot Sykkel, person presset ut i veibane av andre syklist, påkjørt av buss.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:47:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "df82cbae7569c5668cdffd4bf2cb4d6f2497db3d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570494561337917440": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Jens Frede Rasmussen", + "type": "String" + }, + "description": { + "value": "@Morten_Crone *Lyden af samtlige ikke-spillerforeningsmedlemmer, der snørrer fodboldstøvlerne*.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:04:37Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/518826561404141568/IdZhEPb0_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-187": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91138476, + "lng": 10.83788394 + }, + "type": "LatLng" + }, + "description": { + "value": "Må dele fotgjengerfelt med gående, 2filsvei med biler som kjører fort i motsatt retning. Ikke aktuelt å krysse denne 3feltsveien, når man skal videre i retning Brynseng til byen", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:33:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "126d5c1ff44c27f29b26c5d2ec39b130da3b93a5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-720": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88112608, + "lng": 10.78555941 + }, + "type": "LatLng" + }, + "description": { + "value": "Om morgenen er det stillestående kø i Kongsveien. Biler kommer ned Raschs vei for å \"smette inn\" i køen, og biler nordfra krysser også sykkelfeltet for å kjøre opp Raschs vei. Her har det skjedd flere ulykker siste år. Tydeligere merking i veien (rød asfalt?) er et mulig tiltak. Stopp-skilt et annet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:27:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "e7aa213940d1a9826b328f927e2175b638a6c647.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-851": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92547611, + "lng": 10.73847913 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt Ullevålsveien sydover: Farlig å bruke sykkelfeltet pga. parkerte bilers dørsone. Kjørefelt brukes i stedet. Hovedsykkelveinett.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:20:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "17e84d7d67cd686c5f246e592d65a5c87d762322.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570488754110107650": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "GAFFA.no", + "type": "String" + }, + "description": { + "value": "Hør den nye dryleren til Godspeed You! Black Emperor -- http://t.co/IxQZzas0oL", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:41:32Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561092082480078848/HmfDxO1J_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-417": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93295742, + "lng": 10.77805995 + }, + "type": "LatLng" + }, + "description": { + "value": "Når man kommer oppover på fortauet/sykkelveien er det veldig vanskelig å se hva som foregår i rundkjøringen pga mye vegetasjon. Både som fotgjenger og syklist må man nesten ut i veien for å se om det kommer biler som skal nedover Mailundveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:19:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "f17664ae793dde6c6c0cb0acb559b5af7e10355a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-146": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9258644, + "lng": 10.73103969 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig vei, tett trafikk med buss, trikk og biler ved Bislet stadion og alle sidegater som fører til rundkjøringen ved stadion,", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:07:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "8aab3c2f397f28a82d96795e8ac2e30bc2aa0772.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-792": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90690393, + "lng": 10.76074361 + }, + "type": "LatLng" + }, + "description": { + "value": "Enden av Dronning Eufemias gate, mot middelalderparken - her kjører veldig mange på rød pil mot høyre i rushtiden. Dette skjer daglig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:42:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "82e9cf4e579f2903a90cfd6969620495adab763c.jpeg", + "type": "String" + } + } + }, + "aftenposten-984": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.83828206, + "lng": 10.77801704 + }, + "type": "LatLng" + }, + "description": { + "value": "Flere dårlige alternativer for sykkel/inlines fra E18 til Ljansbruveien, - enten den bratte spiralen, - men det er jo ikke sykkelvei over broa over E18, eller den bratte bakken inne i skogen, men veldig mørk og dårlig asfalt, eller kjøre der bilene kjører, men det er smalt og også dårlig asfalt. - Hva med sykkeltrase langs den avkjørslen og opp til brua, - helst bred nok til at den kan brukes begge veier, - E18 fortauet har blitt bra hit, - for to-veis sykling, men her slutter det brått", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:05:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "24962c27d76c0730f613ca057d2ea7df7f2bd6a0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570516457043464200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 69.650518, + "lng": 18.959926 + }, + "type": "LatLng" + }, + "author": { + "value": "LLewie13", + "type": "String" + }, + "description": { + "value": "@ParkesKatie @BeckettNetball Good luck girls xx💪 xx", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:31:37Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/550275132456194048/lFjcQttE_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B40B43", + "type": "String" + }, + "streetview": { + "value": "76d4974c07da552e35e59dd9a0590b1be482e992.jpeg", + "type": "String" + } + } + }, + "aftenposten-186": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91336409, + "lng": 10.64180374 + }, + "type": "LatLng" + }, + "description": { + "value": "flere krysninger av trafikkert vei på Lysaker. innkjøring til Gjensidigebygget, sykkelbroen opp til lysakerlokket,", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:33:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "bd28db19750938f11605d5cfb46997af969aaa93.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570496887314354200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Knut-Arne Futsæter", + "type": "String" + }, + "description": { + "value": "Where the Digital Economy Is Moving the Fastest https://t.co/PJeF4ELQEM", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:13:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/486233592448569345/MlMiabRK_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0000FF", + "type": "String" + } + } + }, + "aftenposten-299": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.81673417, + "lng": 10.68403244 + }, + "type": "LatLng" + }, + "description": { + "value": "farlig", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:24:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "2b1b049cb099297690d4bbde71b8b868d30ee583.jpeg", + "type": "String" + } + } + }, + "aftenposten-569": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91398368, + "lng": 10.80081367 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det høy fart på bilene, og jeg har opplevd flere nestenulykker i meterne før bilkrysset.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:50:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "e0ebbf388d76f6e2fe8ac95ed58b1fab142c1483.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-752": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92276431, + "lng": 10.7264328 + }, + "type": "LatLng" + }, + "description": { + "value": "Trikkeskinner, høye fortauskanter og hissige bilister, kanskje spesielt sinte drosjesjåfører, gjør sykling i denne oppussede prydgaten til en dødsangstfrembringende affære.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:56:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "6fd87131b6ec7fa8bbfe708a8a8ea7189ce62069.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-714": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93712838, + "lng": 10.68205833 + }, + "type": "LatLng" + }, + "description": { + "value": "Her blir sykkelveien plutselig en bussholdeplass.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:18:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "98cd458f9583b1d8affd17e8b33b42c17f7de627.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-185": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92429132, + "lng": 10.741539 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig smal veibane og bilister som skal til venstre i krysset lengre foran bryter ofte sperrelinjen fordi de ikke gidder å vente i kø med bilene som skal rett frem. Ingen sykkelbane og veldig smale fortau her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:32:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "e13f8b7975253e8b7534a07bf4f60989f678e83f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-104": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90742574, + "lng": 10.75810432 + }, + "type": "LatLng" + }, + "description": { + "value": "Eufemias gate har så mye busser pg så smale sykkelfelt at ingen benytter sykkelibfradtruktur, og helker sykler på fortauet. Et paradaprosjekt for mislykket sykkelpolitikk", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:27:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "cdd7ef41f4c451d0180fdd7689b928e40a2b9c67.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-667": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92610187, + "lng": 10.76108157 + }, + "type": "LatLng" + }, + "description": { + "value": "Dersom en bil skal inn i Nissens gate (sørgående) og må vente på klar bane, vil biler bak bruke sykkelfelt til lå passere bilen. Det er meget skummelt dersom du kjører i sykkelfeltet, da det går fort i denne bakken. Har kastet meg av sykkelen for å unngå å kollidere i en taxi akkurat her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:18:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "f2192025559d34127475b948f581cba4a3a8c4e7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-802": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91332106, + "lng": 10.73754787 + }, + "type": "LatLng" + }, + "description": { + "value": "Kom nedover i retning nasjonal, og holdt på å tryne i et firkanta sluk som i realiteten var et hull rett i veiskuldra. Greit at denne gata ikke er tilrettelagt, men den trenger ikke være direkte trafikkfarlig for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:55:35Z", + "type": "DateTime" + }, + "streetview": { + "value": "3dbdc0723d5aaa0580ee2c5bf8c1aa81e35d0551.jpeg", + "type": "String" + } + } + }, + "tweet:570492178784514050": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.873157, + "lng": 10.496919 + }, + "type": "LatLng" + }, + "author": { + "value": "Christoffer Hovde", + "type": "String" + }, + "description": { + "value": "@hildesteria Så bra, lykke til Hilde! :) @TorbenDN @landsnes", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:55:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/556103246855417858/G1z4gMws_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-904": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92319446, + "lng": 10.84011554 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilfører krysset sykkelvei til parkeirngsplass uten å se seg for.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:09:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "db17dc4d4b211f0e452aa1fdaf482823c85b2b4d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-923": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92903054, + "lng": 10.76932668 + }, + "type": "LatLng" + }, + "description": { + "value": "etter undergangen ledes man ut i en ufattelig trang sykkelrundkjøring med forferdelig dårlige siktmuligheter. Siden denne rundkjøringen ligger lavt i terrenget, får syklende god fart inn i den fra tre kanter. Krysset kan ikke plasseres slik at man ledes blindt inn i det. Rundkjøringen må ha større diameter eller må endres til vanlgi kryss for å unngå velt/ulykker på vinterføre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:51:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "db6ef93304d72cf760b2f090b27a8be70155d075.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-298": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90820574, + "lng": 10.78352093 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler parkert innenfor sykkelfelt. Kommer plutselig en dør ut i sykkelfeltet, eller en bil som svinger inn/ut av parkering uten å bruke blinklys. Også et problem med taxier som stopper midt i sykkelfelt", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:23:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "e5499f6a32421bbc62321421ddbbfe0a5a70bb8d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-961": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93036643, + "lng": 10.69347381 + }, + "type": "LatLng" + }, + "description": { + "value": "På vei nedover sykkelfeltet, bil kjører forbi og svinger av til skolen. Bare flaks at jeg hadde lav nok fart til å bremse ned, var en halv meter i fra og treffe siden på bilen. Denne strekningen har for mange avkjøringer som krysser sykkelfelt. Bilister er uoppmerksomme på syklister i sykkelfelt..", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:29:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "d057811258666704fe31aa85a07318b6f84cc8d7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-388": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92586128, + "lng": 10.77733039 + }, + "type": "LatLng" + }, + "description": { + "value": "Manglende sykkelfelt opp grenseveien østover. Det er umulig å følge veibanen oppover. Fortau eneste mulighet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:06:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "c11979c3bfa92ea6b3d69cf0e58e424f331e87c4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570505036679286800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.919394, + "lng": 10.701313 + }, + "type": "LatLng" + }, + "author": { + "value": "Emily Victoria", + "type": "String" + }, + "description": { + "value": "I can't wait to hear the follow up to My Song 5, My Song 6", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:46:14Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/505345041158897664/pHU0gz6S_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "2c157cb7e52179d8d6d50f3b8303c45243be9c17.jpeg", + "type": "String" + } + } + }, + "tweet:570488569229418500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.47151, + "lng": 6.17293 + }, + "type": "LatLng" + }, + "author": { + "value": "Cecilie Helle", + "type": "String" + }, + "description": { + "value": "@Chicago_Jake Oki sent you DM :) Have a nice day", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:40:48Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570231728506040320/Xwo0MRGZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-781": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9152124, + "lng": 10.76993994 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette krysset kan være farlig hvis man ikke er obs. Her mener jeg selv at syklistene bør legge seg ut mellom bilene som om de skal til venstre, slik at bilene som må fortsette til høyre forstår hvor syklisten skal. Syklisten har også vikeplikt i dette krysset. Jeg har sett mange bajaser som sykler her. Jeg sykler også i dette krysset hver morgen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:18:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "240ab38a17a808f9a833d8678c8cd40af2825a92.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-770": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92091459, + "lng": 10.63605308 + }, + "type": "LatLng" + }, + "description": { + "value": "Kunne tenkt meg sykkel vei på denne strekningen(CCVest - Vækerøveien) da det er mange syklister og det vil gjøre sykkelveinettet mer komplett.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:10:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "4ebed449a2a93e0ba8fd4e2c3baaaac0db9979ae.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1011": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91436447, + "lng": 10.78799486 + }, + "type": "LatLng" + }, + "description": { + "value": "Veiovergang som kommer brått på bilene om kommer over toppen fra Tøyen, og misforstått vikeplikt for de som kommer fra Tiedemannsbyen, skaper mange nesten ulykker. Fartsgrensen er 40, men den blir ikke overholdt", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:44:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "f1fe30f2e38018b736c346cbb04456e07821f696.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-640": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9131624, + "lng": 10.64142286 + }, + "type": "LatLng" + }, + "description": { + "value": "syklervei slutter om en vei ...", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:42:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "dd6ccc381ca830bb16d157dd02f555593e7b1418.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-499": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94559768, + "lng": 10.7770729 + }, + "type": "LatLng" + }, + "description": { + "value": "Stadig konflikter mellom syklister og tunge kjøretøy som skal inn til Thaugland. Det er sykkelfelt på stedet, men store lastebiler som svinger til høyre med dårlig kontroll på blindsonen gjør det usikkert.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:57:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "a8ee7d2a848f48b18fdd275e2dca015535209113.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570488465827061760": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "1. #NashsNewVideo\n2. #viasatfotball\n3. Norway\n4. Norge\n5. Barca\n\n2015/2/25 08:32 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:40:24Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-920": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95155607, + "lng": 10.76513171 + }, + "type": "LatLng" + }, + "description": { + "value": "Direkte farlig er det kanskje ikke, men i forhold til potensialet og viktigheten, er hele strekningen langs Akerselva fra starten av Gjerdrums vei helt til Oslo sentrum dårlig tilrettelagt for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:47:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "c72ba03012fb652ae335498ed3e28b79f017132c.jpeg", + "type": "String" + } + } + }, + "aftenposten-322": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.82495378, + "lng": 10.78003406 + }, + "type": "LatLng" + }, + "description": { + "value": "Her mangler det 200 m med asfalt. Fin sykkelvei på begge sider av denne gjørmete veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:30:30Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-946": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9517441, + "lng": 10.67261695 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig smalt fortau kun på nordsiden av vegen, ellers ikke noe. Syklister må sykle i vegbanen, som har stor trafikk. Brukes som sykkelveg til og fra jobb, og det er en veldig farlig strekning fra Hovseter og helt frem til man har krysset T-banelinjen på Slemdal", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:15:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "9237c7953477e707dab970c92f9eab5877685272.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-442": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8535933, + "lng": 10.78568816 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært mye trafikk svinger av mot Solveien i morgenrush. Stor fart oppover svært smal vei skaper daglig farlige situasjoner for gående og syklende.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:27:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "bb276fb65bfe33303f205bfad368e088e482c397.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-852": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90957744, + "lng": 10.74244022 + }, + "type": "LatLng" + }, + "description": { + "value": "\"Sykkelfeltet\" her er en vits. Det er i praksis et fortau. Det at det er skiltet som sykkelfelt gjør bilister mer aggressive mot syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:20:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "d5a2f4c1d7aeece98594f0a9e6522c770fbb6577.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570509437217202200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.47151, + "lng": 6.17293 + }, + "type": "LatLng" + }, + "author": { + "value": "Cecilie Helle", + "type": "String" + }, + "description": { + "value": "@ScreamingSun012 My pleasure! I'm watching YOU! \\m/", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:03:44Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570231728506040320/Xwo0MRGZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-939": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92385043, + "lng": 10.74044466 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det mange farlige forbikjøringer (østgående). Biler presser seg forbi med centimeters avstand i høy fart istedenfor å vente 50 meter til det blir bedre plass.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:08:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "29badfd8bd4420c27b30d26fe77119baa023c551.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "39cf56cb-c1a5-46f0-b691-c49e4ff77e12": { + "type": "master:utmost:almost", + "properties": { + "location": { + "value": { + "lat": 59.90342321, + "lng": 10.77195793 + }, + "type": "LatLng" + }, + "name": { + "value": "Bike near miss", + "type": "String" + }, + "_utmostIcon": { + "value": "almost-bike", + "type": "String" + }, + "streetview": { + "value": "06b0abf00aa2fcf86a5e3dcaf1bb1e778d0584aa.jpeg", + "type": "String" + } + } + }, + "tweet:570504098551898100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.701443, + "lng": 8.958551 + }, + "type": "LatLng" + }, + "author": { + "value": "Mona Mohammud", + "type": "String" + }, + "description": { + "value": "Hey, I'm playing Castle Clash! Come join me and let's kick some", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:42:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://abs.twimg.com/sticky/default_profile_images/default_profile_3_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "2d2f05934b7b96810c22d0d6cbe4be0c6a9da538.jpeg", + "type": "String" + } + } + }, + "aftenposten-142": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93585994, + "lng": 10.73647499 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig med mange busser og folk ved busstoppet Ullevål Sykehus.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:06:15Z", + "type": "DateTime" + }, + "streetview": { + "value": "8ef25ba6c803c57ed8bf08a2ed39fe5d00dfb854.jpeg", + "type": "String" + } + } + }, + "tweet:570513702228774900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "I always dread the phrase \"I have a quick question for you\". It might be quick for you but for me, it feels like a whole paragraph.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:20:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-610": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.86163682, + "lng": 10.8204174 + }, + "type": "LatLng" + }, + "description": { + "value": "Billist kjørte på syklist", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:17:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "e2a1fb3e1942eee8a8013d50b1e0b2a139c09059.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-846": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91123415, + "lng": 10.79192161 + }, + "type": "LatLng" + }, + "description": { + "value": "Hva skjer med sykkelveiene her? Plutselig skiltes de inn via boligstrøk, og så forsvinner skiltingen..", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:16:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "2afccc73bf7004337893c28c24a3f3169a1f7ea7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-161": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91826888, + "lng": 10.66738128 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er \"E-18\" for syklister på veil til Oslo. Det arbeides i området, og sykkelveien er ødelagt. Har opplevd 2 nesten-ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:19:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "c87c191ceb8c5a30b074ea99879118fa5ca47641.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570488174746705900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Gisle G. Stokland", + "type": "String" + }, + "description": { + "value": "@ibbi_king Kult at hun tør å slippe noe helt uventet, og at hun får det til å bli en hit. Man skal ikke ta det for gitt", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:39:14Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/563646708022652928/x2LSlJFH_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "tweet:570500586451427300": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 58.934266, + "lng": 5.641012 + }, + "type": "LatLng" + }, + "author": { + "value": "Bharti", + "type": "String" + }, + "description": { + "value": "@deespeak Agree http://t.co/3YXKW89jZk", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:28:33Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rTQl6W0AAMUd0.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568360445074210816/c0Gw0g8a_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570494530639814660": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.865977, + "lng": 5.711641 + }, + "type": "LatLng" + }, + "author": { + "value": "Erlend Aasland", + "type": "String" + }, + "description": { + "value": "@Nastynilssen Kjem du på konsert i kveld, då?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:04:30Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/62937256/n677086927_1083237_3512_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "088253", + "type": "String" + }, + "streetview": { + "value": "e427307be686c0a42ad03380bb13428d5e063bcc.jpeg", + "type": "String" + } + } + }, + "aftenposten-184": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94385671, + "lng": 10.81445217 + }, + "type": "LatLng" + }, + "description": { + "value": "Tre veis kryss for syklister og fotgjengere. Skolevei for 1-10 skole. Flere ulykker med påkjørsler av skolebarn. Syklister må tilpasse farten, for barna er her de myke trafikantene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:32:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "686ea44a9fa1fac2abaf3befd7f30cedcf01fe9f.jpeg", + "type": "String" + } + } + }, + "aftenposten-183": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91178278, + "lng": 10.74873805 + }, + "type": "LatLng" + }, + "description": { + "value": "\"Alltid\" en avfallscontainer som blokkerer deler av sykkelfeltet sørover. Tvinger syklistene ut i møtende trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:32:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "c785fbe056c9bc29b558eab845c76c618d2a0962.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-919": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91224535, + "lng": 10.77724456 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det tre problemer - A) Parkeringsplass langs med smalt sykkelfelt er en dårlig kombinasjon. Trygg trafikk anbefaler å passere parkerte biler med avstand på 1,5 meter. Da er jeg ute i veibanen. B) Mange biler skal inn til høyre. De får ikke med seg at det kommer syklister i feltet til høyre. Sykkelfeltet burde vært tydelig markert også i kryss. C) Mange som stopper midlertidig i sykkelfeltet siden det ikke er ledige parkeringsplasser.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:45:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "03313e10658a501dcb5cdd94559d8743087bae3f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-530": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91805915, + "lng": 10.74021935 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye brudd på vikeplikt for trafikk fra høyre i dette krysset, siden mange bilister forholder seg til det som om det var en rundkjøring.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:14:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "dc982ba3234d92079fc7f940779fda3739af722f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570498598884016100": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.382676, + "lng": 5.056815 + }, + "type": "LatLng" + }, + "author": { + "value": "Beathe Lindseth", + "type": "String" + }, + "description": { + "value": "Go on, leave me breathless http://t.co/BUoRQzwqNc", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:20:39Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rRcePWkAAj5EN.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568438803992678400/ILYAuIPo_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FA64DA", + "type": "String" + } + } + }, + "aftenposten-182": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8977306, + "lng": 10.75956344 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter sykkelfeltet og syklene må ut i veien i en sving, ofte i høy fart. Bilene MÅ forbi, og kommer i motsatt kjørefelt i en sving. Livsfarlig. Det er 60 km i øverste del av Kongsveien, bilistene greier ikke å tilpasse farten i den nederste delen. Oppover er det farlig fordi en del syklister i", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:31:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "191306b5ff896bce58ec956460d10d5cc999fad2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-103": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91480548, + "lng": 10.69699287 + }, + "type": "LatLng" + }, + "description": { + "value": "Kolliderte med motgående syklist som syklet på feil side av gang- og sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:27:01Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-75": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90133567, + "lng": 10.76651573 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig trangt og farlig sving, bilene som kommer oppover er ofte farlige.Gunnar K", + "type": "String" + }, + "date": { + "value": "2014-09-08T11:27:04Z", + "type": "DateTime" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-748": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94118596, + "lng": 10.91837167 + }, + "type": "LatLng" + }, + "description": { + "value": "Plankryss med både sykler og biler i fart", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:54:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "6e11238235d61a60b8d7858312dbbbed7fa21020.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-477": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91286927, + "lng": 10.82423686 + }, + "type": "LatLng" + }, + "description": { + "value": "Her slutter sykkelstien brått uten noe godt alternativ", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:46:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "606ff43739abbafdd75ab731c057127a103fd104.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-776": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91314701, + "lng": 10.75909867 + }, + "type": "LatLng" + }, + "description": { + "value": "I kryssene - egentlig langs hele Grønlandsleirets går fotgjengere på rødt lys uten å se seg for. Vi som prøver å sykle på grønt lys kan få store problemer når det ikke er mye biltrafikk. Fotgjengerne hverken hører eller ser oss syklister. Noen går også ett skritt ut i \"veibanen\",altså i sykkelfeltet, \"for å vente til bilene har kjørt så de kan krysse. Ofte rett foran en syklist som passerer. Syklistene er usynlige. \"", + "type": "String" + }, + "date": { + "value": "2015-01-28T14:06:33.857Z", + "type": "DateTime" + }, + "streetview": { + "value": "2c99a2671e79564fb64efdd02af142e478c0b6bd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570507153787764740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "GAFFA.no", + "type": "String" + }, + "description": { + "value": "Spennende musikkprosjekt til Øya (@oyafestival) -- http://t.co/2kt6i0ozvD", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:54:39Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561092082480078848/HmfDxO1J_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-609": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92627257, + "lng": 10.7341361 + }, + "type": "LatLng" + }, + "description": { + "value": "Dette er en enveiskjørt gate i nordlig retning, men syklister burde hatt tillatelse til å sykle mot enveiskjøringen, da det er nok plass til dette.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:16:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "4dbfac837dfeecd854833201789896d280319382.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570516019283922940": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Ida Faldbakken", + "type": "String" + }, + "description": { + "value": "Meld deg på! Norges første Music Hackhaton @byLarm. 4 ulike utfordringer skal løses! http://t.co/9ubzXM82CA @StartupLabNo @3inno1 @657OSLO", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:29:53Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/437566122636763136/exHrzlV0_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3977F5", + "type": "String" + } + } + }, + "aftenposten-122": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91651572, + "lng": 10.73426485 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien ender i et kryss.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:43:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "bcedf3731cbc7279287d45f366b1bc4d8b74949d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-839": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92824833, + "lng": 10.75911283 + }, + "type": "LatLng" + }, + "description": { + "value": "Kommer man fra Birkelunden og skal videre nordover må man opp på en høy fortauskant, så tråkle seg gjennom mange mennesker som venter på bussen eller skal over gata. Må alltid si unnskyld en hel haug av ganger og føler meg bare i veien på sykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:05:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "5ab394e5e3d98bf0251359f6e0e63c234b554579.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570522420731375600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.931756, + "lng": 10.721783 + }, + "type": "LatLng" + }, + "author": { + "value": "Karoline Vorland", + "type": "String" + }, + "description": { + "value": "@mathjoh91 protip! Tysm", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:55:19Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/533270321126596608/Pn6elUzz_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "C964C9", + "type": "String" + }, + "streetview": { + "value": "3422a8254f28d8b30ee02118622a2cf04e5f87f9.jpeg", + "type": "String" + } + } + }, + "aftenposten-514": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9308704, + "lng": 10.77171921 + }, + "type": "LatLng" + }, + "description": { + "value": "Krapp, blind sving ut av tunnelen. Mye barnevogner og greier i sykkeldelen av veien, i tillegg til motgående sykkeltrafikk. Hva med et speil?", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:05:52Z", + "type": "DateTime" + }, + "streetview": { + "value": "7094d2c9d9ad043b300f5952e82669e48fef8812.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570508596154212350": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "6. Suarez\n7. #2hockey\n8. #vglista\n9. Messi\n10. Takk\n\n2015/2/25 09:59 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:00:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-321": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91497759, + "lng": 10.73209762 + }, + "type": "LatLng" + }, + "description": { + "value": "Ingen egen sykkeltrase gjennom kryss, svært skummelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:29:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "663f5543e9a8f77ec73f4b2531b9cd9771a5801a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570497456628084740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Flåten", + "type": "String" + }, + "description": { + "value": "St.Clause:Alltid vær klar for å takle psykiske skrullinger fra både naboer eller kommunalt ansatte.Noen som ikke er i fengsel,kan gå fri??", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:16:07Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/254817315/St_Clause_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "9D582E", + "type": "String" + } + } + }, + "tweet:570518655366139900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "6. Suarez\n7. #vglista\n8. Veldig\n9. Oslo\n10. Takk\n\n2015/2/25 10:36 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:40:21Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570488464329682940": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "6. Suarez\n7. Takk\n8. #2hockey\n9. Messi\n10. #vglista\n\n2015/2/25 08:32 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:40:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570498442033819650": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.37454, + "lng": 10.338355 + }, + "type": "LatLng" + }, + "author": { + "value": "Linnsky", + "type": "String" + }, + "description": { + "value": "Håper på å dra med pappa på golf-ferie til Spania ☀⛳", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:20:02Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569190525820219392/qLJNWJ1o_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "020F14", + "type": "String" + }, + "streetview": { + "value": "fcd837c61b911d209c6ef6a0dfc1b3e2cb20e189.jpeg", + "type": "String" + } + } + }, + "tweet:570498028089573400": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Hr. Haukedal", + "type": "String" + }, + "description": { + "value": "@GeorgeGooding framstillingen om at \"kun 20\" muslimer møtte opp.. Du vet, bevisst feilinformasjon er også løgn. http://t.co/4GeJLPUsdw", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:18:23Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rQ7t6UMAEdAgV.png", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/502558630336421888/FX5B5J9O_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570508949813919740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Jarl Wåge", + "type": "String" + }, + "description": { + "value": "@Magnekydland @sveio Det er lokalavisa sin feil. Han er berre eit stakkars offer.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:01:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/412930209826877441/9Ko7z0_p_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-983": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88189594, + "lng": 10.77145099 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne lyskryssen er ikke tilrettelagd for sykkel da det blir ikke grønt lys sammen med veien. Mange kjører derfor på rødt, noen ganger også når de ikke burde. Med mye tung trafikk og dårlig sikt blir det fort veldig farlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:05:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "477fa8ff01294347c97efd60e7e4e0d345624f87.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-181": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9131287, + "lng": 10.64049899 + }, + "type": "LatLng" + }, + "description": { + "value": "Rett før Lysaker broen krysser sykkelveien trafikert vei. Farligst her er andre sykelister som ikke føger reglene, motgående sykelister krysser rett foran meg i full fart, forbikjøringer på høyre side av andre sykelister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:30:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "9827a24804fe72072c95986f85aa79a3d23530ed.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570518156114047000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Roar Ulvestad", + "type": "String" + }, + "description": { + "value": "Er dette dokkar heimeside, @retorikkbyraet ?\nhttp://t.co/MHsjTpV8nn\n\nVille profitert på høve til å lenke enkeltinnlegga til #some", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:38:22Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/530792117593833472/uazVs1az_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "aftenposten-945": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94925128, + "lng": 10.6266117 + }, + "type": "LatLng" + }, + "description": { + "value": "Når du kommer over kommunegrensen fra Oslo til Bærum og skal til Grini er sykkelveien så godt gjemt at du må være lokalkjent for å finne den. Du må av hovedveien, sykle mot Eiksmarka sentrum og opp en vei i et boligfelt hvor det er skiltet blindvei. I enden av den blindveien starter en fin sykkel- og gangsti. Men hva hjelper det om bare noen lokalkjente finner den?", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:14:48Z", + "type": "DateTime" + }, + "streetview": { + "value": "e3a40989cdefa5e0fdf58bc7b75d325eda3482a7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-121": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91149233, + "lng": 10.77149391 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkerte biler på høyresiden i nedoverretning utgjør en fare. Flytt de til andre siden av veien eller bygg adskilt sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:42:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "477d921e2ac0e23989e3e68bfc43646518625f36.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-563": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91583809, + "lng": 10.74454307 + }, + "type": "LatLng" + }, + "description": { + "value": "Betongblokkene som beskytter ruinene i regjeringskvartalet er stil opp på sykkelfelt slik at det er ikke mulig å kjøre gjennom med barnetilhenger. Det trengs mer plass mellom sperringer.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:45:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "b04496ad9fa02e53dcce53707017880c6daf54d0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-982": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94561917, + "lng": 10.84451436 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er busslomma plassert langsmed gang og sykkelvei uten noe skille eller gjerde slik at mange som venter på bussen rusler rundt i gang og sykkelbanen. Oplever neste daglig potensielt farlige situasjoner mellom busspasasjerer og syklister", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:04:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "59f78f9638c1dca341b817212f35e04fa4e25390.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570505144439312400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Lindis Sloan", + "type": "String" + }, + "description": { + "value": "@theskinnybib describes #Fäviken so well in #manga http://t.co/aKX7gP7TEl NB the previous episode on @nomacph - next episode on March 10!", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:46:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1377229267/workingwoman_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570504716049907700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.910106, + "lng": 10.725009 + }, + "type": "LatLng" + }, + "author": { + "value": "Hans-Petter N-Hansen", + "type": "String" + }, + "description": { + "value": "@urke Ett steg nærmere en enkel forklaring på #KI15 : lagring, server og nettverk - i en boks 😀 via @ulfrasmussen / @Teknisk", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:44:58Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562329672713662464/vNeJqE4g_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "00910a844be8bf46d8a72873b0252c279f44b9a4.jpeg", + "type": "String" + } + } + }, + "aftenposten-411": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9271594, + "lng": 10.7200745 + }, + "type": "LatLng" + }, + "description": { + "value": "To år med gravearbeider i Bogstadveien. De har husket parkeringsplasser for biler på begge sider, men sykkelfelt ble \"glemt\". Nå må vi konkurere med trikk og bil.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:16:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "1cd71bc8203192c4bc8f7ff1b72f3f86e3197a2f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570521454355320800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.203477, + "lng": 8.566605 + }, + "type": "LatLng" + }, + "author": { + "value": "Elisabeth", + "type": "String" + }, + "description": { + "value": "@Verostocker snart slepper du alt det regnet 😄", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:51:29Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558378584927399937/vYlFAdW__normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-297": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9163974, + "lng": 10.78180432 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt opphører for et lite stykke samtidig som dette er et T-kryss og et sted køen frem til neste kryss gjerne starter. Det er i nedoverbakke og etter en bro-undergang, og flere ganger har jeg måtte bråbremse fordi biler kjører inn rett foran meg. Oppleves utrygt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:23:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "f32fbe08c6332310239340e747fbc7b06f806291.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-645": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91346628, + "lng": 10.64288735 + }, + "type": "LatLng" + }, + "description": { + "value": "Man må kunne forvente planfri sykkelvei på en av norges mest sykkeltette strekker!", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:45:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "f5f9d3a46b3349e3ee13855d9aa48afdcdede049.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-296": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.49340797, + "lng": 10.70570468 + }, + "type": "LatLng" + }, + "description": { + "value": "Eneste strekning mellom Moss og Oslo der syklister (og gående) er sammen med bilene på en smal vei som også er en svingete omkjøringsvei for E6.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:22:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "bbefb9f2c4759c68c86c32118d7e17188c471f9a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-120": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91566599, + "lng": 10.75036883 + }, + "type": "LatLng" + }, + "description": { + "value": "Ikke plass til sykler i kjørefelt for bil, ingen retrettmulighet pga. gjerde, umulig å sykle på fortau pga stålrist.", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:42:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "d532a8754d3bfbc5e723829b79d0b6ff8ae14045.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-180": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91074467, + "lng": 10.72876095 + }, + "type": "LatLng" + }, + "description": { + "value": "Dokkveien/Rådhusplassen, ulovlig kjøring og parkering. I praksis \"fritt frem\" på Rådhusplassen i dag for kjøring og parkering. Elendig tilrettelegging for sykkel, hva med en avmerket trasé parallelt med trikkeskinnene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:30:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "065724947de52eabe861f9cc3ce258b475bd6e40.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "4740a652-6269-4df0-9d0d-f2fe80cb13fa": { + "type": "master:utmost:green", + "properties": { + "location": { + "value": { + "lat": 59.91225342, + "lng": 10.75798631 + }, + "type": "LatLng" + }, + "description": { + "value": "This is a policeman", + "type": "String" + }, + "date": { + "value": "2015-02-04T10:05:03.969Z", + "type": "DateTime" + }, + "url": { + "value": "https://master-bridge.eu/medias/7d15f71b4128dcedb8f8170178ca08be39d13c05.png", + "type": "String" + }, + "_utmostIcon": { + "value": "green", + "type": "String" + }, + "streetview": { + "value": "4ca367853ff68947b12dbd73fbbb998f43792793.jpeg", + "type": "String" + } + } + }, + "tweet:570486307249623040": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 63.476632, + "lng": 10.908223 + }, + "type": "LatLng" + }, + "author": { + "value": "Ragnhild Aslaksen", + "type": "String" + }, + "description": { + "value": "http://t.co/Nan67XLfO7", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:31:49Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rGRNAW0AALLMj.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/473022948312641537/Q8iauwJo_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "70fe2a8a9b34f547362a05524437a213c8a3006d.jpeg", + "type": "String" + } + } + }, + "aftenposten-102": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93652641, + "lng": 10.68055629 + }, + "type": "LatLng" + }, + "description": { + "value": "Lyskryss med sykkelvei midt i veien. Bilene krysser sykkelvei og LYSKRYSSET skifter så raskt at man ALDRI kommer over på grønt!", + "type": "String" + }, + "date": { + "value": "2014-09-10T05:25:05Z", + "type": "DateTime" + }, + "streetview": { + "value": "ad02b5c8ece6e3345ebfa0de993514f3e3dc74c5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570495041824825340": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "@AdamTyminski @Samueljrp @SpirOxy ciężko o bunt pokoleniowy,kiedy zmysły stępione, a jedyną świętością jest internet, którego młodzież broni", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:06:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "tweet:570518080096473100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.602083, + "lng": 8.97501 + }, + "type": "LatLng" + }, + "author": { + "value": "markus hjertø hammer", + "type": "String" + }, + "description": { + "value": "Playing GtaV \n\n#gta # funn", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:38:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/458895697744785408/zSP68OE4_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "f2006212f631b6886e8c7e34334facb1653ab108.jpeg", + "type": "String" + } + } + }, + "aftenposten-160": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91747836, + "lng": 10.76177626 + }, + "type": "LatLng" + }, + "description": { + "value": "Til og med den nye gang- og sykkelveien langs Akerselva er blitt den foretrukne parkeringsplassen for kommunale etater. Jeg sykler der to ganger daglig. Bilene parkerer stort sett MIDT i traseen. Enkelte sjåfører synes det er for mye plunder å stenge døra, slik at syklister og fotgjengere må vike. S", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:19:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "2a1bebaf2a481da190508f8685cd1cf4d70b04ec.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570507570009546750": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Oslo Records", + "type": "String" + }, + "description": { + "value": "Head turner by day, jaw dropper by night: @mayavik & @HPLindstrom's tribute to M.Douglas @NoiseyMusic @Noisey_Nordics\nhttp://t.co/JT0x0fRJuN", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:56:18Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1273509271/OR-OSL_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570505128219959300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "ide se włosy uczesać bo sobie je umyłam jezu chwila prawdy boje się że są w złym stanie ale musze być dobrej myśli wygram to", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:46:36Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-456": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.97264627, + "lng": 10.76406955 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien / skiløypa kommer ned til Maridalsveien, og fortsetter på andre siden, men det er ingen fotgjengerfelt eller varsling for biler nordfra, som også kommer rundt en sving. Mange nesten-ulykker, ofte med barn.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:34:27Z", + "type": "DateTime" + }, + "streetview": { + "value": "71d606b9c8799c701876834d727d3c20d4bf5297.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-922": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93491396, + "lng": 10.76333999 + }, + "type": "LatLng" + }, + "description": { + "value": "Gamle, ubrukte trikkeskinner, brostein og hull i veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:51:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "dc907cc09e0ac7b0eff32ebe4375ddd78240b702.jpeg", + "type": "String" + } + } + }, + "aftenposten-179": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90964198, + "lng": 10.71797847 + }, + "type": "LatLng" + }, + "description": { + "value": "kapasitets utfordringer i sommerhalvåret , det er ikke plass til alle syklende sammen med gående som skal til fergeterminal.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:29:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "b2ff24e9acaaa51b1a924b2370710c1815ddede8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-329": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92407625, + "lng": 10.8324337 + }, + "type": "LatLng" + }, + "description": { + "value": "For å komme fra Karihaugen til Helsfyr, er dette korteste vei, men fortauet er utrolig dårlig stand, og det samme er veiskulderen. Man må sykle midt i veien, og det er ikke noe kjekt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:35:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "489202426e9a6ea96ad10404f7daae83545aff0b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570520611178606600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "@APKaczmarczyk @pafelwoo Panie Andrzeju niech Pan uważa słuchając. I broń Boże nie pije niczego w tym czasie. Można się zakrztusić słuchając", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:48:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "aftenposten-864": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90835098, + "lng": 10.75196743 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er svært uoversiktlig og nesten umulig å manøvrere som syklist foran Operaen og i krysset Tollbugata-Operagata-Langkaia. I realiteten må man sykle på fortauet til fare for seg selv og andre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:30:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "9d19e9a545cd14ff08535e0c5eeceecfa33dddd8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-328": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9245279, + "lng": 10.7398653 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalt for syklister som presses mot kant av veibanen av passerende biler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:34:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "d98b73a72269455d1675b9c04e29337f04a9609b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-425": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9305062, + "lng": 10.77020645 + }, + "type": "LatLng" + }, + "description": { + "value": "Klønete løsning i svingen her. Sjikane for å lede syklister inn på en krøllete og upraktisk sykkelvei. Hvis man velger å sykle forbi, f.eks. fordi man ikke skal dit sykkelveien leder, blir sykkelveien borte og man må finne en løsning på egenhånd.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:22:12Z", + "type": "DateTime" + }, + "streetview": { + "value": "b358c298bf644a91e56190c03d6bdf4232c893aa.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-535": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92386118, + "lng": 10.72578907 + }, + "type": "LatLng" + }, + "description": { + "value": "Bogstadveien pusset opp for millioner uten at det er lagt til rette for sykkel. Kombinasjonen trikkespor og manglende sykkelsti gir mange farlige situasjoner når biler presser seg forbi. Ingen alternativ vei med sykkelsti inn til sentrum fra Majorstuen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:15:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "2efaedf411c7090603488badd1c53f4ed4f27d5e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-960": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93190384, + "lng": 10.72312831 + }, + "type": "LatLng" + }, + "description": { + "value": "Sett flere nestenulykker i dette krysset. Syklister kommer nedover Ring 2 i det trange sykkelfeltet, mens biler uten forvarsel svinger mot Marienlyst og avskjærer sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:29:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "57e4254e7e87e8182b82a7dd850b25a2aad1b8d4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-608": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93787006, + "lng": 10.68474054 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av drosje som ikke overholdt vikeplikten ved innkjøring. Drosjen kom i samme retning som meg (vestfra), så meg ikke på grunn av buss som sto på holdeplassen mellom oss, og svingte inn. Gode bremser => kun skrubbsår.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:15:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "e10bc22362a7f81ffdfcfb52a22db93d26e0c0c5.jpeg", + "type": "String" + } + } + }, + "aftenposten-327": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.88028084, + "lng": 10.78651428 + }, + "type": "LatLng" + }, + "description": { + "value": "Utenfor handlesenteret på Holtet står gjerne bilister i sykkelfeltene begge veier. Handlesenteret har godt med parkeringsplasser, men det er mye enklere å sette fra seg bilen i sykkelfeltet, \"skal bare\" gjøre noe småtteri. Video: http://youtu.be/sfWbgI9rs-A", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:33:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "4540b5b81a52fb047c3b24172cfde36dfe2bce0c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-295": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92033384, + "lng": 10.76115131 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt forsvinner før rundkjøring, det er før og i kryss det er viktigst med skille mellom syklister og bilister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:22:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "5207308ad06284a315be1bb2fa174a247333011a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-363": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91512818, + "lng": 10.73917865 + }, + "type": "LatLng" + }, + "description": { + "value": "Denne veien er enveiskjørt og bør ikke være med på sykkelvei-kartet, eventuelt få merket alternativ rute (som ikke finnes). Men den er brei nok til toveis sykkeltrafikk!", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:56:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "e8b2692c4fff78efc8692fc0c395883e037a8f4f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570513626424938500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "6. Suarez\n7. #vglista\n8. Veldig\n9. Oslo\n10. Takk\n\n2015/2/25 10:18 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:20:22Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-178": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91552078, + "lng": 10.75060486 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangle trafikklys og biler kommer fort ut av tunnelen i område.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:29:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "61ba6ca0479d52902ddf612049b3975bcfc6611a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570506846026518500": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Alvine Barbo", + "type": "String" + }, + "description": { + "value": "http://t.co/ICdHsBFjQy", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:53:26Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rY8_iVIAEAXAs.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562674121541443586/OjoS1Tsj_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "545154", + "type": "String" + } + } + }, + "aftenposten-902": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9601244, + "lng": 10.89483799 + }, + "type": "LatLng" + }, + "description": { + "value": "Ekstremt farlig utkjørsel fra enebolig. Meldt fra flere ganger til Statens Vegvesen, men de gjør vel ingenting før det blir en stor ulykke", + "type": "String" + }, + "date": { + "value": "2014-09-10T16:59:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "c0fc86205270260b52291a995e3711f7a329a9bc.jpeg", + "type": "String" + } + } + }, + "aftenposten-1008": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9127348, + "lng": 10.7461524 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det mangel på planlegging. Hvordan skal man komme seg til fra Kirkegata til Torggata? Ligger man i sykkelfeltet på høyre side må man krysse over til venstre inn på en farlig måte. Man må også kjøre inn på fotgjengerfelt med mye folk fordi der er det eneste stedet med senket fortau. Uoversiktlig og farlig sted!", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:39:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "6bb4157b8f925403da8c15d6b2d2d12aa53a3004.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570517105193455600": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.912002, + "lng": 10.711973 + }, + "type": "LatLng" + }, + "author": { + "value": "MartinePetra", + "type": "String" + }, + "description": { + "value": "#Morning poop at #Tinkern #Skillebekk #Frogner #Vippa #kleinspitz #dog #Oslo #Norway #Norge @ Tinkern https://t.co/HOXp1X9vqi", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:34:12Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-d-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/11022973_936272529751251_2043345908_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2441996400/5utbcafh715kwlyx1j72_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "E60E44", + "type": "String" + }, + "streetview": { + "value": "fc316aaeb69ce7574dea85af877587cf39d89e7b.jpeg", + "type": "String" + } + } + }, + "tweet:570518027546054660": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Roger Pihl", + "type": "String" + }, + "description": { + "value": "@sykkeldama @oslovann må bli mer aktive hvis dere skal bli interessante å følge :-)", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:37:52Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/523919148212957184/EFln2n_A_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "tweet:570498196734144500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.919426, + "lng": 10.701063 + }, + "type": "LatLng" + }, + "author": { + "value": "Emily Victoria", + "type": "String" + }, + "description": { + "value": "@babyhaim @edwarddroste good job Edward, lift your right hand in the air and pay your left shoulder", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:19:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/505345041158897664/pHU0gz6S_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "230246b644da0f495a88594ba91615c85404cab0.jpeg", + "type": "String" + } + } + }, + "aftenposten-545": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90814657, + "lng": 10.75564742 + }, + "type": "LatLng" + }, + "description": { + "value": "En varslet sykkelkatastrofe som utspilles i sakte film i Dronning Eufemias gate. Syklister som deler kjørefelt med utallige busstopp. Nesten 50 meter bred gate, og ingen reel sykkelmulighet, Sykkelfelt som avluttes i to kjørefelt som begge svinger til høyre. Dette blir en av Oslos mest travle syk", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:25:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "4bdbe67c70d769756a1883fca11b619cfdcf69f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570496848068112400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Flåten", + "type": "String" + }, + "description": { + "value": "St.Clause:Alltid vær klar for å takle psykiske skrullinger fra både naboer eller kommunalt ansatte.Noen som ikke er i fengsel,kan gå fri?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:13:42Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/254817315/St_Clause_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "9D582E", + "type": "String" + } + } + }, + "aftenposten-968": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93515046, + "lng": 10.74428558 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister som kommer langs Kirkeveien fra vest må krysse hovedveien for å svinge til venstre mot Sagene", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:37:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "7513c4b933f0ea7e2ef891f2092c64fd9f095283.jpeg", + "type": "String" + } + } + }, + "tweet:570503213943816200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 61.12479, + "lng": 9.09373 + }, + "type": "LatLng" + }, + "author": { + "value": "Beitostölen Resort", + "type": "String" + }, + "description": { + "value": "Spennende tider @krohntraaseth! FjellNorge; et verdensprodukt både vinter og sommer. Vi er klare for full samling mot store mål! #reiseliv", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:39:00Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/543770782552174592/xveHrtEP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-416": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9590388, + "lng": 10.6895256 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklet rett i siden på en bil da jeg lå til venstre for køen i 20 km/t og en bil plutselig vrengte til venstre uten å gi tegn på forhånd. Sliter fortsatt med høyre skulder, som ble hektet i speilet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:18:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "a016aace153d8d5b74d214c32a11129c3a9173d1.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570493464141557760": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.97842, + "lng": 8.72469 + }, + "type": "LatLng" + }, + "author": { + "value": "Bjørn Ove Strand", + "type": "String" + }, + "description": { + "value": "Hva er det elektrikeren somler med da. Skulle vært her 8,30.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:00:15Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3540899476/fd88b29057dcecf9b345c379f7f5ff35_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "1C2224", + "type": "String" + } + } + }, + "tweet:570520019450388500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.917011, + "lng": 10.740634 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas Tallaksen", + "type": "String" + }, + "description": { + "value": "@sigvei Hvorfor ikke bruke gmail som alle oss andre?", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:45:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3315994639/cb821519961e3002669e1a8f942cce04_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "20ae752294411501839e34af801703e3dd9e68d0.jpeg", + "type": "String" + } + } + }, + "aftenposten-415": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92336652, + "lng": 10.76600074 + }, + "type": "LatLng" + }, + "description": { + "value": "En politibil overholdt ikke vikeplikten og kjørte nesten på med i dette krysset.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:16:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "6c486be308cf653de75118296f8f1d7107795e97.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-713": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90051784, + "lng": 10.58292388 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det sykkelfelt i 75m i hver retning mellom rundkjøringene som plutselig forsvinner. Særlig farlig nedover, da man møter biler som kommer i stor fart fra E18, ofte med sola i øynene. I stedet burde det vært bygget separat sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:15:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "24c4c4face2e2ee2a782eaa21734d9a94ce7c443.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570513265450749950": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.941505, + "lng": 10.768942 + }, + "type": "LatLng" + }, + "author": { + "value": "Sætre Hanssen", + "type": "String" + }, + "description": { + "value": "@baardamundsen Og en feilslutning om at man blir ledende innen en teknologi ved å være fremste forbruker. @Rotevatn", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:18:56Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000529008550/7550f1aeffb4214cb56195f0f385dcdd_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "36fd494c2248edad206234deb950226a74c70b2c.jpeg", + "type": "String" + } + } + }, + "aftenposten-712": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91265412, + "lng": 10.63845634 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det mange som sykler over fotgjengerfeltet etter å ha kommet ned broen fra Lysakerlokket. Et riktig kaos for alle enten det er fotgjengere, syklister eller motoriserte kjørende. Dårlig løsning med bussholdeplass midt i sykkelstien!", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:12:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "e1fefa0511ff5ad1d0dacbe4132064eeca82ad09.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570498466398519300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.71769, + "lng": 10.826014 + }, + "type": "LatLng" + }, + "author": { + "value": "Tonje Kristoffersen", + "type": "String" + }, + "description": { + "value": "@OddMagnusW ååå jeg er så absolutt enig!!! skikkelig Bad program", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:20:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/477736184383569920/ZqZsPmgz_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "9271dca10d00eab4d1358d77c8a4b8f898c62951.jpeg", + "type": "String" + } + } + }, + "tweet:570522159023575040": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.743532, + "lng": 10.192837 + }, + "type": "LatLng" + }, + "author": { + "value": "Hege Brandsdal ", + "type": "String" + }, + "description": { + "value": "- når du sier til sønn på 9,at teksten til @onklp Styggen på Ryggen er; flere fuckings ekorn, og han nesten dør av latter😆-erke d vetu mamma", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:54:17Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/435076357719330816/o1V49jSC_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-177": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92820532, + "lng": 10.75389862 + }, + "type": "LatLng" + }, + "description": { + "value": "bil pleier å peise på på denne strekken, mens det mangler sykkelvei. Situasjonen er for skummelt for å sykle på veien, desverre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:28:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "2cf756d88fe89435c68445aec2598d395436a445.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-392": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.87076088, + "lng": 10.79059123 + }, + "type": "LatLng" + }, + "description": { + "value": "Buss for trikk bruker sykkelfeltet for av- og påstigning av passasjerer. Farlige situasjoner oppstår også daglig når bussen snur ved brannstasjonen uten hensyn til syklister i motgående sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:06:53Z", + "type": "DateTime" + }, + "streetview": { + "value": "f99b4d6f0d24c416c1e56a550f208f012ba3209f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570516586592935940": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.910112, + "lng": 10.724954 + }, + "type": "LatLng" + }, + "author": { + "value": "Ulf Rasmussen", + "type": "String" + }, + "description": { + "value": "@lifus humanisme, frihet, glede", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:32:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/449912823443767296/_n4LIHya_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "7688E3", + "type": "String" + }, + "streetview": { + "value": "90393027bf8e14df66b75265701310c32b80b7d1.jpeg", + "type": "String" + } + } + }, + "tweet:570503798482997250": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "rano cierpie stojąc pod lodówką bo to co chce zjeść jest za trudne do zrobienia i kończe jedząc kanapke z szynką", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:41:19Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-326": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92839886, + "lng": 10.84796905 + }, + "type": "LatLng" + }, + "description": { + "value": "Ubehagelig veikryss, du kommer rett på fra et gjerde. Men likevel bedre en andre steder", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:33:45Z", + "type": "DateTime" + }, + "streetview": { + "value": "14d70d3111eac03f4f1c02e54066b98cd9e7da2a.jpeg", + "type": "String" + } + } + }, + "aftenposten-698": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90749298, + "lng": 10.78089773 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil stod i sykkelfeltet og ventet på å snike gjennom bommen. Ombestemte seg og svingte rett ut i veien. Fikk to syklister rett i venstre dør. De hadde svingt ut i veien for å kjøre rundt ham. Her er det mye biler som sniker og lager farlige situasjoner. Spesielt etter at Politiet fjernet Passering forbudt skiltet ved bommen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:54:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "6894715d8fb2d9478e3f4f5025b3b18284f201ad.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570506632658067460": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Peder Lofnes Hauge", + "type": "String" + }, + "description": { + "value": "Unge Høgre vil feire russetid med godt samvit. Det unner eg dei. Difor føreslår eg at dei står opp om morgonen og gjer leksene sine.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:52:35Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/520242744477106178/N3rY5lkP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-700": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94128806, + "lng": 10.7261753 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelhjul satt fast i trikkeskinne,slik at jeg datt av sykkelen.ingen merket vei for syklister", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:54:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "0f5396d1cfab1adad0c933850fb1ae40e7861500.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570517936919724000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.910113, + "lng": 10.724919 + }, + "type": "LatLng" + }, + "author": { + "value": "Ulf Rasmussen", + "type": "String" + }, + "description": { + "value": "@hpnhansen @hassanzouhar @urke @Teknisk og i @VCE sitt tilfelle - ett integrert automasjonslag on top, om du vil http://t.co/7eES5CMX9Y", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:37:30Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/449912823443767296/_n4LIHya_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "7688E3", + "type": "String" + }, + "streetview": { + "value": "9df27d2067924214fe351c801da83e66541bc537.jpeg", + "type": "String" + } + } + }, + "aftenposten-176": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93667691, + "lng": 10.83110332 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang/sykkelvei som krysser bilvei etter bratt bakke. Uoversiktlig og vanskelig spesielt når det er vått og glatt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:28:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "69bcdbe3b5c5b4f9f0ba1d6e460811bfcc5c90e4.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-455": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91164832, + "lng": 10.82405447 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble nesten påkjørt av bilist. Han stoppa og var nok mer skremt enn meg. Prøver å være synlig med Bilistene er ikke oppmerksomme på at her kommer det mange syklister siden de skal svinge til venstre.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:33:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "872ed4b60a95f8360947623d935c45c53e7e302b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-807": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93171033, + "lng": 10.76325416 + }, + "type": "LatLng" + }, + "description": { + "value": "plutselig er det ikke sykkelvei mer!!", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:03:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "73906bd0c07aa09c41e948ceeb7280b051da8161.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "25171bab-d952-4929-b8a8-b14b5c5884f7": { + "type": "master:utmost:almost", + "properties": { + "location": { + "value": { + "lat": 59.93891808, + "lng": 10.59397995 + }, + "type": "LatLng" + }, + "name": { + "value": "Motorcycle near miss", + "type": "String" + }, + "_utmostIcon": { + "value": "almost-moto", + "type": "String" + }, + "streetview": { + "value": "3290282d7d9ccd44739eb1cea4a0d7789ee8d5f5.jpeg", + "type": "String" + } + } + }, + "tweet:570519045394591740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.912901, + "lng": 10.74999 + }, + "type": "LatLng" + }, + "author": { + "value": "Inge Olav Fure", + "type": "String" + }, + "description": { + "value": "#HSBC-sjefen er bekymret for at samfunnet stiller større krav til bankfolk enn biskoper. Vel, det er forskjell på kontanter og løst prat.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:41:54Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/362764870/DSC_0018_kopi_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "671fe2935e82bd6b3104a6b36fbeee4148448e11.jpeg", + "type": "String" + } + } + }, + "aftenposten-956": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96063933, + "lng": 10.7672882 + }, + "type": "LatLng" + }, + "description": { + "value": "Mye dårlig asfalt i Frysjaveien, og biler som foretar forbikjøringer uansett hvor fort man sykler nedover bakken her. Iflg. planutkast jeg har sett finner PBE plass til tosidig fortausparkering, men ikke tilrettelegging for sykling i den svært brede veien som skal etableres her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:25:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "8f1790bc47d98c95c36422c4f97b8000c224a9c0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-175": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9237001, + "lng": 10.7590327 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler parkerer i sykkelvei slik at sykler må kjøre ut i veien og da kan det fort skje ulykke med motgående biler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:28:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "e267f29a3b94f3976b0b8eef1e4a1a1799071008.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-800": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92697956, + "lng": 10.80162048 + }, + "type": "LatLng" + }, + "description": { + "value": "Varierende trasé, mangler asfalt. Trangt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:51:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "33a2febee9b5c329243174e0cfa15ce3c458ec30.jpeg", + "type": "String" + } + } + }, + "tweet:570511424130310140": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Roar Ulvestad", + "type": "String" + }, + "description": { + "value": "Det er viktig å huske og ikkje disse den tida då vi kalte huske disse", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:11:37Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/530792117593833472/uazVs1az_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "aftenposten-400": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9337207, + "lng": 10.73214054 + }, + "type": "LatLng" + }, + "description": { + "value": "Hullete vei, trikkeskinner, brostein og lite plass til sykkelist.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:11:20Z", + "type": "DateTime" + }, + "streetview": { + "value": "e2f4ad3ad06002645d340bd71cf34e4779d4c6c9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-756": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91243898, + "lng": 10.76402664 + }, + "type": "LatLng" + }, + "description": { + "value": "Ble presset ut av sykkelfelt av bus 37, veldig skummelt. Uoversiktlig strekning med for mange busser som stanser i sykkelfelt og ikke holde vikeplikt når de skal skifte kjørefelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:58:10Z", + "type": "DateTime" + }, + "streetview": { + "value": "4673cf634ceaa85136f92f80a39f1aab1f2589a5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-806": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93383895, + "lng": 10.68557739 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig asfalt, fartsdumper og kumlokk gjør at man må kjøre ut i veien for å unngå de verste smellene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:03:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "f1d7eda4f3e620692d5d78b01393277dab17b74a.jpeg", + "type": "String" + } + } + }, + "aftenposten-780": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93944207, + "lng": 10.78288793 + }, + "type": "LatLng" + }, + "description": { + "value": "Noe uoversiktlig kryss med både fotgjengere, biltrafikk og trikk.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:18:32Z", + "type": "DateTime" + }, + "streetview": { + "value": "9451c1ebdc9c52d38278e4de39d9d5e6635e7ece.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570515956524568600": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Roar Ulvestad", + "type": "String" + }, + "description": { + "value": "@retorikkbyraet http://t.co/jWELJkOap7", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:29:38Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rhPO_WoAAXoMy.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/530792117593833472/uazVs1az_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "tweet:570508145883275260": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Anders Hofseth", + "type": "String" + }, + "description": { + "value": "@H4sle trodde først “eneste mann” betydde eneste person. Ga en enda rikere lesekontekst.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:58:36Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/413363703/070106_Anders_by_Irma_SQ_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0000FF", + "type": "String" + } + } + }, + "aftenposten-981": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93433346, + "lng": 10.74385643 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt blir borte i kryss. Må enten opp på fortauet og er da i veien for de gående eller leve farlig på veien....", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:04:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "90f2e14010a0dddcad1a4dadeaa144cfea6f3490.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-362": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91046497, + "lng": 10.72088813 + }, + "type": "LatLng" + }, + "description": { + "value": "Stort tre med bladverk hindrer oversikt for biler og syklister, der gang- og sykkelvei krysser Filipstadveien. Dette må man kunne gjøre noe med, her passerer det minst 3000 syklister hver dag i høysesong.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:56:12Z", + "type": "DateTime" + }, + "bilde": { + "value": "17383e4b5591f285e3acba5b87a7335a.JPG", + "type": "String" + }, + "streetview": { + "value": "fcc45eed40702b48d14620208c3ea905e5e37b27.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570522065876480000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.911629, + "lng": 10.7581 + }, + "type": "LatLng" + }, + "author": { + "value": "Montri Tantisirikul", + "type": "String" + }, + "description": { + "value": "I'm at Faculty of Technology, Westerdals Oslo ACT in Oslo https://t.co/8xnJa1a6kd", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:53:54Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3507193061/9972f684af7afa4b36f6a93fd950e52e_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "00B800", + "type": "String" + } + } + }, + "aftenposten-269": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93358632, + "lng": 10.75049757 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal vei med masse parkerte biler. Ikke plas til sykkel og bil ved siden av hverandre og bilistene er utålmodige.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:12:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "fd921df399f2de094bfb92012a84ff530d2f4606.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570519137459572740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.920871, + "lng": 10.760731 + }, + "type": "LatLng" + }, + "author": { + "value": "Marita Thorkildsen", + "type": "String" + }, + "description": { + "value": "What do you order when you're on starbucks? #VIVAShawnMendes", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:42:16Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567794718944559105/FbIAyb1b_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "710efe7f4135ff7983b1010b75a5f4a801faad4f.jpeg", + "type": "String" + } + } + }, + "aftenposten-711": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91342594, + "lng": 10.64231872 + }, + "type": "LatLng" + }, + "description": { + "value": "Griseskummelt!!!!!!! Slakk bakke ned fra Lysakerlokket fører inn i en 90\\\\' sving og deretter få meter fra kryssing tvers over bilvei. Skandaløst på norges desidert mest benyttede sykkelstrekning.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:09:30Z", + "type": "DateTime" + }, + "streetview": { + "value": "7d680393760c51d4a97b85c15bef47618589ed5a.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570505098356531200": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.767718, + "lng": 10.257737 + }, + "type": "LatLng" + }, + "author": { + "value": "ALISE", + "type": "String" + }, + "description": { + "value": "får meg alltid i godt humør http://t.co/vBlkxql2pK", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:46:29Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rXR6nVIAETeR1.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/528645960449417216/86iDPgNc_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "D02B55", + "type": "String" + }, + "streetview": { + "value": "0b09953d60b275a376e04e3f84ec673e4541e550.jpeg", + "type": "String" + } + } + }, + "aftenposten-639": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94323337, + "lng": 10.73668956 + }, + "type": "LatLng" + }, + "description": { + "value": "Ufattelig mye biltrafikk og parkerte biler i den ellers så vakre hagebyen. Tydelig at beboerne ikke benytter det gode kollektivnettverket her godt nok. Vi skviser oss forbi hverandre, syklister, land rovere og barnevogner. Det er relativt farlig å sykle her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:41:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "b51dd7113bc57c8d0667d8880a14c3dd6c6d739c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570503700097183740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.97101, + "lng": 5.73064 + }, + "type": "LatLng" + }, + "author": { + "value": "Thor Bjarne Bore", + "type": "String" + }, + "description": { + "value": "FN var lammet. 2014: Væpnede grupper til angrep på sivilbefolkningen i over 35 land uten at verdensamfunnet grep inn http://t.co/AGnz7s7Iwe", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:40:56Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/459261419964231680/0Eiu1Kzl_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570493452850487300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Lasse Hamre", + "type": "String" + }, + "description": { + "value": "I 2003 besluttet @NilsToreMeland å hoppe av bokstavenk.no Nå kommer boken om kloke beslutninger. Hva har du lært? https://t.co/OaR5yHrlmr", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:00:13Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/522722778353393665/QRrIgSGA_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570516242488016900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.400907, + "lng": 10.6593 + }, + "type": "LatLng" + }, + "author": { + "value": "Marte Sjøvold", + "type": "String" + }, + "description": { + "value": "It's so sad, waking up to such news. Everyone knows that DRose has been working so hard. Maaaaan", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:30:46Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/560412512152461312/w5ozDSyQ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F71313", + "type": "String" + } + } + }, + "tweet:570491653879943200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 67.282821, + "lng": 14.385969 + }, + "type": "LatLng" + }, + "author": { + "value": "Daniel B.-Simonsen", + "type": "String" + }, + "description": { + "value": "Enkle mekanismer i kompliserte spørsmål. Volum gir plass i det nasjonale landskapet. http://t.co/9NjzUftbgy", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:53:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/439381743292796928/_g0Y-RmN_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "f13fce9019ae50123a22c926801c82475ab43cdb.jpeg", + "type": "String" + } + } + }, + "tweet:570517928749215740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "prezydent zaczyna kampanię zgodnie z prawem, no i bardzo dobrze #wywiad #PR1 #PBK \"jestem kandydatem obywatelskim\".", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:37:28Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "aftenposten-773": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92482899, + "lng": 10.75926303 + }, + "type": "LatLng" + }, + "description": { + "value": "Folk parkerer i sykkelfeltet konstant. Kommer ikke forbi - tvinges ut sammen med trikken.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:13:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "f7586e3b7ec782efd17566d4e5f6f5b9a6027ea2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-747": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91880665, + "lng": 10.81775665 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlrig innkjøring fra motorveien da mange kommer raskt inn i krysset mot sykkelveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:53:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "181537aa6215edcc7adbce64598231aef2f117ab.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-842": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90576883, + "lng": 10.82067489 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt ved Bryn er fjernet etter veiforbedring. Har opplevd flere nestenulykker her både til og fra jobb, morgen og ettermiddag. Har ventet lenge på at det skal bli merket. Er det planen at det skal merkes for sykkelfelt, bør det gjøres snart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:10:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "9eff459ee85d8c75fb038af8e887aaa7aadd0578.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-294": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93487096, + "lng": 10.74643135 + }, + "type": "LatLng" + }, + "description": { + "value": "RIng 2 fra Uelands gate til Ullevål Sykehus er nettopp ferdig asfaltert uten at det er gjort tilpasninger for syklister. Mye trafikk og ikke noe sykkelfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:22:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "b930d4ce2212da86912d0986d05b423003f8126e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570487074572386300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.97842, + "lng": 8.72469 + }, + "type": "LatLng" + }, + "author": { + "value": "Bjørn Ove Strand", + "type": "String" + }, + "description": { + "value": "@Trygdepartiet Akkurat sånn var det..", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:34:52Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3540899476/fd88b29057dcecf9b345c379f7f5ff35_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "1C2224", + "type": "String" + } + } + }, + "aftenposten-791": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91699973, + "lng": 10.71458816 + }, + "type": "LatLng" + }, + "description": { + "value": "For ca. 20 - TYVE år siden sa jeg ifra om masse huller her -gamle steiner og gammel asfalt . Men ingenting har skjedd !Mellom Frognerveien og Bygdøy Alle er det fortsatt masse huller og det har ikke blitt bedre av seg selv!! I løpet av disse årene har jeg sett veiarbeider og asfaltbil i krysset BA -flere ganger....et par meter unna . Hvor er logikken ?", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:39:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "47f74de861e4bd664e1f0014cc9b8fc327f91193.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-268": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91559607, + "lng": 10.74249386 + }, + "type": "LatLng" + }, + "description": { + "value": "Håpløs bomløsning, sykler i begge retninger må kjøre på samme side av bom og etter passering av bom må man skifte fil. Her er det bare å flytte bommene inn i kjørebanen slik at syklister kan passere på rett side av veien og slipper å skifte fil etter bompassering. Filskifte i bilvei er ikke greit.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:12:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "856a6b851563605e44fc8ddb4f29d8a2c9817baf.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570519663395909600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Olav Skaar", + "type": "String" + }, + "description": { + "value": "@sondreolsen «Det er forskjell på «klar tale» og å oppføre seg som en tulling». Fin setning. @jasnoen", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:44:22Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/470254864799260672/F6W2JxZQ_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "4C9949", + "type": "String" + } + } + }, + "tweet:570517616042893300": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 58.952787, + "lng": 5.732694 + }, + "type": "LatLng" + }, + "author": { + "value": "ROKderm", + "type": "String" + }, + "description": { + "value": "Ny artikkel ute, stor stas! Jeg får uttale meg om frukt og grønt og huden på http://t.co/FI31g0UorG. 💚 @kk_no… https://t.co/pLv4Lc7hkL", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:36:14Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-e-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/10986055_502457763228660_953098371_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2333549204/jni0gvbpypx4q73klrir_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570508597764886500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "1. #NashsNewVideo\n2. #viasatfotball\n3. Norway\n4. Barca\n5. Norge\n\n2015/2/25 09:59 CET #trndnl2015 http://t.co/6sjsp7X8c6", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:00:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570498775061569540": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.382676, + "lng": 5.056815 + }, + "type": "LatLng" + }, + "author": { + "value": "Beathe Lindseth", + "type": "String" + }, + "description": { + "value": "Go on, leave me breathless http://t.co/e4Yt9AI6bE", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:21:21Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rRmvqWkAAmlqT.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568438803992678400/ILYAuIPo_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FA64DA", + "type": "String" + } + } + }, + "aftenposten-101": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90974957, + "lng": 10.76432704 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele Schweigaardsgate er dårlig for sykkel.", + "type": "String" + }, + "date": { + "value": "2014-09-09T22:45:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "31c7819e864dd26ac53f624d735dc9eeae15667c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570512486211964900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Jarl Wåge", + "type": "String" + }, + "description": { + "value": "@SaysPhilippe @Hafslund_KS Denne samtalen kunne de godt ha tatt på norsk.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:15:50Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/412930209826877441/9Ko7z0_p_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-174": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91044883, + "lng": 10.70632696 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkel- og gangvei krysser bilvei/parkering, uoversiktlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:27:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "f82ec630abeae2f63ed1675c8f7a0bb41e8e2bef.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570491407217111040": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Norske Felleskjøp", + "type": "String" + }, + "description": { + "value": "Hvordan skaper man verdens beste ku? http://t.co/HwQYsc1mcT @Geno4u @TINE_SA @Regjeringen @NorgesBondelag #melkogmiljoe", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:52:05Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2997965033/b95a441ec61b5ee1ef9d3c6d791c065e_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-544": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95068037, + "lng": 10.68366765 + }, + "type": "LatLng" + }, + "description": { + "value": "Svært smale fortau med fotgjengere og mye trafikk på vei. Farlig for spesielt barn som sykler", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:25:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "289d3ce09f96a55f5026427ae818e39997629915.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-159": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92457091, + "lng": 10.75930595 + }, + "type": "LatLng" + }, + "description": { + "value": "Matvare butikk bruker stor porsjoner av fortauet og sykkelveien for å vise frem sine grønnsaker, mm. Det betyr at mange fotgjengere bruker sykkelveien for å gå forbi, uten å ha oversikt å noe kanskje sykler forbi.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:19:11Z", + "type": "DateTime" + }, + "streetview": { + "value": "1db2e42ad27fd24fd092764852b5d24c9faea8c8.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-697": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92792577, + "lng": 10.6212902 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilistene tuter når jeg tar snarveien gjennom rundkjøringen. Jeg ser jo at det går bra. Mangler bare at dem bruker lyktespylerne når de passerer meg nedover Vollsveien. Jeg bestemmer selv hvor jeg vil sykle!", + "type": "String" + }, + "date": { + "value": "2014-09-10T11:51:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "f7ae10cfb880bd942c5b870ae8ae0898af7c68f7.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570491948575936500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Karen Bjøro", + "type": "String" + }, + "description": { + "value": "Infoarbeid #meslinger må trappes opp. Barnevaksprog trenger flere helsesøstre http://t.co/AxatJjXuHi @OBollestad @TellevikDahl @LaHNSF", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:54:14Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/478486496924540928/8EWpIkBR_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-441": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93171167, + "lng": 10.72299152 + }, + "type": "LatLng" + }, + "description": { + "value": "Kumlokk/avløp som fungerer som kraftig dump isykkelbanen. Gir et kraftig slag i styret slik at man kan miste kontrollen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:27:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "40ecbe68a569fc5d05d2410c7223b4f02bed3683.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-943": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9044992, + "lng": 10.82187652 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister kjører i dobbel rundkjøringen og blir ofte ikke respektert av biler.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:13:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "8adb66fe2521fe0ba603ce76ce2c95f3a6d856d0.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-775": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93908468, + "lng": 10.68948268 + }, + "type": "LatLng" + }, + "description": { + "value": "Noen meter med sykkelvei fra smestad før du plutselig befinner deg i et boligfelt. Dårlig skiltet og neppe noe optimal løsning for verken beboere eller syklister,", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:14:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "441991813cb97fb2e8bdc2f3997110f3e65b6e63.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570513662915559400": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 62.472725, + "lng": 6.157347 + }, + "type": "LatLng" + }, + "author": { + "value": "ThePoleKing", + "type": "String" + }, + "description": { + "value": "PROGRESS: «««««««««««««««««««««««««««««««««««««««««\n\" A one year progress picture for day 24 of… https://t.co/PJDeJMaZ9d", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:20:31Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-a-a.akamaihd.net/hphotos-ak-xaf1/t51.2885-15/s306x306/e15/11007852_433068083517224_1847713169_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1677421249/poleking_normal.gif", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-173": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91015837, + "lng": 10.70945978 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelvei stopper opp i rundkjøring/gangfelt veldig mange farlige situasjoner som oppstår når det sykles motsatt vei inn i en rundkjøring.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:27:51Z", + "type": "DateTime" + }, + "streetview": { + "value": "510a822312e3f165763ba7e93962aee88ad5ff43.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-710": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91005079, + "lng": 10.7096529 + }, + "type": "LatLng" + }, + "description": { + "value": "I østgående retning sykler mange i veien, og krysser over gangfelt, inn på sykkelveien. Skaper farlige situasjoner med fotgjengere og motgående trafikk på daglig basis. Dårlig løsning!", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:08:57Z", + "type": "DateTime" + }, + "streetview": { + "value": "3d4ca51c20c60d335761be12b530ecaad5e4ac3d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1000": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93183934, + "lng": 10.86024284 + }, + "type": "LatLng" + }, + "description": { + "value": "Kolliderte med annen syklist som kom fra høyre. Veldig uoversiktlig undergang. Oppmerking i veibanen og speil ville bedret situasjonen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:33:21Z", + "type": "DateTime" + }, + "streetview": { + "value": "06837fefe646fb988285b74e833b5ee79a6cb09e.jpeg", + "type": "String" + } + } + }, + "aftenposten-172": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90632832, + "lng": 10.82005262 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det ikke merket sykkelfelt hverken opp eller ned. Trangt på grunn av veiarbeid.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:26:18Z", + "type": "DateTime" + }, + "streetview": { + "value": "59a63e1e26e0d9925d1035896d50128d207ddd11.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570511081728299000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "@DrBradMcKay I think I just did a mini-sick!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:10:16Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-921": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91583809, + "lng": 10.75797557 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister har ingen plass i Hausmannsgate; i veien er kjører bilene i to felt og i fotgjengerne har brede fortau. Det skulle vært sykkelvei her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T17:47:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "1a2886ad7b60885d67c23c4333bb1bbb55c58b0b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-774": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93203285, + "lng": 10.76177358 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelveien langs ring 2 forsvinner, valget mellom fortau med dårlig framkommelighet og fotgjengere, eller smal bilvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:13:46Z", + "type": "DateTime" + }, + "streetview": { + "value": "5386abd38002a716e04f634a265bd36e84c7ffd3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-100": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91304138, + "lng": 10.75226783 + }, + "type": "LatLng" + }, + "description": { + "value": "Klønete strekning mellom Grønland og resten av byen.", + "type": "String" + }, + "date": { + "value": "2014-09-09T22:44:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "0aec41bc47642a4a82c94f85375271e81509a17d.jpeg", + "type": "String" + } + } + }, + "tweet:570512382541340700": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.962565, + "lng": 10.906263 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas Indrebø", + "type": "String" + }, + "description": { + "value": "Dear media! Pls stop writing about #KimKardashian and all of her shit family!!! @eonline @TMZ @THR @HuffPostCeleb", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:15:26Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000099358157/65173a420efa617dc05edfa5fbcd4360_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "024893ce50dcf9de1a8a0f68ef993fd2de2b8447.jpeg", + "type": "String" + } + } + }, + "aftenposten-931": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93090534, + "lng": 10.76553672 + }, + "type": "LatLng" + }, + "description": { + "value": "sykler man østover risikerer man å møte forvirrede syklister i overgangen fra sykkelfelt til sykkelvei. De må plutselig krysse sykkelveien og komme seg over på fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:03:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "59702691e586fb3e471f4e90e748f09697a5f7cd.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570506582280314900": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.913408, + "lng": 10.740779 + }, + "type": "LatLng" + }, + "author": { + "value": "Per Kristensson", + "type": "String" + }, + "description": { + "value": "Beautiful day in #Oslo. On my way to a meeting w Norwegian companies and researchers. http://t.co/KSPA4ds4iy", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:52:23Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rYqCIUIAAtX30.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/186056334/pelle_disp_normal.JPG", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "2987f457369d8dc9d41c10e3c106e5bd7bdf39f4.jpeg", + "type": "String" + } + } + }, + "tweet:570500828223701000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.89404, + "lng": 10.5248 + }, + "type": "LatLng" + }, + "author": { + "value": "Hilde Myre Eidal", + "type": "String" + }, + "description": { + "value": "I dag bærer det avgårde til Låplassen. Mye er handlet inn, mere skal handles. Privattime fredag, kos med hundene, Martine kommer torsdag.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:29:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/495591338729955328/bUQsnZ7m_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "aftenposten-97": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91222384, + "lng": 10.75044393 + }, + "type": "LatLng" + }, + "description": { + "value": "Hele strekningen fra Jernbanetorget, forbi Kirkeristen, Stortorvet og Grensen er farlig på grunn av mange trikkeskinner og mye trafikk.", + "type": "String" + }, + "date": { + "value": "2014-09-09T11:34:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "bfb5e870b7882cebb8abe9e8064efc283a540e51.jpeg", + "type": "String" + } + } + }, + "tweet:570505323758411800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.358577, + "lng": 10.369442 + }, + "type": "LatLng" + }, + "author": { + "value": "Martin Finne", + "type": "String" + }, + "description": { + "value": "@SaysPhilippe ikke nødvendigvis....", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:47:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566163962786758657/JPJ6_hdM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "C7203C", + "type": "String" + } + } + }, + "aftenposten-476": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.96117641, + "lng": 10.73518753 + }, + "type": "LatLng" + }, + "description": { + "value": "Fra Sognsvann forbi Kringsjå skole og langs hele Carl Kjeldsens vei er det flust av skolebarn og andre som sykler til og fra skole og jobb. Det er svært uoversiktelig for både syklister og bilister. Jeg kvier meg og prøver å unngå å kjøre i de mest folksomme periodene så langt det er mulig. Mangel p", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:46:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "63ae8eaab260881925f96b7e7733d72c4804bc40.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570512377483014140": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.609502, + "lng": 5.826816 + }, + "type": "LatLng" + }, + "author": { + "value": "Norunn Helland", + "type": "String" + }, + "description": { + "value": "Fytti http://t.co/4UBFt4Deou", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:15:25Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rd8ErUUAAtQAb.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565270240943439872/E7bEP6wC_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "89C9FA", + "type": "String" + } + } + }, + "aftenposten-158": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9033738, + "lng": 10.6867955 + }, + "type": "LatLng" + }, + "description": { + "value": "Å sykle eller gå langs fortauet (smaaale veier) på høyre side etter Bygdøy landhandel i retning Huk er som en felle. På hjørnet ut fra Langviksvn. smalner fortauet brått inn og opp, med store runde steiner. Ikke fotgjengerfelt. Barn, turister og syklende ses i farlige situasjoner her..", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:18:01Z", + "type": "DateTime" + }, + "streetview": { + "value": "3fc6001954b76279beda252afc5d5225857f4fb2.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-475": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93549983, + "lng": 10.74079871 + }, + "type": "LatLng" + }, + "description": { + "value": "Ca klokken 10, nesten ingen trafikk. Sykler i kollektivfeltet vestover. Varebil i venstre felt slakker farten og passasjer sikter og kaster glødende sigarettsneip som treffer og havner innenfor klærne. Brenner merke i jakken.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:45:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "18f041da5831b5a245b55b3ace064e76a0e85b54.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570501868440424450": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Hanne-Kari Havik", + "type": "String" + }, + "description": { + "value": "@thorbjarnebore Og psykiatrien fungerer jo også bare sånn passe, sånn apropo....", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:33:39Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/526537522197721088/8Z1tS5jO_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-967": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9331399, + "lng": 10.6223029 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er bare fortau på den ene siden av veien. Visse partier er svært trange. fortauet brukes også av mange skolebarn som skal på Jar skole. Det er svært ubehagelig å møte busser fordi de er tvunget til å kjøre helt inntil fortauet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:36:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "54d55a7fcb60c591ccc60c06c32b6732737222b2.jpeg", + "type": "String" + } + } + }, + "aftenposten-971": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9286354, + "lng": 10.71518898 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet forsvinner...", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:41:23Z", + "type": "DateTime" + }, + "streetview": { + "value": "c24545ec711710c0c7f71eda83cc5771fc0d4b85.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-424": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.89319949, + "lng": 10.75896263 + }, + "type": "LatLng" + }, + "description": { + "value": "Farlig passering av veien fra Mosseveien og ned til havna. Blinklys sjelden i bruk og høy fart på svingende kjøretøy. Komplisert trafikkbilde, især når man kommer fra byen og må se seg bakover på det som i tillegg er et smalt fortau i forbindelse med byggearbeider. Her bør det lages fartshump.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:21:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "1f7a9969c7cb7c65323a6f3aad08d2f0f69676a5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-440": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90960971, + "lng": 10.75073361 + }, + "type": "LatLng" + }, + "description": { + "value": "Bil kjørte inn i bakhjulet mitt mens jeg var i rundkjøringen, han mente tydeligvis at jeg syklet for sakte gjennom rundkjøringen. Intens tuting og fortsatte å ligge tett på sykkelen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:27:07Z", + "type": "DateTime" + }, + "streetview": { + "value": "78c9406aa9cfb10667360abd169c4614f0155f9f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-1010": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90779153, + "lng": 10.76803922 + }, + "type": "LatLng" + }, + "description": { + "value": "Oisann, her forsvinner plutselig sykkelfeltet, sånn at man kræsjer inn i bussbommen!", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:41:13Z", + "type": "DateTime" + }, + "streetview": { + "value": "5feab69a46e8a0e687786de93292a613703a1407.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-999": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92634516, + "lng": 10.62326431 + }, + "type": "LatLng" + }, + "description": { + "value": "Fortauet langs Vollsveien er farlig for både syklister og fotgjengere. Stadig større deler av asfalten faller ned i skråningen mot trikk/T-bane. Sprekker i veibanen viser også at noe er i ferd med å skje, spesielt rett nedenfor Jar huset.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:32:56Z", + "type": "DateTime" + }, + "streetview": { + "value": "329ab368ebcb55865dbb7138f19a5fffa5a503f1.jpeg", + "type": "String" + } + } + }, + "tweet:570511967577907200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 67.26423, + "lng": 15.38742 + }, + "type": "LatLng" + }, + "author": { + "value": "Tor Håkon Bjørnli", + "type": "String" + }, + "description": { + "value": "@TorBjornli Sorry, SUNRISE, it's just before SUNRISE .... ;-)", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:13:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/506720265141637120/F59AU3OW_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "aftenposten-361": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91104051, + "lng": 10.7324624 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklister, turister, fotgjengere, traktorer.. Alle på samme plass gjør det til et mareritt å passere Rådhusplassen. Burde vært egen \"fil\" for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:56:03Z", + "type": "DateTime" + }, + "streetview": { + "value": "d6529dd8310b09f438cf648d50e6a2e154403ea4.jpeg", + "type": "String" + } + } + }, + "tweet:570484841613033500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Jorgen Knutsen", + "type": "String" + }, + "description": { + "value": "På denne dagen i 1995 tapte @LillestromSK 2-4 for Vålerenga. Mål: Peter Hedman og Tom Gulbrandsen. VIF: Aga jr, Riisnæs, Levernes , Haug.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:25:59Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1546561925/JK_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570506495294611460": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.843361, + "lng": 5.742924 + }, + "type": "LatLng" + }, + "author": { + "value": "Unicorn", + "type": "String" + }, + "description": { + "value": "@elisoneee_k Sveiciens dzimšanas dienā! ♥", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:52:02Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000778426578/824d0c571ce24be4be6dcb930632f3a8_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B31018", + "type": "String" + } + } + }, + "tweet:570503991240622100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.946435, + "lng": 5.73275 + }, + "type": "LatLng" + }, + "author": { + "value": "Glen Schaug", + "type": "String" + }, + "description": { + "value": "@ToffeeArt Oops, coasters with an A....", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:42:05Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000674898175/35267133e14f544c6551973d214c13c5_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "5e6a474393cb0646d201428a03a7eb3d3aab20c7.jpeg", + "type": "String" + } + } + }, + "aftenposten-998": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91277245, + "lng": 10.7510823 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfelt er skiltet, men ikke-eksisterende. Syklistene krysser Nygata i forlengelsen av Stenersgata - og risikerer påkjørsler fra buss eller trikk, fra høyre og venstre. Den slake svingen gjør det ekstra uoversiktlig.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:32:02Z", + "type": "DateTime" + }, + "streetview": { + "value": "28a0e50389dea29a41eb06034184ecf49155c30d.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570491604282282000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.910115, + "lng": 10.724918 + }, + "type": "LatLng" + }, + "author": { + "value": "Hans-Petter N-Hansen", + "type": "String" + }, + "description": { + "value": "@urke Den enkleste definisjonen er ..... Drumroll .... Internett 😁 @Teknisk", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:52:52Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562329672713662464/vNeJqE4g_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "3773a07b471b8828a4a9de2d4a4bc2bb00fc868e.jpeg", + "type": "String" + } + } + }, + "tweet:570505864043470850": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.97101, + "lng": 5.73064 + }, + "type": "LatLng" + }, + "author": { + "value": "Thor Bjarne Bore", + "type": "String" + }, + "description": { + "value": "Dagens Ivar Aasen: Eit ord i rette tid er betre enn mange andre", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:49:32Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/459261419964231680/0Eiu1Kzl_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570495463549509600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "hass", + "type": "String" + }, + "description": { + "value": "I'm bored, let me rt things about Iraq.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:08:12Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567054277253013504/1b_hEZPO_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-267": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92758707, + "lng": 10.73922425 + }, + "type": "LatLng" + }, + "description": { + "value": "Veien deles i to kjørefelter, sykkelfelt slutter 50m før kryss.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:12:37Z", + "type": "DateTime" + }, + "streetview": { + "value": "f757914bc2d619bd3573c940bae69718173f0312.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570521296632741900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.638182, + "lng": 11.322404 + }, + "type": "LatLng" + }, + "author": { + "value": "Gudenesgud", + "type": "String" + }, + "description": { + "value": "Det er mandig å være på skoledoen", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:50:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568057116062396416/tnFazeiM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570508260048044000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Peder Lofnes Hauge", + "type": "String" + }, + "description": { + "value": "No kjem det igjen: Unge Høgre vil flytte eksamen ( http://t.co/l3Kv9T3nID ). Slik svarte eg i fjor: https://t.co/kopzS7iGmP", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:59:03Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/520242744477106178/N3rY5lkP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-644": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8952122, + "lng": 10.75756788 + }, + "type": "LatLng" + }, + "description": { + "value": "Andre innlegg i dette området er etter min mening noe milde. Dette området ER en byggeplass med fortau/sykkelrute som går tvers igjennom. Gravemaskiner, store trailere, anleggsgjerder som deler fortauets bredde i to og gir tidvis dårlig sikt. Det skyldes kun flaks at det ikke her har skjedd flere ulykker.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:44:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "2abebffac5715ed8f3e4a9b7b04ce09cf730b16e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570514178563121150": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Aleksander Dye", + "type": "String" + }, + "description": { + "value": "Tilpasse en hel tabell så alle cellene er brede nok i #Excel: Marker kolonnene og dobbeltklikk på skillelinjen mellom dem", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:22:34Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/524869950322638851/p9cTai3e_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "tweet:570513307666391040": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.41764, + "lng": 10.48241 + }, + "type": "LatLng" + }, + "author": { + "value": "Marek Marjusz Sowa", + "type": "String" + }, + "description": { + "value": "@AdamTyminski może i dobre, ale to jednocześnie jest przyczyną otępienia. Treści jakimi żywi się młodzież nie pomagają.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:19:06Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2923809801/d1e16c354c04971e0870a809209b43a1_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "B8C5C6", + "type": "String" + } + } + }, + "tweet:570492932891000800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.940235, + "lng": 10.722034 + }, + "type": "LatLng" + }, + "author": { + "value": "Peter Leonard", + "type": "String" + }, + "description": { + "value": "I'm at Universitetet i Oslo - @unioslo in Oslo https://t.co/RGyhHuw7Fn", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:58:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/54458379/garden_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "06066C", + "type": "String" + } + } + }, + "aftenposten-96": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91136324, + "lng": 10.75859785 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårlig tilrettelagt, mye trafikk, elendig vegdekke (hull og ujevnheter, spesielt rundt trikkelinjene) gjør dette til et elendig sykkelstrekning.", + "type": "String" + }, + "date": { + "value": "2014-09-09T11:28:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "78965e0417de5571a506555dd43ee4da9da3e488.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570511822933127200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.962619, + "lng": 10.905876 + }, + "type": "LatLng" + }, + "author": { + "value": "Thomas Indrebø", + "type": "String" + }, + "description": { + "value": "@eonline who gives a fuck???!!!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:13:12Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000099358157/65173a420efa617dc05edfa5fbcd4360_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "fc009c7426102ec846074bf0d94ffa3886ceba73.jpeg", + "type": "String" + } + } + }, + "tweet:570504464156762100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "no nic mi się nie chce kurwa jakim sposobem doszłam do momentu że mam 17 lat a mam problemy ze wstaniem i udaniem się do kibla", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:43:58Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570513800274808800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.469692, + "lng": 10.906367 + }, + "type": "LatLng" + }, + "author": { + "value": "Walnut", + "type": "String" + }, + "description": { + "value": "@Leesonface @Gemanji #deep", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:21:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/539046446256128000/4LTg6nCf_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9DA5AD", + "type": "String" + }, + "streetview": { + "value": "613b472c235e97f3320b375bbc1574e6942ead58.jpeg", + "type": "String" + } + } + }, + "tweet:570506211302502400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.050432, + "lng": 9.728197 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Eriksen ", + "type": "String" + }, + "description": { + "value": "@UnibetNorge 2-0 #dagenshundrings", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:50:54Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000821154897/7b4ae15529d57e47924dc6fd5fcbe11c_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-513": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93785932, + "lng": 10.684762 + }, + "type": "LatLng" + }, + "description": { + "value": "Inn- og utkjøring til Statoil og drosjeparkeringen her er ikke spesielt god. Burde vært oppbygget for motorkjøretøy som skal krysse gang- og sykkelveg (da de har vikeplikt). Og Statens vegvesen burde ha bygget sykkelveg med fortau her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:05:19Z", + "type": "DateTime" + }, + "streetview": { + "value": "b55e717bf38d0ad82a81a498f5addd510effc8c9.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570500643087110140": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.373087, + "lng": 6.716364 + }, + "type": "LatLng" + }, + "author": { + "value": "Sheymah", + "type": "String" + }, + "description": { + "value": "@elissakh big kisses from Norway", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:28:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/564153150933057536/BafZPVc2_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "E80936", + "type": "String" + } + } + }, + "tweet:570493418109063200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.351667, + "lng": 6.221111 + }, + "type": "LatLng" + }, + "author": { + "value": "tor kjell erfjord", + "type": "String" + }, + "description": { + "value": "Wind 1,0 m/s N. Barometer 999,0 mb, Raks økende. Temperature 3,4 °C. Rain today 6,3 mm. Humidity 89%", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:00:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1883393028/M0g1NcmW_normal", + "type": "String" + }, + "_profile_color": { + "value": "990000", + "type": "String" + } + } + }, + "aftenposten-779": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9073558, + "lng": 10.75898408 + }, + "type": "LatLng" + }, + "description": { + "value": "Fulgte sykkelfelt østover og kolliderte med fotgjenger som kom over fotgjengerfeltet fra Barcode på rødt lys. Umulig å se fotgjenger pga. rush-trafikken som sto stille i kjørefeltene.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:17:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "67f7a3428f30a16046269ebacb81e33843beb869.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-423": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90637135, + "lng": 10.7735002 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det farlig for syklister, gående og biler. Nesten alle som kjører sykkel kjører alt for fort og tråkker pedaler selv om dette er nedoverbakke i denne gaten!!! Det blir så høy fart, disse viker ikke for biler som kommer fra høyre og de fleste bruker ikke sykkelstien da de tydeligvis stresser m", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:21:33Z", + "type": "DateTime" + }, + "streetview": { + "value": "70554a5a3489776c6a1a3e146a8057ee3af8323b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570496802811711500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.434386, + "lng": 10.655843 + }, + "type": "LatLng" + }, + "author": { + "value": "MRKS", + "type": "String" + }, + "description": { + "value": "@RiseChino don't you have s mother", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:13:31Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567443616751419392/-EXhABsY_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FFCC4D", + "type": "String" + }, + "streetview": { + "value": "97f12656754ee286eaaaa1a1a08022a8d641b9e5.jpeg", + "type": "String" + } + } + }, + "tweet:570507366459953150": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.919534, + "lng": 10.690257 + }, + "type": "LatLng" + }, + "author": { + "value": "Erlend Bakken", + "type": "String" + }, + "description": { + "value": "Enjoying a very good morning (@ Studio of Dreams Come True in Oslo, Norway) https://t.co/b1wvzaVBRQ", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:55:30Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3173672301/8073e7975d5c6434d52bc2bfaf7224bf_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099CC", + "type": "String" + } + } + }, + "tweet:570505746472943600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.915936, + "lng": 10.72263 + }, + "type": "LatLng" + }, + "author": { + "value": "Thor Egil Thoeneie", + "type": "String" + }, + "description": { + "value": "@streng1 Å smøre ski er så vanskelig at foreldre avstår fra å sende barna på langrenn - la oss håpe at dette senker foreldres skuldre!", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:49:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3608880622/23d25669c957b91c7a773336eb7159f6_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "7aac00e1c3c12d95765bdf55a582069a3a5e5991.jpeg", + "type": "String" + } + } + }, + "aftenposten-95": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91265412, + "lng": 10.76295375 + }, + "type": "LatLng" + }, + "description": { + "value": "Det oppstår ofte farlige situasjoner når biler - spesielt drosjer - uten forvarsel stanser i sykkelfeltene i Grønlandsleiret. Syklistene må da svinge raskt ut i trafikken for å unngå kollisjon.", + "type": "String" + }, + "date": { + "value": "2014-09-09T11:26:59Z", + "type": "DateTime" + }, + "streetview": { + "value": "56cabeebaf031a2da3a0c9e1e72691426ac84899.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-769": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91273921, + "lng": 10.76214823 + }, + "type": "LatLng" + }, + "description": { + "value": "Her stanser biler (spes drosjer) i sykkelfeltet uten forvarsel. Jeg har opplevd at en taxi passerte meg og svingte hardt til høyre rett foran sykkelen min. Jeg måtte kaste meg ut i trafikken for ikke å kjøre inn i bakskjermen hans.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:08:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "4a7058a1a155ad4d02ef62d8e76653b863aa6f35.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-474": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93754222, + "lng": 10.74982702 + }, + "type": "LatLng" + }, + "description": { + "value": "Påkjørt av bil som kom ned Uelandsgata, bilen overholdt ikke vikeplikten, og hadde stor fart inn i rundkjøringen før den bråbremset og stoppet 3 meter over vikepliktlinjen. Kun mindre skader på sykkel og bil.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:44:44Z", + "type": "DateTime" + }, + "streetview": { + "value": "59878f4f04d252d903ad96e88aaad985667f5177.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-768": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9118796, + "lng": 10.83796977 + }, + "type": "LatLng" + }, + "description": { + "value": "Så dårlig asfalt at det er farlig å sykle denne første delen mellom rundkjøringen nedenfor Tveita senter og lyskrysset. Dumt fordi man må kjøre på bilveien og så svinge opp på fotgjengerfeltet lenger nede i bakken (lenger nede i bakken er det supert sykkelfelt, plutselig)", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:08:29Z", + "type": "DateTime" + }, + "streetview": { + "value": "f13442906b26114b03490bd98086e0b806ee6ca3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570506422653476860": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "Peder Lofnes Hauge", + "type": "String" + }, + "description": { + "value": "No kjem det igjen: Unge Høgre vil ha russetid etter eksamen ( http://t.co/l3Kv9T3nID ). Slik svarte eg i fjor: http://t.co/yk7sOoe6cM", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:51:45Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/520242744477106178/N3rY5lkP_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-862": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91251084, + "lng": 10.74589962 + }, + "type": "LatLng" + }, + "description": { + "value": "Kommer man fra Kirkegata og skal videre i Torggata (\"hovedsykkelgågate\"), har man et problem. Syklende må svinge til venstre over trikkesporene for å komme \"rett fram\" i Torggt, og man har grønt lys samtidig med trikken som kommer imot. Eneste nedsenkede fortauskant er ved gangfeltet, som ofte er sperret av mange gående. Her har ingen planleggere eller politikere forsøkt å sykle selv.", + "type": "String" + }, + "date": { + "value": "2014-09-10T15:29:45Z", + "type": "DateTime" + }, + "bilde": { + "value": "c02173a5a081512fb6e89228d3dc8e1f.jpg", + "type": "String" + }, + "streetview": { + "value": "465646ba9ee2d0cb75455fb2002894f1690b7e30.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570500462744641540": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 58.881185, + "lng": 5.670438 + }, + "type": "LatLng" + }, + "author": { + "value": "Reidar Humlestøl", + "type": "String" + }, + "description": { + "value": "@truckeradamuk @LongHaulLife @ESlibrarian @gluttnous new and good to go http://t.co/P9o4GOJLt6", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:28:04Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rTJZVXEAAMd4a.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/519111905324322816/uxZXoPlI_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-233": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.8810561, + "lng": 10.78539848 + }, + "type": "LatLng" + }, + "description": { + "value": "I rushtiden skal bilene klemme seg inn i bilkøen, ved å blokkere sykkelfeltet. Noen biler vinker også inn biler fra Raschs vei selv om det kommer syklister i sykkelfeltet. Har vært mange ulykker her.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:56:04Z", + "type": "DateTime" + }, + "streetview": { + "value": "e52c630bde584b9133c110a3df31117a4a222075.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-826": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9470639, + "lng": 10.77196211 + }, + "type": "LatLng" + }, + "description": { + "value": "Vitaminvn: Sykkelfelt forsvinner gradvis inn i fortauskant, i tillegg er det brukt feil type skillelinje", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:40:18Z", + "type": "DateTime" + }, + "bilde": { + "value": "80ec25b203f6007ae0ac93c05a7f6b8c.jpg", + "type": "String" + }, + "streetview": { + "value": "6f259ef35e1f718a04bb3d2f4e15d130f56ba949.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-607": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90228261, + "lng": 10.76737403 + }, + "type": "LatLng" + }, + "description": { + "value": "Syklist påkjørt av bil i rundkjøringen. Bilisten hadde vikeplikt inn i rundkjøring, men så ikke syklisten før det smalt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:14:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "f9a3f2fb8707285c3f26e598994f672e8a36c7a3.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "aftenposten-266": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92745267, + "lng": 10.73895335 + }, + "type": "LatLng" + }, + "description": { + "value": "Mangler sykkelfelt gjennom krysset. Og det er gjennom kryss man trenger å vite hvor man har rett til å være som syklist.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:12:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "1926e84c042cee882cd6ece1ecabdbc609ced22f.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-755": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9367844, + "lng": 10.92985153 + }, + "type": "LatLng" + }, + "description": { + "value": "Lettere kaotisk rundkjøring", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:56:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "44ab788122136bd206b19ed7911f8aefefd7a3c9.jpeg", + "type": "String" + } + } + }, + "tweet:570506385181556740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.919446, + "lng": 10.701112 + }, + "type": "LatLng" + }, + "author": { + "value": "Emily Victoria", + "type": "String" + }, + "description": { + "value": "@jizziemcguire can you send me a selfie as a good luck on my interview?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:51:36Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/505345041158897664/pHU0gz6S_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "6b4eaf1c14d9b3a33126e4ab48262cc2aac7eeb1.jpeg", + "type": "String" + } + } + }, + "tweet:570506264440139800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.74746, + "lng": 10.184 + }, + "type": "LatLng" + }, + "author": { + "value": "Hammad ", + "type": "String" + }, + "description": { + "value": "@UnibetNorge 2-1 #dagenshundrings", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:51:07Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/515611612611641346/ZwU87PKb_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + } + } + }, + "aftenposten-94": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93063521, + "lng": 10.85556507 + }, + "type": "LatLng" + }, + "description": { + "value": "Her er det en farlig utkjøring fra en bedrift som gjenvinner metall. Det er høye gjerder rundt bedriften som gjør det svært vanskelig for syklister å se om det kommer noen biler ut fra bedriften. Det er tilsvarende vanskelig for bilister som kommer ut å se om det kommer noen syklister på sykkelstien", + "type": "String" + }, + "date": { + "value": "2014-09-09T11:26:07Z", + "type": "DateTime" + }, + "bilde": { + "value": "9b18f130cd23df323a36e4cd5c08ed11.jpg", + "type": "String" + }, + "streetview": { + "value": "73201bed66a7c2b61e3b81f0668b37e7e7617be5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570497210867159040": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marius Huseby", + "type": "String" + }, + "description": { + "value": "Her er vårklassikerne du må få med deg http://t.co/Xua762LsLT @TV2DagO2 @mads_kaggestad #2sykkel #sykkel @Kristoff87 http://t.co/nLYMh7UaEC", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:15:09Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rQMJ5XIAAH2d5.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/458952908164173824/94cUFPTJ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "aftenposten-934": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92950093, + "lng": 10.76828062 + }, + "type": "LatLng" + }, + "description": { + "value": "håpløst smalt segment på toveis sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T18:04:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "98d98467b2a1daae62b2ed0f17a8f567b50b4e18.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-93": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91002928, + "lng": 10.76351165 + }, + "type": "LatLng" + }, + "description": { + "value": "Det oppstår stadig farlige situasjoner fordi biler - spesielt drosjer - plutselig stopper i sykkelfeltet. Resultatet er at syklister plutselig må svinge ut i trafikken.", + "type": "String" + }, + "date": { + "value": "2014-09-09T11:25:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "6aef570c3b7122d10ac447714ed693cf25de63ad.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570489342998798340": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.910119, + "lng": 10.72492 + }, + "type": "LatLng" + }, + "author": { + "value": "Hans-Petter N-Hansen", + "type": "String" + }, + "description": { + "value": "I dag er jeg konferansier på Felix for @Teknisk sitt frokostseminar, #KI15 (Kovergert Infrastruktur) #itbransjen", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:43:53Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562329672713662464/vNeJqE4g_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "c55ab618328f168363074b50847227f5f0885fbf.jpeg", + "type": "String" + } + } + }, + "aftenposten-439": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90914711, + "lng": 10.74385643 + }, + "type": "LatLng" + }, + "description": { + "value": "Det er temmelig i overkant å kalle dette tilrettelagt. Feltet ligger sammen med fortau, folk går ofte i feltet, og man har vikeplikt hver eneste gang man skal over en gate selv om det er grønt rett fram. Latterlig sykkelstrekning.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:26:26Z", + "type": "DateTime" + }, + "streetview": { + "value": "96adae646d0452ef6acee015c9609909291a5600.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-360": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94937485, + "lng": 10.73131442 + }, + "type": "LatLng" + }, + "description": { + "value": "Alltid skummelt å krysse sognsveien nå man sykler langs ring 3, selv om man går av. Biler kommer fra 70 sone og rett i gangfelt", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:55:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "d5338fa209159da95ed298878326102a26020819.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570493160130007040": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Espen Skorstad", + "type": "String" + }, + "description": { + "value": "Under tittelen \"It's not about luck\" skal Kristian Røkke på @HandelshoyskBI berette om hvordan han bygget opp et verft med to tomme hender..", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:59:03Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/425277875026026496/0nXWrF7I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570506191236960260": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.90586, + "lng": 10.572333 + }, + "type": "LatLng" + }, + "author": { + "value": "Kilrogg Deadeye", + "type": "String" + }, + "description": { + "value": "@BoyeSjo @utdesb2106 story of my life", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:50:50Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://abs.twimg.com/sticky/default_profile_images/default_profile_3_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0099CC", + "type": "String" + }, + "streetview": { + "value": "668fc770be83f66f2e00afaa683fa7ffec357a58.jpeg", + "type": "String" + } + } + }, + "tweet:570487378789466100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.930056, + "lng": 10.877474 + }, + "type": "LatLng" + }, + "author": { + "value": "Morten Christensen", + "type": "String" + }, + "description": { + "value": "@jasnoen Frp søker å unngå å havne i SV-fella. Ikke lett for et populistisk parti - uten regjeringserfaring - å måtte forholde seg til makt.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:36:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/491622864798220288/ksDl6snV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570488227586572300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.912143, + "lng": 10.771815 + }, + "type": "LatLng" + }, + "author": { + "value": "Therese F. Mathisen", + "type": "String" + }, + "description": { + "value": "\"6 av 10 kjenner ikke kostholds rådene\". Må vi bruke @vgnett og @db_nyheter for å nå gjennom i helseformidling? #tabloidhelseformidling", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:39:27Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561231096973508609/1whKwTkV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "06f0e99bad55ba64354067e775d7fddf6087511e.jpeg", + "type": "String" + } + } + }, + "aftenposten-643": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91766658, + "lng": 10.68763732 + }, + "type": "LatLng" + }, + "description": { + "value": "T-kryss med syklister i høy fart fra alle retninger.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:43:58Z", + "type": "DateTime" + }, + "streetview": { + "value": "dda28656a9c700a0de26b4c8c0d99d84d87b4e91.jpeg", + "type": "String" + } + } + }, + "tweet:570495956728336400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.934266, + "lng": 5.641012 + }, + "type": "LatLng" + }, + "author": { + "value": "Bharti", + "type": "String" + }, + "description": { + "value": "@TheFarahKhan @arjunk26 Muh to band Karo uncle 😜😜😜", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:10:10Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568360445074210816/c0Gw0g8a_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570515908407500800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.1215, + "lng": 11.38452 + }, + "type": "LatLng" + }, + "author": { + "value": "erik.gaybisexual yes", + "type": "String" + }, + "description": { + "value": "@ThomasWiese23 hello shemale -Sissy - lover erik gay bisexual yes erik single yes erik man yes erik grilfriend maybe no", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:29:26Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570354882859646976/-pVG1K2H_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570489140564910100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.97842, + "lng": 8.72469 + }, + "type": "LatLng" + }, + "author": { + "value": "Bjørn Ove Strand", + "type": "String" + }, + "description": { + "value": "Heldigvis litt stiilhet. Guttungen er ute å skyter med luftgevær. Bare han ikke knerter kjøttmeisen nå da..", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:43:04Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3540899476/fd88b29057dcecf9b345c379f7f5ff35_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "1C2224", + "type": "String" + } + } + }, + "aftenposten-265": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91540784, + "lng": 10.76346874 + }, + "type": "LatLng" + }, + "description": { + "value": "Store hull og ødlagt vei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:12:14Z", + "type": "DateTime" + }, + "streetview": { + "value": "0fedb270594d29218cd9435b635a3d101c8951e7.jpeg", + "type": "String" + } + } + }, + "aftenposten-171": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91375134, + "lng": 10.75085163 + }, + "type": "LatLng" + }, + "description": { + "value": "kvaliteten av selve veien er kjempe dårlig, men samtidig er det lite plass og mange drosjer, busser óg trikk der. Det er ingen tydelig markert plass til syklister på veien, og her og der ikke en gang plass til de. Disse elementer har ofte skapt skumle momenter for meg.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:25:54Z", + "type": "DateTime" + }, + "streetview": { + "value": "bc62d6fa18673ea54b2ed72f5672e301d65dccdf.jpeg", + "type": "String" + } + } + }, + "aftenposten-170": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91312744, + "lng": 10.64175009 + }, + "type": "LatLng" + }, + "description": { + "value": "Uoversiktlig overgang. Syklister kommer i stor fart fra Lysakerlokket. Bro over Frantzebråtveien ville bedret situasjonen.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:25:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "9d684fec31837728cfaf2a8299de4497e2416fac.jpeg", + "type": "String" + } + } + }, + "tweet:570519404812877800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Hallgeir Berge", + "type": "String" + }, + "description": { + "value": "Først som sist, er min første Tweet lansert sann.\n#myfirstTweet", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:43:20Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/570507612475514880/WH3Dfj0z_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570506152934547460": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.28133, + "lng": 10.422124 + }, + "type": "LatLng" + }, + "author": { + "value": "Henrik K. Larsen", + "type": "String" + }, + "description": { + "value": "Måtte det bli så\nDette kan bli første og siste gang Fremskrittspartiet sitter i regjering: http://t.co/8BeKDtXJzt", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:50:41Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/559440701466116097/SnTYQ0Mg_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "038543", + "type": "String" + }, + "streetview": { + "value": "485af64bf830af5eb02431c92d7fa9b34919913d.jpeg", + "type": "String" + } + } + }, + "aftenposten-1016": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9247107, + "lng": 10.73203325 + }, + "type": "LatLng" + }, + "description": { + "value": "Her har bilister vikeplikt for trafikk fra høyre (veistubben uten navn). Denne overholdes ikke.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:50:06Z", + "type": "DateTime" + }, + "streetview": { + "value": "00a9c7e93007f6bba6cdfae5f673b98608a43d0c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "aftenposten-606": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90920628, + "lng": 10.75641989 + }, + "type": "LatLng" + }, + "description": { + "value": "Rushtid, biler midt i krysset, jeg får grønt og skal kjøre igjennom krysset forbi en bil som står i køen. Velger å kjøre forbi fronten på bilen slik at sjåfør skal se meg. En motorsykkel ruser motoren for å få bilen til å flytte seg. Sjåføren som sitter i mobilen får med seg motorsykkelen men ikke meg. Kjører rett i meg. Lav hastighet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:14:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "977bdf344641087046371b8f521636f48cb338ed.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570509870782386200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.88732, + "lng": 10.534518 + }, + "type": "LatLng" + }, + "author": { + "value": "ALISE", + "type": "String" + }, + "description": { + "value": "Dagene går helt vanvittig fort.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:05:27Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/528645960449417216/86iDPgNc_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "D02B55", + "type": "String" + } + } + }, + "aftenposten-622": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90979462, + "lng": 10.74690878 + }, + "type": "LatLng" + }, + "description": { + "value": "Motgående busser må benytte sykkelfelt når de svinger inn i Skippergata.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:26:34Z", + "type": "DateTime" + }, + "streetview": { + "value": "899d9dc7b0aa8c3b49f486814d66ebb93a4c9451.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-145": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91326728, + "lng": 10.64150333 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelbroen fra Lysakerlokket stopper ved fylkesgrensen og leder sykkelstien direkte ut i akselerasjonsfeltet til E18, I tillegg er det to farlige utkjlrsler fra Gjensidigebygget hvor farlige situasjonen oppstår. Sykkelbroen bør forlenges over akselerasjonsfeltet til E18 og Gjensidigebygget.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:07:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "3872141203c5ccb910b591bb63c0f5256396ca1c.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570515492932177900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Flåten", + "type": "String" + }, + "description": { + "value": "St.Clause:The fart of yesterday has gone.Promote a new one today,and give the world more CO2.Save the climate of our fragile planet,please??", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:27:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/254817315/St_Clause_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "9D582E", + "type": "String" + } + } + }, + "0840e066-9fb0-4184-be95-fb83f83e457c": { + "type": "master:utmost:green", + "properties": { + "location": { + "value": { + "lat": 59.97442868, + "lng": 10.76231003 + }, + "type": "LatLng" + }, + "name": { + "value": "Pedestrian small accident", + "type": "String" + }, + "_utmostIcon": { + "value": "green-pedestrian", + "type": "String" + }, + "streetview": { + "value": "f3cd1b1a9f7310471f622dfcbde89960a7c9e6ea.jpeg", + "type": "String" + } + } + }, + "aftenposten-573": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92876443, + "lng": 10.76879024 + }, + "type": "LatLng" + }, + "description": { + "value": "Umulig å ha fri sikt før man kommer ned i \"rundkjøringen\" i krysset - livsfarlig å kjøre gjennom krysset i noe annet enn gangfart. Nedoverbakke på flere kanter inviterer til høyere fart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T09:52:41Z", + "type": "DateTime" + } + } + }, + "aftenposten-605": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94714514, + "lng": 10.74934959 + }, + "type": "LatLng" + }, + "description": { + "value": "Smalveibane, høyt fortau, bilister som ikke brur seg døyten om de mange sykklistene", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:12:16Z", + "type": "DateTime" + }, + "streetview": { + "value": "023603820c53a693dc993825beb0e426dc63d4ac.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570490804667609100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.094904, + "lng": 9.05558 + }, + "type": "LatLng" + }, + "author": { + "value": "Knut O. Ettestad", + "type": "String" + }, + "description": { + "value": "@EStreetMax Welcome Mighty Max!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:49:41Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2276983590/avatar_normal.JPEG", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-399": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91015837, + "lng": 10.70933103 + }, + "type": "LatLng" + }, + "description": { + "value": "Her sykles det helt vilt i motsatt kjøreretning på grunn av dårlig tilrettelegging. Det burde vært merket opp sykkelbane og gangvei separert fra Vika og utkjørsel i rundkjøring for syklister.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:11:17Z", + "type": "DateTime" + }, + "streetview": { + "value": "8cdc70fcb50446fdcb125d7036c77737ddb49ddc.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570490566380785660": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.405932, + "lng": 8.469816 + }, + "type": "LatLng" + }, + "author": { + "value": "Martin Årseth", + "type": "String" + }, + "description": { + "value": "I 1938 vart Adolf Hitler Person of the Year i Time. Litt mindre kjent er det at Vest-Telemark blad kåra Vidkun Quisling til Årets vesttele.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:48:44Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565844346734673920/wAWqrg0P_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570485142675972100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Magnus Aspli", + "type": "String" + }, + "description": { + "value": "Good sleep and happy kid in the morning. The best days! Throw at me any sour rejection letter, world! I can take it! Easy!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:27:11Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/492792748437565440/ia-ry8LH_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "00B3AA", + "type": "String" + } + } + }, + "tweet:570522372333305860": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.374049, + "lng": 5.34204 + }, + "type": "LatLng" + }, + "author": { + "value": "Mathias Nordvik", + "type": "String" + }, + "description": { + "value": "Vil ha noe ink... Men er vrient å bestemme seg for noe", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:55:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/564944805428727809/wLhqFhhV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + }, + "streetview": { + "value": "5cb564d4ff9cc8ed6c1050891a0586db4cd6e9ea.jpeg", + "type": "String" + } + } + }, + "tweet:570505013585416200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 69.656179, + "lng": 18.963873 + }, + "type": "LatLng" + }, + "author": { + "value": "Sigrid SchallerTunby", + "type": "String" + }, + "description": { + "value": "\"Det er bedre å bygge barn enn å reparere voksne\" @LionsNorge #rødefjær #barnogunge \n| http://t.co/7YtdjytQma http://t.co/s4PRV4e5iy", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:46:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567975029741060096/U5_c3Gly_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + }, + "streetview": { + "value": "f9d60ab12cc77bcb0374385221b923f1d820fd4d.jpeg", + "type": "String" + } + } + }, + "tweet:570502334708625400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "tarjęsimą", + "type": "String" + }, + "description": { + "value": "tak mnie ta kość w tej głowie boli że to jest aż smutne jak schylam głowe i potem ją prostuje to tak jakby mi ktos nóż tam wbił", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:35:30Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/569097213721067520/Hlfj22HL_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "tweet:570495259161042940": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 58.847199, + "lng": 5.736232 + }, + "type": "LatLng" + }, + "author": { + "value": "B e n e d i c t e", + "type": "String" + }, + "description": { + "value": "@IsacElliotHQ he said he was coming back, never forget :) http://t.co/rofsBBtEM6", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:07:23Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/ext_tw_video_thumb/570495196250685440/pu/img/2eAaZ594CpI631Of.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561666890796646400/oAapX2Aj_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "314249", + "type": "String" + }, + "streetview": { + "value": "d063859263fac4587d01385f0a5215120630200e.jpeg", + "type": "String" + } + } + }, + "tweet:570517520723140600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.939619, + "lng": 10.723073 + }, + "type": "LatLng" + }, + "author": { + "value": "Marte Blikstad-Balas", + "type": "String" + }, + "description": { + "value": "@BSkiaker Om prestasjonene er høye kan absolutt diskuteres. Men at PISA misbrukes av mange tror jeg alle er med på ;)", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:35:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/525355099992776704/SgAjxp5k_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "fa08e06e686eff05f16216310d123b189114e9e7.jpeg", + "type": "String" + } + } + }, + "tweet:570517727959515140": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Kreativt Forum", + "type": "String" + }, + "description": { + "value": "Ny film for Utdanningsforbundet, som vanlig signert Try/Apt. http://t.co/WQWReiGsXs", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:36:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/190305998/kf_logo_red_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570497053689839600": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.910107, + "lng": 10.724989 + }, + "type": "LatLng" + }, + "author": { + "value": "Hans-Petter N-Hansen", + "type": "String" + }, + "description": { + "value": "En liten økonomisk refleksjon fra @guff_se på #KI15. Tilsvarende har vi sett ift Kodak og Instagram http://t.co/JKCsr4XNhr", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:14:31Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rP_q0UAAAtFig.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562329672713662464/vNeJqE4g_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + }, + "streetview": { + "value": "c2f1fe5adb17b1c036a785b28a3f1690bdf8854e.jpeg", + "type": "String" + } + } + }, + "aftenposten-359": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91036277, + "lng": 10.82511663 + }, + "type": "LatLng" + }, + "description": { + "value": "Gang-/sykkelvei delvis blokkert av langtidsparkerte biler som tilhører bilverkstedet i krysset Jernbaneveien/Fyrstikkbakken. Det er også mye (ulovlig) biltrafikk i gang-/sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:55:08Z", + "type": "DateTime" + }, + "streetview": { + "value": "5932a41036466b70fd6ac77364e90d1a4266c2ff.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570513946526007300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Anders K. Langset", + "type": "String" + }, + "description": { + "value": "@PetterFl @noregsmallag @IvarAasentunet Haha!", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:21:39Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000104016182/617af1ea09665cff46d7691fa1bb41ff_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "E66B29", + "type": "String" + } + } + }, + "tweet:570506761930719200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.533914, + "lng": 6.150438 + }, + "type": "LatLng" + }, + "author": { + "value": "Erlend Aasland", + "type": "String" + }, + "description": { + "value": "@Nastynilssen Kongsberg. Er vel det næraste Skien me kjem denne runden.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:53:06Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/62937256/n677086927_1083237_3512_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "088253", + "type": "String" + }, + "streetview": { + "value": "72453627aa86e91ec5bcc578ccfeff7a2c331d59.jpeg", + "type": "String" + } + } + }, + "tweet:570520604123766800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.849684, + "lng": 5.740257 + }, + "type": "LatLng" + }, + "author": { + "value": "B e n e d i c t e", + "type": "String" + }, + "description": { + "value": "#VIVAShawnMendes what was your favorite thing about sweden?", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:48:06Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561666890796646400/oAapX2Aj_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "314249", + "type": "String" + } + } + }, + "tweet:570514141145931800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Jarl Wåge", + "type": "String" + }, + "description": { + "value": "@atnguyen_ @andreasgossner Løpe.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:22:25Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/412930209826877441/9Ko7z0_p_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570522212597403650": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 60.36142, + "lng": 11.193085 + }, + "type": "LatLng" + }, + "author": { + "value": "John Gunnar Johnsrud", + "type": "String" + }, + "description": { + "value": "grei dag på jobb, #aktivitetsdag #misberget #663moh http://t.co/k8TqWDYI55", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:54:29Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rm7YGUcAAOzxg.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/475042573015199745/-XHAWEsV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "008F99", + "type": "String" + }, + "streetview": { + "value": "0c5047b6e47dda2eb76c4e2d286d8e80e04fead8.jpeg", + "type": "String" + } + } + }, + "tweet:570517140555604000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.382064, + "lng": 5.324495 + }, + "type": "LatLng" + }, + "author": { + "value": "Prinsen", + "type": "String" + }, + "description": { + "value": "@UnibetNorge Når man har vunnet dagenshundrings, kan den da ikk kombineres med ekte penger man har på konto?", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:34:20Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/459322028332695552/urmQefgC_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-232": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.9145173, + "lng": 10.7878951 + }, + "type": "LatLng" + }, + "description": { + "value": "Bilister kjører ut/inn på P-plassen ved Ensjø stasjon og krysser sykkelfelt. Flere ulykker observert, og senest i går ble jeg selv utsatt for kollisjon med bil her. Krysset er uoversiktlig med T-kryss og ekstra utkjørsel som krysser både sykkelveg og bredt fortau.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:55:43Z", + "type": "DateTime" + }, + "streetview": { + "value": "a16db6e25da7fc61f9e5d8b86c6594fe006c1b40.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "tweet:570497004146700300": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.822918, + "lng": 6.738508 + }, + "type": "LatLng" + }, + "author": { + "value": "Sandnes vgs idrett", + "type": "String" + }, + "description": { + "value": "#1IFB #skills #skileikarlauget #sandnesvgsidrett #skoletilbud #wintertraining @jannemotland @ Røldal https://t.co/8g4oMFmoS4", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:14:19Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-a-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/11022884_1585941298318536_1090151680_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000704018689/ea775cf51b937255ff5e093677fe6cfb_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-144": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90269689, + "lng": 10.76738476 + }, + "type": "LatLng" + }, + "description": { + "value": "Trangt og uoversiktlig å sykle mellom flere trikkeskinner. Satt fast sykkelhjulet i trikkeskinna rett etter trikkestoppet Oslo hospital og falt av sykkelen. Brakk beinet og slo hodet i fortauskanten.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:07:55Z", + "type": "DateTime" + }, + "streetview": { + "value": "f52e034e980dc1f375ded12cfcf1abbc87ace67b.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-bike", + "type": "String" + } + } + }, + "aftenposten-92": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92747417, + "lng": 10.71317195 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet blir plutselig smalere, tett trafikk og lite oversiktlig.", + "type": "String" + }, + "date": { + "value": "2014-09-09T11:17:49Z", + "type": "DateTime" + }, + "streetview": { + "value": "2c4f5c2d0c4bdfa70027768ce17f07212fadf002.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570499755039694850": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Hr. Haukedal", + "type": "String" + }, + "description": { + "value": "@spildrejordet altså, råtne tomater og egg vil nok Carl I kategorisere som kjemiske våpen.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:25:15Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/502558630336421888/FX5B5J9O_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "4A913C", + "type": "String" + } + } + }, + "aftenposten-169": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92474296, + "lng": 10.84277629 + }, + "type": "LatLng" + }, + "description": { + "value": "Strekningen Esso på Alnabru til Ole Deviks vei har veldig dårlig dekke, farlige rundkjøringer og farlige utkjøringer", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:25:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "344c4247b9edf6b5286af535d01d7c01b2fa6fdb.jpeg", + "type": "String" + } + } + }, + "aftenposten-754": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92792308, + "lng": 10.71394979 + }, + "type": "LatLng" + }, + "description": { + "value": "Parkering på venstre side av sykkelfelt, samt bilvei og kø på høyre side betyr dobbelt så stor risiko for \"døring\". Har opplevd å måtte kaste meg unna dører fra både høyre å venstre et utall ganger. Også et problem med stressede sjåfører som skal parkere og ikke sjekker om sykkelfeltet er klart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:56:28Z", + "type": "DateTime" + }, + "streetview": { + "value": "1c099dae35531731fe864fce8fa55664bcb7cb74.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570495953792331800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.930084, + "lng": 10.877582 + }, + "type": "LatLng" + }, + "author": { + "value": "Morten Christensen", + "type": "String" + }, + "description": { + "value": "Har Carl I. Hagen sagt at massakren på Utøya er mindre alvorlig enn tilgrisingen av butikken til Max Hermansen? Noen som vet? #twitterhjelp", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:10:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/491622864798220288/ksDl6snV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570499537795751940": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.871268, + "lng": 9.392609 + }, + "type": "LatLng" + }, + "author": { + "value": "isola dautaj", + "type": "String" + }, + "description": { + "value": "@TreySongz come tooo norway!😘", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:24:23Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568973886369570816/Izj81_JA_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "fc303b7f4abca323fe164b3a0c6ba13afb4c7258.jpeg", + "type": "String" + } + } + }, + "tweet:570515335461408800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.373244, + "lng": 6.716889 + }, + "type": "LatLng" + }, + "author": { + "value": "Sheymah", + "type": "String" + }, + "description": { + "value": "@ElissanMeme @elissakh diva she drawing it hope u like it 😊", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:27:10Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/564153150933057536/BafZPVc2_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "E80936", + "type": "String" + } + } + }, + "tweet:570505933928972300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.358585, + "lng": 10.369358 + }, + "type": "LatLng" + }, + "author": { + "value": "Martin Finne", + "type": "String" + }, + "description": { + "value": "@SiriSukkertopp ah.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:49:48Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566163962786758657/JPJ6_hdM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "C7203C", + "type": "String" + } + } + }, + "aftenposten-168": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91050262, + "lng": 10.72068214 + }, + "type": "LatLng" + }, + "description": { + "value": "sykkelvei havner rett i gangfelt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:24:36Z", + "type": "DateTime" + }, + "streetview": { + "value": "2012e2f094161f9e794ac41f497207f31d070be5.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570498468558594050": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.382676, + "lng": 5.056815 + }, + "type": "LatLng" + }, + "author": { + "value": "Beathe Lindseth", + "type": "String" + }, + "description": { + "value": "Three hours sleep, and the dentist awaits😷🔫", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:20:08Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568438803992678400/ILYAuIPo_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "FA64DA", + "type": "String" + } + } + }, + "aftenposten-753": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93641892, + "lng": 10.93075275 + }, + "type": "LatLng" + }, + "description": { + "value": "Utkjøring fra Maxbo.", + "type": "String" + }, + "date": { + "value": "2014-09-10T12:56:22Z", + "type": "DateTime" + }, + "streetview": { + "value": "e26f34b571ab6fa234c17015c3740a812963f0bc.jpeg", + "type": "String" + } + } + }, + "tweet:570521725882003460": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "@mylesleask You are a beast! In the good sort of way of course.", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:52:33Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-250": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.94243807, + "lng": 10.70433139 + }, + "type": "LatLng" + }, + "description": { + "value": "Dårligt tilrettelagt veikryds, farlige situationer dagligt. ingen mærkeringer for bil eller sykel på veien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T07:03:25Z", + "type": "DateTime" + }, + "streetview": { + "value": "764c3710af661b75590424c5e2961dd631f8fd12.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-car", + "type": "String" + } + } + }, + "tweet:570494083208253440": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.903009, + "lng": 10.605653 + }, + "type": "LatLng" + }, + "author": { + "value": "Honeylee Ramirez", + "type": "String" + }, + "description": { + "value": "Congrats Ateneo MVT! Welcome back sa Finals!", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:02:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3182950484/c7454954f4fbf490ea7aeed7c09ea4df_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "d5b025a117471801b0f96d547ffe2ab4610dd235.jpeg", + "type": "String" + } + } + }, + "aftenposten-1007": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92054894, + "lng": 10.67514896 + }, + "type": "LatLng" + }, + "description": { + "value": "På grunn av anleggsarbeid er det særdeles vanskelige forhold for både syklende og gående. Her er det konflikter hver eneste dag, og i tillegg er det også busstopp her som gjør det vanskelig for alle myke trafikanter.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:39:00Z", + "type": "DateTime" + }, + "streetview": { + "value": "5fa2e14b4080cf496c9a7871463e05b01f4e2d15.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-805": { + "type": "accident:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91101362, + "lng": 10.72814941 + }, + "type": "LatLng" + }, + "description": { + "value": "Biler kjører rett ut i dokkveien fra parkeringsplass ved Landgangen 1. Måtte svinge unna i trikkeskinne for å unngå kollisjon med bil - trynet på grunn av hjulkiling i trikkeskinne. Bil stakk av, ikke meldt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T14:02:47Z", + "type": "DateTime" + }, + "streetview": { + "value": "378252cc0025c37361aab34fd3d7618bd0761d71.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "orange-car", + "type": "String" + } + } + }, + "tweet:570505693050105860": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Markus Vesøen", + "type": "String" + }, + "description": { + "value": "Fruen lanserer ny veskekolleksjon, mulighet for årets beste kjøp om du melder deg inn i forhåndssalgsklubben nå. https://t.co/3RuaYNXyh5", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:48:51Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/378800000325305127/e0cf3749fdd2264bf57dbc258fd5c794_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "52555C", + "type": "String" + } + } + }, + "tweet:570513708138536960": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 58.898101, + "lng": 5.746734 + }, + "type": "LatLng" + }, + "author": { + "value": "Morten Nessler", + "type": "String" + }, + "description": { + "value": "Alltid god stemning når vår nye daglig leder i Oslo, Anette Wærsten er på besøk i Stavanger 👏 @ Peanuts https://t.co/PvAlGQVjs2", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:20:42Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-f-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/10986020_720029638094317_1491438327_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2875050324/9548adc86e98486b0e2c11ba8099903f_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "990000", + "type": "String" + } + } + }, + "aftenposten-167": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90618845, + "lng": 10.77503442 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet i St Halvards gate er farlig. Adskilt med brostein til veien. Feltet i seg selv har endel hull og opphøyninger. Spesielt ekkelt på vei nedover når man får god fart.", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:24:09Z", + "type": "DateTime" + }, + "streetview": { + "value": "05ccd561244a69c60853cdf05c226c3fc8662178.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570505706467663900": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 63.358584, + "lng": 10.369355 + }, + "type": "LatLng" + }, + "author": { + "value": "Martin Finne", + "type": "String" + }, + "description": { + "value": "@SiriSukkertopp men du bruker kid?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:48:54Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566163962786758657/JPJ6_hdM_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "C7203C", + "type": "String" + } + } + }, + "aftenposten-166": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91093293, + "lng": 10.72832107 + }, + "type": "LatLng" + }, + "description": { + "value": "Her var det fint å sykle tidligere. Nå er det farlig pga utbygginger. Provisjoriske på/avkjøringer til fortau! Anelggstrafikk, trikk, inn/utkjøring fra drosjeplass (!), massiv mengde fotgjengere (Nesoddbåten) og syklister. Hvor lenge skal dette vare mon tro?", + "type": "String" + }, + "date": { + "value": "2014-09-10T06:23:38Z", + "type": "DateTime" + }, + "streetview": { + "value": "193fad4072f65bf6c360d9a50105cbca76fae968.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "aftenposten-604": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.91704275, + "lng": 10.74439823 + }, + "type": "LatLng" + }, + "description": { + "value": "Trafikklyset for venstresving inn i Keysers gate registrerer ikke syklister, må sykle på \"rød pil\" hvis det ikke tilfeldigvis kommer biler som skal samme veg, slik at lyset skifter til grønt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:11:40Z", + "type": "DateTime" + }, + "streetview": { + "value": "0d056730ca1c351c93814080ce8a8ea781b32c93.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570499528408891400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.316166, + "lng": 5.378244 + }, + "type": "LatLng" + }, + "author": { + "value": "FutPlayerNOR", + "type": "String" + }, + "description": { + "value": "@Pro_HDGaMeR can i Get 100k?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:24:21Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/568129984901165056/DjO_l8aJ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "24295faa805018c006ff64da2e32efea7d3b7238.jpeg", + "type": "String" + } + } + }, + "tweet:570486245496901600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 58.132653, + "lng": 7.962727 + }, + "type": "LatLng" + }, + "author": { + "value": "Irish Joy Dellosa ♉️", + "type": "String" + }, + "description": { + "value": "Good morning!!!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:31:34Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/565796698493313024/cZNfjdSG_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "F508D5", + "type": "String" + }, + "streetview": { + "value": "a82f3121da1fb1b30bbc61004e43e5bd01a2f4f6.jpeg", + "type": "String" + } + } + }, + "tweet:570486272323678200": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.903041, + "lng": 10.604834 + }, + "type": "LatLng" + }, + "author": { + "value": "Honeylee Ramirez", + "type": "String" + }, + "description": { + "value": "Wow!", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:31:41Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3182950484/c7454954f4fbf490ea7aeed7c09ea4df_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "ddf69638530e42102fbabdb13c3180c63d5935d4.jpeg", + "type": "String" + } + } + }, + "tweet:570494698399375360": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.3907, + "lng": 5.33275 + }, + "type": "LatLng" + }, + "author": { + "value": "On Elpeleg", + "type": "String" + }, + "description": { + "value": "@vebjornselbekk Håper at du vil lese min Bergens Fredsring tale mht @SidselWold & deg\nTalen http://t.co/IbMP5SoAIG\nBT http://t.co/XOXc0JEpcO", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:05:10Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1837080359/me_elinor_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570505395774623740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Flåten", + "type": "String" + }, + "description": { + "value": "St.Clause:det er på tide å reflektere om vi virkelig lever i et demokrati ,der virkemidlene for dette fungerer?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:47:40Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/254817315/St_Clause_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "9D582E", + "type": "String" + } + } + }, + "tweet:570488438371328000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.970193, + "lng": 10.897088 + }, + "type": "LatLng" + }, + "author": { + "value": "PRĪSCĀ DĪSSŌ", + "type": "String" + }, + "description": { + "value": "Drip drop drip drippidy drop", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:40:17Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/567001982356189185/bGec6tyE_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "CC3366", + "type": "String" + } + } + }, + "tweet:570499199499943940": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 69.647892, + "lng": 18.952784 + }, + "type": "LatLng" + }, + "author": { + "value": "MsTraveltipsy", + "type": "String" + }, + "description": { + "value": "Last nights dinner. You really dont get the mussels any fresher than here in Tromsø #tromsø #steakers… https://t.co/zrSIiTUyNl", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:23:03Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-d-a.akamaihd.net/hphotos-ak-xfp1/t51.2885-15/s306x306/e15/891399_459545450861435_409964823_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/442740150238343169/zv-6vKXr_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "52dd498b157bfd97647684a5bd550ab8645962ce.jpeg", + "type": "String" + } + } + }, + "aftenposten-462": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92014832, + "lng": 10.69203615 + }, + "type": "LatLng" + }, + "description": { + "value": "Veldig kort tid fra det blir rødt lys for drammensveien retning Thune, og til det blir grønt for Halvdan Svartes gate retning Thune. Dette medfører at man kan kjøre på grønt fra H. Svartes gate og møte en som kaster seg over på gult/rødt fra Drammenveien.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:37:41Z", + "type": "DateTime" + }, + "streetview": { + "value": "79871b8409f2cee9d9ba55fe6acda558443a954a.jpeg", + "type": "String" + } + } + }, + "tweet:570515153894166500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "GAFFA.no", + "type": "String" + }, + "description": { + "value": "Hør @rihanna med ny singel: http://t.co/BLgLQOXhg2", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:26:27Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561092082480078848/HmfDxO1J_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-980": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.95122836, + "lng": 10.66836833 + }, + "type": "LatLng" + }, + "description": { + "value": "Smal og trang vei med mye trafikk. Ikke klippet hekk langs fortau gjør det smalt.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:03:50Z", + "type": "DateTime" + }, + "streetview": { + "value": "732dcfa76d56ae97114dca876a9ea2168f4a1b70.jpeg", + "type": "String" + } + } + }, + "tweet:570505516671209500": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.24528, + "lng": 11.02441 + }, + "type": "LatLng" + }, + "author": { + "value": "Ole Høidahl", + "type": "String" + }, + "description": { + "value": "Feiltolker man islam i Saudi-Arabia også? Dagen.no - Jagland mener Sandberg feiltolker islam http://t.co/iA8BUm6rzK via @AvisenDagen", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:48:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2136859521/profilbilde-ole_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + }, + "streetview": { + "value": "5580ed8342f6790c0ed5325000cc76cb2aa4a31e.jpeg", + "type": "String" + } + } + }, + "tweet:570496759174197250": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Captain Redbeard", + "type": "String" + }, + "description": { + "value": "Adding to that I'll be bringing the missus up north to meet my parents and friends tomorrow, things are starting to look up. A lot.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:13:21Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/562146030938890240/EyInFFie_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570497642733686800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.930062, + "lng": 10.8776 + }, + "type": "LatLng" + }, + "author": { + "value": "Morten Christensen", + "type": "String" + }, + "description": { + "value": "@Sigvald Det er en viktig oppklaring. Om han hadde sagt noe slikt vet jeg ikke hvordan jeg hadde reagert.", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:16:52Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/491622864798220288/ksDl6snV_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570504903094886400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 62.484196, + "lng": 6.386105 + }, + "type": "LatLng" + }, + "author": { + "value": "PERFECT TUNE©", + "type": "String" + }, + "description": { + "value": "@mohamed_nasr_m Hey you👍", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:45:43Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/566919243615051776/cK3ro78r_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570495301989113860": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 61.308613, + "lng": 12.205972 + }, + "type": "LatLng" + }, + "author": { + "value": "Ola Matsson", + "type": "String" + }, + "description": { + "value": "Snøvær! #trysil #mittanlegg #selfieistolheisen #elskersnø @ Fjellekspressen https://t.co/btUfDrf6zS", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:07:33Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-a-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/10903274_910619225626168_1741148860_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/424074222076710912/4AhAwlcZ_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0099B9", + "type": "String" + }, + "streetview": { + "value": "e1b2410cb206e7f9b5ac1fc1f7b382a56dd884d2.jpeg", + "type": "String" + } + } + }, + "aftenposten-422": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92687472, + "lng": 10.71232438 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelfeltet (retning Majorstuen) gjør en s-sving i krysset. Markeringen av feltet i krysset og videre opp Kirkeveien er slitt vekk fordi bilene kutter over sykkelfeltet.", + "type": "String" + }, + "date": { + "value": "2014-09-10T08:21:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "9918496c4855a0aeb3574fb93ec32d5a8c1efe13.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570515651548172300": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 64.5565, + "lng": 12.6654 + }, + "type": "LatLng" + }, + "author": { + "value": "Norge Trender", + "type": "String" + }, + "description": { + "value": "On Tuesday 24, 'Tromsø' was Trending Topic in Norway for 2 hours: http://t.co/HPpeAZ2ODq #trndnl", + "type": "String" + }, + "date": { + "value": "2015-02-25T09:28:25Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/3623282493/73ed351238e684e00272c5bec12879dc_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "aftenposten-1026": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.90533845, + "lng": 10.82127571 + }, + "type": "LatLng" + }, + "description": { + "value": "bilister legger seg i hø del av veien for å passere biler som skal til ve på E6 uten å ta hensyn til syklister som sykler der.", + "type": "String" + }, + "date": { + "value": "2014-09-10T19:59:31Z", + "type": "DateTime" + }, + "streetview": { + "value": "f135963447768b0d15e8357595f26941abba357e.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570508121942175740": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 60.876516, + "lng": 11.553425 + }, + "type": "LatLng" + }, + "author": { + "value": "Satan (◕‿◕✿)", + "type": "String" + }, + "description": { + "value": "@saviorBVB oh yes 😎", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:58:30Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/561587476947795968/UkSaymqa_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "009999", + "type": "String" + }, + "streetview": { + "value": "646383f7c597aaba00fc586016f1840e869db5ff.jpeg", + "type": "String" + } + } + }, + "tweet:570489138337734660": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.942897, + "lng": 10.71609 + }, + "type": "LatLng" + }, + "author": { + "value": "Toni Gonzalez ", + "type": "String" + }, + "description": { + "value": "Buenos y fresquitos días a tod@s :) @ Institutt for informatikk https://t.co/DxcOzm9Vaq", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:43:04Z", + "type": "DateTime" + }, + "url": { + "value": "https://igcdn-photos-g-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/s306x306/e15/11018537_1402767956701542_640327361_n.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2325656057/18c2kvqeiouc9rteh606_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "990000", + "type": "String" + } + } + }, + "tweet:570495317965037600": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Øystein Flåten", + "type": "String" + }, + "description": { + "value": "St.Clause:The fart of yesterday has gone.Promote a new one today,and give the world more CO2.Save the climate of our fragile planet,please?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:07:37Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/254817315/St_Clause_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "9D582E", + "type": "String" + } + } + }, + "tweet:570494554643804160": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Roger Pihl", + "type": "String" + }, + "description": { + "value": "@norchris Foran på bilen din? Sånn at regninga fra bomringen …?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:04:35Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/523919148212957184/EFln2n_A_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "2FC2EF", + "type": "String" + } + } + }, + "tweet:570491024134561800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Tom Egeland", + "type": "String" + }, + "description": { + "value": "Strømmetjenesten Storytel strømmer nesten bare lydbøker (94%) - nesten ingen (6%) e-bøker. http://t.co/eDsoScYDW3", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:50:34Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/504539251669598209/JDBY1k9W_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0E0999", + "type": "String" + } + } + }, + "aftenposten-801": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.92868379, + "lng": 10.80091238 + }, + "type": "LatLng" + }, + "description": { + "value": "Konstante arbeider, betydelig innsnevring av gang/sykkelvei.", + "type": "String" + }, + "date": { + "value": "2014-09-10T13:53:24Z", + "type": "DateTime" + }, + "streetview": { + "value": "957ca18c0baca8bc8c5b7c8c6c361eb637b9b172.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570485328605270000": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Jorgen Knutsen", + "type": "String" + }, + "description": { + "value": "På denne dagen i 2006 vant @LillestromSK vant 2-1 mot @sfjfotball Mål: Christian Hanssen og Andreas Haddad. SF: Michael Ockei.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:27:56Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/1546561925/JK_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "3B94D9", + "type": "String" + } + } + }, + "tweet:570506100883247100": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.905894, + "lng": 10.572335 + }, + "type": "LatLng" + }, + "author": { + "value": "Kilrogg Deadeye", + "type": "String" + }, + "description": { + "value": "@utdesb2106 story of my life", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:50:28Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://abs.twimg.com/sticky/default_profile_images/default_profile_3_normal.png", + "type": "String" + }, + "_profile_color": { + "value": "0099CC", + "type": "String" + }, + "streetview": { + "value": "202e1cf8f6cdd7cbd69d6a85bfec261ce1d4df96.jpeg", + "type": "String" + } + } + }, + "tweet:570494854045814800": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.666532, + "lng": 10.784477 + }, + "type": "LatLng" + }, + "author": { + "value": "Anita Øverås", + "type": "String" + }, + "description": { + "value": "Skal prøve meg på yoga i dag. Hjelp?", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:05:47Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/552943047517175809/3e83h3AK_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9D13ED", + "type": "String" + } + } + }, + "tweet:570485134119579650": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 69.67147, + "lng": 29.9558 + }, + "type": "LatLng" + }, + "author": { + "value": "Helen M Netland", + "type": "String" + }, + "description": { + "value": "Regjeringen har budsj. m ca 800 mil. i inntekt på #sivposen. Nå er d vår tur. Vi må demonstr. og ha m veske selv.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:27:09Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/2181516132/Syden_19.-26._feb._2010_046_normal.jpg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + }, + "tweet:570492533073170400": { + "type": "tweet", + "properties": { + "location": { + "value": { + "lat": 59.9123, + "lng": 10.75 + }, + "type": "LatLng" + }, + "author": { + "value": "Marc-Anthony Davies", + "type": "String" + }, + "description": { + "value": "@WeAreAustralia I'm in the middle of reading \"Packing for Mars\". It's a pretty good book. It's how they choose astronauts. Very funny.", + "type": "String" + }, + "date": { + "value": "2015-02-25T07:56:33Z", + "type": "DateTime" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/558557369173835776/EXc1288I_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "9266CC", + "type": "String" + } + } + }, + "aftenposten-587": { + "type": "roadrisk:aftenposten", + "properties": { + "location": { + "value": { + "lat": 59.93240107, + "lng": 10.82195699 + }, + "type": "LatLng" + }, + "description": { + "value": "Sykkelstien krysser en vei i bunnen av bakken hvor det i tillegg står en del parkerte biler. Veldig uoversiktlig i begge retninger.", + "type": "String" + }, + "date": { + "value": "2014-09-10T10:00:39Z", + "type": "DateTime" + }, + "streetview": { + "value": "b6e4c2c96a34818b300624eb2ab7d9ac74ba1d67.jpeg", + "type": "String" + }, + "_utmostIcon": { + "value": "risk-bike", + "type": "String" + } + } + }, + "tweet:570504865589428200": { + "type": "tweet:picture", + "properties": { + "location": { + "value": { + "lat": 59.889377, + "lng": 10.56602 + }, + "type": "LatLng" + }, + "author": { + "value": "eva turk", + "type": "String" + }, + "description": { + "value": "Tweetman in @bmj_latest #CoCreatingHealthcare @DNVGL @stephen_leyshon http://t.co/nIBCFuSdjq", + "type": "String" + }, + "date": { + "value": "2015-02-25T08:45:34Z", + "type": "DateTime" + }, + "url": { + "value": "http://pbs.twimg.com/media/B-rXJNdXAAAa5ih.jpg", + "type": "String" + }, + "_profile_image": { + "value": "http://pbs.twimg.com/profile_images/443741378422374400/6eJLgba5_normal.jpeg", + "type": "String" + }, + "_profile_color": { + "value": "0084B4", + "type": "String" + } + } + } + }, + "thingtypes": { + "master:wiki": { + "description": "A wiki document", + "properties": { + "title": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "String" + }, + "content": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "String" + } + } + }, + "master:risk": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + } + } + }, + "master:generic_response": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + } + } + }, + "master:incident": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + } + } + }, + "master:imageoverlay:drawing": { + "description": "A map drawing", + "properties": { + "topleft": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + }, + "bottomright": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + }, + "url": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "String" + }, + "description": { + "name": "undefined", + "description": "undefined", + "required": false, + "type": "String" + }, + "timestamp": { + "name": "undefined", + "description": "Creation date", + "required": false, + "type": "DateTime" + } + } + }, + "tweet": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + }, + "author": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "String" + }, + "date": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "DateTime" + }, + "content": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "String" + } + } + }, + "tweet:picture": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + }, + "author": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "String" + }, + "date": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "DateTime" + }, + "url": { + "name": "undefined", + "description": "undefined", + "required": false, + "type": "String" + }, + "description": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "String" + } + } + }, + "roadrisk:aftenposten": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + }, + "date": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "DateTime" + }, + "description": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "String" + }, + "bilde": { + "name": "undefined", + "description": "undefined", + "required": false, + "type": "String" + } + } + }, + "accident:aftenposten": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + }, + "date": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "DateTime" + }, + "description": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "String" + }, + "bilde": { + "name": "undefined", + "description": "undefined", + "required": false, + "type": "String" + } + } + }, + "master:utmost:almost": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + } + } + }, + "master:utmost:green": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + } + } + }, + "master:utmost:orange": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + } + } + }, + "master:utmost:red": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + } + } + }, + "master:utmost:risk": { + "description": "undefined", + "properties": { + "location": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + } + } + }, + "undefined": { + "description": "undefined", + "properties": { + "undefined": { + "name": "undefined", + "description": "undefined", + "required": true, + "type": "Location" + } + } + } + } +} \ No newline at end of file diff --git a/showcase/projects/bridge/demo.html b/showcase/projects/bridge/demo.html new file mode 100644 index 00000000..a8a3a7ee --- /dev/null +++ b/showcase/projects/bridge/demo.html @@ -0,0 +1,68 @@ + + + + Timeline | Basic demo + + + + + + + +Loading data... +
+ + + + \ No newline at end of file diff --git a/showcase/projects/bridge/js/vis.js b/showcase/projects/bridge/js/vis.js new file mode 100644 index 00000000..18ff0791 --- /dev/null +++ b/showcase/projects/bridge/js/vis.js @@ -0,0 +1,35361 @@ +/** + * vis.js + * https://github.com/almende/vis + * + * A dynamic, browser-based visualization library. + * + * @version 3.10.1-SNAPSHOT + * @date 2015-02-27 + * + * @license + * Copyright (C) 2011-2014 Almende B.V, http://almende.com + * + * Vis.js is dual licensed under both + * + * * The Apache 2.0 License + * http://www.apache.org/licenses/LICENSE-2.0 + * + * and + * + * * The MIT License + * http://opensource.org/licenses/MIT + * + * Vis.js may be distributed under either license. + */ + +"use strict"; + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define(factory); + else if(typeof exports === 'object') + exports["vis"] = factory(); + else + root["vis"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + // utils + exports.util = __webpack_require__(1); + exports.DOMutil = __webpack_require__(2); + + // data + exports.DataSet = __webpack_require__(3); + exports.DataView = __webpack_require__(4); + exports.Queue = __webpack_require__(5); + + // Graph3d + exports.Graph3d = __webpack_require__(6); + exports.graph3d = { + Camera: __webpack_require__(7), + Filter: __webpack_require__(8), + Point2d: __webpack_require__(9), + Point3d: __webpack_require__(11), + Slider: __webpack_require__(10), + StepNumber: __webpack_require__(12) + }; + + // Timeline + exports.Timeline = __webpack_require__(13); + exports.Graph2d = __webpack_require__(14); + exports.timeline = { + DateUtil: __webpack_require__(15), + DataStep: __webpack_require__(16), + Range: __webpack_require__(17), + stack: __webpack_require__(18), + TimeStep: __webpack_require__(19), + + components: { + items: { + Item: __webpack_require__(20), + BackgroundItem: __webpack_require__(21), + BoxItem: __webpack_require__(22), + PointItem: __webpack_require__(23), + RangeItem: __webpack_require__(25) + }, + + Component: __webpack_require__(24), + CurrentTime: __webpack_require__(26), + CustomTime: __webpack_require__(27), + DataAxis: __webpack_require__(28), + GraphGroup: __webpack_require__(29), + Group: __webpack_require__(30), + BackgroundGroup: __webpack_require__(31), + ItemSet: __webpack_require__(32), + Legend: __webpack_require__(33), + LineGraph: __webpack_require__(34), + TimeAxis: __webpack_require__(35) + } + }; + + // Network + exports.Network = __webpack_require__(36); + exports.network = { + Edge: __webpack_require__(37), + Groups: __webpack_require__(38), + Images: __webpack_require__(39), + Node: __webpack_require__(40), + Popup: __webpack_require__(41), + dotparser: __webpack_require__(42), + gephiParser: __webpack_require__(43) + }; + + // Deprecated since v3.0.0 + exports.Graph = function () { + throw new Error('Graph is renamed to Network. Please create a graph as new vis.Network(...)'); + }; + + // bundled external libraries + exports.moment = __webpack_require__(44); + exports.hammer = __webpack_require__(45); + + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + // utility functions + + // first check if moment.js is already loaded in the browser window, if so, + // use this instance. Else, load via commonjs. + var moment = __webpack_require__(44); + + /** + * Test whether given object is a number + * @param {*} object + * @return {Boolean} isNumber + */ + exports.isNumber = function(object) { + return (object instanceof Number || typeof object == 'number'); + }; + + + /** + * this function gives you a range between 0 and 1 based on the min and max values in the set, the total sum of all values and the current value. + * + * @param min + * @param max + * @param total + * @param value + * @returns {number} + */ + exports.giveRange = function(min,max,total,value) { + if (max == min) { + return 0.5; + } + else { + var scale = 1 / (max - min); + return Math.max(0,(value - min)*scale); + } + } + + /** + * Test whether given object is a string + * @param {*} object + * @return {Boolean} isString + */ + exports.isString = function(object) { + return (object instanceof String || typeof object == 'string'); + }; + + /** + * Test whether given object is a Date, or a String containing a Date + * @param {Date | String} object + * @return {Boolean} isDate + */ + exports.isDate = function(object) { + if (object instanceof Date) { + return true; + } + else if (exports.isString(object)) { + // test whether this string contains a date + var match = ASPDateRegex.exec(object); + if (match) { + return true; + } + else if (!isNaN(Date.parse(object))) { + return true; + } + } + + return false; + }; + + /** + * Test whether given object is an instance of google.visualization.DataTable + * @param {*} object + * @return {Boolean} isDataTable + */ + exports.isDataTable = function(object) { + return (typeof (google) !== 'undefined') && + (google.visualization) && + (google.visualization.DataTable) && + (object instanceof google.visualization.DataTable); + }; + + /** + * Create a semi UUID + * source: http://stackoverflow.com/a/105074/1262753 + * @return {String} uuid + */ + exports.randomUUID = function() { + var S4 = function () { + return Math.floor( + Math.random() * 0x10000 /* 65536 */ + ).toString(16); + }; + + return ( + S4() + S4() + '-' + + S4() + '-' + + S4() + '-' + + S4() + '-' + + S4() + S4() + S4() + ); + }; + + /** + * Extend object a with the properties of object b or a series of objects + * Only properties with defined values are copied + * @param {Object} a + * @param {... Object} b + * @return {Object} a + */ + exports.extend = function (a, b) { + for (var i = 1, len = arguments.length; i < len; i++) { + var other = arguments[i]; + for (var prop in other) { + if (other.hasOwnProperty(prop)) { + a[prop] = other[prop]; + } + } + } + + return a; + }; + + /** + * Extend object a with selected properties of object b or a series of objects + * Only properties with defined values are copied + * @param {Array.} props + * @param {Object} a + * @param {... Object} b + * @return {Object} a + */ + exports.selectiveExtend = function (props, a, b) { + if (!Array.isArray(props)) { + throw new Error('Array with property names expected as first argument'); + } + + for (var i = 2; i < arguments.length; i++) { + var other = arguments[i]; + + for (var p = 0; p < props.length; p++) { + var prop = props[p]; + if (other.hasOwnProperty(prop)) { + a[prop] = other[prop]; + } + } + } + return a; + }; + + /** + * Extend object a with selected properties of object b or a series of objects + * Only properties with defined values are copied + * @param {Array.} props + * @param {Object} a + * @param {... Object} b + * @return {Object} a + */ + exports.selectiveDeepExtend = function (props, a, b) { + // TODO: add support for Arrays to deepExtend + if (Array.isArray(b)) { + throw new TypeError('Arrays are not supported by deepExtend'); + } + for (var i = 2; i < arguments.length; i++) { + var other = arguments[i]; + for (var p = 0; p < props.length; p++) { + var prop = props[p]; + if (other.hasOwnProperty(prop)) { + if (b[prop] && b[prop].constructor === Object) { + if (a[prop] === undefined) { + a[prop] = {}; + } + if (a[prop].constructor === Object) { + exports.deepExtend(a[prop], b[prop]); + } + else { + a[prop] = b[prop]; + } + } else if (Array.isArray(b[prop])) { + throw new TypeError('Arrays are not supported by deepExtend'); + } else { + a[prop] = b[prop]; + } + + } + } + } + return a; + }; + + /** + * Extend object a with selected properties of object b or a series of objects + * Only properties with defined values are copied + * @param {Array.} props + * @param {Object} a + * @param {... Object} b + * @return {Object} a + */ + exports.selectiveNotDeepExtend = function (props, a, b) { + // TODO: add support for Arrays to deepExtend + if (Array.isArray(b)) { + throw new TypeError('Arrays are not supported by deepExtend'); + } + for (var prop in b) { + if (b.hasOwnProperty(prop)) { + if (props.indexOf(prop) == -1) { + if (b[prop] && b[prop].constructor === Object) { + if (a[prop] === undefined) { + a[prop] = {}; + } + if (a[prop].constructor === Object) { + exports.deepExtend(a[prop], b[prop]); + } + else { + a[prop] = b[prop]; + } + } else if (Array.isArray(b[prop])) { + throw new TypeError('Arrays are not supported by deepExtend'); + } else { + a[prop] = b[prop]; + } + } + } + } + return a; + }; + + /** + * Deep extend an object a with the properties of object b + * @param {Object} a + * @param {Object} b + * @returns {Object} + */ + exports.deepExtend = function(a, b) { + // TODO: add support for Arrays to deepExtend + if (Array.isArray(b)) { + throw new TypeError('Arrays are not supported by deepExtend'); + } + + for (var prop in b) { + if (b.hasOwnProperty(prop)) { + if (b[prop] && b[prop].constructor === Object) { + if (a[prop] === undefined) { + a[prop] = {}; + } + if (a[prop].constructor === Object) { + exports.deepExtend(a[prop], b[prop]); + } + else { + a[prop] = b[prop]; + } + } else if (Array.isArray(b[prop])) { + throw new TypeError('Arrays are not supported by deepExtend'); + } else { + a[prop] = b[prop]; + } + } + } + return a; + }; + + /** + * Test whether all elements in two arrays are equal. + * @param {Array} a + * @param {Array} b + * @return {boolean} Returns true if both arrays have the same length and same + * elements. + */ + exports.equalArray = function (a, b) { + if (a.length != b.length) return false; + + for (var i = 0, len = a.length; i < len; i++) { + if (a[i] != b[i]) return false; + } + + return true; + }; + + /** + * Convert an object to another type + * @param {Boolean | Number | String | Date | Moment | Null | undefined} object + * @param {String | undefined} type Name of the type. Available types: + * 'Boolean', 'Number', 'String', + * 'Date', 'Moment', ISODate', 'ASPDate'. + * @return {*} object + * @throws Error + */ + exports.convert = function(object, type) { + var match; + + if (object === undefined) { + return undefined; + } + if (object === null) { + return null; + } + + if (!type) { + return object; + } + if (!(typeof type === 'string') && !(type instanceof String)) { + throw new Error('Type must be a string'); + } + + //noinspection FallthroughInSwitchStatementJS + switch (type) { + case 'boolean': + case 'Boolean': + return Boolean(object); + + case 'number': + case 'Number': + return Number(object.valueOf()); + + case 'string': + case 'String': + return String(object); + + case 'Date': + if (exports.isNumber(object)) { + return new Date(object); + } + if (object instanceof Date) { + return new Date(object.valueOf()); + } + else if (moment.isMoment(object)) { + return new Date(object.valueOf()); + } + if (exports.isString(object)) { + match = ASPDateRegex.exec(object); + if (match) { + // object is an ASP date + return new Date(Number(match[1])); // parse number + } + else { + return moment(object).toDate(); // parse string + } + } + else { + throw new Error( + 'Cannot convert object of type ' + exports.getType(object) + + ' to type Date'); + } + + case 'Moment': + if (exports.isNumber(object)) { + return moment(object); + } + if (object instanceof Date) { + return moment(object.valueOf()); + } + else if (moment.isMoment(object)) { + return moment(object); + } + if (exports.isString(object)) { + match = ASPDateRegex.exec(object); + if (match) { + // object is an ASP date + return moment(Number(match[1])); // parse number + } + else { + return moment(object); // parse string + } + } + else { + throw new Error( + 'Cannot convert object of type ' + exports.getType(object) + + ' to type Date'); + } + + case 'ISODate': + if (exports.isNumber(object)) { + return new Date(object); + } + else if (object instanceof Date) { + return object.toISOString(); + } + else if (moment.isMoment(object)) { + return object.toDate().toISOString(); + } + else if (exports.isString(object)) { + match = ASPDateRegex.exec(object); + if (match) { + // object is an ASP date + return new Date(Number(match[1])).toISOString(); // parse number + } + else { + return new Date(object).toISOString(); // parse string + } + } + else { + throw new Error( + 'Cannot convert object of type ' + exports.getType(object) + + ' to type ISODate'); + } + + case 'ASPDate': + if (exports.isNumber(object)) { + return '/Date(' + object + ')/'; + } + else if (object instanceof Date) { + return '/Date(' + object.valueOf() + ')/'; + } + else if (exports.isString(object)) { + match = ASPDateRegex.exec(object); + var value; + if (match) { + // object is an ASP date + value = new Date(Number(match[1])).valueOf(); // parse number + } + else { + value = new Date(object).valueOf(); // parse string + } + return '/Date(' + value + ')/'; + } + else { + throw new Error( + 'Cannot convert object of type ' + exports.getType(object) + + ' to type ASPDate'); + } + + default: + throw new Error('Unknown type "' + type + '"'); + } + }; + + // parse ASP.Net Date pattern, + // for example '/Date(1198908717056)/' or '/Date(1198908717056-0700)/' + // code from http://momentjs.com/ + var ASPDateRegex = /^\/?Date\((\-?\d+)/i; + + /** + * Get the type of an object, for example exports.getType([]) returns 'Array' + * @param {*} object + * @return {String} type + */ + exports.getType = function(object) { + var type = typeof object; + + if (type == 'object') { + if (object == null) { + return 'null'; + } + if (object instanceof Boolean) { + return 'Boolean'; + } + if (object instanceof Number) { + return 'Number'; + } + if (object instanceof String) { + return 'String'; + } + if (Array.isArray(object)) { + return 'Array'; + } + if (object instanceof Date) { + return 'Date'; + } + return 'Object'; + } + else if (type == 'number') { + return 'Number'; + } + else if (type == 'boolean') { + return 'Boolean'; + } + else if (type == 'string') { + return 'String'; + } + + return type; + }; + + /** + * Retrieve the absolute left value of a DOM element + * @param {Element} elem A dom element, for example a div + * @return {number} left The absolute left position of this element + * in the browser page. + */ + exports.getAbsoluteLeft = function(elem) { + return elem.getBoundingClientRect().left + window.pageXOffset; + }; + + /** + * Retrieve the absolute top value of a DOM element + * @param {Element} elem A dom element, for example a div + * @return {number} top The absolute top position of this element + * in the browser page. + */ + exports.getAbsoluteTop = function(elem) { + return elem.getBoundingClientRect().top + window.pageYOffset; + }; + + /** + * add a className to the given elements style + * @param {Element} elem + * @param {String} className + */ + exports.addClassName = function(elem, className) { + var classes = elem.className.split(' '); + if (classes.indexOf(className) == -1) { + classes.push(className); // add the class to the array + elem.className = classes.join(' '); + } + }; + + /** + * add a className to the given elements style + * @param {Element} elem + * @param {String} className + */ + exports.removeClassName = function(elem, className) { + var classes = elem.className.split(' '); + var index = classes.indexOf(className); + if (index != -1) { + classes.splice(index, 1); // remove the class from the array + elem.className = classes.join(' '); + } + }; + + /** + * For each method for both arrays and objects. + * In case of an array, the built-in Array.forEach() is applied. + * In case of an Object, the method loops over all properties of the object. + * @param {Object | Array} object An Object or Array + * @param {function} callback Callback method, called for each item in + * the object or array with three parameters: + * callback(value, index, object) + */ + exports.forEach = function(object, callback) { + var i, + len; + if (Array.isArray(object)) { + // array + for (i = 0, len = object.length; i < len; i++) { + callback(object[i], i, object); + } + } + else { + // object + for (i in object) { + if (object.hasOwnProperty(i)) { + callback(object[i], i, object); + } + } + } + }; + + /** + * Convert an object into an array: all objects properties are put into the + * array. The resulting array is unordered. + * @param {Object} object + * @param {Array} array + */ + exports.toArray = function(object) { + var array = []; + + for (var prop in object) { + if (object.hasOwnProperty(prop)) array.push(object[prop]); + } + + return array; + } + + /** + * Update a property in an object + * @param {Object} object + * @param {String} key + * @param {*} value + * @return {Boolean} changed + */ + exports.updateProperty = function(object, key, value) { + if (object[key] !== value) { + object[key] = value; + return true; + } + else { + return false; + } + }; + + /** + * Add and event listener. Works for all browsers + * @param {Element} element An html element + * @param {string} action The action, for example "click", + * without the prefix "on" + * @param {function} listener The callback function to be executed + * @param {boolean} [useCapture] + */ + exports.addEventListener = function(element, action, listener, useCapture) { + if (element.addEventListener) { + if (useCapture === undefined) + useCapture = false; + + if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) { + action = "DOMMouseScroll"; // For Firefox + } + + element.addEventListener(action, listener, useCapture); + } else { + element.attachEvent("on" + action, listener); // IE browsers + } + }; + + /** + * Remove an event listener from an element + * @param {Element} element An html dom element + * @param {string} action The name of the event, for example "mousedown" + * @param {function} listener The listener function + * @param {boolean} [useCapture] + */ + exports.removeEventListener = function(element, action, listener, useCapture) { + if (element.removeEventListener) { + // non-IE browsers + if (useCapture === undefined) + useCapture = false; + + if (action === "mousewheel" && navigator.userAgent.indexOf("Firefox") >= 0) { + action = "DOMMouseScroll"; // For Firefox + } + + element.removeEventListener(action, listener, useCapture); + } else { + // IE browsers + element.detachEvent("on" + action, listener); + } + }; + + /** + * Cancels the event if it is cancelable, without stopping further propagation of the event. + */ + exports.preventDefault = function (event) { + if (!event) + event = window.event; + + if (event.preventDefault) { + event.preventDefault(); // non-IE browsers + } + else { + event.returnValue = false; // IE browsers + } + }; + + /** + * Get HTML element which is the target of the event + * @param {Event} event + * @return {Element} target element + */ + exports.getTarget = function(event) { + // code from http://www.quirksmode.org/js/events_properties.html + if (!event) { + event = window.event; + } + + var target; + + if (event.target) { + target = event.target; + } + else if (event.srcElement) { + target = event.srcElement; + } + + if (target.nodeType != undefined && target.nodeType == 3) { + // defeat Safari bug + target = target.parentNode; + } + + return target; + }; + + exports.option = {}; + + /** + * Convert a value into a boolean + * @param {Boolean | function | undefined} value + * @param {Boolean} [defaultValue] + * @returns {Boolean} bool + */ + exports.option.asBoolean = function (value, defaultValue) { + if (typeof value == 'function') { + value = value(); + } + + if (value != null) { + return (value != false); + } + + return defaultValue || null; + }; + + /** + * Convert a value into a number + * @param {Boolean | function | undefined} value + * @param {Number} [defaultValue] + * @returns {Number} number + */ + exports.option.asNumber = function (value, defaultValue) { + if (typeof value == 'function') { + value = value(); + } + + if (value != null) { + return Number(value) || defaultValue || null; + } + + return defaultValue || null; + }; + + /** + * Convert a value into a string + * @param {String | function | undefined} value + * @param {String} [defaultValue] + * @returns {String} str + */ + exports.option.asString = function (value, defaultValue) { + if (typeof value == 'function') { + value = value(); + } + + if (value != null) { + return String(value); + } + + return defaultValue || null; + }; + + /** + * Convert a size or location into a string with pixels or a percentage + * @param {String | Number | function | undefined} value + * @param {String} [defaultValue] + * @returns {String} size + */ + exports.option.asSize = function (value, defaultValue) { + if (typeof value == 'function') { + value = value(); + } + + if (exports.isString(value)) { + return value; + } + else if (exports.isNumber(value)) { + return value + 'px'; + } + else { + return defaultValue || null; + } + }; + + /** + * Convert a value into a DOM element + * @param {HTMLElement | function | undefined} value + * @param {HTMLElement} [defaultValue] + * @returns {HTMLElement | null} dom + */ + exports.option.asElement = function (value, defaultValue) { + if (typeof value == 'function') { + value = value(); + } + + return value || defaultValue || null; + }; + + /** + * http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb + * + * @param {String} hex + * @returns {{r: *, g: *, b: *}} | 255 range + */ + exports.hexToRGB = function(hex) { + // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") + var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + hex = hex.replace(shorthandRegex, function(m, r, g, b) { + return r + r + g + g + b + b; + }); + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; + }; + + /** + * This function takes color in hex format or rgb() or rgba() format and overrides the opacity. Returns rgba() string. + * @param color + * @param opacity + * @returns {*} + */ + exports.overrideOpacity = function(color,opacity) { + if (color.indexOf("rgb") != -1) { + var rgb = color.substr(color.indexOf("(")+1).replace(")","").split(","); + return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + "," + opacity + ")" + } + else { + var rgb = exports.hexToRGB(color); + if (rgb == null) { + return color; + } + else { + return "rgba(" + rgb.r + "," + rgb.g + "," + rgb.b + "," + opacity + ")" + } + } + } + + /** + * + * @param red 0 -- 255 + * @param green 0 -- 255 + * @param blue 0 -- 255 + * @returns {string} + * @constructor + */ + exports.RGBToHex = function(red,green,blue) { + return "#" + ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).slice(1); + }; + + /** + * Parse a color property into an object with border, background, and + * highlight colors + * @param {Object | String} color + * @return {Object} colorObject + */ + exports.parseColor = function(color) { + var c; + if (exports.isString(color)) { + if (exports.isValidRGB(color)) { + var rgb = color.substr(4).substr(0,color.length-5).split(','); + color = exports.RGBToHex(rgb[0],rgb[1],rgb[2]); + } + if (exports.isValidHex(color)) { + var hsv = exports.hexToHSV(color); + var lighterColorHSV = {h:hsv.h,s:hsv.s * 0.45,v:Math.min(1,hsv.v * 1.05)}; + var darkerColorHSV = {h:hsv.h,s:Math.min(1,hsv.v * 1.25),v:hsv.v*0.6}; + var darkerColorHex = exports.HSVToHex(darkerColorHSV.h ,darkerColorHSV.h ,darkerColorHSV.v); + var lighterColorHex = exports.HSVToHex(lighterColorHSV.h,lighterColorHSV.s,lighterColorHSV.v); + + c = { + background: color, + border:darkerColorHex, + highlight: { + background:lighterColorHex, + border:darkerColorHex + }, + hover: { + background:lighterColorHex, + border:darkerColorHex + } + }; + } + else { + c = { + background:color, + border:color, + highlight: { + background:color, + border:color + }, + hover: { + background:color, + border:color + } + }; + } + } + else { + c = {}; + c.background = color.background || 'white'; + c.border = color.border || c.background; + + if (exports.isString(color.highlight)) { + c.highlight = { + border: color.highlight, + background: color.highlight + } + } + else { + c.highlight = {}; + c.highlight.background = color.highlight && color.highlight.background || c.background; + c.highlight.border = color.highlight && color.highlight.border || c.border; + } + + if (exports.isString(color.hover)) { + c.hover = { + border: color.hover, + background: color.hover + } + } + else { + c.hover = {}; + c.hover.background = color.hover && color.hover.background || c.background; + c.hover.border = color.hover && color.hover.border || c.border; + } + } + + return c; + }; + + /** + * http://www.javascripter.net/faq/rgb2hsv.htm + * + * @param red + * @param green + * @param blue + * @returns {*} + * @constructor + */ + exports.RGBToHSV = function(red,green,blue) { + red=red/255; green=green/255; blue=blue/255; + var minRGB = Math.min(red,Math.min(green,blue)); + var maxRGB = Math.max(red,Math.max(green,blue)); + + // Black-gray-white + if (minRGB == maxRGB) { + return {h:0,s:0,v:minRGB}; + } + + // Colors other than black-gray-white: + var d = (red==minRGB) ? green-blue : ((blue==minRGB) ? red-green : blue-red); + var h = (red==minRGB) ? 3 : ((blue==minRGB) ? 1 : 5); + var hue = 60*(h - d/(maxRGB - minRGB))/360; + var saturation = (maxRGB - minRGB)/maxRGB; + var value = maxRGB; + return {h:hue,s:saturation,v:value}; + }; + + var cssUtil = { + // split a string with css styles into an object with key/values + split: function (cssText) { + var styles = {}; + + cssText.split(';').forEach(function (style) { + if (style.trim() != '') { + var parts = style.split(':'); + var key = parts[0].trim(); + var value = parts[1].trim(); + styles[key] = value; + } + }); + + return styles; + }, + + // build a css text string from an object with key/values + join: function (styles) { + return Object.keys(styles) + .map(function (key) { + return key + ': ' + styles[key]; + }) + .join('; '); + } + }; + + /** + * Append a string with css styles to an element + * @param {Element} element + * @param {String} cssText + */ + exports.addCssText = function (element, cssText) { + var currentStyles = cssUtil.split(element.style.cssText); + var newStyles = cssUtil.split(cssText); + var styles = exports.extend(currentStyles, newStyles); + + element.style.cssText = cssUtil.join(styles); + }; + + /** + * Remove a string with css styles from an element + * @param {Element} element + * @param {String} cssText + */ + exports.removeCssText = function (element, cssText) { + var styles = cssUtil.split(element.style.cssText); + var removeStyles = cssUtil.split(cssText); + + for (var key in removeStyles) { + if (removeStyles.hasOwnProperty(key)) { + delete styles[key]; + } + } + + element.style.cssText = cssUtil.join(styles); + }; + + /** + * https://gist.github.com/mjijackson/5311256 + * @param h + * @param s + * @param v + * @returns {{r: number, g: number, b: number}} + * @constructor + */ + exports.HSVToRGB = function(h, s, v) { + var r, g, b; + + var i = Math.floor(h * 6); + var f = h * 6 - i; + var p = v * (1 - s); + var q = v * (1 - f * s); + var t = v * (1 - (1 - f) * s); + + switch (i % 6) { + case 0: r = v, g = t, b = p; break; + case 1: r = q, g = v, b = p; break; + case 2: r = p, g = v, b = t; break; + case 3: r = p, g = q, b = v; break; + case 4: r = t, g = p, b = v; break; + case 5: r = v, g = p, b = q; break; + } + + return {r:Math.floor(r * 255), g:Math.floor(g * 255), b:Math.floor(b * 255) }; + }; + + exports.HSVToHex = function(h, s, v) { + var rgb = exports.HSVToRGB(h, s, v); + return exports.RGBToHex(rgb.r, rgb.g, rgb.b); + }; + + exports.hexToHSV = function(hex) { + var rgb = exports.hexToRGB(hex); + return exports.RGBToHSV(rgb.r, rgb.g, rgb.b); + }; + + exports.isValidHex = function(hex) { + var isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex); + return isOk; + }; + + exports.isValidRGB = function(rgb) { + rgb = rgb.replace(" ",""); + var isOk = /rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(rgb); + return isOk; + } + + /** + * This recursively redirects the prototype of JSON objects to the referenceObject + * This is used for default options. + * + * @param referenceObject + * @returns {*} + */ + exports.selectiveBridgeObject = function(fields, referenceObject) { + if (typeof referenceObject == "object") { + var objectTo = Object.create(referenceObject); + for (var i = 0; i < fields.length; i++) { + if (referenceObject.hasOwnProperty(fields[i])) { + if (typeof referenceObject[fields[i]] == "object") { + objectTo[fields[i]] = exports.bridgeObject(referenceObject[fields[i]]); + } + } + } + return objectTo; + } + else { + return null; + } + }; + + /** + * This recursively redirects the prototype of JSON objects to the referenceObject + * This is used for default options. + * + * @param referenceObject + * @returns {*} + */ + exports.bridgeObject = function(referenceObject) { + if (typeof referenceObject == "object") { + var objectTo = Object.create(referenceObject); + for (var i in referenceObject) { + if (referenceObject.hasOwnProperty(i)) { + if (typeof referenceObject[i] == "object") { + objectTo[i] = exports.bridgeObject(referenceObject[i]); + } + } + } + return objectTo; + } + else { + return null; + } + }; + + + /** + * this is used to set the options of subobjects in the options object. A requirement of these subobjects + * is that they have an 'enabled' element which is optional for the user but mandatory for the program. + * + * @param [object] mergeTarget | this is either this.options or the options used for the groups. + * @param [object] options | options + * @param [String] option | this is the option key in the options argument + * @private + */ + exports.mergeOptions = function (mergeTarget, options, option) { + if (options[option] !== undefined) { + if (typeof options[option] == 'boolean') { + mergeTarget[option].enabled = options[option]; + } + else { + mergeTarget[option].enabled = true; + for (var prop in options[option]) { + if (options[option].hasOwnProperty(prop)) { + mergeTarget[option][prop] = options[option][prop]; + } + } + } + } + } + + + /** + * This function does a binary search for a visible item in a sorted list. If we find a visible item, the code that uses + * this function will then iterate in both directions over this sorted list to find all visible items. + * + * @param {Item[]} orderedItems | Items ordered by start + * @param {function} searchFunction | -1 is lower, 0 is found, 1 is higher + * @param {String} field + * @param {String} field2 + * @returns {number} + * @private + */ + exports.binarySearchCustom = function(orderedItems, searchFunction, field, field2) { + var maxIterations = 10000; + var iteration = 0; + var low = 0; + var high = orderedItems.length - 1; + + while (low <= high && iteration < maxIterations) { + var middle = Math.floor((low + high) / 2); + + var item = orderedItems[middle]; + var value = (field2 === undefined) ? item[field] : item[field][field2]; + + var searchResult = searchFunction(value); + if (searchResult == 0) { // jihaa, found a visible item! + return middle; + } + else if (searchResult == -1) { // it is too small --> increase low + low = middle + 1; + } + else { // it is too big --> decrease high + high = middle - 1; + } + + iteration++; + } + + return -1; + }; + + /** + * This function does a binary search for a specific value in a sorted array. If it does not exist but is in between of + * two values, we return either the one before or the one after, depending on user input + * If it is found, we return the index, else -1. + * + * @param {Array} orderedItems + * @param {{start: number, end: number}} target + * @param {String} field + * @param {String} sidePreference 'before' or 'after' + * @returns {number} + * @private + */ + exports.binarySearchValue = function(orderedItems, target, field, sidePreference) { + var maxIterations = 10000; + var iteration = 0; + var low = 0; + var high = orderedItems.length - 1; + var prevValue, value, nextValue, middle; + + while (low <= high && iteration < maxIterations) { + // get a new guess + middle = Math.floor(0.5*(high+low)); + prevValue = orderedItems[Math.max(0,middle - 1)][field]; + value = orderedItems[middle][field]; + nextValue = orderedItems[Math.min(orderedItems.length-1,middle + 1)][field]; + + if (value == target) { // we found the target + return middle; + } + else if (prevValue < target && value > target) { // target is in between of the previous and the current + return sidePreference == 'before' ? Math.max(0,middle - 1) : middle; + } + else if (value < target && nextValue > target) { // target is in between of the current and the next + return sidePreference == 'before' ? middle : Math.min(orderedItems.length-1,middle + 1); + } + else { // didnt find the target, we need to change our boundaries. + if (value < target) { // it is too small --> increase low + low = middle + 1; + } + else { // it is too big --> decrease high + high = middle - 1; + } + } + iteration++; + } + + // didnt find anything. Return -1. + return -1; + }; + + /** + * Quadratic ease-in-out + * http://gizma.com/easing/ + * @param {number} t Current time + * @param {number} start Start value + * @param {number} end End value + * @param {number} duration Duration + * @returns {number} Value corresponding with current time + */ + exports.easeInOutQuad = function (t, start, end, duration) { + var change = end - start; + t /= duration/2; + if (t < 1) return change/2*t*t + start; + t--; + return -change/2 * (t*(t-2) - 1) + start; + }; + + + + /* + * Easing Functions - inspired from http://gizma.com/easing/ + * only considering the t value for the range [0, 1] => [0, 1] + * https://gist.github.com/gre/1650294 + */ + exports.easingFunctions = { + // no easing, no acceleration + linear: function (t) { + return t + }, + // accelerating from zero velocity + easeInQuad: function (t) { + return t * t + }, + // decelerating to zero velocity + easeOutQuad: function (t) { + return t * (2 - t) + }, + // acceleration until halfway, then deceleration + easeInOutQuad: function (t) { + return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t + }, + // accelerating from zero velocity + easeInCubic: function (t) { + return t * t * t + }, + // decelerating to zero velocity + easeOutCubic: function (t) { + return (--t) * t * t + 1 + }, + // acceleration until halfway, then deceleration + easeInOutCubic: function (t) { + return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1 + }, + // accelerating from zero velocity + easeInQuart: function (t) { + return t * t * t * t + }, + // decelerating to zero velocity + easeOutQuart: function (t) { + return 1 - (--t) * t * t * t + }, + // acceleration until halfway, then deceleration + easeInOutQuart: function (t) { + return t < .5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t + }, + // accelerating from zero velocity + easeInQuint: function (t) { + return t * t * t * t * t + }, + // decelerating to zero velocity + easeOutQuint: function (t) { + return 1 + (--t) * t * t * t * t + }, + // acceleration until halfway, then deceleration + easeInOutQuint: function (t) { + return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t + } + }; + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + // DOM utility methods + + /** + * this prepares the JSON container for allocating SVG elements + * @param JSONcontainer + * @private + */ + exports.prepareElements = function(JSONcontainer) { + // cleanup the redundant svgElements; + for (var elementType in JSONcontainer) { + if (JSONcontainer.hasOwnProperty(elementType)) { + JSONcontainer[elementType].redundant = JSONcontainer[elementType].used; + JSONcontainer[elementType].used = []; + } + } + }; + + /** + * this cleans up all the unused SVG elements. By asking for the parentNode, we only need to supply the JSON container from + * which to remove the redundant elements. + * + * @param JSONcontainer + * @private + */ + exports.cleanupElements = function(JSONcontainer) { + // cleanup the redundant svgElements; + for (var elementType in JSONcontainer) { + if (JSONcontainer.hasOwnProperty(elementType)) { + if (JSONcontainer[elementType].redundant) { + for (var i = 0; i < JSONcontainer[elementType].redundant.length; i++) { + JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i]); + } + JSONcontainer[elementType].redundant = []; + } + } + } + }; + + /** + * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer + * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. + * + * @param elementType + * @param JSONcontainer + * @param svgContainer + * @returns {*} + * @private + */ + exports.getSVGElement = function (elementType, JSONcontainer, svgContainer) { + var element; + // allocate SVG element, if it doesnt yet exist, create one. + if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before + // check if there is an redundant element + if (JSONcontainer[elementType].redundant.length > 0) { + element = JSONcontainer[elementType].redundant[0]; + JSONcontainer[elementType].redundant.shift(); + } + else { + // create a new element and add it to the SVG + element = document.createElementNS('http://www.w3.org/2000/svg', elementType); + svgContainer.appendChild(element); + } + } + else { + // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. + element = document.createElementNS('http://www.w3.org/2000/svg', elementType); + JSONcontainer[elementType] = {used: [], redundant: []}; + svgContainer.appendChild(element); + } + JSONcontainer[elementType].used.push(element); + return element; + }; + + + /** + * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer + * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. + * + * @param elementType + * @param JSONcontainer + * @param DOMContainer + * @returns {*} + * @private + */ + exports.getDOMElement = function (elementType, JSONcontainer, DOMContainer, insertBefore) { + var element; + // allocate DOM element, if it doesnt yet exist, create one. + if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before + // check if there is an redundant element + if (JSONcontainer[elementType].redundant.length > 0) { + element = JSONcontainer[elementType].redundant[0]; + JSONcontainer[elementType].redundant.shift(); + } + else { + // create a new element and add it to the SVG + element = document.createElement(elementType); + if (insertBefore !== undefined) { + DOMContainer.insertBefore(element, insertBefore); + } + else { + DOMContainer.appendChild(element); + } + } + } + else { + // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. + element = document.createElement(elementType); + JSONcontainer[elementType] = {used: [], redundant: []}; + if (insertBefore !== undefined) { + DOMContainer.insertBefore(element, insertBefore); + } + else { + DOMContainer.appendChild(element); + } + } + JSONcontainer[elementType].used.push(element); + return element; + }; + + + + + /** + * draw a point object. this is a seperate function because it can also be called by the legend. + * The reason the JSONcontainer and the target SVG svgContainer have to be supplied is so the legend can use these functions + * as well. + * + * @param x + * @param y + * @param group + * @param JSONcontainer + * @param svgContainer + * @param labelObj + * @returns {*} + */ + exports.drawPoint = function(x, y, group, JSONcontainer, svgContainer, labelObj) { + var point; + if (group.options.drawPoints.style == 'circle') { + point = exports.getSVGElement('circle',JSONcontainer,svgContainer); + point.setAttributeNS(null, "cx", x); + point.setAttributeNS(null, "cy", y); + point.setAttributeNS(null, "r", 0.5 * group.options.drawPoints.size); + } + else { + point = exports.getSVGElement('rect',JSONcontainer,svgContainer); + point.setAttributeNS(null, "x", x - 0.5*group.options.drawPoints.size); + point.setAttributeNS(null, "y", y - 0.5*group.options.drawPoints.size); + point.setAttributeNS(null, "width", group.options.drawPoints.size); + point.setAttributeNS(null, "height", group.options.drawPoints.size); + } + + if(group.options.drawPoints.styles !== undefined) { + point.setAttributeNS(null, "style", group.group.options.drawPoints.styles); + } + point.setAttributeNS(null, "class", group.className + " point"); + //handle label + var label = exports.getSVGElement('text',JSONcontainer,svgContainer); + if (labelObj){ + if (labelObj.xOffset) { + x = x + labelObj.xOffset; + } + + if (labelObj.yOffset) { + y = y + labelObj.yOffset; + } + if (labelObj.content) { + label.textContent = labelObj.content; + } + + if (labelObj.className) { + label.setAttributeNS(null, "class", labelObj.className + " label"); + } + + + } + label.setAttributeNS(null, "x", x); + label.setAttributeNS(null, "y", y); + return point; + }; + + /** + * draw a bar SVG element centered on the X coordinate + * + * @param x + * @param y + * @param className + */ + exports.drawBar = function (x, y, width, height, className, JSONcontainer, svgContainer) { + if (height != 0) { + if (height < 0) { + height *= -1; + y -= height; + } + var rect = exports.getSVGElement('rect',JSONcontainer, svgContainer); + rect.setAttributeNS(null, "x", x - 0.5 * width); + rect.setAttributeNS(null, "y", y); + rect.setAttributeNS(null, "width", width); + rect.setAttributeNS(null, "height", height); + rect.setAttributeNS(null, "class", className); + } + }; + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Queue = __webpack_require__(5); + + /** + * DataSet + * + * Usage: + * var dataSet = new DataSet({ + * fieldId: '_id', + * type: { + * // ... + * } + * }); + * + * dataSet.add(item); + * dataSet.add(data); + * dataSet.update(item); + * dataSet.update(data); + * dataSet.remove(id); + * dataSet.remove(ids); + * var data = dataSet.get(); + * var data = dataSet.get(id); + * var data = dataSet.get(ids); + * var data = dataSet.get(ids, options, data); + * dataSet.clear(); + * + * A data set can: + * - add/remove/update data + * - gives triggers upon changes in the data + * - can import/export data in various data formats + * + * @param {Array | DataTable} [data] Optional array with initial data + * @param {Object} [options] Available options: + * {String} fieldId Field name of the id in the + * items, 'id' by default. + * {Object.} [type] + * {String[]} [fields] field names to be returned + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * {Array | DataTable} [data] If provided, items will be appended to this + * array or table. Required in case of Google + * DataTable. + * + * @throws Error + */ + DataSet.prototype.get = function (args) { + var me = this; + + // parse the arguments + var id, ids, options, data; + var firstType = util.getType(arguments[0]); + if (firstType == 'String' || firstType == 'Number') { + // get(id [, options] [, data]) + id = arguments[0]; + options = arguments[1]; + data = arguments[2]; + } + else if (firstType == 'Array') { + // get(ids [, options] [, data]) + ids = arguments[0]; + options = arguments[1]; + data = arguments[2]; + } + else { + // get([, options] [, data]) + options = arguments[0]; + data = arguments[1]; + } + + // determine the return type + var returnType; + if (options && options.returnType) { + var allowedValues = ["DataTable", "Array", "Object"]; + returnType = allowedValues.indexOf(options.returnType) == -1 ? "Array" : options.returnType; + + if (data && (returnType != util.getType(data))) { + throw new Error('Type of parameter "data" (' + util.getType(data) + ') ' + + 'does not correspond with specified options.type (' + options.type + ')'); + } + if (returnType == 'DataTable' && !util.isDataTable(data)) { + throw new Error('Parameter "data" must be a DataTable ' + + 'when options.type is "DataTable"'); + } + } + else if (data) { + returnType = (util.getType(data) == 'DataTable') ? 'DataTable' : 'Array'; + } + else { + returnType = 'Array'; + } + + // build options + var type = options && options.type || this._options.type; + var filter = options && options.filter; + var items = [], item, itemId, i, len; + + // convert items + if (id != undefined) { + // return a single item + item = me._getItem(id, type); + if (filter && !filter(item)) { + item = null; + } + } + else if (ids != undefined) { + // return a subset of items + for (i = 0, len = ids.length; i < len; i++) { + item = me._getItem(ids[i], type); + if (!filter || filter(item)) { + items.push(item); + } + } + } + else { + // return all items + for (itemId in this._data) { + if (this._data.hasOwnProperty(itemId)) { + item = me._getItem(itemId, type); + if (!filter || filter(item)) { + items.push(item); + } + } + } + } + + // order the results + if (options && options.order && id == undefined) { + this._sort(items, options.order); + } + + // filter fields of the items + if (options && options.fields) { + var fields = options.fields; + if (id != undefined) { + item = this._filterFields(item, fields); + } + else { + for (i = 0, len = items.length; i < len; i++) { + items[i] = this._filterFields(items[i], fields); + } + } + } + + // return the results + if (returnType == 'DataTable') { + var columns = this._getColumnNames(data); + if (id != undefined) { + // append a single item to the data table + me._appendRow(data, columns, item); + } + else { + // copy the items to the provided data table + for (i = 0; i < items.length; i++) { + me._appendRow(data, columns, items[i]); + } + } + return data; + } + else if (returnType == "Object") { + var result = {}; + for (i = 0; i < items.length; i++) { + result[items[i].id] = items[i]; + } + return result; + } + else { + // return an array + if (id != undefined) { + // a single item + return item; + } + else { + // multiple items + if (data) { + // copy the items to the provided array + for (i = 0, len = items.length; i < len; i++) { + data.push(items[i]); + } + return data; + } + else { + // just return our array + return items; + } + } + } + }; + + /** + * Get ids of all items or from a filtered set of items. + * @param {Object} [options] An Object with options. Available options: + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Array} ids + */ + DataSet.prototype.getIds = function (options) { + var data = this._data, + filter = options && options.filter, + order = options && options.order, + type = options && options.type || this._options.type, + i, + len, + id, + item, + items, + ids = []; + + if (filter) { + // get filtered items + if (order) { + // create ordered list + items = []; + for (id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (filter(item)) { + items.push(item); + } + } + } + + this._sort(items, order); + + for (i = 0, len = items.length; i < len; i++) { + ids[i] = items[i][this._fieldId]; + } + } + else { + // create unordered list + for (id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (filter(item)) { + ids.push(item[this._fieldId]); + } + } + } + } + } + else { + // get all items + if (order) { + // create an ordered list + items = []; + for (id in data) { + if (data.hasOwnProperty(id)) { + items.push(data[id]); + } + } + + this._sort(items, order); + + for (i = 0, len = items.length; i < len; i++) { + ids[i] = items[i][this._fieldId]; + } + } + else { + // create unordered list + for (id in data) { + if (data.hasOwnProperty(id)) { + item = data[id]; + ids.push(item[this._fieldId]); + } + } + } + } + + return ids; + }; + + /** + * Returns the DataSet itself. Is overwritten for example by the DataView, + * which returns the DataSet it is connected to instead. + */ + DataSet.prototype.getDataSet = function () { + return this; + }; + + /** + * Execute a callback function for every item in the dataset. + * @param {function} callback + * @param {Object} [options] Available options: + * {Object.} [type] + * {String[]} [fields] filter fields + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + */ + DataSet.prototype.forEach = function (callback, options) { + var filter = options && options.filter, + type = options && options.type || this._options.type, + data = this._data, + item, + id; + + if (options && options.order) { + // execute forEach on ordered list + var items = this.get(options); + + for (var i = 0, len = items.length; i < len; i++) { + item = items[i]; + id = item[this._fieldId]; + callback(item, id); + } + } + else { + // unordered + for (id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (!filter || filter(item)) { + callback(item, id); + } + } + } + } + }; + + /** + * Map every item in the dataset. + * @param {function} callback + * @param {Object} [options] Available options: + * {Object.} [type] + * {String[]} [fields] filter fields + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Object[]} mappedItems + */ + DataSet.prototype.map = function (callback, options) { + var filter = options && options.filter, + type = options && options.type || this._options.type, + mappedItems = [], + data = this._data, + item; + + // convert and filter items + for (var id in data) { + if (data.hasOwnProperty(id)) { + item = this._getItem(id, type); + if (!filter || filter(item)) { + mappedItems.push(callback(item, id)); + } + } + } + + // order items + if (options && options.order) { + this._sort(mappedItems, options.order); + } + + return mappedItems; + }; + + /** + * Filter the fields of an item + * @param {Object | null} item + * @param {String[]} fields Field names + * @return {Object | null} filteredItem or null if no item is provided + * @private + */ + DataSet.prototype._filterFields = function (item, fields) { + if (!item) { // item is null + return item; + } + + var filteredItem = {}; + + for (var field in item) { + if (item.hasOwnProperty(field) && (fields.indexOf(field) != -1)) { + filteredItem[field] = item[field]; + } + } + + return filteredItem; + }; + + /** + * Sort the provided array with items + * @param {Object[]} items + * @param {String | function} order A field name or custom sort function. + * @private + */ + DataSet.prototype._sort = function (items, order) { + if (util.isString(order)) { + // order by provided field name + var name = order; // field name + items.sort(function (a, b) { + var av = a[name]; + var bv = b[name]; + return (av > bv) ? 1 : ((av < bv) ? -1 : 0); + }); + } + else if (typeof order === 'function') { + // order by sort function + items.sort(order); + } + // TODO: extend order by an Object {field:String, direction:String} + // where direction can be 'asc' or 'desc' + else { + throw new TypeError('Order must be a function or a string'); + } + }; + + /** + * Remove an object by pointer or by id + * @param {String | Number | Object | Array} id Object or id, or an array with + * objects or ids to be removed + * @param {String} [senderId] Optional sender id + * @return {Array} removedIds + */ + DataSet.prototype.remove = function (id, senderId) { + var removedIds = [], + i, len, removedId; + + if (Array.isArray(id)) { + for (i = 0, len = id.length; i < len; i++) { + removedId = this._remove(id[i]); + if (removedId != null) { + removedIds.push(removedId); + } + } + } + else { + removedId = this._remove(id); + if (removedId != null) { + removedIds.push(removedId); + } + } + + if (removedIds.length) { + this._trigger('remove', {items: removedIds}, senderId); + } + + return removedIds; + }; + + /** + * Remove an item by its id + * @param {Number | String | Object} id id or item + * @returns {Number | String | null} id + * @private + */ + DataSet.prototype._remove = function (id) { + if (util.isNumber(id) || util.isString(id)) { + if (this._data[id]) { + delete this._data[id]; + this.length--; + return id; + } + } + else if (id instanceof Object) { + var itemId = id[this._fieldId]; + if (itemId && this._data[itemId]) { + delete this._data[itemId]; + this.length--; + return itemId; + } + } + return null; + }; + + /** + * Clear the data + * @param {String} [senderId] Optional sender id + * @return {Array} removedIds The ids of all removed items + */ + DataSet.prototype.clear = function (senderId) { + var ids = Object.keys(this._data); + + this._data = {}; + this.length = 0; + + this._trigger('remove', {items: ids}, senderId); + + return ids; + }; + + /** + * Find the item with maximum value of a specified field + * @param {String} field + * @return {Object | null} item Item containing max value, or null if no items + */ + DataSet.prototype.max = function (field) { + var data = this._data, + max = null, + maxField = null; + + for (var id in data) { + if (data.hasOwnProperty(id)) { + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!max || itemField > maxField)) { + max = item; + maxField = itemField; + } + } + } + + return max; + }; + + /** + * Find the item with minimum value of a specified field + * @param {String} field + * @return {Object | null} item Item containing max value, or null if no items + */ + DataSet.prototype.min = function (field) { + var data = this._data, + min = null, + minField = null; + + for (var id in data) { + if (data.hasOwnProperty(id)) { + var item = data[id]; + var itemField = item[field]; + if (itemField != null && (!min || itemField < minField)) { + min = item; + minField = itemField; + } + } + } + + return min; + }; + + /** + * Find all distinct values of a specified field + * @param {String} field + * @return {Array} values Array containing all distinct values. If data items + * do not contain the specified field are ignored. + * The returned array is unordered. + */ + DataSet.prototype.distinct = function (field) { + var data = this._data; + var values = []; + var fieldType = this._options.type && this._options.type[field] || null; + var count = 0; + var i; + + for (var prop in data) { + if (data.hasOwnProperty(prop)) { + var item = data[prop]; + var value = item[field]; + var exists = false; + for (i = 0; i < count; i++) { + if (values[i] == value) { + exists = true; + break; + } + } + if (!exists && (value !== undefined)) { + values[count] = value; + count++; + } + } + } + + if (fieldType) { + for (i = 0; i < values.length; i++) { + values[i] = util.convert(values[i], fieldType); + } + } + + return values; + }; + + /** + * Add a single item. Will fail when an item with the same id already exists. + * @param {Object} item + * @return {String} id + * @private + */ + DataSet.prototype._addItem = function (item) { + var id = item[this._fieldId]; + + if (id != undefined) { + // check whether this id is already taken + if (this._data[id]) { + // item already exists + throw new Error('Cannot add item: item with id ' + id + ' already exists'); + } + } + else { + // generate an id + id = util.randomUUID(); + item[this._fieldId] = id; + } + + var d = {}; + for (var field in item) { + if (item.hasOwnProperty(field)) { + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); + } + } + this._data[id] = d; + this.length++; + + return id; + }; + + /** + * Get an item. Fields can be converted to a specific type + * @param {String} id + * @param {Object.} [types] field types to convert + * @return {Object | null} item + * @private + */ + DataSet.prototype._getItem = function (id, types) { + var field, value; + + // get the item from the dataset + var raw = this._data[id]; + if (!raw) { + return null; + } + + // convert the items field types + var converted = {}; + if (types) { + for (field in raw) { + if (raw.hasOwnProperty(field)) { + value = raw[field]; + converted[field] = util.convert(value, types[field]); + } + } + } + else { + // no field types specified, no converting needed + for (field in raw) { + if (raw.hasOwnProperty(field)) { + value = raw[field]; + converted[field] = value; + } + } + } + return converted; + }; + + /** + * Update a single item: merge with existing item. + * Will fail when the item has no id, or when there does not exist an item + * with the same id. + * @param {Object} item + * @return {String} id + * @private + */ + DataSet.prototype._updateItem = function (item) { + var id = item[this._fieldId]; + if (id == undefined) { + throw new Error('Cannot update item: item has no id (item: ' + JSON.stringify(item) + ')'); + } + var d = this._data[id]; + if (!d) { + // item doesn't exist + throw new Error('Cannot update item: no item with id ' + id + ' found'); + } + + // merge with current item + for (var field in item) { + if (item.hasOwnProperty(field)) { + var fieldType = this._type[field]; // type may be undefined + d[field] = util.convert(item[field], fieldType); + } + } + + return id; + }; + + /** + * Get an array with the column names of a Google DataTable + * @param {DataTable} dataTable + * @return {String[]} columnNames + * @private + */ + DataSet.prototype._getColumnNames = function (dataTable) { + var columns = []; + for (var col = 0, cols = dataTable.getNumberOfColumns(); col < cols; col++) { + columns[col] = dataTable.getColumnId(col) || dataTable.getColumnLabel(col); + } + return columns; + }; + + /** + * Append an item as a row to the dataTable + * @param dataTable + * @param columns + * @param item + * @private + */ + DataSet.prototype._appendRow = function (dataTable, columns, item) { + var row = dataTable.addRow(); + + for (var col = 0, cols = columns.length; col < cols; col++) { + var field = columns[col]; + dataTable.setValue(row, col, item[field]); + } + }; + + module.exports = DataSet; + + +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + + /** + * DataView + * + * a dataview offers a filtered view on a dataset or an other dataview. + * + * @param {DataSet | DataView} data + * @param {Object} [options] Available options: see method get + * + * @constructor DataView + */ + function DataView (data, options) { + this._data = null; + this._ids = {}; // ids of the items currently in memory (just contains a boolean true) + this.length = 0; // number of items in the DataView + this._options = options || {}; + this._fieldId = 'id'; // name of the field containing id + this._subscribers = {}; // event subscribers + + var me = this; + this.listener = function () { + me._onEvent.apply(me, arguments); + }; + + this.setData(data); + } + + // TODO: implement a function .config() to dynamically update things like configured filter + // and trigger changes accordingly + + /** + * Set a data source for the view + * @param {DataSet | DataView} data + */ + DataView.prototype.setData = function (data) { + var ids, i, len; + + if (this._data) { + // unsubscribe from current dataset + if (this._data.unsubscribe) { + this._data.unsubscribe('*', this.listener); + } + + // trigger a remove of all items in memory + ids = []; + for (var id in this._ids) { + if (this._ids.hasOwnProperty(id)) { + ids.push(id); + } + } + this._ids = {}; + this.length = 0; + this._trigger('remove', {items: ids}); + } + + this._data = data; + + if (this._data) { + // update fieldId + this._fieldId = this._options.fieldId || + (this._data && this._data.options && this._data.options.fieldId) || + 'id'; + + // trigger an add of all added items + ids = this._data.getIds({filter: this._options && this._options.filter}); + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + this._ids[id] = true; + } + this.length = ids.length; + this._trigger('add', {items: ids}); + + // subscribe to new dataset + if (this._data.on) { + this._data.on('*', this.listener); + } + } + }; + + /** + * Refresh the DataView. Useful when the DataView has a filter function + * containing a variable parameter. + */ + DataView.prototype.refresh = function () { + var id; + var ids = this._data.getIds({filter: this._options && this._options.filter}); + var newIds = {}; + var added = []; + var removed = []; + + // check for additions + for (var i = 0; i < ids.length; i++) { + id = ids[i]; + newIds[id] = true; + if (!this._ids[id]) { + added.push(id); + this._ids[id] = true; + this.length++; + } + } + + // check for removals + for (id in this._ids) { + if (this._ids.hasOwnProperty(id)) { + if (!newIds[id]) { + removed.push(id); + delete this._ids[id]; + this.length--; + } + } + } + + // trigger events + if (added.length) { + this._trigger('add', {items: added}); + } + if (removed.length) { + this._trigger('remove', {items: removed}); + } + }; + + /** + * Get data from the data view + * + * Usage: + * + * get() + * get(options: Object) + * get(options: Object, data: Array | DataTable) + * + * get(id: Number) + * get(id: Number, options: Object) + * get(id: Number, options: Object, data: Array | DataTable) + * + * get(ids: Number[]) + * get(ids: Number[], options: Object) + * get(ids: Number[], options: Object, data: Array | DataTable) + * + * Where: + * + * {Number | String} id The id of an item + * {Number[] | String{}} ids An array with ids of items + * {Object} options An Object with options. Available options: + * {String} [type] Type of data to be returned. Can + * be 'DataTable' or 'Array' (default) + * {Object.} [convert] + * {String[]} [fields] field names to be returned + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * {Array | DataTable} [data] If provided, items will be appended to this + * array or table. Required in case of Google + * DataTable. + * @param args + */ + DataView.prototype.get = function (args) { + var me = this; + + // parse the arguments + var ids, options, data; + var firstType = util.getType(arguments[0]); + if (firstType == 'String' || firstType == 'Number' || firstType == 'Array') { + // get(id(s) [, options] [, data]) + ids = arguments[0]; // can be a single id or an array with ids + options = arguments[1]; + data = arguments[2]; + } + else { + // get([, options] [, data]) + options = arguments[0]; + data = arguments[1]; + } + + // extend the options with the default options and provided options + var viewOptions = util.extend({}, this._options, options); + + // create a combined filter method when needed + if (this._options.filter && options && options.filter) { + viewOptions.filter = function (item) { + return me._options.filter(item) && options.filter(item); + } + } + + // build up the call to the linked data set + var getArguments = []; + if (ids != undefined) { + getArguments.push(ids); + } + getArguments.push(viewOptions); + getArguments.push(data); + + return this._data && this._data.get.apply(this._data, getArguments); + }; + + /** + * Get ids of all items or from a filtered set of items. + * @param {Object} [options] An Object with options. Available options: + * {function} [filter] filter items + * {String | function} [order] Order the items by + * a field name or custom sort function. + * @return {Array} ids + */ + DataView.prototype.getIds = function (options) { + var ids; + + if (this._data) { + var defaultFilter = this._options.filter; + var filter; + + if (options && options.filter) { + if (defaultFilter) { + filter = function (item) { + return defaultFilter(item) && options.filter(item); + } + } + else { + filter = options.filter; + } + } + else { + filter = defaultFilter; + } + + ids = this._data.getIds({ + filter: filter, + order: options && options.order + }); + } + else { + ids = []; + } + + return ids; + }; + + /** + * Get the DataSet to which this DataView is connected. In case there is a chain + * of multiple DataViews, the root DataSet of this chain is returned. + * @return {DataSet} dataSet + */ + DataView.prototype.getDataSet = function () { + var dataSet = this; + while (dataSet instanceof DataView) { + dataSet = dataSet._data; + } + return dataSet || null; + }; + + /** + * Event listener. Will propagate all events from the connected data set to + * the subscribers of the DataView, but will filter the items and only trigger + * when there are changes in the filtered data set. + * @param {String} event + * @param {Object | null} params + * @param {String} senderId + * @private + */ + DataView.prototype._onEvent = function (event, params, senderId) { + var i, len, id, item, + ids = params && params.items, + data = this._data, + added = [], + updated = [], + removed = []; + + if (ids && data) { + switch (event) { + case 'add': + // filter the ids of the added items + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + item = this.get(id); + if (item) { + this._ids[id] = true; + added.push(id); + } + } + + break; + + case 'update': + // determine the event from the views viewpoint: an updated + // item can be added, updated, or removed from this view. + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + item = this.get(id); + + if (item) { + if (this._ids[id]) { + updated.push(id); + } + else { + this._ids[id] = true; + added.push(id); + } + } + else { + if (this._ids[id]) { + delete this._ids[id]; + removed.push(id); + } + else { + // nothing interesting for me :-( + } + } + } + + break; + + case 'remove': + // filter the ids of the removed items + for (i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + if (this._ids[id]) { + delete this._ids[id]; + removed.push(id); + } + } + + break; + } + + this.length += added.length - removed.length; + + if (added.length) { + this._trigger('add', {items: added}, senderId); + } + if (updated.length) { + this._trigger('update', {items: updated}, senderId); + } + if (removed.length) { + this._trigger('remove', {items: removed}, senderId); + } + } + }; + + // copy subscription functionality from DataSet + DataView.prototype.on = DataSet.prototype.on; + DataView.prototype.off = DataSet.prototype.off; + DataView.prototype._trigger = DataSet.prototype._trigger; + + // TODO: make these functions deprecated (replaced with `on` and `off` since version 0.5) + DataView.prototype.subscribe = DataView.prototype.on; + DataView.prototype.unsubscribe = DataView.prototype.off; + + module.exports = DataView; + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * A queue + * @param {Object} options + * Available options: + * - delay: number When provided, the queue will be flushed + * automatically after an inactivity of this delay + * in milliseconds. + * Default value is null. + * - max: number When the queue exceeds the given maximum number + * of entries, the queue is flushed automatically. + * Default value of max is Infinity. + * @constructor + */ + function Queue(options) { + // options + this.delay = null; + this.max = Infinity; + + // properties + this._queue = []; + this._timeout = null; + this._extended = null; + + this.setOptions(options); + } + + /** + * Update the configuration of the queue + * @param {Object} options + * Available options: + * - delay: number When provided, the queue will be flushed + * automatically after an inactivity of this delay + * in milliseconds. + * Default value is null. + * - max: number When the queue exceeds the given maximum number + * of entries, the queue is flushed automatically. + * Default value of max is Infinity. + * @param options + */ + Queue.prototype.setOptions = function (options) { + if (options && typeof options.delay !== 'undefined') { + this.delay = options.delay; + } + if (options && typeof options.max !== 'undefined') { + this.max = options.max; + } + + this._flushIfNeeded(); + }; + + /** + * Extend an object with queuing functionality. + * The object will be extended with a function flush, and the methods provided + * in options.replace will be replaced with queued ones. + * @param {Object} object + * @param {Object} options + * Available options: + * - replace: Array. + * A list with method names of the methods + * on the object to be replaced with queued ones. + * - delay: number When provided, the queue will be flushed + * automatically after an inactivity of this delay + * in milliseconds. + * Default value is null. + * - max: number When the queue exceeds the given maximum number + * of entries, the queue is flushed automatically. + * Default value of max is Infinity. + * @return {Queue} Returns the created queue + */ + Queue.extend = function (object, options) { + var queue = new Queue(options); + + if (object.flush !== undefined) { + throw new Error('Target object already has a property flush'); + } + object.flush = function () { + queue.flush(); + }; + + var methods = [{ + name: 'flush', + original: undefined + }]; + + if (options && options.replace) { + for (var i = 0; i < options.replace.length; i++) { + var name = options.replace[i]; + methods.push({ + name: name, + original: object[name] + }); + queue.replace(object, name); + } + } + + queue._extended = { + object: object, + methods: methods + }; + + return queue; + }; + + /** + * Destroy the queue. The queue will first flush all queued actions, and in + * case it has extended an object, will restore the original object. + */ + Queue.prototype.destroy = function () { + this.flush(); + + if (this._extended) { + var object = this._extended.object; + var methods = this._extended.methods; + for (var i = 0; i < methods.length; i++) { + var method = methods[i]; + if (method.original) { + object[method.name] = method.original; + } + else { + delete object[method.name]; + } + } + this._extended = null; + } + }; + + /** + * Replace a method on an object with a queued version + * @param {Object} object Object having the method + * @param {string} method The method name + */ + Queue.prototype.replace = function(object, method) { + var me = this; + var original = object[method]; + if (!original) { + throw new Error('Method ' + method + ' undefined'); + } + + object[method] = function () { + // create an Array with the arguments + var args = []; + for (var i = 0; i < arguments.length; i++) { + args[i] = arguments[i]; + } + + // add this call to the queue + me.queue({ + args: args, + fn: original, + context: this + }); + }; + }; + + /** + * Queue a call + * @param {function | {fn: function, args: Array} | {fn: function, args: Array, context: Object}} entry + */ + Queue.prototype.queue = function(entry) { + if (typeof entry === 'function') { + this._queue.push({fn: entry}); + } + else { + this._queue.push(entry); + } + + this._flushIfNeeded(); + }; + + /** + * Check whether the queue needs to be flushed + * @private + */ + Queue.prototype._flushIfNeeded = function () { + // flush when the maximum is exceeded. + if (this._queue.length > this.max) { + this.flush(); + } + + // flush after a period of inactivity when a delay is configured + clearTimeout(this._timeout); + if (this.queue.length > 0 && typeof this.delay === 'number') { + var me = this; + this._timeout = setTimeout(function () { + me.flush(); + }, this.delay); + } + }; + + /** + * Flush all queued calls + */ + Queue.prototype.flush = function () { + while (this._queue.length > 0) { + var entry = this._queue.shift(); + entry.fn.apply(entry.context || entry.fn, entry.args || []); + } + }; + + module.exports = Queue; + + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + var Emitter = __webpack_require__(56); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var util = __webpack_require__(1); + var Point3d = __webpack_require__(11); + var Point2d = __webpack_require__(9); + var Camera = __webpack_require__(7); + var Filter = __webpack_require__(8); + var Slider = __webpack_require__(10); + var StepNumber = __webpack_require__(12); + + /** + * @constructor Graph3d + * Graph3d displays data in 3d. + * + * Graph3d is developed in javascript as a Google Visualization Chart. + * + * @param {Element} container The DOM element in which the Graph3d will + * be created. Normally a div element. + * @param {DataSet | DataView | Array} [data] + * @param {Object} [options] + */ + function Graph3d(container, data, options) { + if (!(this instanceof Graph3d)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + // create variables and set default values + this.containerElement = container; + this.width = '400px'; + this.height = '400px'; + this.margin = 10; // px + this.defaultXCenter = '55%'; + this.defaultYCenter = '50%'; + + this.xLabel = 'x'; + this.yLabel = 'y'; + this.zLabel = 'z'; + + var passValueFn = function(v) { return v; }; + this.xValueLabel = passValueFn; + this.yValueLabel = passValueFn; + this.zValueLabel = passValueFn; + + this.filterLabel = 'time'; + this.legendLabel = 'value'; + + this.style = Graph3d.STYLE.DOT; + this.showPerspective = true; + this.showGrid = true; + this.keepAspectRatio = true; + this.showShadow = false; + this.showGrayBottom = false; // TODO: this does not work correctly + this.showTooltip = false; + this.verticalRatio = 0.5; // 0.1 to 1.0, where 1.0 results in a 'cube' + + this.animationInterval = 1000; // milliseconds + this.animationPreload = false; + + this.camera = new Camera(); + this.eye = new Point3d(0, 0, -1); // TODO: set eye.z about 3/4 of the width of the window? + + this.dataTable = null; // The original data table + this.dataPoints = null; // The table with point objects + + // the column indexes + this.colX = undefined; + this.colY = undefined; + this.colZ = undefined; + this.colValue = undefined; + this.colFilter = undefined; + + this.xMin = 0; + this.xStep = undefined; // auto by default + this.xMax = 1; + this.yMin = 0; + this.yStep = undefined; // auto by default + this.yMax = 1; + this.zMin = 0; + this.zStep = undefined; // auto by default + this.zMax = 1; + this.valueMin = 0; + this.valueMax = 1; + this.xBarWidth = 1; + this.yBarWidth = 1; + // TODO: customize axis range + + // constants + this.colorAxis = '#4D4D4D'; + this.colorGrid = '#D3D3D3'; + this.colorDot = '#7DC1FF'; + this.colorDotBorder = '#3267D2'; + + // create a frame and canvas + this.create(); + + // apply options (also when undefined) + this.setOptions(options); + + // apply data + if (data) { + this.setData(data); + } + } + + // Extend Graph3d with an Emitter mixin + Emitter(Graph3d.prototype); + + /** + * Calculate the scaling values, dependent on the range in x, y, and z direction + */ + Graph3d.prototype._setScale = function() { + this.scale = new Point3d(1 / (this.xMax - this.xMin), + 1 / (this.yMax - this.yMin), + 1 / (this.zMax - this.zMin)); + + // keep aspect ration between x and y scale if desired + if (this.keepAspectRatio) { + if (this.scale.x < this.scale.y) { + //noinspection JSSuspiciousNameCombination + this.scale.y = this.scale.x; + } + else { + //noinspection JSSuspiciousNameCombination + this.scale.x = this.scale.y; + } + } + + // scale the vertical axis + this.scale.z *= this.verticalRatio; + // TODO: can this be automated? verticalRatio? + + // determine scale for (optional) value + this.scale.value = 1 / (this.valueMax - this.valueMin); + + // position the camera arm + var xCenter = (this.xMax + this.xMin) / 2 * this.scale.x; + var yCenter = (this.yMax + this.yMin) / 2 * this.scale.y; + var zCenter = (this.zMax + this.zMin) / 2 * this.scale.z; + this.camera.setArmLocation(xCenter, yCenter, zCenter); + }; + + + /** + * Convert a 3D location to a 2D location on screen + * http://en.wikipedia.org/wiki/3D_projection + * @param {Point3d} point3d A 3D point with parameters x, y, z + * @return {Point2d} point2d A 2D point with parameters x, y + */ + Graph3d.prototype._convert3Dto2D = function(point3d) { + var translation = this._convertPointToTranslation(point3d); + return this._convertTranslationToScreen(translation); + }; + + /** + * Convert a 3D location its translation seen from the camera + * http://en.wikipedia.org/wiki/3D_projection + * @param {Point3d} point3d A 3D point with parameters x, y, z + * @return {Point3d} translation A 3D point with parameters x, y, z This is + * the translation of the point, seen from the + * camera + */ + Graph3d.prototype._convertPointToTranslation = function(point3d) { + var ax = point3d.x * this.scale.x, + ay = point3d.y * this.scale.y, + az = point3d.z * this.scale.z, + + cx = this.camera.getCameraLocation().x, + cy = this.camera.getCameraLocation().y, + cz = this.camera.getCameraLocation().z, + + // calculate angles + sinTx = Math.sin(this.camera.getCameraRotation().x), + cosTx = Math.cos(this.camera.getCameraRotation().x), + sinTy = Math.sin(this.camera.getCameraRotation().y), + cosTy = Math.cos(this.camera.getCameraRotation().y), + sinTz = Math.sin(this.camera.getCameraRotation().z), + cosTz = Math.cos(this.camera.getCameraRotation().z), + + // calculate translation + dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz), + dy = sinTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) + cosTx * (cosTz * (ay - cy) - sinTz * (ax-cx)), + dz = cosTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) - sinTx * (cosTz * (ay - cy) - sinTz * (ax-cx)); + + return new Point3d(dx, dy, dz); + }; + + /** + * Convert a translation point to a point on the screen + * @param {Point3d} translation A 3D point with parameters x, y, z This is + * the translation of the point, seen from the + * camera + * @return {Point2d} point2d A 2D point with parameters x, y + */ + Graph3d.prototype._convertTranslationToScreen = function(translation) { + var ex = this.eye.x, + ey = this.eye.y, + ez = this.eye.z, + dx = translation.x, + dy = translation.y, + dz = translation.z; + + // calculate position on screen from translation + var bx; + var by; + if (this.showPerspective) { + bx = (dx - ex) * (ez / dz); + by = (dy - ey) * (ez / dz); + } + else { + bx = dx * -(ez / this.camera.getArmLength()); + by = dy * -(ez / this.camera.getArmLength()); + } + + // shift and scale the point to the center of the screen + // use the width of the graph to scale both horizontally and vertically. + return new Point2d( + this.xcenter + bx * this.frame.canvas.clientWidth, + this.ycenter - by * this.frame.canvas.clientWidth); + }; + + /** + * Set the background styling for the graph + * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor + */ + Graph3d.prototype._setBackgroundColor = function(backgroundColor) { + var fill = 'white'; + var stroke = 'gray'; + var strokeWidth = 1; + + if (typeof(backgroundColor) === 'string') { + fill = backgroundColor; + stroke = 'none'; + strokeWidth = 0; + } + else if (typeof(backgroundColor) === 'object') { + if (backgroundColor.fill !== undefined) fill = backgroundColor.fill; + if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke; + if (backgroundColor.strokeWidth !== undefined) strokeWidth = backgroundColor.strokeWidth; + } + else if (backgroundColor === undefined) { + // use use defaults + } + else { + throw 'Unsupported type of backgroundColor'; + } + + this.frame.style.backgroundColor = fill; + this.frame.style.borderColor = stroke; + this.frame.style.borderWidth = strokeWidth + 'px'; + this.frame.style.borderStyle = 'solid'; + }; + + + /// enumerate the available styles + Graph3d.STYLE = { + BAR: 0, + BARCOLOR: 1, + BARSIZE: 2, + DOT : 3, + DOTLINE : 4, + DOTCOLOR: 5, + DOTSIZE: 6, + GRID : 7, + LINE: 8, + SURFACE : 9 + }; + + /** + * Retrieve the style index from given styleName + * @param {string} styleName Style name such as 'dot', 'grid', 'dot-line' + * @return {Number} styleNumber Enumeration value representing the style, or -1 + * when not found + */ + Graph3d.prototype._getStyleNumber = function(styleName) { + switch (styleName) { + case 'dot': return Graph3d.STYLE.DOT; + case 'dot-line': return Graph3d.STYLE.DOTLINE; + case 'dot-color': return Graph3d.STYLE.DOTCOLOR; + case 'dot-size': return Graph3d.STYLE.DOTSIZE; + case 'line': return Graph3d.STYLE.LINE; + case 'grid': return Graph3d.STYLE.GRID; + case 'surface': return Graph3d.STYLE.SURFACE; + case 'bar': return Graph3d.STYLE.BAR; + case 'bar-color': return Graph3d.STYLE.BARCOLOR; + case 'bar-size': return Graph3d.STYLE.BARSIZE; + } + + return -1; + }; + + /** + * Determine the indexes of the data columns, based on the given style and data + * @param {DataSet} data + * @param {Number} style + */ + Graph3d.prototype._determineColumnIndexes = function(data, style) { + if (this.style === Graph3d.STYLE.DOT || + this.style === Graph3d.STYLE.DOTLINE || + this.style === Graph3d.STYLE.LINE || + this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE || + this.style === Graph3d.STYLE.BAR) { + // 3 columns expected, and optionally a 4th with filter values + this.colX = 0; + this.colY = 1; + this.colZ = 2; + this.colValue = undefined; + + if (data.getNumberOfColumns() > 3) { + this.colFilter = 3; + } + } + else if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + // 4 columns expected, and optionally a 5th with filter values + this.colX = 0; + this.colY = 1; + this.colZ = 2; + this.colValue = 3; + + if (data.getNumberOfColumns() > 4) { + this.colFilter = 4; + } + } + else { + throw 'Unknown style "' + this.style + '"'; + } + }; + + Graph3d.prototype.getNumberOfRows = function(data) { + return data.length; + } + + + Graph3d.prototype.getNumberOfColumns = function(data) { + var counter = 0; + for (var column in data[0]) { + if (data[0].hasOwnProperty(column)) { + counter++; + } + } + return counter; + } + + + Graph3d.prototype.getDistinctValues = function(data, column) { + var distinctValues = []; + for (var i = 0; i < data.length; i++) { + if (distinctValues.indexOf(data[i][column]) == -1) { + distinctValues.push(data[i][column]); + } + } + return distinctValues; + } + + + Graph3d.prototype.getColumnRange = function(data,column) { + var minMax = {min:data[0][column],max:data[0][column]}; + for (var i = 0; i < data.length; i++) { + if (minMax.min > data[i][column]) { minMax.min = data[i][column]; } + if (minMax.max < data[i][column]) { minMax.max = data[i][column]; } + } + return minMax; + }; + + /** + * Initialize the data from the data table. Calculate minimum and maximum values + * and column index values + * @param {Array | DataSet | DataView} rawData The data containing the items for the Graph. + * @param {Number} style Style Number + */ + Graph3d.prototype._dataInitialize = function (rawData, style) { + var me = this; + + // unsubscribe from the dataTable + if (this.dataSet) { + this.dataSet.off('*', this._onChange); + } + + if (rawData === undefined) + return; + + if (Array.isArray(rawData)) { + rawData = new DataSet(rawData); + } + + var data; + if (rawData instanceof DataSet || rawData instanceof DataView) { + data = rawData.get(); + } + else { + throw new Error('Array, DataSet, or DataView expected'); + } + + if (data.length == 0) + return; + + this.dataSet = rawData; + this.dataTable = data; + + // subscribe to changes in the dataset + this._onChange = function () { + me.setData(me.dataSet); + }; + this.dataSet.on('*', this._onChange); + + // _determineColumnIndexes + // getNumberOfRows (points) + // getNumberOfColumns (x,y,z,v,t,t1,t2...) + // getDistinctValues (unique values?) + // getColumnRange + + // determine the location of x,y,z,value,filter columns + this.colX = 'x'; + this.colY = 'y'; + this.colZ = 'z'; + this.colValue = 'style'; + this.colFilter = 'filter'; + + + + // check if a filter column is provided + if (data[0].hasOwnProperty('filter')) { + if (this.dataFilter === undefined) { + this.dataFilter = new Filter(rawData, this.colFilter, this); + this.dataFilter.setOnLoadCallback(function() {me.redraw();}); + } + } + + + var withBars = this.style == Graph3d.STYLE.BAR || + this.style == Graph3d.STYLE.BARCOLOR || + this.style == Graph3d.STYLE.BARSIZE; + + // determine barWidth from data + if (withBars) { + if (this.defaultXBarWidth !== undefined) { + this.xBarWidth = this.defaultXBarWidth; + } + else { + var dataX = this.getDistinctValues(data,this.colX); + this.xBarWidth = (dataX[1] - dataX[0]) || 1; + } + + if (this.defaultYBarWidth !== undefined) { + this.yBarWidth = this.defaultYBarWidth; + } + else { + var dataY = this.getDistinctValues(data,this.colY); + this.yBarWidth = (dataY[1] - dataY[0]) || 1; + } + } + + // calculate minimums and maximums + var xRange = this.getColumnRange(data,this.colX); + if (withBars) { + xRange.min -= this.xBarWidth / 2; + xRange.max += this.xBarWidth / 2; + } + this.xMin = (this.defaultXMin !== undefined) ? this.defaultXMin : xRange.min; + this.xMax = (this.defaultXMax !== undefined) ? this.defaultXMax : xRange.max; + if (this.xMax <= this.xMin) this.xMax = this.xMin + 1; + this.xStep = (this.defaultXStep !== undefined) ? this.defaultXStep : (this.xMax-this.xMin)/5; + + var yRange = this.getColumnRange(data,this.colY); + if (withBars) { + yRange.min -= this.yBarWidth / 2; + yRange.max += this.yBarWidth / 2; + } + this.yMin = (this.defaultYMin !== undefined) ? this.defaultYMin : yRange.min; + this.yMax = (this.defaultYMax !== undefined) ? this.defaultYMax : yRange.max; + if (this.yMax <= this.yMin) this.yMax = this.yMin + 1; + this.yStep = (this.defaultYStep !== undefined) ? this.defaultYStep : (this.yMax-this.yMin)/5; + + var zRange = this.getColumnRange(data,this.colZ); + this.zMin = (this.defaultZMin !== undefined) ? this.defaultZMin : zRange.min; + this.zMax = (this.defaultZMax !== undefined) ? this.defaultZMax : zRange.max; + if (this.zMax <= this.zMin) this.zMax = this.zMin + 1; + this.zStep = (this.defaultZStep !== undefined) ? this.defaultZStep : (this.zMax-this.zMin)/5; + + if (this.colValue !== undefined) { + var valueRange = this.getColumnRange(data,this.colValue); + this.valueMin = (this.defaultValueMin !== undefined) ? this.defaultValueMin : valueRange.min; + this.valueMax = (this.defaultValueMax !== undefined) ? this.defaultValueMax : valueRange.max; + if (this.valueMax <= this.valueMin) this.valueMax = this.valueMin + 1; + } + + // set the scale dependent on the ranges. + this._setScale(); + }; + + + + /** + * Filter the data based on the current filter + * @param {Array} data + * @return {Array} dataPoints Array with point objects which can be drawn on screen + */ + Graph3d.prototype._getDataPoints = function (data) { + // TODO: store the created matrix dataPoints in the filters instead of reloading each time + var x, y, i, z, obj, point; + + var dataPoints = []; + + if (this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE) { + // copy all values from the google data table to a matrix + // the provided values are supposed to form a grid of (x,y) positions + + // create two lists with all present x and y values + var dataX = []; + var dataY = []; + for (i = 0; i < this.getNumberOfRows(data); i++) { + x = data[i][this.colX] || 0; + y = data[i][this.colY] || 0; + + if (dataX.indexOf(x) === -1) { + dataX.push(x); + } + if (dataY.indexOf(y) === -1) { + dataY.push(y); + } + } + + var sortNumber = function (a, b) { + return a - b; + }; + dataX.sort(sortNumber); + dataY.sort(sortNumber); + + // create a grid, a 2d matrix, with all values. + var dataMatrix = []; // temporary data matrix + for (i = 0; i < data.length; i++) { + x = data[i][this.colX] || 0; + y = data[i][this.colY] || 0; + z = data[i][this.colZ] || 0; + + var xIndex = dataX.indexOf(x); // TODO: implement Array().indexOf() for Internet Explorer + var yIndex = dataY.indexOf(y); + + if (dataMatrix[xIndex] === undefined) { + dataMatrix[xIndex] = []; + } + + var point3d = new Point3d(); + point3d.x = x; + point3d.y = y; + point3d.z = z; + + obj = {}; + obj.point = point3d; + obj.trans = undefined; + obj.screen = undefined; + obj.bottom = new Point3d(x, y, this.zMin); + + dataMatrix[xIndex][yIndex] = obj; + + dataPoints.push(obj); + } + + // fill in the pointers to the neighbors. + for (x = 0; x < dataMatrix.length; x++) { + for (y = 0; y < dataMatrix[x].length; y++) { + if (dataMatrix[x][y]) { + dataMatrix[x][y].pointRight = (x < dataMatrix.length-1) ? dataMatrix[x+1][y] : undefined; + dataMatrix[x][y].pointTop = (y < dataMatrix[x].length-1) ? dataMatrix[x][y+1] : undefined; + dataMatrix[x][y].pointCross = + (x < dataMatrix.length-1 && y < dataMatrix[x].length-1) ? + dataMatrix[x+1][y+1] : + undefined; + } + } + } + } + else { // 'dot', 'dot-line', etc. + // copy all values from the google data table to a list with Point3d objects + for (i = 0; i < data.length; i++) { + point = new Point3d(); + point.x = data[i][this.colX] || 0; + point.y = data[i][this.colY] || 0; + point.z = data[i][this.colZ] || 0; + + if (this.colValue !== undefined) { + point.value = data[i][this.colValue] || 0; + } + + obj = {}; + obj.point = point; + obj.bottom = new Point3d(point.x, point.y, this.zMin); + obj.trans = undefined; + obj.screen = undefined; + + dataPoints.push(obj); + } + } + + return dataPoints; + }; + + /** + * Create the main frame for the Graph3d. + * This function is executed once when a Graph3d object is created. The frame + * contains a canvas, and this canvas contains all objects like the axis and + * nodes. + */ + Graph3d.prototype.create = function () { + // remove all elements from the container element. + while (this.containerElement.hasChildNodes()) { + this.containerElement.removeChild(this.containerElement.firstChild); + } + + this.frame = document.createElement('div'); + this.frame.style.position = 'relative'; + this.frame.style.overflow = 'hidden'; + + // create the graph canvas (HTML canvas element) + this.frame.canvas = document.createElement( 'canvas' ); + this.frame.canvas.style.position = 'relative'; + this.frame.appendChild(this.frame.canvas); + //if (!this.frame.canvas.getContext) { + { + var noCanvas = document.createElement( 'DIV' ); + noCanvas.style.color = 'red'; + noCanvas.style.fontWeight = 'bold' ; + noCanvas.style.padding = '10px'; + noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; + this.frame.canvas.appendChild(noCanvas); + } + + this.frame.filter = document.createElement( 'div' ); + this.frame.filter.style.position = 'absolute'; + this.frame.filter.style.bottom = '0px'; + this.frame.filter.style.left = '0px'; + this.frame.filter.style.width = '100%'; + this.frame.appendChild(this.frame.filter); + + // add event listeners to handle moving and zooming the contents + var me = this; + var onmousedown = function (event) {me._onMouseDown(event);}; + var ontouchstart = function (event) {me._onTouchStart(event);}; + var onmousewheel = function (event) {me._onWheel(event);}; + var ontooltip = function (event) {me._onTooltip(event);}; + // TODO: these events are never cleaned up... can give a 'memory leakage' + + util.addEventListener(this.frame.canvas, 'keydown', onkeydown); + util.addEventListener(this.frame.canvas, 'mousedown', onmousedown); + util.addEventListener(this.frame.canvas, 'touchstart', ontouchstart); + util.addEventListener(this.frame.canvas, 'mousewheel', onmousewheel); + util.addEventListener(this.frame.canvas, 'mousemove', ontooltip); + + // add the new graph to the container element + this.containerElement.appendChild(this.frame); + }; + + + /** + * Set a new size for the graph + * @param {string} width Width in pixels or percentage (for example '800px' + * or '50%') + * @param {string} height Height in pixels or percentage (for example '400px' + * or '30%') + */ + Graph3d.prototype.setSize = function(width, height) { + this.frame.style.width = width; + this.frame.style.height = height; + + this._resizeCanvas(); + }; + + /** + * Resize the canvas to the current size of the frame + */ + Graph3d.prototype._resizeCanvas = function() { + this.frame.canvas.style.width = '100%'; + this.frame.canvas.style.height = '100%'; + + this.frame.canvas.width = this.frame.canvas.clientWidth; + this.frame.canvas.height = this.frame.canvas.clientHeight; + + // adjust with for margin + this.frame.filter.style.width = (this.frame.canvas.clientWidth - 2 * 10) + 'px'; + }; + + /** + * Start animation + */ + Graph3d.prototype.animationStart = function() { + if (!this.frame.filter || !this.frame.filter.slider) + throw 'No animation available'; + + this.frame.filter.slider.play(); + }; + + + /** + * Stop animation + */ + Graph3d.prototype.animationStop = function() { + if (!this.frame.filter || !this.frame.filter.slider) return; + + this.frame.filter.slider.stop(); + }; + + + /** + * Resize the center position based on the current values in this.defaultXCenter + * and this.defaultYCenter (which are strings with a percentage or a value + * in pixels). The center positions are the variables this.xCenter + * and this.yCenter + */ + Graph3d.prototype._resizeCenter = function() { + // calculate the horizontal center position + if (this.defaultXCenter.charAt(this.defaultXCenter.length-1) === '%') { + this.xcenter = + parseFloat(this.defaultXCenter) / 100 * + this.frame.canvas.clientWidth; + } + else { + this.xcenter = parseFloat(this.defaultXCenter); // supposed to be in px + } + + // calculate the vertical center position + if (this.defaultYCenter.charAt(this.defaultYCenter.length-1) === '%') { + this.ycenter = + parseFloat(this.defaultYCenter) / 100 * + (this.frame.canvas.clientHeight - this.frame.filter.clientHeight); + } + else { + this.ycenter = parseFloat(this.defaultYCenter); // supposed to be in px + } + }; + + /** + * Set the rotation and distance of the camera + * @param {Object} pos An object with the camera position. The object + * contains three parameters: + * - horizontal {Number} + * The horizontal rotation, between 0 and 2*PI. + * Optional, can be left undefined. + * - vertical {Number} + * The vertical rotation, between 0 and 0.5*PI + * if vertical=0.5*PI, the graph is shown from the + * top. Optional, can be left undefined. + * - distance {Number} + * The (normalized) distance of the camera to the + * center of the graph, a value between 0.71 and 5.0. + * Optional, can be left undefined. + */ + Graph3d.prototype.setCameraPosition = function(pos) { + if (pos === undefined) { + return; + } + + if (pos.horizontal !== undefined && pos.vertical !== undefined) { + this.camera.setArmRotation(pos.horizontal, pos.vertical); + } + + if (pos.distance !== undefined) { + this.camera.setArmLength(pos.distance); + } + + this.redraw(); + }; + + + /** + * Retrieve the current camera rotation + * @return {object} An object with parameters horizontal, vertical, and + * distance + */ + Graph3d.prototype.getCameraPosition = function() { + var pos = this.camera.getArmRotation(); + pos.distance = this.camera.getArmLength(); + return pos; + }; + + /** + * Load data into the 3D Graph + */ + Graph3d.prototype._readData = function(data) { + // read the data + this._dataInitialize(data, this.style); + + + if (this.dataFilter) { + // apply filtering + this.dataPoints = this.dataFilter._getDataPoints(); + } + else { + // no filtering. load all data + this.dataPoints = this._getDataPoints(this.dataTable); + } + + // draw the filter + this._redrawFilter(); + }; + + /** + * Replace the dataset of the Graph3d + * @param {Array | DataSet | DataView} data + */ + Graph3d.prototype.setData = function (data) { + this._readData(data); + this.redraw(); + + // start animation when option is true + if (this.animationAutoStart && this.dataFilter) { + this.animationStart(); + } + }; + + /** + * Update the options. Options will be merged with current options + * @param {Object} options + */ + Graph3d.prototype.setOptions = function (options) { + var cameraPosition = undefined; + + this.animationStop(); + + if (options !== undefined) { + // retrieve parameter values + if (options.width !== undefined) this.width = options.width; + if (options.height !== undefined) this.height = options.height; + + if (options.xCenter !== undefined) this.defaultXCenter = options.xCenter; + if (options.yCenter !== undefined) this.defaultYCenter = options.yCenter; + + if (options.filterLabel !== undefined) this.filterLabel = options.filterLabel; + if (options.legendLabel !== undefined) this.legendLabel = options.legendLabel; + if (options.xLabel !== undefined) this.xLabel = options.xLabel; + if (options.yLabel !== undefined) this.yLabel = options.yLabel; + if (options.zLabel !== undefined) this.zLabel = options.zLabel; + + if (options.xValueLabel !== undefined) this.xValueLabel = options.xValueLabel; + if (options.yValueLabel !== undefined) this.yValueLabel = options.yValueLabel; + if (options.zValueLabel !== undefined) this.zValueLabel = options.zValueLabel; + + if (options.style !== undefined) { + var styleNumber = this._getStyleNumber(options.style); + if (styleNumber !== -1) { + this.style = styleNumber; + } + } + if (options.showGrid !== undefined) this.showGrid = options.showGrid; + if (options.showPerspective !== undefined) this.showPerspective = options.showPerspective; + if (options.showShadow !== undefined) this.showShadow = options.showShadow; + if (options.tooltip !== undefined) this.showTooltip = options.tooltip; + if (options.showAnimationControls !== undefined) this.showAnimationControls = options.showAnimationControls; + if (options.keepAspectRatio !== undefined) this.keepAspectRatio = options.keepAspectRatio; + if (options.verticalRatio !== undefined) this.verticalRatio = options.verticalRatio; + + if (options.animationInterval !== undefined) this.animationInterval = options.animationInterval; + if (options.animationPreload !== undefined) this.animationPreload = options.animationPreload; + if (options.animationAutoStart !== undefined)this.animationAutoStart = options.animationAutoStart; + + if (options.xBarWidth !== undefined) this.defaultXBarWidth = options.xBarWidth; + if (options.yBarWidth !== undefined) this.defaultYBarWidth = options.yBarWidth; + + if (options.xMin !== undefined) this.defaultXMin = options.xMin; + if (options.xStep !== undefined) this.defaultXStep = options.xStep; + if (options.xMax !== undefined) this.defaultXMax = options.xMax; + if (options.yMin !== undefined) this.defaultYMin = options.yMin; + if (options.yStep !== undefined) this.defaultYStep = options.yStep; + if (options.yMax !== undefined) this.defaultYMax = options.yMax; + if (options.zMin !== undefined) this.defaultZMin = options.zMin; + if (options.zStep !== undefined) this.defaultZStep = options.zStep; + if (options.zMax !== undefined) this.defaultZMax = options.zMax; + if (options.valueMin !== undefined) this.defaultValueMin = options.valueMin; + if (options.valueMax !== undefined) this.defaultValueMax = options.valueMax; + + if (options.cameraPosition !== undefined) cameraPosition = options.cameraPosition; + + if (cameraPosition !== undefined) { + this.camera.setArmRotation(cameraPosition.horizontal, cameraPosition.vertical); + this.camera.setArmLength(cameraPosition.distance); + } + else { + this.camera.setArmRotation(1.0, 0.5); + this.camera.setArmLength(1.7); + } + } + + this._setBackgroundColor(options && options.backgroundColor); + + this.setSize(this.width, this.height); + + // re-load the data + if (this.dataTable) { + this.setData(this.dataTable); + } + + // start animation when option is true + if (this.animationAutoStart && this.dataFilter) { + this.animationStart(); + } + }; + + /** + * Redraw the Graph. + */ + Graph3d.prototype.redraw = function() { + if (this.dataPoints === undefined) { + throw 'Error: graph data not initialized'; + } + + this._resizeCanvas(); + this._resizeCenter(); + this._redrawSlider(); + this._redrawClear(); + this._redrawAxis(); + + if (this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE) { + this._redrawDataGrid(); + } + else if (this.style === Graph3d.STYLE.LINE) { + this._redrawDataLine(); + } + else if (this.style === Graph3d.STYLE.BAR || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + this._redrawDataBar(); + } + else { + // style is DOT, DOTLINE, DOTCOLOR, DOTSIZE + this._redrawDataDot(); + } + + this._redrawInfo(); + this._redrawLegend(); + }; + + /** + * Clear the canvas before redrawing + */ + Graph3d.prototype._redrawClear = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + + ctx.clearRect(0, 0, canvas.width, canvas.height); + }; + + + /** + * Redraw the legend showing the colors + */ + Graph3d.prototype._redrawLegend = function() { + var y; + + if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE) { + + var dotSize = this.frame.clientWidth * 0.02; + + var widthMin, widthMax; + if (this.style === Graph3d.STYLE.DOTSIZE) { + widthMin = dotSize / 2; // px + widthMax = dotSize / 2 + dotSize * 2; // Todo: put this in one function + } + else { + widthMin = 20; // px + widthMax = 20; // px + } + + var height = Math.max(this.frame.clientHeight * 0.25, 100); + var top = this.margin; + var right = this.frame.clientWidth - this.margin; + var left = right - widthMax; + var bottom = top + height; + } + + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + ctx.lineWidth = 1; + ctx.font = '14px arial'; // TODO: put in options + + if (this.style === Graph3d.STYLE.DOTCOLOR) { + // draw the color bar + var ymin = 0; + var ymax = height; // Todo: make height customizable + for (y = ymin; y < ymax; y++) { + var f = (y - ymin) / (ymax - ymin); + + //var width = (dotSize / 2 + (1-f) * dotSize * 2); // Todo: put this in one function + var hue = f * 240; + var color = this._hsv2rgb(hue, 1, 1); + + ctx.strokeStyle = color; + ctx.beginPath(); + ctx.moveTo(left, top + y); + ctx.lineTo(right, top + y); + ctx.stroke(); + } + + ctx.strokeStyle = this.colorAxis; + ctx.strokeRect(left, top, widthMax, height); + } + + if (this.style === Graph3d.STYLE.DOTSIZE) { + // draw border around color bar + ctx.strokeStyle = this.colorAxis; + ctx.fillStyle = this.colorDot; + ctx.beginPath(); + ctx.moveTo(left, top); + ctx.lineTo(right, top); + ctx.lineTo(right - widthMax + widthMin, bottom); + ctx.lineTo(left, bottom); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + + if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE) { + // print values along the color bar + var gridLineLen = 5; // px + var step = new StepNumber(this.valueMin, this.valueMax, (this.valueMax-this.valueMin)/5, true); + step.start(); + if (step.getCurrent() < this.valueMin) { + step.next(); + } + while (!step.end()) { + y = bottom - (step.getCurrent() - this.valueMin) / (this.valueMax - this.valueMin) * height; + + ctx.beginPath(); + ctx.moveTo(left - gridLineLen, y); + ctx.lineTo(left, y); + ctx.stroke(); + + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y); + + step.next(); + } + + ctx.textAlign = 'right'; + ctx.textBaseline = 'top'; + var label = this.legendLabel; + ctx.fillText(label, right, bottom + this.margin); + } + }; + + /** + * Redraw the filter + */ + Graph3d.prototype._redrawFilter = function() { + this.frame.filter.innerHTML = ''; + + if (this.dataFilter) { + var options = { + 'visible': this.showAnimationControls + }; + var slider = new Slider(this.frame.filter, options); + this.frame.filter.slider = slider; + + // TODO: css here is not nice here... + this.frame.filter.style.padding = '10px'; + //this.frame.filter.style.backgroundColor = '#EFEFEF'; + + slider.setValues(this.dataFilter.values); + slider.setPlayInterval(this.animationInterval); + + // create an event handler + var me = this; + var onchange = function () { + var index = slider.getIndex(); + + me.dataFilter.selectValue(index); + me.dataPoints = me.dataFilter._getDataPoints(); + + me.redraw(); + }; + slider.setOnChangeCallback(onchange); + } + else { + this.frame.filter.slider = undefined; + } + }; + + /** + * Redraw the slider + */ + Graph3d.prototype._redrawSlider = function() { + if ( this.frame.filter.slider !== undefined) { + this.frame.filter.slider.redraw(); + } + }; + + + /** + * Redraw common information + */ + Graph3d.prototype._redrawInfo = function() { + if (this.dataFilter) { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + + ctx.font = '14px arial'; // TODO: put in options + ctx.lineStyle = 'gray'; + ctx.fillStyle = 'gray'; + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + var x = this.margin; + var y = this.margin; + ctx.fillText(this.dataFilter.getLabel() + ': ' + this.dataFilter.getSelectedValue(), x, y); + } + }; + + + /** + * Redraw the axis + */ + Graph3d.prototype._redrawAxis = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + from, to, step, prettyStep, + text, xText, yText, zText, + offset, xOffset, yOffset, + xMin2d, xMax2d; + + // TODO: get the actual rendered style of the containerElement + //ctx.font = this.containerElement.style.font; + ctx.font = 24 / this.camera.getArmLength() + 'px arial'; + + // calculate the length for the short grid lines + var gridLenX = 0.025 / this.scale.x; + var gridLenY = 0.025 / this.scale.y; + var textMargin = 5 / this.camera.getArmLength(); // px + var armAngle = this.camera.getArmRotation().horizontal; + + // draw x-grid lines + ctx.lineWidth = 1; + prettyStep = (this.defaultXStep === undefined); + step = new StepNumber(this.xMin, this.xMax, this.xStep, prettyStep); + step.start(); + if (step.getCurrent() < this.xMin) { + step.next(); + } + while (!step.end()) { + var x = step.getCurrent(); + + if (this.showGrid) { + from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } + else { + from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMin+gridLenX, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + + from = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMax-gridLenX, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } + + yText = (Math.cos(armAngle) > 0) ? this.yMin : this.yMax; + text = this._convert3Dto2D(new Point3d(x, yText, this.zMin)); + if (Math.cos(armAngle * 2) > 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + text.y += textMargin; + } + else if (Math.sin(armAngle * 2) < 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(' ' + this.xValueLabel(step.getCurrent()) + ' ', text.x, text.y); + + step.next(); + } + + // draw y-grid lines + ctx.lineWidth = 1; + prettyStep = (this.defaultYStep === undefined); + step = new StepNumber(this.yMin, this.yMax, this.yStep, prettyStep); + step.start(); + if (step.getCurrent() < this.yMin) { + step.next(); + } + while (!step.end()) { + if (this.showGrid) { + from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } + else { + from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMin+gridLenY, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + + from = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax-gridLenY, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } + + xText = (Math.sin(armAngle ) > 0) ? this.xMin : this.xMax; + text = this._convert3Dto2D(new Point3d(xText, step.getCurrent(), this.zMin)); + if (Math.cos(armAngle * 2) < 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + text.y += textMargin; + } + else if (Math.sin(armAngle * 2) > 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(' ' + this.yValueLabel(step.getCurrent()) + ' ', text.x, text.y); + + step.next(); + } + + // draw z-grid lines and axis + ctx.lineWidth = 1; + prettyStep = (this.defaultZStep === undefined); + step = new StepNumber(this.zMin, this.zMax, this.zStep, prettyStep); + step.start(); + if (step.getCurrent() < this.zMin) { + step.next(); + } + xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; + yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; + while (!step.end()) { + // TODO: make z-grid lines really 3d? + from = this._convert3Dto2D(new Point3d(xText, yText, step.getCurrent())); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(from.x - textMargin, from.y); + ctx.stroke(); + + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(this.zValueLabel(step.getCurrent()) + ' ', from.x - 5, from.y); + + step.next(); + } + ctx.lineWidth = 1; + from = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + to = this._convert3Dto2D(new Point3d(xText, yText, this.zMax)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + + // draw x-axis + ctx.lineWidth = 1; + // line at yMin + xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); + xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(xMin2d.x, xMin2d.y); + ctx.lineTo(xMax2d.x, xMax2d.y); + ctx.stroke(); + // line at ymax + xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); + xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(xMin2d.x, xMin2d.y); + ctx.lineTo(xMax2d.x, xMax2d.y); + ctx.stroke(); + + // draw y-axis + ctx.lineWidth = 1; + // line at xMin + from = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + // line at xMax + from = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + + // draw x-label + var xLabel = this.xLabel; + if (xLabel.length > 0) { + yOffset = 0.1 / this.scale.y; + xText = (this.xMin + this.xMax) / 2; + yText = (Math.cos(armAngle) > 0) ? this.yMin - yOffset: this.yMax + yOffset; + text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + if (Math.cos(armAngle * 2) > 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + } + else if (Math.sin(armAngle * 2) < 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(xLabel, text.x, text.y); + } + + // draw y-label + var yLabel = this.yLabel; + if (yLabel.length > 0) { + xOffset = 0.1 / this.scale.x; + xText = (Math.sin(armAngle ) > 0) ? this.xMin - xOffset : this.xMax + xOffset; + yText = (this.yMin + this.yMax) / 2; + text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + if (Math.cos(armAngle * 2) < 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + } + else if (Math.sin(armAngle * 2) > 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(yLabel, text.x, text.y); + } + + // draw z-label + var zLabel = this.zLabel; + if (zLabel.length > 0) { + offset = 30; // pixels. // TODO: relate to the max width of the values on the z axis? + xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; + yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; + zText = (this.zMin + this.zMax) / 2; + text = this._convert3Dto2D(new Point3d(xText, yText, zText)); + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(zLabel, text.x - offset, text.y); + } + }; + + /** + * Calculate the color based on the given value. + * @param {Number} H Hue, a value be between 0 and 360 + * @param {Number} S Saturation, a value between 0 and 1 + * @param {Number} V Value, a value between 0 and 1 + */ + Graph3d.prototype._hsv2rgb = function(H, S, V) { + var R, G, B, C, Hi, X; + + C = V * S; + Hi = Math.floor(H/60); // hi = 0,1,2,3,4,5 + X = C * (1 - Math.abs(((H/60) % 2) - 1)); + + switch (Hi) { + case 0: R = C; G = X; B = 0; break; + case 1: R = X; G = C; B = 0; break; + case 2: R = 0; G = C; B = X; break; + case 3: R = 0; G = X; B = C; break; + case 4: R = X; G = 0; B = C; break; + case 5: R = C; G = 0; B = X; break; + + default: R = 0; G = 0; B = 0; break; + } + + return 'RGB(' + parseInt(R*255) + ',' + parseInt(G*255) + ',' + parseInt(B*255) + ')'; + }; + + + /** + * Draw all datapoints as a grid + * This function can be used when the style is 'grid' + */ + Graph3d.prototype._redrawDataGrid = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + point, right, top, cross, + i, + topSideVisible, fillStyle, strokeStyle, lineWidth, + h, s, v, zAvg; + + + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? + + // calculate the translations and screen position of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; + + // calculate the translation of the point at the bottom (needed for sorting) + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; + } + + // sort the points on depth of their (x,y) position (not on z) + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); + + if (this.style === Graph3d.STYLE.SURFACE) { + for (i = 0; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + right = this.dataPoints[i].pointRight; + top = this.dataPoints[i].pointTop; + cross = this.dataPoints[i].pointCross; + + if (point !== undefined && right !== undefined && top !== undefined && cross !== undefined) { + + if (this.showGrayBottom || this.showShadow) { + // calculate the cross product of the two vectors from center + // to left and right, in order to know whether we are looking at the + // bottom or at the top side. We can also use the cross product + // for calculating light intensity + var aDiff = Point3d.subtract(cross.trans, point.trans); + var bDiff = Point3d.subtract(top.trans, right.trans); + var crossproduct = Point3d.crossProduct(aDiff, bDiff); + var len = crossproduct.length(); + // FIXME: there is a bug with determining the surface side (shadow or colored) + + topSideVisible = (crossproduct.z > 0); + } + else { + topSideVisible = true; + } + + if (topSideVisible) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + right.point.z + top.point.z + cross.point.z) / 4; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + s = 1; // saturation + + if (this.showShadow) { + v = Math.min(1 + (crossproduct.x / len) / 2, 1); // value. TODO: scale + fillStyle = this._hsv2rgb(h, s, v); + strokeStyle = fillStyle; + } + else { + v = 1; + fillStyle = this._hsv2rgb(h, s, v); + strokeStyle = this.colorAxis; + } + } + else { + fillStyle = 'gray'; + strokeStyle = this.colorAxis; + } + lineWidth = 0.5; + + ctx.lineWidth = lineWidth; + ctx.fillStyle = fillStyle; + ctx.strokeStyle = strokeStyle; + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(right.screen.x, right.screen.y); + ctx.lineTo(cross.screen.x, cross.screen.y); + ctx.lineTo(top.screen.x, top.screen.y); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + } + } + else { // grid style + for (i = 0; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + right = this.dataPoints[i].pointRight; + top = this.dataPoints[i].pointTop; + + if (point !== undefined) { + if (this.showPerspective) { + lineWidth = 2 / -point.trans.z; + } + else { + lineWidth = 2 * -(this.eye.z / this.camera.getArmLength()); + } + } + + if (point !== undefined && right !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + right.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + + ctx.lineWidth = lineWidth; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(right.screen.x, right.screen.y); + ctx.stroke(); + } + + if (point !== undefined && top !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + top.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + + ctx.lineWidth = lineWidth; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(top.screen.x, top.screen.y); + ctx.stroke(); + } + } + } + }; + + + /** + * Draw all datapoints as dots. + * This function can be used when the style is 'dot' or 'dot-line' + */ + Graph3d.prototype._redrawDataDot = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + var i; + + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? + + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; + + // calculate the distance from the point at the bottom to the camera + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; + } + + // order the translated points by depth + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); + + // draw the datapoints as colored circles + var dotSize = this.frame.clientWidth * 0.02; // px + for (i = 0; i < this.dataPoints.length; i++) { + var point = this.dataPoints[i]; + + if (this.style === Graph3d.STYLE.DOTLINE) { + // draw a vertical line from the bottom to the graph value + //var from = this._convert3Dto2D(new Point3d(point.point.x, point.point.y, this.zMin)); + var from = this._convert3Dto2D(point.bottom); + ctx.lineWidth = 1; + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(point.screen.x, point.screen.y); + ctx.stroke(); + } + + // calculate radius for the circle + var size; + if (this.style === Graph3d.STYLE.DOTSIZE) { + size = dotSize/2 + 2*dotSize * (point.point.value - this.valueMin) / (this.valueMax - this.valueMin); + } + else { + size = dotSize; + } + + var radius; + if (this.showPerspective) { + radius = size / -point.trans.z; + } + else { + radius = size * -(this.eye.z / this.camera.getArmLength()); + } + if (radius < 0) { + radius = 0; + } + + var hue, color, borderColor; + if (this.style === Graph3d.STYLE.DOTCOLOR ) { + // calculate the color based on the value + hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + else if (this.style === Graph3d.STYLE.DOTSIZE) { + color = this.colorDot; + borderColor = this.colorDotBorder; + } + else { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + + // draw the circle + ctx.lineWidth = 1.0; + ctx.strokeStyle = borderColor; + ctx.fillStyle = color; + ctx.beginPath(); + ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI*2, true); + ctx.fill(); + ctx.stroke(); + } + }; + + /** + * Draw all datapoints as bars. + * This function can be used when the style is 'bar', 'bar-color', or 'bar-size' + */ + Graph3d.prototype._redrawDataBar = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + var i, j, surface, corners; + + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? + + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; + + // calculate the distance from the point at the bottom to the camera + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; + } + + // order the translated points by depth + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); + + // draw the datapoints as bars + var xWidth = this.xBarWidth / 2; + var yWidth = this.yBarWidth / 2; + for (i = 0; i < this.dataPoints.length; i++) { + var point = this.dataPoints[i]; + + // determine color + var hue, color, borderColor; + if (this.style === Graph3d.STYLE.BARCOLOR ) { + // calculate the color based on the value + hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + else if (this.style === Graph3d.STYLE.BARSIZE) { + color = this.colorDot; + borderColor = this.colorDotBorder; + } + else { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + + // calculate size for the bar + if (this.style === Graph3d.STYLE.BARSIZE) { + xWidth = (this.xBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); + yWidth = (this.yBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); + } + + // calculate all corner points + var me = this; + var point3d = point.point; + var top = [ + {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z)}, + {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z)}, + {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z)}, + {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z)} + ]; + var bottom = [ + {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, this.zMin)}, + {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, this.zMin)}, + {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, this.zMin)}, + {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, this.zMin)} + ]; + + // calculate screen location of the points + top.forEach(function (obj) { + obj.screen = me._convert3Dto2D(obj.point); + }); + bottom.forEach(function (obj) { + obj.screen = me._convert3Dto2D(obj.point); + }); + + // create five sides, calculate both corner points and center points + var surfaces = [ + {corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point)}, + {corners: [top[0], top[1], bottom[1], bottom[0]], center: Point3d.avg(bottom[1].point, bottom[0].point)}, + {corners: [top[1], top[2], bottom[2], bottom[1]], center: Point3d.avg(bottom[2].point, bottom[1].point)}, + {corners: [top[2], top[3], bottom[3], bottom[2]], center: Point3d.avg(bottom[3].point, bottom[2].point)}, + {corners: [top[3], top[0], bottom[0], bottom[3]], center: Point3d.avg(bottom[0].point, bottom[3].point)} + ]; + point.surfaces = surfaces; + + // calculate the distance of each of the surface centers to the camera + for (j = 0; j < surfaces.length; j++) { + surface = surfaces[j]; + var transCenter = this._convertPointToTranslation(surface.center); + surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z; + // TODO: this dept calculation doesn't work 100% of the cases due to perspective, + // but the current solution is fast/simple and works in 99.9% of all cases + // the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9}) + } + + // order the surfaces by their (translated) depth + surfaces.sort(function (a, b) { + var diff = b.dist - a.dist; + if (diff) return diff; + + // if equal depth, sort the top surface last + if (a.corners === top) return 1; + if (b.corners === top) return -1; + + // both are equal + return 0; + }); + + // draw the ordered surfaces + ctx.lineWidth = 1; + ctx.strokeStyle = borderColor; + ctx.fillStyle = color; + // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside + for (j = 2; j < surfaces.length; j++) { + surface = surfaces[j]; + corners = surface.corners; + ctx.beginPath(); + ctx.moveTo(corners[3].screen.x, corners[3].screen.y); + ctx.lineTo(corners[0].screen.x, corners[0].screen.y); + ctx.lineTo(corners[1].screen.x, corners[1].screen.y); + ctx.lineTo(corners[2].screen.x, corners[2].screen.y); + ctx.lineTo(corners[3].screen.x, corners[3].screen.y); + ctx.fill(); + ctx.stroke(); + } + } + }; + + + /** + * Draw a line through all datapoints. + * This function can be used when the style is 'line' + */ + Graph3d.prototype._redrawDataLine = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + point, i; + + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? + + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; + } + + // start the line + if (this.dataPoints.length > 0) { + point = this.dataPoints[0]; + + ctx.lineWidth = 1; // TODO: make customizable + ctx.strokeStyle = 'blue'; // TODO: make customizable + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + } + + // draw the datapoints as colored circles + for (i = 1; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + ctx.lineTo(point.screen.x, point.screen.y); + } + + // finish the line + if (this.dataPoints.length > 0) { + ctx.stroke(); + } + }; + + /** + * Start a moving operation inside the provided parent element + * @param {Event} event The event that occurred (required for + * retrieving the mouse position) + */ + Graph3d.prototype._onMouseDown = function(event) { + event = event || window.event; + + // check if mouse is still down (may be up when focus is lost for example + // in an iframe) + if (this.leftButtonDown) { + this._onMouseUp(event); + } + + // only react on left mouse button down + this.leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); + if (!this.leftButtonDown && !this.touchDown) return; + + // get mouse position (different code for IE and all other browsers) + this.startMouseX = getMouseX(event); + this.startMouseY = getMouseY(event); + + this.startStart = new Date(this.start); + this.startEnd = new Date(this.end); + this.startArmRotation = this.camera.getArmRotation(); + + this.frame.style.cursor = 'move'; + + // add event listeners to handle moving the contents + // we store the function onmousemove and onmouseup in the graph, so we can + // remove the eventlisteners lateron in the function mouseUp() + var me = this; + this.onmousemove = function (event) {me._onMouseMove(event);}; + this.onmouseup = function (event) {me._onMouseUp(event);}; + util.addEventListener(document, 'mousemove', me.onmousemove); + util.addEventListener(document, 'mouseup', me.onmouseup); + util.preventDefault(event); + }; + + + /** + * Perform moving operating. + * This function activated from within the funcion Graph.mouseDown(). + * @param {Event} event Well, eehh, the event + */ + Graph3d.prototype._onMouseMove = function (event) { + event = event || window.event; + + // calculate change in mouse position + var diffX = parseFloat(getMouseX(event)) - this.startMouseX; + var diffY = parseFloat(getMouseY(event)) - this.startMouseY; + + var horizontalNew = this.startArmRotation.horizontal + diffX / 200; + var verticalNew = this.startArmRotation.vertical + diffY / 200; + + var snapAngle = 4; // degrees + var snapValue = Math.sin(snapAngle / 360 * 2 * Math.PI); + + // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc... + // the -0.001 is to take care that the vertical axis is always drawn at the left front corner + if (Math.abs(Math.sin(horizontalNew)) < snapValue) { + horizontalNew = Math.round((horizontalNew / Math.PI)) * Math.PI - 0.001; + } + if (Math.abs(Math.cos(horizontalNew)) < snapValue) { + horizontalNew = (Math.round((horizontalNew/ Math.PI - 0.5)) + 0.5) * Math.PI - 0.001; + } + + // snap vertically to nice angles + if (Math.abs(Math.sin(verticalNew)) < snapValue) { + verticalNew = Math.round((verticalNew / Math.PI)) * Math.PI; + } + if (Math.abs(Math.cos(verticalNew)) < snapValue) { + verticalNew = (Math.round((verticalNew/ Math.PI - 0.5)) + 0.5) * Math.PI; + } + + this.camera.setArmRotation(horizontalNew, verticalNew); + this.redraw(); + + // fire a cameraPositionChange event + var parameters = this.getCameraPosition(); + this.emit('cameraPositionChange', parameters); + + util.preventDefault(event); + }; + + + /** + * Stop moving operating. + * This function activated from within the funcion Graph.mouseDown(). + * @param {event} event The event + */ + Graph3d.prototype._onMouseUp = function (event) { + this.frame.style.cursor = 'auto'; + this.leftButtonDown = false; + + // remove event listeners here + util.removeEventListener(document, 'mousemove', this.onmousemove); + util.removeEventListener(document, 'mouseup', this.onmouseup); + util.preventDefault(event); + }; + + /** + * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point + * @param {Event} event A mouse move event + */ + Graph3d.prototype._onTooltip = function (event) { + var delay = 300; // ms + var boundingRect = this.frame.getBoundingClientRect(); + var mouseX = getMouseX(event) - boundingRect.left; + var mouseY = getMouseY(event) - boundingRect.top; + + if (!this.showTooltip) { + return; + } + + if (this.tooltipTimeout) { + clearTimeout(this.tooltipTimeout); + } + + // (delayed) display of a tooltip only if no mouse button is down + if (this.leftButtonDown) { + this._hideTooltip(); + return; + } + + if (this.tooltip && this.tooltip.dataPoint) { + // tooltip is currently visible + var dataPoint = this._dataPointFromXY(mouseX, mouseY); + if (dataPoint !== this.tooltip.dataPoint) { + // datapoint changed + if (dataPoint) { + this._showTooltip(dataPoint); + } + else { + this._hideTooltip(); + } + } + } + else { + // tooltip is currently not visible + var me = this; + this.tooltipTimeout = setTimeout(function () { + me.tooltipTimeout = null; + + // show a tooltip if we have a data point + var dataPoint = me._dataPointFromXY(mouseX, mouseY); + if (dataPoint) { + me._showTooltip(dataPoint); + } + }, delay); + } + }; + + /** + * Event handler for touchstart event on mobile devices + */ + Graph3d.prototype._onTouchStart = function(event) { + this.touchDown = true; + + var me = this; + this.ontouchmove = function (event) {me._onTouchMove(event);}; + this.ontouchend = function (event) {me._onTouchEnd(event);}; + util.addEventListener(document, 'touchmove', me.ontouchmove); + util.addEventListener(document, 'touchend', me.ontouchend); + + this._onMouseDown(event); + }; + + /** + * Event handler for touchmove event on mobile devices + */ + Graph3d.prototype._onTouchMove = function(event) { + this._onMouseMove(event); + }; + + /** + * Event handler for touchend event on mobile devices + */ + Graph3d.prototype._onTouchEnd = function(event) { + this.touchDown = false; + + util.removeEventListener(document, 'touchmove', this.ontouchmove); + util.removeEventListener(document, 'touchend', this.ontouchend); + + this._onMouseUp(event); + }; + + + /** + * Event handler for mouse wheel event, used to zoom the graph + * Code from http://adomas.org/javascript-mouse-wheel/ + * @param {event} event The event + */ + Graph3d.prototype._onWheel = function(event) { + if (!event) /* For IE. */ + event = window.event; + + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta/120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail/3; + } + + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + var oldLength = this.camera.getArmLength(); + var newLength = oldLength * (1 - delta / 10); + + this.camera.setArmLength(newLength); + this.redraw(); + + this._hideTooltip(); + } + + // fire a cameraPositionChange event + var parameters = this.getCameraPosition(); + this.emit('cameraPositionChange', parameters); + + // Prevent default actions caused by mouse wheel. + // That might be ugly, but we handle scrolls somehow + // anyway, so don't bother here.. + util.preventDefault(event); + }; + + /** + * Test whether a point lies inside given 2D triangle + * @param {Point2d} point + * @param {Point2d[]} triangle + * @return {boolean} Returns true if given point lies inside or on the edge of the triangle + * @private + */ + Graph3d.prototype._insideTriangle = function (point, triangle) { + var a = triangle[0], + b = triangle[1], + c = triangle[2]; + + function sign (x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + } + + var as = sign((b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x)); + var bs = sign((c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x)); + var cs = sign((a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x)); + + // each of the three signs must be either equal to each other or zero + return (as == 0 || bs == 0 || as == bs) && + (bs == 0 || cs == 0 || bs == cs) && + (as == 0 || cs == 0 || as == cs); + }; + + /** + * Find a data point close to given screen position (x, y) + * @param {Number} x + * @param {Number} y + * @return {Object | null} The closest data point or null if not close to any data point + * @private + */ + Graph3d.prototype._dataPointFromXY = function (x, y) { + var i, + distMax = 100, // px + dataPoint = null, + closestDataPoint = null, + closestDist = null, + center = new Point2d(x, y); + + if (this.style === Graph3d.STYLE.BAR || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + // the data points are ordered from far away to closest + for (i = this.dataPoints.length - 1; i >= 0; i--) { + dataPoint = this.dataPoints[i]; + var surfaces = dataPoint.surfaces; + if (surfaces) { + for (var s = surfaces.length - 1; s >= 0; s--) { + // split each surface in two triangles, and see if the center point is inside one of these + var surface = surfaces[s]; + var corners = surface.corners; + var triangle1 = [corners[0].screen, corners[1].screen, corners[2].screen]; + var triangle2 = [corners[2].screen, corners[3].screen, corners[0].screen]; + if (this._insideTriangle(center, triangle1) || + this._insideTriangle(center, triangle2)) { + // return immediately at the first hit + return dataPoint; + } + } + } + } + } + else { + // find the closest data point, using distance to the center of the point on 2d screen + for (i = 0; i < this.dataPoints.length; i++) { + dataPoint = this.dataPoints[i]; + var point = dataPoint.screen; + if (point) { + var distX = Math.abs(x - point.x); + var distY = Math.abs(y - point.y); + var dist = Math.sqrt(distX * distX + distY * distY); + + if ((closestDist === null || dist < closestDist) && dist < distMax) { + closestDist = dist; + closestDataPoint = dataPoint; + } + } + } + } + + + return closestDataPoint; + }; + + /** + * Display a tooltip for given data point + * @param {Object} dataPoint + * @private + */ + Graph3d.prototype._showTooltip = function (dataPoint) { + var content, line, dot; + + if (!this.tooltip) { + content = document.createElement('div'); + content.style.position = 'absolute'; + content.style.padding = '10px'; + content.style.border = '1px solid #4d4d4d'; + content.style.color = '#1a1a1a'; + content.style.background = 'rgba(255,255,255,0.7)'; + content.style.borderRadius = '2px'; + content.style.boxShadow = '5px 5px 10px rgba(128,128,128,0.5)'; + + line = document.createElement('div'); + line.style.position = 'absolute'; + line.style.height = '40px'; + line.style.width = '0'; + line.style.borderLeft = '1px solid #4d4d4d'; + + dot = document.createElement('div'); + dot.style.position = 'absolute'; + dot.style.height = '0'; + dot.style.width = '0'; + dot.style.border = '5px solid #4d4d4d'; + dot.style.borderRadius = '5px'; + + this.tooltip = { + dataPoint: null, + dom: { + content: content, + line: line, + dot: dot + } + }; + } + else { + content = this.tooltip.dom.content; + line = this.tooltip.dom.line; + dot = this.tooltip.dom.dot; + } + + this._hideTooltip(); + + this.tooltip.dataPoint = dataPoint; + if (typeof this.showTooltip === 'function') { + content.innerHTML = this.showTooltip(dataPoint.point); + } + else { + content.innerHTML = '' + + '' + + '' + + '' + + '
x:' + dataPoint.point.x + '
y:' + dataPoint.point.y + '
z:' + dataPoint.point.z + '
'; + } + + content.style.left = '0'; + content.style.top = '0'; + this.frame.appendChild(content); + this.frame.appendChild(line); + this.frame.appendChild(dot); + + // calculate sizes + var contentWidth = content.offsetWidth; + var contentHeight = content.offsetHeight; + var lineHeight = line.offsetHeight; + var dotWidth = dot.offsetWidth; + var dotHeight = dot.offsetHeight; + + var left = dataPoint.screen.x - contentWidth / 2; + left = Math.min(Math.max(left, 10), this.frame.clientWidth - 10 - contentWidth); + + line.style.left = dataPoint.screen.x + 'px'; + line.style.top = (dataPoint.screen.y - lineHeight) + 'px'; + content.style.left = left + 'px'; + content.style.top = (dataPoint.screen.y - lineHeight - contentHeight) + 'px'; + dot.style.left = (dataPoint.screen.x - dotWidth / 2) + 'px'; + dot.style.top = (dataPoint.screen.y - dotHeight / 2) + 'px'; + }; + + /** + * Hide the tooltip when displayed + * @private + */ + Graph3d.prototype._hideTooltip = function () { + if (this.tooltip) { + this.tooltip.dataPoint = null; + + for (var prop in this.tooltip.dom) { + if (this.tooltip.dom.hasOwnProperty(prop)) { + var elem = this.tooltip.dom[prop]; + if (elem && elem.parentNode) { + elem.parentNode.removeChild(elem); + } + } + } + } + }; + + /**--------------------------------------------------------------------------**/ + + + /** + * Get the horizontal mouse position from a mouse event + * @param {Event} event + * @return {Number} mouse x + */ + function getMouseX (event) { + if ('clientX' in event) return event.clientX; + return event.targetTouches[0] && event.targetTouches[0].clientX || 0; + } + + /** + * Get the vertical mouse position from a mouse event + * @param {Event} event + * @return {Number} mouse y + */ + function getMouseY (event) { + if ('clientY' in event) return event.clientY; + return event.targetTouches[0] && event.targetTouches[0].clientY || 0; + } + + module.exports = Graph3d; + + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + var Point3d = __webpack_require__(11); + + /** + * @class Camera + * The camera is mounted on a (virtual) camera arm. The camera arm can rotate + * The camera is always looking in the direction of the origin of the arm. + * This way, the camera always rotates around one fixed point, the location + * of the camera arm. + * + * Documentation: + * http://en.wikipedia.org/wiki/3D_projection + */ + function Camera() { + this.armLocation = new Point3d(); + this.armRotation = {}; + this.armRotation.horizontal = 0; + this.armRotation.vertical = 0; + this.armLength = 1.7; + + this.cameraLocation = new Point3d(); + this.cameraRotation = new Point3d(0.5*Math.PI, 0, 0); + + this.calculateCameraOrientation(); + } + + /** + * Set the location (origin) of the arm + * @param {Number} x Normalized value of x + * @param {Number} y Normalized value of y + * @param {Number} z Normalized value of z + */ + Camera.prototype.setArmLocation = function(x, y, z) { + this.armLocation.x = x; + this.armLocation.y = y; + this.armLocation.z = z; + + this.calculateCameraOrientation(); + }; + + /** + * Set the rotation of the camera arm + * @param {Number} horizontal The horizontal rotation, between 0 and 2*PI. + * Optional, can be left undefined. + * @param {Number} vertical The vertical rotation, between 0 and 0.5*PI + * if vertical=0.5*PI, the graph is shown from the + * top. Optional, can be left undefined. + */ + Camera.prototype.setArmRotation = function(horizontal, vertical) { + if (horizontal !== undefined) { + this.armRotation.horizontal = horizontal; + } + + if (vertical !== undefined) { + this.armRotation.vertical = vertical; + if (this.armRotation.vertical < 0) this.armRotation.vertical = 0; + if (this.armRotation.vertical > 0.5*Math.PI) this.armRotation.vertical = 0.5*Math.PI; + } + + if (horizontal !== undefined || vertical !== undefined) { + this.calculateCameraOrientation(); + } + }; + + /** + * Retrieve the current arm rotation + * @return {object} An object with parameters horizontal and vertical + */ + Camera.prototype.getArmRotation = function() { + var rot = {}; + rot.horizontal = this.armRotation.horizontal; + rot.vertical = this.armRotation.vertical; + + return rot; + }; + + /** + * Set the (normalized) length of the camera arm. + * @param {Number} length A length between 0.71 and 5.0 + */ + Camera.prototype.setArmLength = function(length) { + if (length === undefined) + return; + + this.armLength = length; + + // Radius must be larger than the corner of the graph, + // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the + // graph + if (this.armLength < 0.71) this.armLength = 0.71; + if (this.armLength > 5.0) this.armLength = 5.0; + + this.calculateCameraOrientation(); + }; + + /** + * Retrieve the arm length + * @return {Number} length + */ + Camera.prototype.getArmLength = function() { + return this.armLength; + }; + + /** + * Retrieve the camera location + * @return {Point3d} cameraLocation + */ + Camera.prototype.getCameraLocation = function() { + return this.cameraLocation; + }; + + /** + * Retrieve the camera rotation + * @return {Point3d} cameraRotation + */ + Camera.prototype.getCameraRotation = function() { + return this.cameraRotation; + }; + + /** + * Calculate the location and rotation of the camera based on the + * position and orientation of the camera arm + */ + Camera.prototype.calculateCameraOrientation = function() { + // calculate location of the camera + this.cameraLocation.x = this.armLocation.x - this.armLength * Math.sin(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); + this.cameraLocation.y = this.armLocation.y - this.armLength * Math.cos(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); + this.cameraLocation.z = this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical); + + // calculate rotation of the camera + this.cameraRotation.x = Math.PI/2 - this.armRotation.vertical; + this.cameraRotation.y = 0; + this.cameraRotation.z = -this.armRotation.horizontal; + }; + + module.exports = Camera; + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + var DataView = __webpack_require__(4); + + /** + * @class Filter + * + * @param {DataSet} data The google data table + * @param {Number} column The index of the column to be filtered + * @param {Graph} graph The graph + */ + function Filter (data, column, graph) { + this.data = data; + this.column = column; + this.graph = graph; // the parent graph + + this.index = undefined; + this.value = undefined; + + // read all distinct values and select the first one + this.values = graph.getDistinctValues(data.get(), this.column); + + // sort both numeric and string values correctly + this.values.sort(function (a, b) { + return a > b ? 1 : a < b ? -1 : 0; + }); + + if (this.values.length > 0) { + this.selectValue(0); + } + + // create an array with the filtered datapoints. this will be loaded afterwards + this.dataPoints = []; + + this.loaded = false; + this.onLoadCallback = undefined; + + if (graph.animationPreload) { + this.loaded = false; + this.loadInBackground(); + } + else { + this.loaded = true; + } + }; + + + /** + * Return the label + * @return {string} label + */ + Filter.prototype.isLoaded = function() { + return this.loaded; + }; + + + /** + * Return the loaded progress + * @return {Number} percentage between 0 and 100 + */ + Filter.prototype.getLoadedProgress = function() { + var len = this.values.length; + + var i = 0; + while (this.dataPoints[i]) { + i++; + } + + return Math.round(i / len * 100); + }; + + + /** + * Return the label + * @return {string} label + */ + Filter.prototype.getLabel = function() { + return this.graph.filterLabel; + }; + + + /** + * Return the columnIndex of the filter + * @return {Number} columnIndex + */ + Filter.prototype.getColumn = function() { + return this.column; + }; + + /** + * Return the currently selected value. Returns undefined if there is no selection + * @return {*} value + */ + Filter.prototype.getSelectedValue = function() { + if (this.index === undefined) + return undefined; + + return this.values[this.index]; + }; + + /** + * Retrieve all values of the filter + * @return {Array} values + */ + Filter.prototype.getValues = function() { + return this.values; + }; + + /** + * Retrieve one value of the filter + * @param {Number} index + * @return {*} value + */ + Filter.prototype.getValue = function(index) { + if (index >= this.values.length) + throw 'Error: index out of range'; + + return this.values[index]; + }; + + + /** + * Retrieve the (filtered) dataPoints for the currently selected filter index + * @param {Number} [index] (optional) + * @return {Array} dataPoints + */ + Filter.prototype._getDataPoints = function(index) { + if (index === undefined) + index = this.index; + + if (index === undefined) + return []; + + var dataPoints; + if (this.dataPoints[index]) { + dataPoints = this.dataPoints[index]; + } + else { + var f = {}; + f.column = this.column; + f.value = this.values[index]; + + var dataView = new DataView(this.data,{filter: function (item) {return (item[f.column] == f.value);}}).get(); + dataPoints = this.graph._getDataPoints(dataView); + + this.dataPoints[index] = dataPoints; + } + + return dataPoints; + }; + + + + /** + * Set a callback function when the filter is fully loaded. + */ + Filter.prototype.setOnLoadCallback = function(callback) { + this.onLoadCallback = callback; + }; + + + /** + * Add a value to the list with available values for this filter + * No double entries will be created. + * @param {Number} index + */ + Filter.prototype.selectValue = function(index) { + if (index >= this.values.length) + throw 'Error: index out of range'; + + this.index = index; + this.value = this.values[index]; + }; + + /** + * Load all filtered rows in the background one by one + * Start this method without providing an index! + */ + Filter.prototype.loadInBackground = function(index) { + if (index === undefined) + index = 0; + + var frame = this.graph.frame; + + if (index < this.values.length) { + var dataPointsTemp = this._getDataPoints(index); + //this.graph.redrawInfo(); // TODO: not neat + + // create a progress box + if (frame.progress === undefined) { + frame.progress = document.createElement('DIV'); + frame.progress.style.position = 'absolute'; + frame.progress.style.color = 'gray'; + frame.appendChild(frame.progress); + } + var progress = this.getLoadedProgress(); + frame.progress.innerHTML = 'Loading animation... ' + progress + '%'; + // TODO: this is no nice solution... + frame.progress.style.bottom = 60 + 'px'; // TODO: use height of slider + frame.progress.style.left = 10 + 'px'; + + var me = this; + setTimeout(function() {me.loadInBackground(index+1);}, 10); + this.loaded = false; + } + else { + this.loaded = true; + + // remove the progress box + if (frame.progress !== undefined) { + frame.removeChild(frame.progress); + frame.progress = undefined; + } + + if (this.onLoadCallback) + this.onLoadCallback(); + } + }; + + module.exports = Filter; + + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @prototype Point2d + * @param {Number} [x] + * @param {Number} [y] + */ + function Point2d (x, y) { + this.x = x !== undefined ? x : 0; + this.y = y !== undefined ? y : 0; + } + + module.exports = Point2d; + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + + /** + * @constructor Slider + * + * An html slider control with start/stop/prev/next buttons + * @param {Element} container The element where the slider will be created + * @param {Object} options Available options: + * {boolean} visible If true (default) the + * slider is visible. + */ + function Slider(container, options) { + if (container === undefined) { + throw 'Error: No container element defined'; + } + this.container = container; + this.visible = (options && options.visible != undefined) ? options.visible : true; + + if (this.visible) { + this.frame = document.createElement('DIV'); + //this.frame.style.backgroundColor = '#E5E5E5'; + this.frame.style.width = '100%'; + this.frame.style.position = 'relative'; + this.container.appendChild(this.frame); + + this.frame.prev = document.createElement('INPUT'); + this.frame.prev.type = 'BUTTON'; + this.frame.prev.value = 'Prev'; + this.frame.appendChild(this.frame.prev); + + this.frame.play = document.createElement('INPUT'); + this.frame.play.type = 'BUTTON'; + this.frame.play.value = 'Play'; + this.frame.appendChild(this.frame.play); + + this.frame.next = document.createElement('INPUT'); + this.frame.next.type = 'BUTTON'; + this.frame.next.value = 'Next'; + this.frame.appendChild(this.frame.next); + + this.frame.bar = document.createElement('INPUT'); + this.frame.bar.type = 'BUTTON'; + this.frame.bar.style.position = 'absolute'; + this.frame.bar.style.border = '1px solid red'; + this.frame.bar.style.width = '100px'; + this.frame.bar.style.height = '6px'; + this.frame.bar.style.borderRadius = '2px'; + this.frame.bar.style.MozBorderRadius = '2px'; + this.frame.bar.style.border = '1px solid #7F7F7F'; + this.frame.bar.style.backgroundColor = '#E5E5E5'; + this.frame.appendChild(this.frame.bar); + + this.frame.slide = document.createElement('INPUT'); + this.frame.slide.type = 'BUTTON'; + this.frame.slide.style.margin = '0px'; + this.frame.slide.value = ' '; + this.frame.slide.style.position = 'relative'; + this.frame.slide.style.left = '-100px'; + this.frame.appendChild(this.frame.slide); + + // create events + var me = this; + this.frame.slide.onmousedown = function (event) {me._onMouseDown(event);}; + this.frame.prev.onclick = function (event) {me.prev(event);}; + this.frame.play.onclick = function (event) {me.togglePlay(event);}; + this.frame.next.onclick = function (event) {me.next(event);}; + } + + this.onChangeCallback = undefined; + + this.values = []; + this.index = undefined; + + this.playTimeout = undefined; + this.playInterval = 1000; // milliseconds + this.playLoop = true; + } + + /** + * Select the previous index + */ + Slider.prototype.prev = function() { + var index = this.getIndex(); + if (index > 0) { + index--; + this.setIndex(index); + } + }; + + /** + * Select the next index + */ + Slider.prototype.next = function() { + var index = this.getIndex(); + if (index < this.values.length - 1) { + index++; + this.setIndex(index); + } + }; + + /** + * Select the next index + */ + Slider.prototype.playNext = function() { + var start = new Date(); + + var index = this.getIndex(); + if (index < this.values.length - 1) { + index++; + this.setIndex(index); + } + else if (this.playLoop) { + // jump to the start + index = 0; + this.setIndex(index); + } + + var end = new Date(); + var diff = (end - start); + + // calculate how much time it to to set the index and to execute the callback + // function. + var interval = Math.max(this.playInterval - diff, 0); + // document.title = diff // TODO: cleanup + + var me = this; + this.playTimeout = setTimeout(function() {me.playNext();}, interval); + }; + + /** + * Toggle start or stop playing + */ + Slider.prototype.togglePlay = function() { + if (this.playTimeout === undefined) { + this.play(); + } else { + this.stop(); + } + }; + + /** + * Start playing + */ + Slider.prototype.play = function() { + // Test whether already playing + if (this.playTimeout) return; + + this.playNext(); + + if (this.frame) { + this.frame.play.value = 'Stop'; + } + }; + + /** + * Stop playing + */ + Slider.prototype.stop = function() { + clearInterval(this.playTimeout); + this.playTimeout = undefined; + + if (this.frame) { + this.frame.play.value = 'Play'; + } + }; + + /** + * Set a callback function which will be triggered when the value of the + * slider bar has changed. + */ + Slider.prototype.setOnChangeCallback = function(callback) { + this.onChangeCallback = callback; + }; + + /** + * Set the interval for playing the list + * @param {Number} interval The interval in milliseconds + */ + Slider.prototype.setPlayInterval = function(interval) { + this.playInterval = interval; + }; + + /** + * Retrieve the current play interval + * @return {Number} interval The interval in milliseconds + */ + Slider.prototype.getPlayInterval = function(interval) { + return this.playInterval; + }; + + /** + * Set looping on or off + * @pararm {boolean} doLoop If true, the slider will jump to the start when + * the end is passed, and will jump to the end + * when the start is passed. + */ + Slider.prototype.setPlayLoop = function(doLoop) { + this.playLoop = doLoop; + }; + + + /** + * Execute the onchange callback function + */ + Slider.prototype.onChange = function() { + if (this.onChangeCallback !== undefined) { + this.onChangeCallback(); + } + }; + + /** + * redraw the slider on the correct place + */ + Slider.prototype.redraw = function() { + if (this.frame) { + // resize the bar + this.frame.bar.style.top = (this.frame.clientHeight/2 - + this.frame.bar.offsetHeight/2) + 'px'; + this.frame.bar.style.width = (this.frame.clientWidth - + this.frame.prev.clientWidth - + this.frame.play.clientWidth - + this.frame.next.clientWidth - 30) + 'px'; + + // position the slider button + var left = this.indexToLeft(this.index); + this.frame.slide.style.left = (left) + 'px'; + } + }; + + + /** + * Set the list with values for the slider + * @param {Array} values A javascript array with values (any type) + */ + Slider.prototype.setValues = function(values) { + this.values = values; + + if (this.values.length > 0) + this.setIndex(0); + else + this.index = undefined; + }; + + /** + * Select a value by its index + * @param {Number} index + */ + Slider.prototype.setIndex = function(index) { + if (index < this.values.length) { + this.index = index; + + this.redraw(); + this.onChange(); + } + else { + throw 'Error: index out of range'; + } + }; + + /** + * retrieve the index of the currently selected vaue + * @return {Number} index + */ + Slider.prototype.getIndex = function() { + return this.index; + }; + + + /** + * retrieve the currently selected value + * @return {*} value + */ + Slider.prototype.get = function() { + return this.values[this.index]; + }; + + + Slider.prototype._onMouseDown = function(event) { + // only react on left mouse button down + var leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); + if (!leftButtonDown) return; + + this.startClientX = event.clientX; + this.startSlideX = parseFloat(this.frame.slide.style.left); + + this.frame.style.cursor = 'move'; + + // add event listeners to handle moving the contents + // we store the function onmousemove and onmouseup in the graph, so we can + // remove the eventlisteners lateron in the function mouseUp() + var me = this; + this.onmousemove = function (event) {me._onMouseMove(event);}; + this.onmouseup = function (event) {me._onMouseUp(event);}; + util.addEventListener(document, 'mousemove', this.onmousemove); + util.addEventListener(document, 'mouseup', this.onmouseup); + util.preventDefault(event); + }; + + + Slider.prototype.leftToIndex = function (left) { + var width = parseFloat(this.frame.bar.style.width) - + this.frame.slide.clientWidth - 10; + var x = left - 3; + + var index = Math.round(x / width * (this.values.length-1)); + if (index < 0) index = 0; + if (index > this.values.length-1) index = this.values.length-1; + + return index; + }; + + Slider.prototype.indexToLeft = function (index) { + var width = parseFloat(this.frame.bar.style.width) - + this.frame.slide.clientWidth - 10; + + var x = index / (this.values.length-1) * width; + var left = x + 3; + + return left; + }; + + + + Slider.prototype._onMouseMove = function (event) { + var diff = event.clientX - this.startClientX; + var x = this.startSlideX + diff; + + var index = this.leftToIndex(x); + + this.setIndex(index); + + util.preventDefault(); + }; + + + Slider.prototype._onMouseUp = function (event) { + this.frame.style.cursor = 'auto'; + + // remove event listeners + util.removeEventListener(document, 'mousemove', this.onmousemove); + util.removeEventListener(document, 'mouseup', this.onmouseup); + + util.preventDefault(); + }; + + module.exports = Slider; + + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @prototype Point3d + * @param {Number} [x] + * @param {Number} [y] + * @param {Number} [z] + */ + function Point3d(x, y, z) { + this.x = x !== undefined ? x : 0; + this.y = y !== undefined ? y : 0; + this.z = z !== undefined ? z : 0; + }; + + /** + * Subtract the two provided points, returns a-b + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} a-b + */ + Point3d.subtract = function(a, b) { + var sub = new Point3d(); + sub.x = a.x - b.x; + sub.y = a.y - b.y; + sub.z = a.z - b.z; + return sub; + }; + + /** + * Add the two provided points, returns a+b + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} a+b + */ + Point3d.add = function(a, b) { + var sum = new Point3d(); + sum.x = a.x + b.x; + sum.y = a.y + b.y; + sum.z = a.z + b.z; + return sum; + }; + + /** + * Calculate the average of two 3d points + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} The average, (a+b)/2 + */ + Point3d.avg = function(a, b) { + return new Point3d( + (a.x + b.x) / 2, + (a.y + b.y) / 2, + (a.z + b.z) / 2 + ); + }; + + /** + * Calculate the cross product of the two provided points, returns axb + * Documentation: http://en.wikipedia.org/wiki/Cross_product + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} cross product axb + */ + Point3d.crossProduct = function(a, b) { + var crossproduct = new Point3d(); + + crossproduct.x = a.y * b.z - a.z * b.y; + crossproduct.y = a.z * b.x - a.x * b.z; + crossproduct.z = a.x * b.y - a.y * b.x; + + return crossproduct; + }; + + + /** + * Rtrieve the length of the vector (or the distance from this point to the origin + * @return {Number} length + */ + Point3d.prototype.length = function() { + return Math.sqrt( + this.x * this.x + + this.y * this.y + + this.z * this.z + ); + }; + + module.exports = Point3d; + + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @prototype StepNumber + * The class StepNumber is an iterator for Numbers. You provide a start and end + * value, and a best step size. StepNumber itself rounds to fixed values and + * a finds the step that best fits the provided step. + * + * If prettyStep is true, the step size is chosen as close as possible to the + * provided step, but being a round value like 1, 2, 5, 10, 20, 50, .... + * + * Example usage: + * var step = new StepNumber(0, 10, 2.5, true); + * step.start(); + * while (!step.end()) { + * alert(step.getCurrent()); + * step.next(); + * } + * + * Version: 1.0 + * + * @param {Number} start The start value + * @param {Number} end The end value + * @param {Number} step Optional. Step size. Must be a positive value. + * @param {boolean} prettyStep Optional. If true, the step size is rounded + * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) + */ + function StepNumber(start, end, step, prettyStep) { + // set default values + this._start = 0; + this._end = 0; + this._step = 1; + this.prettyStep = true; + this.precision = 5; + + this._current = 0; + this.setRange(start, end, step, prettyStep); + }; + + /** + * Set a new range: start, end and step. + * + * @param {Number} start The start value + * @param {Number} end The end value + * @param {Number} step Optional. Step size. Must be a positive value. + * @param {boolean} prettyStep Optional. If true, the step size is rounded + * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) + */ + StepNumber.prototype.setRange = function(start, end, step, prettyStep) { + this._start = start ? start : 0; + this._end = end ? end : 0; + + this.setStep(step, prettyStep); + }; + + /** + * Set a new step size + * @param {Number} step New step size. Must be a positive value + * @param {boolean} prettyStep Optional. If true, the provided step is rounded + * to a pretty step size (like 1, 2, 5, 10, 20, 50, ...) + */ + StepNumber.prototype.setStep = function(step, prettyStep) { + if (step === undefined || step <= 0) + return; + + if (prettyStep !== undefined) + this.prettyStep = prettyStep; + + if (this.prettyStep === true) + this._step = StepNumber.calculatePrettyStep(step); + else + this._step = step; + }; + + /** + * Calculate a nice step size, closest to the desired step size. + * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an + * integer Number. For example 1, 2, 5, 10, 20, 50, etc... + * @param {Number} step Desired step size + * @return {Number} Nice step size + */ + StepNumber.calculatePrettyStep = function (step) { + var log10 = function (x) {return Math.log(x) / Math.LN10;}; + + // try three steps (multiple of 1, 2, or 5 + var step1 = Math.pow(10, Math.round(log10(step))), + step2 = 2 * Math.pow(10, Math.round(log10(step / 2))), + step5 = 5 * Math.pow(10, Math.round(log10(step / 5))); + + // choose the best step (closest to minimum step) + var prettyStep = step1; + if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2; + if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5; + + // for safety + if (prettyStep <= 0) { + prettyStep = 1; + } + + return prettyStep; + }; + + /** + * returns the current value of the step + * @return {Number} current value + */ + StepNumber.prototype.getCurrent = function () { + return parseFloat(this._current.toPrecision(this.precision)); + }; + + /** + * returns the current step size + * @return {Number} current step size + */ + StepNumber.prototype.getStep = function () { + return this._step; + }; + + /** + * Set the current value to the largest value smaller than start, which + * is a multiple of the step size + */ + StepNumber.prototype.start = function() { + this._current = this._start - this._start % this._step; + }; + + /** + * Do a step, add the step size to the current value + */ + StepNumber.prototype.next = function () { + this._current += this._step; + }; + + /** + * Returns true whether the end is reached + * @return {boolean} True if the current value has passed the end value. + */ + StepNumber.prototype.end = function () { + return (this._current > this._end); + }; + + module.exports = StepNumber; + + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Range = __webpack_require__(17); + var Core = __webpack_require__(46); + var TimeAxis = __webpack_require__(35); + var CurrentTime = __webpack_require__(26); + var CustomTime = __webpack_require__(27); + var ItemSet = __webpack_require__(32); + + /** + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | vis.DataView | Array | google.visualization.DataTable} [items] + * @param {vis.DataSet | vis.DataView | Array | google.visualization.DataTable} [groups] + * @param {Object} [options] See Timeline.setOptions for the available options. + * @constructor + * @extends Core + */ + function Timeline (container, items, groups, options) { + if (!(this instanceof Timeline)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + // if the third element is options, the forth is groups (optionally); + if (!(Array.isArray(groups) || groups instanceof DataSet || groups instanceof DataView) && groups instanceof Object) { + var forthArgument = options; + options = groups; + groups = forthArgument; + } + + var me = this; + this.defaultOptions = { + start: null, + end: null, + + autoResize: true, + + orientation: 'bottom', + width: null, + height: null, + maxHeight: null, + minHeight: null + }; + this.options = util.deepExtend({}, this.defaultOptions); + + // Create the DOM, props, and emitter + this._create(container); + + // all components listed here will be repainted automatically + this.components = []; + + this.body = { + dom: this.dom, + domProps: this.props, + emitter: { + on: this.on.bind(this), + off: this.off.bind(this), + emit: this.emit.bind(this) + }, + hiddenDates: [], + util: { + getScale: function () { + return me.timeAxis.step.scale; + }, + getStep: function () { + return me.timeAxis.step.step; + }, + + toScreen: me._toScreen.bind(me), + toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width + toTime: me._toTime.bind(me), + toGlobalTime : me._toGlobalTime.bind(me) + } + }; + + // range + this.range = new Range(this.body); + this.components.push(this.range); + this.body.range = this.range; + + // time axis + this.timeAxis = new TimeAxis(this.body); + this.components.push(this.timeAxis); + + // current time bar + this.currentTime = new CurrentTime(this.body); + this.components.push(this.currentTime); + + // custom time bar + // Note: time bar will be attached in this.setOptions when selected + this.customTime = new CustomTime(this.body); + this.components.push(this.customTime); + + // item set + this.itemSet = new ItemSet(this.body); + this.components.push(this.itemSet); + + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet + + // apply options + if (options) { + this.setOptions(options); + } + + // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! + if (groups) { + this.setGroups(groups); + } + + // create itemset + if (items) { + this.setItems(items); + } + else { + this._redraw(); + } + } + + // Extend the functionality from Core + Timeline.prototype = new Core(); + + /** + * Force a redraw. The size of all items will be recalculated. + * Can be useful to manually redraw when option autoResize=false and the window + * has been resized, or when the items CSS has been changed. + */ + Timeline.prototype.redraw = function() { + this.itemSet && this.itemSet.markDirty({refreshItems: true}); + this._redraw(); + }; + + /** + * Set items + * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + */ + Timeline.prototype.setItems = function(items) { + var initialLoad = (this.itemsData == null); + + // convert to type DataSet when needed + var newDataSet; + if (!items) { + newDataSet = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + newDataSet = items; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(items, { + type: { + start: 'Date', + end: 'Date' + } + }); + } + + // set items + this.itemsData = newDataSet; + this.itemSet && this.itemSet.setItems(newDataSet); + + if (initialLoad) { + if (this.options.start != undefined || this.options.end != undefined) { + if (this.options.start == undefined || this.options.end == undefined) { + var dataRange = this._getDataRange(); + } + + var start = this.options.start != undefined ? this.options.start : dataRange.start; + var end = this.options.end != undefined ? this.options.end : dataRange.end; + + this.setWindow(start, end, {animate: false}); + } + else { + this.fit({animate: false}); + } + } + }; + + /** + * Set groups + * @param {vis.DataSet | Array | google.visualization.DataTable} groups + */ + Timeline.prototype.setGroups = function(groups) { + // convert to type DataSet when needed + var newDataSet; + if (!groups) { + newDataSet = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + newDataSet = groups; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(groups); + } + + this.groupsData = newDataSet; + this.itemSet.setGroups(newDataSet); + }; + + /** + * Set selected items by their id. Replaces the current selection + * Unknown id's are silently ignored. + * @param {string[] | string} [ids] An array with zero or more id's of the items to be + * selected. If ids is an empty array, all items will be + * unselected. + * @param {Object} [options] Available options: + * `focus: boolean` + * If true, focus will be set to the selected item(s) + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. + * Only applicable when option focus is true. + */ + Timeline.prototype.setSelection = function(ids, options) { + this.itemSet && this.itemSet.setSelection(ids); + + if (options && options.focus) { + this.focus(ids, options); + } + }; + + /** + * Get the selected items by their id + * @return {Array} ids The ids of the selected items + */ + Timeline.prototype.getSelection = function() { + return this.itemSet && this.itemSet.getSelection() || []; + }; + + /** + * Adjust the visible window such that the selected item (or multiple items) + * are centered on screen. + * @param {String | String[]} id An item id or array with item ids + * @param {Object} [options] Available options: + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. + * Only applicable when option focus is true + */ + Timeline.prototype.focus = function(id, options) { + if (!this.itemsData || id == undefined) return; + + var ids = Array.isArray(id) ? id : [id]; + + // get the specified item(s) + var itemsData = this.itemsData.getDataSet().get(ids, { + type: { + start: 'Date', + end: 'Date' + } + }); + + // calculate minimum start and maximum end of specified items + var start = null; + var end = null; + itemsData.forEach(function (itemData) { + var s = itemData.start.valueOf(); + var e = 'end' in itemData ? itemData.end.valueOf() : itemData.start.valueOf(); + + if (start === null || s < start) { + start = s; + } + + if (end === null || e > end) { + end = e; + } + }); + + if (start !== null && end !== null) { + // calculate the new middle and interval for the window + var middle = (start + end) / 2; + var interval = Math.max((this.range.end - this.range.start), (end - start) * 1.1); + + var animate = (options && options.animate !== undefined) ? options.animate : true; + this.range.setRange(middle - interval / 2, middle + interval / 2, animate); + } + }; + + /** + * Get the data range of the item set. + * @returns {{min: Date, max: Date}} range A range with a start and end Date. + * When no minimum is found, min==null + * When no maximum is found, max==null + */ + Timeline.prototype.getItemRange = function() { + // calculate min from start filed + var dataset = this.itemsData.getDataSet(), + min = null, + max = null; + + if (dataset) { + // calculate the minimum value of the field 'start' + var minItem = dataset.min('start'); + min = minItem ? util.convert(minItem.start, 'Date').valueOf() : null; + // Note: we convert first to Date and then to number because else + // a conversion from ISODate to Number will fail + + // calculate maximum value of fields 'start' and 'end' + var maxStartItem = dataset.max('start'); + if (maxStartItem) { + max = util.convert(maxStartItem.start, 'Date').valueOf(); + } + var maxEndItem = dataset.max('end'); + if (maxEndItem) { + if (max == null) { + max = util.convert(maxEndItem.end, 'Date').valueOf(); + } + else { + max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); + } + } + } + + return { + min: (min != null) ? new Date(min) : null, + max: (max != null) ? new Date(max) : null + }; + }; + + + module.exports = Timeline; + + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Range = __webpack_require__(17); + var Core = __webpack_require__(46); + var TimeAxis = __webpack_require__(35); + var CurrentTime = __webpack_require__(26); + var CustomTime = __webpack_require__(27); + var LineGraph = __webpack_require__(34); + + /** + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {Object} [options] See Graph2d.setOptions for the available options. + * @constructor + * @extends Core + */ + function Graph2d (container, items, groups, options) { + // if the third element is options, the forth is groups (optionally); + if (!(Array.isArray(groups) || groups instanceof DataSet) && groups instanceof Object) { + var forthArgument = options; + options = groups; + groups = forthArgument; + } + + var me = this; + this.defaultOptions = { + start: null, + end: null, + + autoResize: true, + + orientation: 'bottom', + width: null, + height: null, + maxHeight: null, + minHeight: null + }; + this.options = util.deepExtend({}, this.defaultOptions); + + // Create the DOM, props, and emitter + this._create(container); + + // all components listed here will be repainted automatically + this.components = []; + + this.body = { + dom: this.dom, + domProps: this.props, + emitter: { + on: this.on.bind(this), + off: this.off.bind(this), + emit: this.emit.bind(this) + }, + hiddenDates: [], + util: { + toScreen: me._toScreen.bind(me), + toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width + toTime: me._toTime.bind(me), + toGlobalTime : me._toGlobalTime.bind(me) + } + }; + + // range + this.range = new Range(this.body); + this.components.push(this.range); + this.body.range = this.range; + + // time axis + this.timeAxis = new TimeAxis(this.body); + this.components.push(this.timeAxis); + //this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); + + // current time bar + this.currentTime = new CurrentTime(this.body); + this.components.push(this.currentTime); + + // custom time bar + // Note: time bar will be attached in this.setOptions when selected + this.customTime = new CustomTime(this.body); + this.components.push(this.customTime); + + // item set + this.linegraph = new LineGraph(this.body); + this.components.push(this.linegraph); + + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet + + // apply options + if (options) { + this.setOptions(options); + } + + // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! + if (groups) { + this.setGroups(groups); + } + + // create itemset + if (items) { + this.setItems(items); + } + else { + this._redraw(); + } + } + + // Extend the functionality from Core + Graph2d.prototype = new Core(); + + /** + * Set items + * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + */ + Graph2d.prototype.setItems = function(items) { + var initialLoad = (this.itemsData == null); + + // convert to type DataSet when needed + var newDataSet; + if (!items) { + newDataSet = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + newDataSet = items; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(items, { + type: { + start: 'Date', + end: 'Date' + } + }); + } + + // set items + this.itemsData = newDataSet; + this.linegraph && this.linegraph.setItems(newDataSet); + + if (initialLoad) { + if (this.options.start != undefined || this.options.end != undefined) { + var start = this.options.start != undefined ? this.options.start : null; + var end = this.options.end != undefined ? this.options.end : null; + + this.setWindow(start, end, {animate: false}); + } + else { + this.fit({animate: false}); + } + } + }; + + /** + * Set groups + * @param {vis.DataSet | Array | google.visualization.DataTable} groups + */ + Graph2d.prototype.setGroups = function(groups) { + // convert to type DataSet when needed + var newDataSet; + if (!groups) { + newDataSet = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + newDataSet = groups; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(groups); + } + + this.groupsData = newDataSet; + this.linegraph.setGroups(newDataSet); + }; + + /** + * Returns an object containing an SVG element with the icon of the group (size determined by iconWidth and iconHeight), the label of the group (content) and the yAxisOrientation of the group (left or right). + * @param groupId + * @param width + * @param height + */ + Graph2d.prototype.getLegend = function(groupId, width, height) { + if (width === undefined) {width = 15;} + if (height === undefined) {height = 15;} + if (this.linegraph.groups[groupId] !== undefined) { + return this.linegraph.groups[groupId].getLegend(width,height); + } + else { + return "cannot find group:" + groupId; + } + } + + /** + * This checks if the visible option of the supplied group (by ID) is true or false. + * @param groupId + * @returns {*} + */ + Graph2d.prototype.isGroupVisible = function(groupId) { + if (this.linegraph.groups[groupId] !== undefined) { + return (this.linegraph.groups[groupId].visible && (this.linegraph.options.groups.visibility[groupId] === undefined || this.linegraph.options.groups.visibility[groupId] == true)); + } + else { + return false; + } + } + + + /** + * Get the data range of the item set. + * @returns {{min: Date, max: Date}} range A range with a start and end Date. + * When no minimum is found, min==null + * When no maximum is found, max==null + */ + Graph2d.prototype.getItemRange = function() { + var min = null; + var max = null; + + // calculate min from start filed + for (var groupId in this.linegraph.groups) { + if (this.linegraph.groups.hasOwnProperty(groupId)) { + if (this.linegraph.groups[groupId].visible == true) { + for (var i = 0; i < this.linegraph.groups[groupId].itemsData.length; i++) { + var item = this.linegraph.groups[groupId].itemsData[i]; + var value = util.convert(item.x, 'Date').valueOf(); + min = min == null ? value : min > value ? value : min; + max = max == null ? value : max < value ? value : max; + } + } + } + } + + return { + min: (min != null) ? new Date(min) : null, + max: (max != null) ? new Date(max) : null + }; + }; + + + + module.exports = Graph2d; + + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Created by Alex on 10/3/2014. + */ + var moment = __webpack_require__(44); + + + /** + * used in Core to convert the options into a volatile variable + * + * @param Core + */ + exports.convertHiddenOptions = function(body, hiddenDates) { + body.hiddenDates = []; + if (hiddenDates) { + if (Array.isArray(hiddenDates) == true) { + for (var i = 0; i < hiddenDates.length; i++) { + if (hiddenDates[i].repeat === undefined) { + var dateItem = {}; + dateItem.start = moment(hiddenDates[i].start).toDate().valueOf(); + dateItem.end = moment(hiddenDates[i].end).toDate().valueOf(); + body.hiddenDates.push(dateItem); + } + } + body.hiddenDates.sort(function (a, b) { + return a.start - b.start; + }); // sort by start time + } + } + }; + + + /** + * create new entrees for the repeating hidden dates + * @param body + * @param hiddenDates + */ + exports.updateHiddenDates = function (body, hiddenDates) { + if (hiddenDates && body.domProps.centerContainer.width !== undefined) { + exports.convertHiddenOptions(body, hiddenDates); + + var start = moment(body.range.start); + var end = moment(body.range.end); + + var totalRange = (body.range.end - body.range.start); + var pixelTime = totalRange / body.domProps.centerContainer.width; + + for (var i = 0; i < hiddenDates.length; i++) { + if (hiddenDates[i].repeat !== undefined) { + var startDate = moment(hiddenDates[i].start); + var endDate = moment(hiddenDates[i].end); + + if (startDate._d == "Invalid Date") { + throw new Error("Supplied start date is not valid: " + hiddenDates[i].start); + } + if (endDate._d == "Invalid Date") { + throw new Error("Supplied end date is not valid: " + hiddenDates[i].end); + } + + var duration = endDate - startDate; + if (duration >= 4 * pixelTime) { + + var offset = 0; + var runUntil = end.clone(); + switch (hiddenDates[i].repeat) { + case "daily": // case of time + if (startDate.day() != endDate.day()) { + offset = 1; + } + startDate.dayOfYear(start.dayOfYear()); + startDate.year(start.year()); + startDate.subtract(7,'days'); + + endDate.dayOfYear(start.dayOfYear()); + endDate.year(start.year()); + endDate.subtract(7 - offset,'days'); + + runUntil.add(1, 'weeks'); + break; + case "weekly": + var dayOffset = endDate.diff(startDate,'days') + var day = startDate.day(); + + // set the start date to the range.start + startDate.date(start.date()); + startDate.month(start.month()); + startDate.year(start.year()); + endDate = startDate.clone(); + + // force + startDate.day(day); + endDate.day(day); + endDate.add(dayOffset,'days'); + + startDate.subtract(1,'weeks'); + endDate.subtract(1,'weeks'); + + runUntil.add(1, 'weeks'); + break + case "monthly": + if (startDate.month() != endDate.month()) { + offset = 1; + } + startDate.month(start.month()); + startDate.year(start.year()); + startDate.subtract(1,'months'); + + endDate.month(start.month()); + endDate.year(start.year()); + endDate.subtract(1,'months'); + endDate.add(offset,'months'); + + runUntil.add(1, 'months'); + break; + case "yearly": + if (startDate.year() != endDate.year()) { + offset = 1; + } + startDate.year(start.year()); + startDate.subtract(1,'years'); + endDate.year(start.year()); + endDate.subtract(1,'years'); + endDate.add(offset,'years'); + + runUntil.add(1, 'years'); + break; + default: + console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); + return; + } + while (startDate < runUntil) { + body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()}); + switch (hiddenDates[i].repeat) { + case "daily": + startDate.add(1, 'days'); + endDate.add(1, 'days'); + break; + case "weekly": + startDate.add(1, 'weeks'); + endDate.add(1, 'weeks'); + break + case "monthly": + startDate.add(1, 'months'); + endDate.add(1, 'months'); + break; + case "yearly": + startDate.add(1, 'y'); + endDate.add(1, 'y'); + break; + default: + console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); + return; + } + } + body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()}); + } + } + } + // remove duplicates, merge where possible + exports.removeDuplicates(body); + // ensure the new positions are not on hidden dates + var startHidden = exports.isHidden(body.range.start, body.hiddenDates); + var endHidden = exports.isHidden(body.range.end,body.hiddenDates); + var rangeStart = body.range.start; + var rangeEnd = body.range.end; + if (startHidden.hidden == true) {rangeStart = body.range.startToFront == true ? startHidden.startDate - 1 : startHidden.endDate + 1;} + if (endHidden.hidden == true) {rangeEnd = body.range.endToFront == true ? endHidden.startDate - 1 : endHidden.endDate + 1;} + if (startHidden.hidden == true || endHidden.hidden == true) { + body.range._applyRange(rangeStart, rangeEnd); + } + } + + } + + + /** + * remove duplicates from the hidden dates list. Duplicates are evil. They mess everything up. + * Scales with N^2 + * @param body + */ + exports.removeDuplicates = function(body) { + var hiddenDates = body.hiddenDates; + var safeDates = []; + for (var i = 0; i < hiddenDates.length; i++) { + for (var j = 0; j < hiddenDates.length; j++) { + if (i != j && hiddenDates[j].remove != true && hiddenDates[i].remove != true) { + // j inside i + if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { + hiddenDates[j].remove = true; + } + // j start inside i + else if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].start <= hiddenDates[i].end) { + hiddenDates[i].end = hiddenDates[j].end; + hiddenDates[j].remove = true; + } + // j end inside i + else if (hiddenDates[j].end >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { + hiddenDates[i].start = hiddenDates[j].start; + hiddenDates[j].remove = true; + } + } + } + } + + for (var i = 0; i < hiddenDates.length; i++) { + if (hiddenDates[i].remove !== true) { + safeDates.push(hiddenDates[i]); + } + } + + body.hiddenDates = safeDates; + body.hiddenDates.sort(function (a, b) { + return a.start - b.start; + }); // sort by start time + } + + exports.printDates = function(dates) { + for (var i =0; i < dates.length; i++) { + console.log(i, new Date(dates[i].start),new Date(dates[i].end), dates[i].start, dates[i].end, dates[i].remove); + } + } + + /** + * Used in TimeStep to avoid the hidden times. + * @param timeStep + * @param previousTime + */ + exports.stepOverHiddenDates = function(timeStep, previousTime) { + var stepInHidden = false; + var currentValue = timeStep.current.valueOf(); + for (var i = 0; i < timeStep.hiddenDates.length; i++) { + var startDate = timeStep.hiddenDates[i].start; + var endDate = timeStep.hiddenDates[i].end; + if (currentValue >= startDate && currentValue < endDate) { + stepInHidden = true; + break; + } + } + + if (stepInHidden == true && currentValue < timeStep._end.valueOf() && currentValue != previousTime) { + var prevValue = moment(previousTime); + var newValue = moment(endDate); + //check if the next step should be major + if (prevValue.year() != newValue.year()) {timeStep.switchedYear = true;} + else if (prevValue.month() != newValue.month()) {timeStep.switchedMonth = true;} + else if (prevValue.dayOfYear() != newValue.dayOfYear()) {timeStep.switchedDay = true;} + + timeStep.current = newValue.toDate(); + } + }; + + + ///** + // * Used in TimeStep to avoid the hidden times. + // * @param timeStep + // * @param previousTime + // */ + //exports.checkFirstStep = function(timeStep) { + // var stepInHidden = false; + // var currentValue = timeStep.current.valueOf(); + // for (var i = 0; i < timeStep.hiddenDates.length; i++) { + // var startDate = timeStep.hiddenDates[i].start; + // var endDate = timeStep.hiddenDates[i].end; + // if (currentValue >= startDate && currentValue < endDate) { + // stepInHidden = true; + // break; + // } + // } + // + // if (stepInHidden == true && currentValue <= timeStep._end.valueOf()) { + // var newValue = moment(endDate); + // timeStep.current = newValue.toDate(); + // } + //}; + + /** + * replaces the Core toScreen methods + * @param Core + * @param time + * @param width + * @returns {number} + */ + exports.toScreen = function(Core, time, width) { + if (Core.body.hiddenDates.length == 0) { + var conversion = Core.range.conversion(width); + return (time.valueOf() - conversion.offset) * conversion.scale; + } + else { + var hidden = exports.isHidden(time, Core.body.hiddenDates) + if (hidden.hidden == true) { + time = hidden.startDate; + } + + var duration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); + time = exports.correctTimeForHidden(Core.body.hiddenDates, Core.range, time); + + var conversion = Core.range.conversion(width, duration); + return (time.valueOf() - conversion.offset) * conversion.scale; + } + }; + + + /** + * Replaces the core toTime methods + * @param body + * @param range + * @param x + * @param width + * @returns {Date} + */ + exports.toTime = function(Core, x, width) { + if (Core.body.hiddenDates.length == 0) { + var conversion = Core.range.conversion(width); + return new Date(x / conversion.scale + conversion.offset); + } + else { + var hiddenDuration = exports.getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); + var totalDuration = Core.range.end - Core.range.start - hiddenDuration; + var partialDuration = totalDuration * x / width; + var accumulatedHiddenDuration = exports.getAccumulatedHiddenDuration(Core.body.hiddenDates, Core.range, partialDuration); + + var newTime = new Date(accumulatedHiddenDuration + partialDuration + Core.range.start); + return newTime; + } + }; + + + /** + * Support function + * + * @param hiddenDates + * @param range + * @returns {number} + */ + exports.getHiddenDurationBetween = function(hiddenDates, start, end) { + var duration = 0; + for (var i = 0; i < hiddenDates.length; i++) { + var startDate = hiddenDates[i].start; + var endDate = hiddenDates[i].end; + // if time after the cutout, and the + if (startDate >= start && endDate < end) { + duration += endDate - startDate; + } + } + return duration; + }; + + + /** + * Support function + * @param hiddenDates + * @param range + * @param time + * @returns {{duration: number, time: *, offset: number}} + */ + exports.correctTimeForHidden = function(hiddenDates, range, time) { + time = moment(time).toDate().valueOf(); + time -= exports.getHiddenDurationBefore(hiddenDates,range,time); + return time; + }; + + exports.getHiddenDurationBefore = function(hiddenDates, range, time) { + var timeOffset = 0; + time = moment(time).toDate().valueOf(); + + for (var i = 0; i < hiddenDates.length; i++) { + var startDate = hiddenDates[i].start; + var endDate = hiddenDates[i].end; + // if time after the cutout, and the + if (startDate >= range.start && endDate < range.end) { + if (time >= endDate) { + timeOffset += (endDate - startDate); + } + } + } + return timeOffset; + } + + /** + * sum the duration from start to finish, including the hidden duration, + * until the required amount has been reached, return the accumulated hidden duration + * @param hiddenDates + * @param range + * @param time + * @returns {{duration: number, time: *, offset: number}} + */ + exports.getAccumulatedHiddenDuration = function(hiddenDates, range, requiredDuration) { + var hiddenDuration = 0; + var duration = 0; + var previousPoint = range.start; + //exports.printDates(hiddenDates) + for (var i = 0; i < hiddenDates.length; i++) { + var startDate = hiddenDates[i].start; + var endDate = hiddenDates[i].end; + // if time after the cutout, and the + if (startDate >= range.start && endDate < range.end) { + duration += startDate - previousPoint; + previousPoint = endDate; + if (duration >= requiredDuration) { + break; + } + else { + hiddenDuration += endDate - startDate; + } + } + } + + return hiddenDuration; + }; + + + + /** + * used to step over to either side of a hidden block. Correction is disabled on tablets, might be set to true + * @param hiddenDates + * @param time + * @param direction + * @param correctionEnabled + * @returns {*} + */ + exports.snapAwayFromHidden = function(hiddenDates, time, direction, correctionEnabled) { + var isHidden = exports.isHidden(time, hiddenDates); + if (isHidden.hidden == true) { + if (direction < 0) { + if (correctionEnabled == true) { + return isHidden.startDate - (isHidden.endDate - time) - 1; + } + else { + return isHidden.startDate - 1; + } + } + else { + if (correctionEnabled == true) { + return isHidden.endDate + (time - isHidden.startDate) + 1; + } + else { + return isHidden.endDate + 1; + } + } + } + else { + return time; + } + + } + + + /** + * Check if a time is hidden + * + * @param time + * @param hiddenDates + * @returns {{hidden: boolean, startDate: Window.start, endDate: *}} + */ + exports.isHidden = function(time, hiddenDates) { + for (var i = 0; i < hiddenDates.length; i++) { + var startDate = hiddenDates[i].start; + var endDate = hiddenDates[i].end; + + if (time >= startDate && time < endDate) { // if the start is entering a hidden zone + return {hidden: true, startDate: startDate, endDate: endDate}; + break; + } + } + return {hidden: false, startDate: startDate, endDate: endDate}; + } + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @constructor DataStep + * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an + * end data point. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. + * + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + */ + function DataStep(start, end, minimumStep, containerHeight, customRange, alignZeros) { + // variables + this.current = 0; + + this.autoScale = true; + this.stepIndex = 0; + this.step = 1; + this.scale = 1; + + this.marginStart; + this.marginEnd; + this.deadSpace = 0; + + this.majorSteps = [1, 2, 5, 10]; + this.minorSteps = [0.25, 0.5, 1, 2]; + + this.alignZeros = alignZeros; + + this.setRange(start, end, minimumStep, containerHeight, customRange); + } + + + + /** + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Number} [start] The start date and time. + * @param {Number} [end] The end date and time. + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + */ + DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, customRange) { + this._start = customRange.min === undefined ? start : customRange.min; + this._end = customRange.max === undefined ? end : customRange.max; + + if (this._start == this._end) { + this._start -= 0.75; + this._end += 1; + } + + if (this.autoScale == true) { + this.setMinimumStep(minimumStep, containerHeight); + } + + this.setFirst(customRange); + }; + + /** + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds + */ + DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { + // round to floor + var size = this._end - this._start; + var safeSize = size * 1.2; + var minimumStepValue = minimumStep * (safeSize / containerHeight); + var orderOfMagnitude = Math.round(Math.log(safeSize)/Math.LN10); + + var minorStepIdx = -1; + var magnitudefactor = Math.pow(10,orderOfMagnitude); + + var start = 0; + if (orderOfMagnitude < 0) { + start = orderOfMagnitude; + } + + var solutionFound = false; + for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { + magnitudefactor = Math.pow(10,i); + for (var j = 0; j < this.minorSteps.length; j++) { + var stepSize = magnitudefactor * this.minorSteps[j]; + if (stepSize >= minimumStepValue) { + solutionFound = true; + minorStepIdx = j; + break; + } + } + if (solutionFound == true) { + break; + } + } + this.stepIndex = minorStepIdx; + this.scale = magnitudefactor; + this.step = magnitudefactor * this.minorSteps[minorStepIdx]; + }; + + + + /** + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date + */ + DataStep.prototype.setFirst = function(customRange) { + if (customRange === undefined) { + customRange = {}; + } + + var niceStart = customRange.min === undefined ? this._start - (this.scale * 2 * this.minorSteps[this.stepIndex]) : customRange.min; + var niceEnd = customRange.max === undefined ? this._end + (this.scale * this.minorSteps[this.stepIndex]) : customRange.max; + + this.marginEnd = customRange.max === undefined ? this.roundToMinor(niceEnd) : customRange.max; + this.marginStart = customRange.min === undefined ? this.roundToMinor(niceStart) : customRange.min; + + // if we need to align the zero's we need to make sure that there is a zero to use. + if (this.alignZeros == true && (this.marginEnd - this.marginStart) % this.step != 0) { + this.marginEnd += this.marginEnd % this.step; + } + + this.deadSpace = this.roundToMinor(niceEnd) - niceEnd + this.roundToMinor(niceStart) - niceStart; + this.marginRange = this.marginEnd - this.marginStart; + + + this.current = this.marginEnd; + }; + + DataStep.prototype.roundToMinor = function(value) { + var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); + if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { + return rounded + (this.scale * this.minorSteps[this.stepIndex]); + } + else { + return rounded; + } + } + + + /** + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date + */ + DataStep.prototype.hasNext = function () { + return (this.current >= this.marginStart); + }; + + /** + * Do the next step + */ + DataStep.prototype.next = function() { + var prev = this.current; + this.current -= this.step; + + // safety mechanism: if current time is still unchanged, move to the end + if (this.current == prev) { + this.current = this._end; + } + }; + + /** + * Do the next step + */ + DataStep.prototype.previous = function() { + this.current += this.step; + this.marginEnd += this.step; + this.marginRange = this.marginEnd - this.marginStart; + }; + + + + /** + * Get the current datetime + * @return {String} current The current date + */ + DataStep.prototype.getCurrent = function(decimals) { + // prevent round-off errors when close to zero + var current = (Math.abs(this.current) < this.step / 2) ? 0 : this.current; + var toPrecision = '' + Number(current).toPrecision(5); + + // If decimals is specified, then limit or extend the string as required + if(decimals !== undefined && !isNaN(Number(decimals))) { + // If string includes exponent, then we need to add it to the end + var exp = ""; + var index = toPrecision.indexOf("e"); + if(index != -1) { + // Get the exponent + exp = toPrecision.slice(index); + // Remove the exponent in case we need to zero-extend + toPrecision = toPrecision.slice(0, index); + } + index = Math.max(toPrecision.indexOf(","), toPrecision.indexOf(".")); + if(index === -1) { + // No decimal found - if we want decimals, then we need to add it + if(decimals !== 0) { + toPrecision += '.'; + } + // Calculate how long the string should be + index = toPrecision.length + decimals; + } + else if(decimals !== 0) { + // Calculate how long the string should be - accounting for the decimal place + index += decimals + 1; + } + if(index > toPrecision.length) { + // We need to add zeros! + for(var cnt = index - toPrecision.length; cnt > 0; cnt--) { + toPrecision += '0'; + } + } + else { + // we need to remove characters + toPrecision = toPrecision.slice(0, index); + } + // Add the exponent if there is one + toPrecision += exp; + } + else { + if (toPrecision.indexOf(",") != -1 || toPrecision.indexOf(".") != -1) { + // If no decimal is specified, and there are decimal places, remove trailing zeros + for (var i = toPrecision.length - 1; i > 0; i--) { + if (toPrecision[i] == "0") { + toPrecision = toPrecision.slice(0, i); + } + else if (toPrecision[i] == "." || toPrecision[i] == ",") { + toPrecision = toPrecision.slice(0, i); + break; + } + else { + break; + } + } + } + } + + return toPrecision; + }; + + /** + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. + */ + DataStep.prototype.isMajor = function() { + return (this.current % (this.scale * this.majorSteps[this.stepIndex]) == 0); + }; + + module.exports = DataStep; + + +/***/ }, +/* 17 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var hammerUtil = __webpack_require__(47); + var moment = __webpack_require__(44); + var Component = __webpack_require__(24); + var DateUtil = __webpack_require__(15); + + /** + * @constructor Range + * A Range controls a numeric range with a start and end value. + * The Range adjusts the range based on mouse events or programmatic changes, + * and triggers events when the range is changing or has been changed. + * @param {{dom: Object, domProps: Object, emitter: Emitter}} body + * @param {Object} [options] See description at Range.setOptions + */ + function Range(body, options) { + var now = moment().hours(0).minutes(0).seconds(0).milliseconds(0); + this.start = now.clone().add(-3, 'days').valueOf(); // Number + this.end = now.clone().add(4, 'days').valueOf(); // Number + + this.body = body; + this.deltaDifference = 0; + this.scaleOffset = 0; + this.startToFront = false; + this.endToFront = true; + + // default options + this.defaultOptions = { + start: null, + end: null, + direction: 'horizontal', // 'horizontal' or 'vertical' + moveable: true, + zoomable: true, + min: null, + max: null, + zoomMin: 10, // milliseconds + zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000 // milliseconds + }; + this.options = util.extend({}, this.defaultOptions); + + this.props = { + touch: {} + }; + this.animateTimer = null; + + // drag listeners for dragging + this.body.emitter.on('dragstart', this._onDragStart.bind(this)); + this.body.emitter.on('drag', this._onDrag.bind(this)); + this.body.emitter.on('dragend', this._onDragEnd.bind(this)); + + // ignore dragging when holding + this.body.emitter.on('hold', this._onHold.bind(this)); + + // mouse wheel for zooming + this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this)); + this.body.emitter.on('DOMMouseScroll', this._onMouseWheel.bind(this)); // For FF + + // pinch to zoom + this.body.emitter.on('touch', this._onTouch.bind(this)); + this.body.emitter.on('pinch', this._onPinch.bind(this)); + + this.setOptions(options); + } + + Range.prototype = new Component(); + + /** + * Set options for the range controller + * @param {Object} options Available options: + * {Number | Date | String} start Start date for the range + * {Number | Date | String} end End date for the range + * {Number} min Minimum value for start + * {Number} max Maximum value for end + * {Number} zoomMin Set a minimum value for + * (end - start). + * {Number} zoomMax Set a maximum value for + * (end - start). + * {Boolean} moveable Enable moving of the range + * by dragging. True by default + * {Boolean} zoomable Enable zooming of the range + * by pinching/scrolling. True by default + */ + Range.prototype.setOptions = function (options) { + if (options) { + // copy the options that we know + var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable', 'activate', 'hiddenDates']; + util.selectiveExtend(fields, this.options, options); + + if ('start' in options || 'end' in options) { + // apply a new range. both start and end are optional + this.setRange(options.start, options.end); + } + } + }; + + /** + * Test whether direction has a valid value + * @param {String} direction 'horizontal' or 'vertical' + */ + function validateDirection (direction) { + if (direction != 'horizontal' && direction != 'vertical') { + throw new TypeError('Unknown direction "' + direction + '". ' + + 'Choose "horizontal" or "vertical".'); + } + } + + /** + * Set a new start and end range + * @param {Date | Number | String} [start] + * @param {Date | Number | String} [end] + * @param {boolean | number} [animate=false] If true, the range is animated + * smoothly to the new window. + * If animate is a number, the + * number is taken as duration + * Default duration is 500 ms. + * @param {Boolean} [byUser=false] + * + */ + Range.prototype.setRange = function(start, end, animate, byUser) { + if (byUser !== true) { + byUser = false; + } + var _start = start != undefined ? util.convert(start, 'Date').valueOf() : null; + var _end = end != undefined ? util.convert(end, 'Date').valueOf() : null; + this._cancelAnimation(); + + if (animate) { + var me = this; + var initStart = this.start; + var initEnd = this.end; + var duration = typeof animate === 'number' ? animate : 500; + var initTime = new Date().valueOf(); + var anyChanged = false; + + var next = function () { + if (!me.props.touch.dragging) { + var now = new Date().valueOf(); + var time = now - initTime; + var done = time > duration; + var s = (done || _start === null) ? _start : util.easeInOutQuad(time, initStart, _start, duration); + var e = (done || _end === null) ? _end : util.easeInOutQuad(time, initEnd, _end, duration); + + changed = me._applyRange(s, e); + DateUtil.updateHiddenDates(me.body, me.options.hiddenDates); + anyChanged = anyChanged || changed; + if (changed) { + me.body.emitter.emit('rangechange', {start: new Date(me.start), end: new Date(me.end), byUser:byUser}); + } + + if (done) { + if (anyChanged) { + me.body.emitter.emit('rangechanged', {start: new Date(me.start), end: new Date(me.end), byUser:byUser}); + } + } + else { + // animate with as high as possible frame rate, leave 20 ms in between + // each to prevent the browser from blocking + me.animateTimer = setTimeout(next, 20); + } + } + }; + + return next(); + } + else { + var changed = this._applyRange(_start, _end); + DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); + if (changed) { + var params = {start: new Date(this.start), end: new Date(this.end), byUser:byUser}; + this.body.emitter.emit('rangechange', params); + this.body.emitter.emit('rangechanged', params); + } + } + }; + + /** + * Stop an animation + * @private + */ + Range.prototype._cancelAnimation = function () { + if (this.animateTimer) { + clearTimeout(this.animateTimer); + this.animateTimer = null; + } + }; + + /** + * Set a new start and end range. This method is the same as setRange, but + * does not trigger a range change and range changed event, and it returns + * true when the range is changed + * @param {Number} [start] + * @param {Number} [end] + * @return {Boolean} changed + * @private + */ + Range.prototype._applyRange = function(start, end) { + var newStart = (start != null) ? util.convert(start, 'Date').valueOf() : this.start, + newEnd = (end != null) ? util.convert(end, 'Date').valueOf() : this.end, + max = (this.options.max != null) ? util.convert(this.options.max, 'Date').valueOf() : null, + min = (this.options.min != null) ? util.convert(this.options.min, 'Date').valueOf() : null, + diff; + + // check for valid number + if (isNaN(newStart) || newStart === null) { + throw new Error('Invalid start "' + start + '"'); + } + if (isNaN(newEnd) || newEnd === null) { + throw new Error('Invalid end "' + end + '"'); + } + + // prevent start < end + if (newEnd < newStart) { + newEnd = newStart; + } + + // prevent start < min + if (min !== null) { + if (newStart < min) { + diff = (min - newStart); + newStart += diff; + newEnd += diff; + + // prevent end > max + if (max != null) { + if (newEnd > max) { + newEnd = max; + } + } + } + } + + // prevent end > max + if (max !== null) { + if (newEnd > max) { + diff = (newEnd - max); + newStart -= diff; + newEnd -= diff; + + // prevent start < min + if (min != null) { + if (newStart < min) { + newStart = min; + } + } + } + } + + // prevent (end-start) < zoomMin + if (this.options.zoomMin !== null) { + var zoomMin = parseFloat(this.options.zoomMin); + if (zoomMin < 0) { + zoomMin = 0; + } + if ((newEnd - newStart) < zoomMin) { + if ((this.end - this.start) === zoomMin && newStart > this.start && newEnd < this.end) { + // ignore this action, we are already zoomed to the minimum + newStart = this.start; + newEnd = this.end; + } + else { + // zoom to the minimum + diff = (zoomMin - (newEnd - newStart)); + newStart -= diff / 2; + newEnd += diff / 2; + } + } + } + + // prevent (end-start) > zoomMax + if (this.options.zoomMax !== null) { + var zoomMax = parseFloat(this.options.zoomMax); + if (zoomMax < 0) { + zoomMax = 0; + } + + if ((newEnd - newStart) > zoomMax) { + if ((this.end - this.start) === zoomMax && newStart < this.start && newEnd > this.end) { + // ignore this action, we are already zoomed to the maximum + newStart = this.start; + newEnd = this.end; + } + else { + // zoom to the maximum + diff = ((newEnd - newStart) - zoomMax); + newStart += diff / 2; + newEnd -= diff / 2; + } + } + } + + var changed = (this.start != newStart || this.end != newEnd); + + // if the new range does NOT overlap with the old range, emit checkRangedItems to avoid not showing ranged items (ranged meaning has end time, not necessarily of type Range) + if (!((newStart >= this.start && newStart <= this.end) || (newEnd >= this.start && newEnd <= this.end)) && + !((this.start >= newStart && this.start <= newEnd) || (this.end >= newStart && this.end <= newEnd) )) { + this.body.emitter.emit('checkRangedItems'); + } + + this.start = newStart; + this.end = newEnd; + return changed; + }; + + /** + * Retrieve the current range. + * @return {Object} An object with start and end properties + */ + Range.prototype.getRange = function() { + return { + start: this.start, + end: this.end + }; + }; + + /** + * Calculate the conversion offset and scale for current range, based on + * the provided width + * @param {Number} width + * @returns {{offset: number, scale: number}} conversion + */ + Range.prototype.conversion = function (width, totalHidden) { + return Range.conversion(this.start, this.end, width, totalHidden); + }; + + /** + * Static method to calculate the conversion offset and scale for a range, + * based on the provided start, end, and width + * @param {Number} start + * @param {Number} end + * @param {Number} width + * @returns {{offset: number, scale: number}} conversion + */ + Range.conversion = function (start, end, width, totalHidden) { + if (totalHidden === undefined) { + totalHidden = 0; + } + if (width != 0 && (end - start != 0)) { + return { + offset: start, + scale: width / (end - start - totalHidden) + } + } + else { + return { + offset: 0, + scale: 1 + }; + } + }; + + /** + * Start dragging horizontally or vertically + * @param {Event} event + * @private + */ + Range.prototype._onDragStart = function(event) { + this.deltaDifference = 0; + this.previousDelta = 0; + // only allow dragging when configured as movable + if (!this.options.moveable) return; + + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; + + this.props.touch.start = this.start; + this.props.touch.end = this.end; + this.props.touch.dragging = true; + + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'move'; + } + }; + + /** + * Perform dragging operation + * @param {Event} event + * @private + */ + Range.prototype._onDrag = function (event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; + + var direction = this.options.direction; + validateDirection(direction); + + var delta = (direction == 'horizontal') ? event.gesture.deltaX : event.gesture.deltaY; + delta -= this.deltaDifference; + var interval = (this.props.touch.end - this.props.touch.start); + + // normalize dragging speed if cutout is in between. + var duration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); + interval -= duration; + + var width = (direction == 'horizontal') ? this.body.domProps.center.width : this.body.domProps.center.height; + var diffRange = -delta / width * interval; + var newStart = this.props.touch.start + diffRange; + var newEnd = this.props.touch.end + diffRange; + + + // snapping times away from hidden zones + var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, this.previousDelta-delta, true); + var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, this.previousDelta-delta, true); + if (safeStart != newStart || safeEnd != newEnd) { + this.deltaDifference += delta; + this.props.touch.start = safeStart; + this.props.touch.end = safeEnd; + this._onDrag(event); + return; + } + + this.previousDelta = delta; + this._applyRange(newStart, newEnd); + + // fire a rangechange event + this.body.emitter.emit('rangechange', { + start: new Date(this.start), + end: new Date(this.end), + byUser: true + }); + }; + + /** + * Stop dragging operation + * @param {event} event + * @private + */ + Range.prototype._onDragEnd = function (event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; + + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; + + this.props.touch.dragging = false; + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'auto'; + } + + // fire a rangechanged event + this.body.emitter.emit('rangechanged', { + start: new Date(this.start), + end: new Date(this.end), + byUser: true + }); + }; + + /** + * Event handler for mouse wheel event, used to zoom + * Code from http://adomas.org/javascript-mouse-wheel/ + * @param {Event} event + * @private + */ + Range.prototype._onMouseWheel = function(event) { + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; + + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta / 120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail / 3; + } + + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + // perform the zoom action. Delta is normally 1 or -1 + + // adjust a negative delta such that zooming in with delta 0.1 + // equals zooming out with a delta -0.1 + var scale; + if (delta < 0) { + scale = 1 - (delta / 5); + } + else { + scale = 1 / (1 + (delta / 5)) ; + } + + // calculate center, the date to zoom around + var gesture = hammerUtil.fakeGesture(this, event), + pointer = getPointer(gesture.center, this.body.dom.center), + pointerDate = this._pointerToDate(pointer); + + this.zoom(scale, pointerDate, delta); + } + + // Prevent default actions caused by mouse wheel + // (else the page and timeline both zoom and scroll) + event.preventDefault(); + }; + + /** + * Start of a touch gesture + * @private + */ + Range.prototype._onTouch = function (event) { + this.props.touch.start = this.start; + this.props.touch.end = this.end; + this.props.touch.allowDragging = true; + this.props.touch.center = null; + this.scaleOffset = 0; + this.deltaDifference = 0; + }; + + /** + * On start of a hold gesture + * @private + */ + Range.prototype._onHold = function () { + this.props.touch.allowDragging = false; + }; + + /** + * Handle pinch event + * @param {Event} event + * @private + */ + Range.prototype._onPinch = function (event) { + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; + + this.props.touch.allowDragging = false; + + if (event.gesture.touches.length > 1) { + if (!this.props.touch.center) { + this.props.touch.center = getPointer(event.gesture.center, this.body.dom.center); + } + + var scale = 1 / (event.gesture.scale + this.scaleOffset); + var centerDate = this._pointerToDate(this.props.touch.center); + + var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); + var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, centerDate); + var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; + + // calculate new start and end + var newStart = (centerDate - hiddenDurationBefore) + (this.props.touch.start - (centerDate - hiddenDurationBefore)) * scale; + var newEnd = (centerDate + hiddenDurationAfter) + (this.props.touch.end - (centerDate + hiddenDurationAfter)) * scale; + + // snapping times away from hidden zones + this.startToFront = 1 - scale > 0 ? false : true; // used to do the right autocorrection with periodic hidden times + this.endToFront = scale - 1 > 0 ? false : true; // used to do the right autocorrection with periodic hidden times + + var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, 1 - scale, true); + var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, scale - 1, true); + if (safeStart != newStart || safeEnd != newEnd) { + this.props.touch.start = safeStart; + this.props.touch.end = safeEnd; + this.scaleOffset = 1 - event.gesture.scale; + newStart = safeStart; + newEnd = safeEnd; + } + + this.setRange(newStart, newEnd, false, true); + + this.startToFront = false; // revert to default + this.endToFront = true; // revert to default + } + }; + + /** + * Helper function to calculate the center date for zooming + * @param {{x: Number, y: Number}} pointer + * @return {number} date + * @private + */ + Range.prototype._pointerToDate = function (pointer) { + var conversion; + var direction = this.options.direction; + + validateDirection(direction); + + if (direction == 'horizontal') { + return this.body.util.toTime(pointer.x).valueOf(); + } + else { + var height = this.body.domProps.center.height; + conversion = this.conversion(height); + return pointer.y / conversion.scale + conversion.offset; + } + }; + + /** + * Get the pointer location relative to the location of the dom element + * @param {{pageX: Number, pageY: Number}} touch + * @param {Element} element HTML DOM element + * @return {{x: Number, y: Number}} pointer + * @private + */ + function getPointer (touch, element) { + return { + x: touch.pageX - util.getAbsoluteLeft(element), + y: touch.pageY - util.getAbsoluteTop(element) + }; + } + + /** + * Zoom the range the given scale in or out. Start and end date will + * be adjusted, and the timeline will be redrawn. You can optionally give a + * date around which to zoom. + * For example, try scale = 0.9 or 1.1 + * @param {Number} scale Scaling factor. Values above 1 will zoom out, + * values below 1 will zoom in. + * @param {Number} [center] Value representing a date around which will + * be zoomed. + */ + Range.prototype.zoom = function(scale, center, delta) { + // if centerDate is not provided, take it half between start Date and end Date + if (center == null) { + center = (this.start + this.end) / 2; + } + + var hiddenDuration = DateUtil.getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); + var hiddenDurationBefore = DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this, center); + var hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; + + // calculate new start and end + var newStart = (center-hiddenDurationBefore) + (this.start - (center-hiddenDurationBefore)) * scale; + var newEnd = (center+hiddenDurationAfter) + (this.end - (center+hiddenDurationAfter)) * scale; + + // snapping times away from hidden zones + this.startToFront = delta > 0 ? false : true; // used to do the right autocorrection with periodic hidden times + this.endToFront = -delta > 0 ? false : true; // used to do the right autocorrection with periodic hidden times + var safeStart = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newStart, delta, true); + var safeEnd = DateUtil.snapAwayFromHidden(this.body.hiddenDates, newEnd, -delta, true); + if (safeStart != newStart || safeEnd != newEnd) { + newStart = safeStart; + newEnd = safeEnd; + } + + this.setRange(newStart, newEnd, false, true); + + this.startToFront = false; // revert to default + this.endToFront = true; // revert to default + }; + + + + /** + * Move the range with a given delta to the left or right. Start and end + * value will be adjusted. For example, try delta = 0.1 or -0.1 + * @param {Number} delta Moving amount. Positive value will move right, + * negative value will move left + */ + Range.prototype.move = function(delta) { + // zoom start Date and end Date relative to the centerDate + var diff = (this.end - this.start); + + // apply new values + var newStart = this.start + diff * delta; + var newEnd = this.end + diff * delta; + + // TODO: reckon with min and max range + + this.start = newStart; + this.end = newEnd; + }; + + /** + * Move the range to a new center point + * @param {Number} moveTo New center point of the range + */ + Range.prototype.moveTo = function(moveTo) { + var center = (this.start + this.end) / 2; + + var diff = center - moveTo; + + // calculate new start and end + var newStart = this.start - diff; + var newEnd = this.end - diff; + + this.setRange(newStart, newEnd); + }; + + module.exports = Range; + + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + // Utility functions for ordering and stacking of items + var EPSILON = 0.001; // used when checking collisions, to prevent round-off errors + + /** + * Order items by their start data + * @param {Item[]} items + */ + exports.orderByStart = function(items) { + items.sort(function (a, b) { + return a.data.start - b.data.start; + }); + }; + + /** + * Order items by their end date. If they have no end date, their start date + * is used. + * @param {Item[]} items + */ + exports.orderByEnd = function(items) { + items.sort(function (a, b) { + var aTime = ('end' in a.data) ? a.data.end : a.data.start, + bTime = ('end' in b.data) ? b.data.end : b.data.start; + + return aTime - bTime; + }); + }; + + /** + * Adjust vertical positions of the items such that they don't overlap each + * other. + * @param {Item[]} items + * All visible items + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * Margins between items and between items and the axis. + * @param {boolean} [force=false] + * If true, all items will be repositioned. If false (default), only + * items having a top===null will be re-stacked + */ + exports.stack = function(items, margin, force) { + var i, iMax; + + if (force) { + // reset top position of all items + for (i = 0, iMax = items.length; i < iMax; i++) { + items[i].top = null; + } + } + + // calculate new, non-overlapping positions + for (i = 0, iMax = items.length; i < iMax; i++) { + var item = items[i]; + if (item.stack && item.top === null) { + // initialize top position + item.top = margin.axis; + + do { + // TODO: optimize checking for overlap. when there is a gap without items, + // you only need to check for items from the next item on, not from zero + var collidingItem = null; + for (var j = 0, jj = items.length; j < jj; j++) { + var other = items[j]; + if (other.top !== null && other !== item && other.stack && exports.collision(item, other, margin.item)) { + collidingItem = other; + break; + } + } + + if (collidingItem != null) { + // There is a collision. Reposition the items above the colliding element + item.top = collidingItem.top + collidingItem.height + margin.item.vertical; + } + } while (collidingItem); + } + } + }; + + + /** + * Adjust vertical positions of the items without stacking them + * @param {Item[]} items + * All visible items + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * Margins between items and between items and the axis. + */ + exports.nostack = function(items, margin, subgroups) { + var i, iMax, newTop; + + // reset top position of all items + for (i = 0, iMax = items.length; i < iMax; i++) { + if (items[i].data.subgroup !== undefined) { + newTop = margin.axis; + for (var subgroup in subgroups) { + if (subgroups.hasOwnProperty(subgroup)) { + if (subgroups[subgroup].visible == true && subgroups[subgroup].index < subgroups[items[i].data.subgroup].index) { + newTop += subgroups[subgroup].height + margin.item.vertical; + } + } + } + items[i].top = newTop; + } + else { + items[i].top = margin.axis; + } + } + }; + + /** + * Test if the two provided items collide + * The items must have parameters left, width, top, and height. + * @param {Item} a The first item + * @param {Item} b The second item + * @param {{horizontal: number, vertical: number}} margin + * An object containing a horizontal and vertical + * minimum required margin. + * @return {boolean} true if a and b collide, else false + */ + exports.collision = function(a, b, margin) { + return ((a.left - margin.horizontal + EPSILON) < (b.left + b.width) && + (a.left + a.width + margin.horizontal - EPSILON) > b.left && + (a.top - margin.vertical + EPSILON) < (b.top + b.height) && + (a.top + a.height + margin.vertical - EPSILON) > b.top); + }; + + +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { + + var moment = __webpack_require__(44); + var DateUtil = __webpack_require__(15); + var util = __webpack_require__(1); + + /** + * @constructor TimeStep + * The class TimeStep is an iterator for dates. You provide a start date and an + * end date. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. + * + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds + */ + function TimeStep(start, end, minimumStep, hiddenDates) { + // variables + this.current = new Date(); + this._start = new Date(); + this._end = new Date(); + + this.autoScale = true; + this.scale = 'day'; + this.step = 1; + + // initialize the range + this.setRange(start, end, minimumStep); + + // hidden Dates options + this.switchedDay = false; + this.switchedMonth = false; + this.switchedYear = false; + this.hiddenDates = hiddenDates; + if (hiddenDates === undefined) { + this.hiddenDates = []; + } + + this.format = TimeStep.FORMAT; // default formatting + } + + // Time formatting + TimeStep.FORMAT = { + minorLabels: { + millisecond:'SSS', + second: 's', + minute: 'HH:mm', + hour: 'HH:mm', + weekday: 'ddd D', + day: 'D', + month: 'MMM', + year: 'YYYY' + }, + majorLabels: { + millisecond:'HH:mm:ss', + second: 'D MMMM HH:mm', + minute: 'ddd D MMMM', + hour: 'ddd D MMMM', + weekday: 'MMMM YYYY', + day: 'MMMM YYYY', + month: 'YYYY', + year: '' + } + }; + + /** + * Set custom formatting for the minor an major labels of the TimeStep. + * Both `minorLabels` and `majorLabels` are an Object with properties: + * 'millisecond, 'second, 'minute', 'hour', 'weekday, 'day, 'month, 'year'. + * @param {{minorLabels: Object, majorLabels: Object}} format + */ + TimeStep.prototype.setFormat = function (format) { + var defaultFormat = util.deepExtend({}, TimeStep.FORMAT); + this.format = util.deepExtend(defaultFormat, format); + }; + + /** + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Date} [start] The start date and time. + * @param {Date} [end] The end date and time. + * @param {int} [minimumStep] Optional. Minimum step size in milliseconds + */ + TimeStep.prototype.setRange = function(start, end, minimumStep) { + if (!(start instanceof Date) || !(end instanceof Date)) { + throw "No legal start or end date in method setRange"; + } + + this._start = (start != undefined) ? new Date(start.valueOf()) : new Date(); + this._end = (end != undefined) ? new Date(end.valueOf()) : new Date(); + + if (this.autoScale) { + this.setMinimumStep(minimumStep); + } + }; + + /** + * Set the range iterator to the start date. + */ + TimeStep.prototype.first = function() { + this.current = new Date(this._start.valueOf()); + this.roundToMinor(); + }; + + /** + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date + */ + TimeStep.prototype.roundToMinor = function() { + // round to floor + // IMPORTANT: we have no breaks in this switch! (this is no bug) + // noinspection FallThroughInSwitchStatementJS + switch (this.scale) { + case 'year': + this.current.setFullYear(this.step * Math.floor(this.current.getFullYear() / this.step)); + this.current.setMonth(0); + case 'month': this.current.setDate(1); + case 'day': // intentional fall through + case 'weekday': this.current.setHours(0); + case 'hour': this.current.setMinutes(0); + case 'minute': this.current.setSeconds(0); + case 'second': this.current.setMilliseconds(0); + //case 'millisecond': // nothing to do for milliseconds + } + + if (this.step != 1) { + // round down to the first minor value that is a multiple of the current step size + switch (this.scale) { + case 'millisecond': this.current.setMilliseconds(this.current.getMilliseconds() - this.current.getMilliseconds() % this.step); break; + case 'second': this.current.setSeconds(this.current.getSeconds() - this.current.getSeconds() % this.step); break; + case 'minute': this.current.setMinutes(this.current.getMinutes() - this.current.getMinutes() % this.step); break; + case 'hour': this.current.setHours(this.current.getHours() - this.current.getHours() % this.step); break; + case 'weekday': // intentional fall through + case 'day': this.current.setDate((this.current.getDate()-1) - (this.current.getDate()-1) % this.step + 1); break; + case 'month': this.current.setMonth(this.current.getMonth() - this.current.getMonth() % this.step); break; + case 'year': this.current.setFullYear(this.current.getFullYear() - this.current.getFullYear() % this.step); break; + default: break; + } + } + }; + + /** + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date + */ + TimeStep.prototype.hasNext = function () { + return (this.current.valueOf() <= this._end.valueOf()); + }; + + /** + * Do the next step + */ + TimeStep.prototype.next = function() { + var prev = this.current.valueOf(); + + // Two cases, needed to prevent issues with switching daylight savings + // (end of March and end of October) + if (this.current.getMonth() < 6) { + switch (this.scale) { + case 'millisecond': + + this.current = new Date(this.current.valueOf() + this.step); break; + case 'second': this.current = new Date(this.current.valueOf() + this.step * 1000); break; + case 'minute': this.current = new Date(this.current.valueOf() + this.step * 1000 * 60); break; + case 'hour': + this.current = new Date(this.current.valueOf() + this.step * 1000 * 60 * 60); + // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...) + var h = this.current.getHours(); + this.current.setHours(h - (h % this.step)); + break; + case 'weekday': // intentional fall through + case 'day': this.current.setDate(this.current.getDate() + this.step); break; + case 'month': this.current.setMonth(this.current.getMonth() + this.step); break; + case 'year': this.current.setFullYear(this.current.getFullYear() + this.step); break; + default: break; + } + } + else { + switch (this.scale) { + case 'millisecond': this.current = new Date(this.current.valueOf() + this.step); break; + case 'second': this.current.setSeconds(this.current.getSeconds() + this.step); break; + case 'minute': this.current.setMinutes(this.current.getMinutes() + this.step); break; + case 'hour': this.current.setHours(this.current.getHours() + this.step); break; + case 'weekday': // intentional fall through + case 'day': this.current.setDate(this.current.getDate() + this.step); break; + case 'month': this.current.setMonth(this.current.getMonth() + this.step); break; + case 'year': this.current.setFullYear(this.current.getFullYear() + this.step); break; + default: break; + } + } + + if (this.step != 1) { + // round down to the correct major value + switch (this.scale) { + case 'millisecond': if(this.current.getMilliseconds() < this.step) this.current.setMilliseconds(0); break; + case 'second': if(this.current.getSeconds() < this.step) this.current.setSeconds(0); break; + case 'minute': if(this.current.getMinutes() < this.step) this.current.setMinutes(0); break; + case 'hour': if(this.current.getHours() < this.step) this.current.setHours(0); break; + case 'weekday': // intentional fall through + case 'day': if(this.current.getDate() < this.step+1) this.current.setDate(1); break; + case 'month': if(this.current.getMonth() < this.step) this.current.setMonth(0); break; + case 'year': break; // nothing to do for year + default: break; + } + } + + // safety mechanism: if current time is still unchanged, move to the end + if (this.current.valueOf() == prev) { + this.current = new Date(this._end.valueOf()); + } + + DateUtil.stepOverHiddenDates(this, prev); + }; + + + /** + * Get the current datetime + * @return {Date} current The current date + */ + TimeStep.prototype.getCurrent = function() { + return this.current; + }; + + /** + * Set a custom scale. Autoscaling will be disabled. + * For example setScale('minute', 5) will result + * in minor steps of 5 minutes, and major steps of an hour. + * + * @param {{scale: string, step: number}} params + * An object containing two properties: + * - A string 'scale'. Choose from 'millisecond', 'second', + * 'minute', 'hour', 'weekday, 'day, 'month, 'year'. + * - A number 'step'. A step size, by default 1. + * Choose for example 1, 2, 5, or 10. + */ + TimeStep.prototype.setScale = function(params) { + if (params && typeof params.scale == 'string') { + this.scale = params.scale; + this.step = params.step > 0 ? params.step : 1; + this.autoScale = false; + } + }; + + /** + * Enable or disable autoscaling + * @param {boolean} enable If true, autoascaling is set true + */ + TimeStep.prototype.setAutoScale = function (enable) { + this.autoScale = enable; + }; + + + /** + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds + */ + TimeStep.prototype.setMinimumStep = function(minimumStep) { + if (minimumStep == undefined) { + return; + } + + //var b = asc + ds; + + var stepYear = (1000 * 60 * 60 * 24 * 30 * 12); + var stepMonth = (1000 * 60 * 60 * 24 * 30); + var stepDay = (1000 * 60 * 60 * 24); + var stepHour = (1000 * 60 * 60); + var stepMinute = (1000 * 60); + var stepSecond = (1000); + var stepMillisecond= (1); + + // find the smallest step that is larger than the provided minimumStep + if (stepYear*1000 > minimumStep) {this.scale = 'year'; this.step = 1000;} + if (stepYear*500 > minimumStep) {this.scale = 'year'; this.step = 500;} + if (stepYear*100 > minimumStep) {this.scale = 'year'; this.step = 100;} + if (stepYear*50 > minimumStep) {this.scale = 'year'; this.step = 50;} + if (stepYear*10 > minimumStep) {this.scale = 'year'; this.step = 10;} + if (stepYear*5 > minimumStep) {this.scale = 'year'; this.step = 5;} + if (stepYear > minimumStep) {this.scale = 'year'; this.step = 1;} + if (stepMonth*3 > minimumStep) {this.scale = 'month'; this.step = 3;} + if (stepMonth > minimumStep) {this.scale = 'month'; this.step = 1;} + if (stepDay*5 > minimumStep) {this.scale = 'day'; this.step = 5;} + if (stepDay*2 > minimumStep) {this.scale = 'day'; this.step = 2;} + if (stepDay > minimumStep) {this.scale = 'day'; this.step = 1;} + if (stepDay/2 > minimumStep) {this.scale = 'weekday'; this.step = 1;} + if (stepHour*4 > minimumStep) {this.scale = 'hour'; this.step = 4;} + if (stepHour > minimumStep) {this.scale = 'hour'; this.step = 1;} + if (stepMinute*15 > minimumStep) {this.scale = 'minute'; this.step = 15;} + if (stepMinute*10 > minimumStep) {this.scale = 'minute'; this.step = 10;} + if (stepMinute*5 > minimumStep) {this.scale = 'minute'; this.step = 5;} + if (stepMinute > minimumStep) {this.scale = 'minute'; this.step = 1;} + if (stepSecond*15 > minimumStep) {this.scale = 'second'; this.step = 15;} + if (stepSecond*10 > minimumStep) {this.scale = 'second'; this.step = 10;} + if (stepSecond*5 > minimumStep) {this.scale = 'second'; this.step = 5;} + if (stepSecond > minimumStep) {this.scale = 'second'; this.step = 1;} + if (stepMillisecond*200 > minimumStep) {this.scale = 'millisecond'; this.step = 200;} + if (stepMillisecond*100 > minimumStep) {this.scale = 'millisecond'; this.step = 100;} + if (stepMillisecond*50 > minimumStep) {this.scale = 'millisecond'; this.step = 50;} + if (stepMillisecond*10 > minimumStep) {this.scale = 'millisecond'; this.step = 10;} + if (stepMillisecond*5 > minimumStep) {this.scale = 'millisecond'; this.step = 5;} + if (stepMillisecond > minimumStep) {this.scale = 'millisecond'; this.step = 1;} + }; + + /** + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * Static function + * @param {Date} date the date to be snapped. + * @param {string} scale Current scale, can be 'millisecond', 'second', + * 'minute', 'hour', 'weekday, 'day, 'month, 'year'. + * @param {number} step Current step (1, 2, 4, 5, ... + * @return {Date} snappedDate + */ + TimeStep.snap = function(date, scale, step) { + var clone = new Date(date.valueOf()); + + if (scale == 'year') { + var year = clone.getFullYear() + Math.round(clone.getMonth() / 12); + clone.setFullYear(Math.round(year / step) * step); + clone.setMonth(0); + clone.setDate(0); + clone.setHours(0); + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (scale == 'month') { + if (clone.getDate() > 15) { + clone.setDate(1); + clone.setMonth(clone.getMonth() + 1); + // important: first set Date to 1, after that change the month. + } + else { + clone.setDate(1); + } + + clone.setHours(0); + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (scale == 'day') { + //noinspection FallthroughInSwitchStatementJS + switch (step) { + case 5: + case 2: + clone.setHours(Math.round(clone.getHours() / 24) * 24); break; + default: + clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + } + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (scale == 'weekday') { + //noinspection FallthroughInSwitchStatementJS + switch (step) { + case 5: + case 2: + clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + default: + clone.setHours(Math.round(clone.getHours() / 6) * 6); break; + } + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (scale == 'hour') { + switch (step) { + case 4: + clone.setMinutes(Math.round(clone.getMinutes() / 60) * 60); break; + default: + clone.setMinutes(Math.round(clone.getMinutes() / 30) * 30); break; + } + clone.setSeconds(0); + clone.setMilliseconds(0); + } else if (scale == 'minute') { + //noinspection FallthroughInSwitchStatementJS + switch (step) { + case 15: + case 10: + clone.setMinutes(Math.round(clone.getMinutes() / 5) * 5); + clone.setSeconds(0); + break; + case 5: + clone.setSeconds(Math.round(clone.getSeconds() / 60) * 60); break; + default: + clone.setSeconds(Math.round(clone.getSeconds() / 30) * 30); break; + } + clone.setMilliseconds(0); + } + else if (scale == 'second') { + //noinspection FallthroughInSwitchStatementJS + switch (step) { + case 15: + case 10: + clone.setSeconds(Math.round(clone.getSeconds() / 5) * 5); + clone.setMilliseconds(0); + break; + case 5: + clone.setMilliseconds(Math.round(clone.getMilliseconds() / 1000) * 1000); break; + default: + clone.setMilliseconds(Math.round(clone.getMilliseconds() / 500) * 500); break; + } + } + else if (scale == 'millisecond') { + var _step = step > 5 ? step / 2 : 1; + clone.setMilliseconds(Math.round(clone.getMilliseconds() / _step) * _step); + } + + return clone; + }; + + /** + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. + */ + TimeStep.prototype.isMajor = function() { + if (this.switchedYear == true) { + this.switchedYear = false; + switch (this.scale) { + case 'year': + case 'month': + case 'weekday': + case 'day': + case 'hour': + case 'minute': + case 'second': + case 'millisecond': + return true; + default: + return false; + } + } + else if (this.switchedMonth == true) { + this.switchedMonth = false; + switch (this.scale) { + case 'weekday': + case 'day': + case 'hour': + case 'minute': + case 'second': + case 'millisecond': + return true; + default: + return false; + } + } + else if (this.switchedDay == true) { + this.switchedDay = false; + switch (this.scale) { + case 'millisecond': + case 'second': + case 'minute': + case 'hour': + return true; + default: + return false; + } + } + + switch (this.scale) { + case 'millisecond': + return (this.current.getMilliseconds() == 0); + case 'second': + return (this.current.getSeconds() == 0); + case 'minute': + return (this.current.getHours() == 0) && (this.current.getMinutes() == 0); + case 'hour': + return (this.current.getHours() == 0); + case 'weekday': // intentional fall through + case 'day': + return (this.current.getDate() == 1); + case 'month': + return (this.current.getMonth() == 0); + case 'year': + return false; + default: + return false; + } + }; + + + /** + * Returns formatted text for the minor axislabel, depending on the current + * date and the scale. For example when scale is MINUTE, the current time is + * formatted as "hh:mm". + * @param {Date} [date] custom date. if not provided, current date is taken + */ + TimeStep.prototype.getLabelMinor = function(date) { + if (date == undefined) { + date = this.current; + } + + var format = this.format.minorLabels[this.scale]; + return (format && format.length > 0) ? moment(date).format(format) : ''; + }; + + /** + * Returns formatted text for the major axis label, depending on the current + * date and the scale. For example when scale is MINUTE, the major scale is + * hours, and the hour will be formatted as "hh". + * @param {Date} [date] custom date. if not provided, current date is taken + */ + TimeStep.prototype.getLabelMajor = function(date) { + if (date == undefined) { + date = this.current; + } + + var format = this.format.majorLabels[this.scale]; + return (format && format.length > 0) ? moment(date).format(format) : ''; + }; + + TimeStep.prototype.getClassName = function() { + var m = moment(this.current); + var date = m.locale ? m.locale('en') : m.lang('en'); // old versions of moment have .lang() function + var step = this.step; + + function even(value) { + return (value / step % 2 == 0) ? ' even' : ' odd'; + } + + function today(date) { + if (date.isSame(new Date(), 'day')) { + return ' today'; + } + if (date.isSame(moment().add(1, 'day'), 'day')) { + return ' tomorrow'; + } + if (date.isSame(moment().add(-1, 'day'), 'day')) { + return ' yesterday'; + } + return ''; + } + + function currentWeek(date) { + return date.isSame(new Date(), 'week') ? ' current-week' : ''; + } + + function currentMonth(date) { + return date.isSame(new Date(), 'month') ? ' current-month' : ''; + } + + function currentYear(date) { + return date.isSame(new Date(), 'year') ? ' current-year' : ''; + } + + switch (this.scale) { + case 'millisecond': + return even(date.milliseconds()).trim(); + + case 'second': + return even(date.seconds()).trim(); + + case 'minute': + return even(date.minutes()).trim(); + + case 'hour': + var hours = date.hours(); + if (this.step == 4) { + hours = hours + '-' + (hours + 4); + } + return hours + 'h' + today(date) + even(date.hours()); + + case 'weekday': + return date.format('dddd').toLowerCase() + + today(date) + currentWeek(date) + even(date.date()); + + case 'day': + var day = date.date(); + var month = date.format('MMMM').toLowerCase(); + return 'day' + day + ' ' + month + currentMonth(date) + even(day - 1); + + case 'month': + return date.format('MMMM').toLowerCase() + + currentMonth(date) + even(date.month()); + + case 'year': + var year = date.year(); + return 'year' + year + currentYear(date)+ even(year); + + default: + return ''; + } + }; + + module.exports = TimeStep; + + +/***/ }, +/* 20 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + + /** + * @constructor Item + * @param {Object} data Object containing (optional) parameters type, + * start, end, content, group, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} options Configuration options + * // TODO: describe available options + */ + function Item (data, conversion, options) { + this.id = null; + this.parent = null; + this.data = data; + this.dom = null; + this.conversion = conversion || {}; + this.options = options || {}; + + this.selected = false; + this.displayed = false; + this.dirty = true; + + this.top = null; + this.left = null; + this.width = null; + this.height = null; + } + + Item.prototype.stack = true; + + /** + * Select current item + */ + Item.prototype.select = function() { + this.selected = true; + this.dirty = true; + if (this.displayed) this.redraw(); + }; + + /** + * Unselect current item + */ + Item.prototype.unselect = function() { + this.selected = false; + this.dirty = true; + if (this.displayed) this.redraw(); + }; + + /** + * Set data for the item. Existing data will be updated. The id should not + * be changed. When the item is displayed, it will be redrawn immediately. + * @param {Object} data + */ + Item.prototype.setData = function(data) { + this.data = data; + this.dirty = true; + if (this.displayed) this.redraw(); + }; + + /** + * Set a parent for the item + * @param {ItemSet | Group} parent + */ + Item.prototype.setParent = function(parent) { + if (this.displayed) { + this.hide(); + this.parent = parent; + if (this.parent) { + this.show(); + } + } + else { + this.parent = parent; + } + }; + + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + Item.prototype.isVisible = function(range) { + // Should be implemented by Item implementations + return false; + }; + + /** + * Show the Item in the DOM (when not already visible) + * @return {Boolean} changed + */ + Item.prototype.show = function() { + return false; + }; + + /** + * Hide the Item from the DOM (when visible) + * @return {Boolean} changed + */ + Item.prototype.hide = function() { + return false; + }; + + /** + * Repaint the item + */ + Item.prototype.redraw = function() { + // should be implemented by the item + }; + + /** + * Reposition the Item horizontally + */ + Item.prototype.repositionX = function() { + // should be implemented by the item + }; + + /** + * Reposition the Item vertically + */ + Item.prototype.repositionY = function() { + // should be implemented by the item + }; + + /** + * Repaint a delete button on the top right of the item when the item is selected + * @param {HTMLElement} anchor + * @protected + */ + Item.prototype._repaintDeleteButton = function (anchor) { + if (this.selected && this.options.editable.remove && !this.dom.deleteButton) { + // create and show button + var me = this; + + var deleteButton = document.createElement('div'); + deleteButton.className = 'delete'; + deleteButton.title = 'Delete this item'; + + Hammer(deleteButton, { + preventDefault: true + }).on('tap', function (event) { + me.parent.removeFromDataSet(me); + event.stopPropagation(); + }); + + anchor.appendChild(deleteButton); + this.dom.deleteButton = deleteButton; + } + else if (!this.selected && this.dom.deleteButton) { + // remove button + if (this.dom.deleteButton.parentNode) { + this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton); + } + this.dom.deleteButton = null; + } + }; + + /** + * Set HTML contents for the item + * @param {Element} element HTML element to fill with the contents + * @private + */ + Item.prototype._updateContents = function (element) { + var content; + if (this.options.template) { + var itemData = this.parent.itemSet.itemsData.get(this.id); // get a clone of the data from the dataset + content = this.options.template(itemData); + } + else { + content = this.data.content; + } + + if(content !== this.content) { + // only replace the content when changed + if (content instanceof Element) { + element.innerHTML = ''; + element.appendChild(content); + } + else if (content != undefined) { + element.innerHTML = content; + } + else { + if (!(this.data.type == 'background' && this.data.content === undefined)) { + throw new Error('Property "content" missing in item ' + this.id); + } + } + + this.content = content; + } + }; + + /** + * Set HTML contents for the item + * @param {Element} element HTML element to fill with the contents + * @private + */ + Item.prototype._updateTitle = function (element) { + if (this.data.title != null) { + element.title = this.data.title || ''; + } + else { + element.removeAttribute('title'); + } + }; + + /** + * Process dataAttributes timeline option and set as data- attributes on dom.content + * @param {Element} element HTML element to which the attributes will be attached + * @private + */ + Item.prototype._updateDataAttributes = function(element) { + if (this.options.dataAttributes && this.options.dataAttributes.length > 0) { + var attributes = []; + + if (Array.isArray(this.options.dataAttributes)) { + attributes = this.options.dataAttributes; + } + else if (this.options.dataAttributes == 'all') { + attributes = Object.keys(this.data); + } + else { + return; + } + + for (var i = 0; i < attributes.length; i++) { + var name = attributes[i]; + var value = this.data[name]; + + if (value != null) { + element.setAttribute('data-' + name, value); + } + else { + element.removeAttribute('data-' + name); + } + } + } + }; + + /** + * Update custom styles of the element + * @param element + * @private + */ + Item.prototype._updateStyle = function(element) { + // remove old styles + if (this.style) { + util.removeCssText(element, this.style); + this.style = null; + } + + // append new styles + if (this.data.style) { + util.addCssText(element, this.data.style); + this.style = this.data.style; + } + }; + + module.exports = Item; + + +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(45); + var Item = __webpack_require__(20); + var BackgroundGroup = __webpack_require__(31); + var RangeItem = __webpack_require__(25); + + /** + * @constructor BackgroundItem + * @extends Item + * @param {Object} data Object containing parameters start, end + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe options + */ + // TODO: implement support for the BackgroundItem just having a start, then being displayed as a sort of an annotation + function BackgroundItem (data, conversion, options) { + this.props = { + content: { + width: 0 + } + }; + this.overflow = false; // if contents can overflow (css styling), this flag is set to true + + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data.id); + } + if (data.end == undefined) { + throw new Error('Property "end" missing in item ' + data.id); + } + } + + Item.call(this, data, conversion, options); + + this.emptyContent = false; + } + + BackgroundItem.prototype = new Item (null, null, null); + + BackgroundItem.prototype.baseClassName = 'item background'; + BackgroundItem.prototype.stack = false; + + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + BackgroundItem.prototype.isVisible = function(range) { + // determine visibility + return (this.data.start < range.end) && (this.data.end > range.start); + }; + + /** + * Repaint the item + */ + BackgroundItem.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; + + // background box + dom.box = document.createElement('div'); + // className is updated in redraw() + + // contents box + dom.content = document.createElement('div'); + dom.content.className = 'content'; + dom.box.appendChild(dom.content); + + // Note: we do NOT attach this item as attribute to the DOM, + // such that background items cannot be selected + //dom.box['timeline-item'] = this; + + this.dirty = true; + } + + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.box.parentNode) { + var background = this.parent.dom.background; + if (!background) { + throw new Error('Cannot redraw item: parent has no background container element'); + } + background.appendChild(dom.box); + } + this.displayed = true; + + // Update DOM when item is marked dirty. An item is marked dirty when: + // - the item is not yet rendered + // - the item's data is changed + // - the item is selected/deselected + if (this.dirty) { + this._updateContents(this.dom.content); + this._updateTitle(this.dom.content); + this._updateDataAttributes(this.dom.content); + this._updateStyle(this.dom.box); + + // update class + var className = (this.data.className ? (' ' + this.data.className) : '') + + (this.selected ? ' selected' : ''); + dom.box.className = this.baseClassName + className; + + // determine from css whether this box has overflow + this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden'; + + // recalculate size + this.props.content.width = this.dom.content.offsetWidth; + this.height = 0; // set height zero, so this item will be ignored when stacking items + + this.dirty = false; + } + }; + + /** + * Show the item in the DOM (when not already visible). The items DOM will + * be created when needed. + */ + BackgroundItem.prototype.show = RangeItem.prototype.show; + + /** + * Hide the item from the DOM (when visible) + * @return {Boolean} changed + */ + BackgroundItem.prototype.hide = RangeItem.prototype.hide; + + /** + * Reposition the item horizontally + * @Override + */ + BackgroundItem.prototype.repositionX = RangeItem.prototype.repositionX; + + /** + * Reposition the item vertically + * @Override + */ + BackgroundItem.prototype.repositionY = function(margin) { + var onTop = this.options.orientation === 'top'; + this.dom.content.style.top = onTop ? '' : '0'; + this.dom.content.style.bottom = onTop ? '0' : ''; + var height; + + // special positioning for subgroups + if (this.data.subgroup !== undefined) { + var itemSubgroup = this.data.subgroup; + var subgroups = this.parent.subgroups; + var subgroupIndex = subgroups[itemSubgroup].index; + // if the orientation is top, we need to take the difference in height into account. + if (onTop == true) { + // the first subgroup will have to account for the distance from the top to the first item. + height = this.parent.subgroups[itemSubgroup].height + margin.item.vertical; + height += subgroupIndex == 0 ? margin.axis - 0.5*margin.item.vertical : 0; + var newTop = this.parent.top; + for (var subgroup in subgroups) { + if (subgroups.hasOwnProperty(subgroup)) { + if (subgroups[subgroup].visible == true && subgroups[subgroup].index < subgroupIndex) { + newTop += subgroups[subgroup].height + margin.item.vertical; + } + } + } + + // the others will have to be offset downwards with this same distance. + newTop += subgroupIndex != 0 ? margin.axis - 0.5 * margin.item.vertical : 0; + this.dom.box.style.top = newTop + 'px'; + this.dom.box.style.bottom = ''; + } + // and when the orientation is bottom: + else { + var newTop = this.parent.top; + for (var subgroup in subgroups) { + if (subgroups.hasOwnProperty(subgroup)) { + if (subgroups[subgroup].visible == true && subgroups[subgroup].index > subgroupIndex) { + newTop += subgroups[subgroup].height + margin.item.vertical; + } + } + } + height = this.parent.subgroups[itemSubgroup].height + margin.item.vertical; + this.dom.box.style.top = newTop + 'px'; + this.dom.box.style.bottom = ''; + } + } + // and in the case of no subgroups: + else { + // we want backgrounds with groups to only show in groups. + if (this.parent instanceof BackgroundGroup) { + // if the item is not in a group: + height = Math.max(this.parent.height, + this.parent.itemSet.body.domProps.center.height, + this.parent.itemSet.body.domProps.centerContainer.height); + this.dom.box.style.top = onTop ? '0' : ''; + this.dom.box.style.bottom = onTop ? '' : '0'; + } + else { + height = this.parent.height; + // same alignment for items when orientation is top or bottom + this.dom.box.style.top = this.parent.top + 'px'; + this.dom.box.style.bottom = ''; + } + } + this.dom.box.style.height = height + 'px'; + }; + + module.exports = BackgroundItem; + + +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { + + var Item = __webpack_require__(20); + var util = __webpack_require__(1); + + /** + * @constructor BoxItem + * @extends Item + * @param {Object} data Object containing parameters start + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe available options + */ + function BoxItem (data, conversion, options) { + this.props = { + dot: { + width: 0, + height: 0 + }, + line: { + width: 0, + height: 0 + } + }; + + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data); + } + } + + Item.call(this, data, conversion, options); + } + + BoxItem.prototype = new Item (null, null, null); + + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + BoxItem.prototype.isVisible = function(range) { + // determine visibility + // TODO: account for the real width of the item. Right now we just add 1/4 to the window + var interval = (range.end - range.start) / 4; + return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); + }; + + /** + * Repaint the item + */ + BoxItem.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; + + // create main box + dom.box = document.createElement('DIV'); + + // contents box (inside the background box). used for making margins + dom.content = document.createElement('DIV'); + dom.content.className = 'content'; + dom.box.appendChild(dom.content); + + // line to axis + dom.line = document.createElement('DIV'); + dom.line.className = 'line'; + + // dot on axis + dom.dot = document.createElement('DIV'); + dom.dot.className = 'dot'; + + // attach this item as attribute + dom.box['timeline-item'] = this; + + this.dirty = true; + } + + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.box.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) throw new Error('Cannot redraw item: parent has no foreground container element'); + foreground.appendChild(dom.box); + } + if (!dom.line.parentNode) { + var background = this.parent.dom.background; + if (!background) throw new Error('Cannot redraw item: parent has no background container element'); + background.appendChild(dom.line); + } + if (!dom.dot.parentNode) { + var axis = this.parent.dom.axis; + if (!background) throw new Error('Cannot redraw item: parent has no axis container element'); + axis.appendChild(dom.dot); + } + this.displayed = true; + + // Update DOM when item is marked dirty. An item is marked dirty when: + // - the item is not yet rendered + // - the item's data is changed + // - the item is selected/deselected + if (this.dirty) { + this._updateContents(this.dom.content); + this._updateTitle(this.dom.box); + this._updateDataAttributes(this.dom.box); + this._updateStyle(this.dom.box); + + // update class + var className = (this.data.className? ' ' + this.data.className : '') + + (this.selected ? ' selected' : ''); + dom.box.className = 'item box' + className; + dom.line.className = 'item line' + className; + dom.dot.className = 'item dot' + className; + + // recalculate size + this.props.dot.height = dom.dot.offsetHeight; + this.props.dot.width = dom.dot.offsetWidth; + this.props.line.width = dom.line.offsetWidth; + this.width = dom.box.offsetWidth; + this.height = dom.box.offsetHeight; + + this.dirty = false; + } + + this._repaintDeleteButton(dom.box); + }; + + /** + * Show the item in the DOM (when not already displayed). The items DOM will + * be created when needed. + */ + BoxItem.prototype.show = function() { + if (!this.displayed) { + this.redraw(); + } + }; + + /** + * Hide the item from the DOM (when visible) + */ + BoxItem.prototype.hide = function() { + if (this.displayed) { + var dom = this.dom; + + if (dom.box.parentNode) dom.box.parentNode.removeChild(dom.box); + if (dom.line.parentNode) dom.line.parentNode.removeChild(dom.line); + if (dom.dot.parentNode) dom.dot.parentNode.removeChild(dom.dot); + + this.top = null; + this.left = null; + + this.displayed = false; + } + }; + + /** + * Reposition the item horizontally + * @Override + */ + BoxItem.prototype.repositionX = function() { + var start = this.conversion.toScreen(this.data.start); + var align = this.options.align; + var left; + var box = this.dom.box; + var line = this.dom.line; + var dot = this.dom.dot; + + // calculate left position of the box + if (align == 'right') { + this.left = start - this.width; + } + else if (align == 'left') { + this.left = start; + } + else { + // default or 'center' + this.left = start - this.width / 2; + } + + // reposition box + box.style.left = this.left + 'px'; + + // reposition line + line.style.left = (start - this.props.line.width / 2) + 'px'; + + // reposition dot + dot.style.left = (start - this.props.dot.width / 2) + 'px'; + }; + + /** + * Reposition the item vertically + * @Override + */ + BoxItem.prototype.repositionY = function() { + var orientation = this.options.orientation; + var box = this.dom.box; + var line = this.dom.line; + var dot = this.dom.dot; + + if (orientation == 'top') { + box.style.top = (this.top || 0) + 'px'; + + line.style.top = '0'; + line.style.height = (this.parent.top + this.top + 1) + 'px'; + line.style.bottom = ''; + } + else { // orientation 'bottom' + var itemSetHeight = this.parent.itemSet.props.height; // TODO: this is nasty + var lineHeight = itemSetHeight - this.parent.top - this.parent.height + this.top; + + box.style.top = (this.parent.height - this.top - this.height || 0) + 'px'; + line.style.top = (itemSetHeight - lineHeight) + 'px'; + line.style.bottom = '0'; + } + + dot.style.top = (-this.props.dot.height / 2) + 'px'; + }; + + module.exports = BoxItem; + + +/***/ }, +/* 23 */ +/***/ function(module, exports, __webpack_require__) { + + var Item = __webpack_require__(20); + + /** + * @constructor PointItem + * @extends Item + * @param {Object} data Object containing parameters start + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe available options + */ + function PointItem (data, conversion, options) { + this.props = { + dot: { + top: 0, + width: 0, + height: 0 + }, + content: { + height: 0, + marginLeft: 0 + } + }; + + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data); + } + } + + Item.call(this, data, conversion, options); + } + + PointItem.prototype = new Item (null, null, null); + + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + PointItem.prototype.isVisible = function(range) { + // determine visibility + // TODO: account for the real width of the item. Right now we just add 1/4 to the window + var interval = (range.end - range.start) / 4; + return (this.data.start > range.start - interval) && (this.data.start < range.end + interval); + }; + + /** + * Repaint the item + */ + PointItem.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; + + // background box + dom.point = document.createElement('div'); + // className is updated in redraw() + + // contents box, right from the dot + dom.content = document.createElement('div'); + dom.content.className = 'content'; + dom.point.appendChild(dom.content); + + // dot at start + dom.dot = document.createElement('div'); + dom.point.appendChild(dom.dot); + + // attach this item as attribute + dom.point['timeline-item'] = this; + + this.dirty = true; + } + + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.point.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) { + throw new Error('Cannot redraw item: parent has no foreground container element'); + } + foreground.appendChild(dom.point); + } + this.displayed = true; + + // Update DOM when item is marked dirty. An item is marked dirty when: + // - the item is not yet rendered + // - the item's data is changed + // - the item is selected/deselected + if (this.dirty) { + this._updateContents(this.dom.content); + this._updateTitle(this.dom.point); + this._updateDataAttributes(this.dom.point); + this._updateStyle(this.dom.point); + + // update class + var className = (this.data.className? ' ' + this.data.className : '') + + (this.selected ? ' selected' : ''); + dom.point.className = 'item point' + className; + dom.dot.className = 'item dot' + className; + + // recalculate size + this.width = dom.point.offsetWidth; + this.height = dom.point.offsetHeight; + this.props.dot.width = dom.dot.offsetWidth; + this.props.dot.height = dom.dot.offsetHeight; + this.props.content.height = dom.content.offsetHeight; + + // resize contents + dom.content.style.marginLeft = 2 * this.props.dot.width + 'px'; + //dom.content.style.marginRight = ... + 'px'; // TODO: margin right + + dom.dot.style.top = ((this.height - this.props.dot.height) / 2) + 'px'; + dom.dot.style.left = (this.props.dot.width / 2) + 'px'; + + this.dirty = false; + } + + this._repaintDeleteButton(dom.point); + }; + + /** + * Show the item in the DOM (when not already visible). The items DOM will + * be created when needed. + */ + PointItem.prototype.show = function() { + if (!this.displayed) { + this.redraw(); + } + }; + + /** + * Hide the item from the DOM (when visible) + */ + PointItem.prototype.hide = function() { + if (this.displayed) { + if (this.dom.point.parentNode) { + this.dom.point.parentNode.removeChild(this.dom.point); + } + + this.top = null; + this.left = null; + + this.displayed = false; + } + }; + + /** + * Reposition the item horizontally + * @Override + */ + PointItem.prototype.repositionX = function() { + var start = this.conversion.toScreen(this.data.start); + + this.left = start - this.props.dot.width; + + // reposition point + this.dom.point.style.left = this.left + 'px'; + }; + + /** + * Reposition the item vertically + * @Override + */ + PointItem.prototype.repositionY = function() { + var orientation = this.options.orientation, + point = this.dom.point; + + if (orientation == 'top') { + point.style.top = this.top + 'px'; + } + else { + point.style.top = (this.parent.height - this.top - this.height) + 'px'; + } + }; + + module.exports = PointItem; + + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Prototype for visual components + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body] + * @param {Object} [options] + */ + function Component (body, options) { + this.options = null; + this.props = null; + } + + /** + * Set options for the component. The new options will be merged into the + * current options. + * @param {Object} options + */ + Component.prototype.setOptions = function(options) { + if (options) { + util.extend(this.options, options); + } + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + Component.prototype.redraw = function() { + // should be implemented by the component + return false; + }; + + /** + * Destroy the component. Cleanup DOM and event listeners + */ + Component.prototype.destroy = function() { + // should be implemented by the component + }; + + /** + * Test whether the component is resized since the last time _isResized() was + * called. + * @return {Boolean} Returns true if the component is resized + * @protected + */ + Component.prototype._isResized = function() { + var resized = (this.props._previousWidth !== this.props.width || + this.props._previousHeight !== this.props.height); + + this.props._previousWidth = this.props.width; + this.props._previousHeight = this.props.height; + + return resized; + }; + + module.exports = Component; + + +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(45); + var Item = __webpack_require__(20); + + /** + * @constructor RangeItem + * @extends Item + * @param {Object} data Object containing parameters start, end + * content, className. + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe options + */ + function RangeItem (data, conversion, options) { + this.props = { + content: { + width: 0 + } + }; + this.overflow = false; // if contents can overflow (css styling), this flag is set to true + + // validate data + if (data) { + if (data.start == undefined) { + throw new Error('Property "start" missing in item ' + data.id); + } + if (data.end == undefined) { + throw new Error('Property "end" missing in item ' + data.id); + } + } + + Item.call(this, data, conversion, options); + } + + RangeItem.prototype = new Item (null, null, null); + + RangeItem.prototype.baseClassName = 'item range'; + + /** + * Check whether this item is visible inside given range + * @returns {{start: Number, end: Number}} range with a timestamp for start and end + * @returns {boolean} True if visible + */ + RangeItem.prototype.isVisible = function(range) { + // determine visibility + return (this.data.start < range.end) && (this.data.end > range.start); + }; + + /** + * Repaint the item + */ + RangeItem.prototype.redraw = function() { + var dom = this.dom; + if (!dom) { + // create DOM + this.dom = {}; + dom = this.dom; + + // background box + dom.box = document.createElement('div'); + // className is updated in redraw() + + // contents box + dom.content = document.createElement('div'); + dom.content.className = 'content'; + dom.box.appendChild(dom.content); + + // attach this item as attribute + dom.box['timeline-item'] = this; + + this.dirty = true; + } + + // append DOM to parent DOM + if (!this.parent) { + throw new Error('Cannot redraw item: no parent attached'); + } + if (!dom.box.parentNode) { + var foreground = this.parent.dom.foreground; + if (!foreground) { + throw new Error('Cannot redraw item: parent has no foreground container element'); + } + foreground.appendChild(dom.box); + } + this.displayed = true; + + // Update DOM when item is marked dirty. An item is marked dirty when: + // - the item is not yet rendered + // - the item's data is changed + // - the item is selected/deselected + if (this.dirty) { + this._updateContents(this.dom.content); + this._updateTitle(this.dom.box); + this._updateDataAttributes(this.dom.box); + this._updateStyle(this.dom.box); + + // update class + var className = (this.data.className ? (' ' + this.data.className) : '') + + (this.selected ? ' selected' : ''); + dom.box.className = this.baseClassName + className; + + // determine from css whether this box has overflow + this.overflow = window.getComputedStyle(dom.content).overflow !== 'hidden'; + + // recalculate size + // turn off max-width to be able to calculate the real width + // this causes an extra browser repaint/reflow, but so be it + this.dom.content.style.maxWidth = 'none'; + this.props.content.width = this.dom.content.offsetWidth; + this.height = this.dom.box.offsetHeight; + this.dom.content.style.maxWidth = ''; + + this.dirty = false; + } + + this._repaintDeleteButton(dom.box); + this._repaintDragLeft(); + this._repaintDragRight(); + }; + + /** + * Show the item in the DOM (when not already visible). The items DOM will + * be created when needed. + */ + RangeItem.prototype.show = function() { + if (!this.displayed) { + this.redraw(); + } + }; + + /** + * Hide the item from the DOM (when visible) + * @return {Boolean} changed + */ + RangeItem.prototype.hide = function() { + if (this.displayed) { + var box = this.dom.box; + + if (box.parentNode) { + box.parentNode.removeChild(box); + } + + this.top = null; + this.left = null; + + this.displayed = false; + } + }; + + /** + * Reposition the item horizontally + * @Override + */ + RangeItem.prototype.repositionX = function() { + var parentWidth = this.parent.width; + var start = this.conversion.toScreen(this.data.start); + var end = this.conversion.toScreen(this.data.end); + var contentLeft; + var contentWidth; + + // limit the width of the this, as browsers cannot draw very wide divs + if (start < -parentWidth) { + start = -parentWidth; + } + if (end > 2 * parentWidth) { + end = 2 * parentWidth; + } + var boxWidth = Math.max(end - start, 1); + + if (this.overflow) { + this.left = start; + this.width = boxWidth + this.props.content.width; + contentWidth = this.props.content.width; + + // Note: The calculation of width is an optimistic calculation, giving + // a width which will not change when moving the Timeline + // So no re-stacking needed, which is nicer for the eye; + } + else { + this.left = start; + this.width = boxWidth; + contentWidth = Math.min(end - start - 2 * this.options.padding, this.props.content.width); + } + + this.dom.box.style.left = this.left + 'px'; + this.dom.box.style.width = boxWidth + 'px'; + + switch (this.options.align) { + case 'left': + this.dom.content.style.left = '0'; + break; + + case 'right': + this.dom.content.style.left = Math.max((boxWidth - contentWidth - 2 * this.options.padding), 0) + 'px'; + break; + + case 'center': + this.dom.content.style.left = Math.max((boxWidth - contentWidth - 2 * this.options.padding) / 2, 0) + 'px'; + break; + + default: // 'auto' + // when range exceeds left of the window, position the contents at the left of the visible area + if (this.overflow) { + if (end > 0) { + contentLeft = Math.max(-start, 0); + } + else { + contentLeft = -contentWidth; // ensure it's not visible anymore + } + } + else { + if (start < 0) { + contentLeft = Math.min(-start, + (end - start - contentWidth - 2 * this.options.padding)); + // TODO: remove the need for options.padding. it's terrible. + } + else { + contentLeft = 0; + } + } + this.dom.content.style.left = contentLeft + 'px'; + } + }; + + /** + * Reposition the item vertically + * @Override + */ + RangeItem.prototype.repositionY = function() { + var orientation = this.options.orientation, + box = this.dom.box; + + if (orientation == 'top') { + box.style.top = this.top + 'px'; + } + else { + box.style.top = (this.parent.height - this.top - this.height) + 'px'; + } + }; + + /** + * Repaint a drag area on the left side of the range when the range is selected + * @protected + */ + RangeItem.prototype._repaintDragLeft = function () { + if (this.selected && this.options.editable.updateTime && !this.dom.dragLeft) { + // create and show drag area + var dragLeft = document.createElement('div'); + dragLeft.className = 'drag-left'; + dragLeft.dragLeftItem = this; + + // TODO: this should be redundant? + Hammer(dragLeft, { + preventDefault: true + }).on('drag', function () { + //console.log('drag left') + }); + + this.dom.box.appendChild(dragLeft); + this.dom.dragLeft = dragLeft; + } + else if (!this.selected && this.dom.dragLeft) { + // delete drag area + if (this.dom.dragLeft.parentNode) { + this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft); + } + this.dom.dragLeft = null; + } + }; + + /** + * Repaint a drag area on the right side of the range when the range is selected + * @protected + */ + RangeItem.prototype._repaintDragRight = function () { + if (this.selected && this.options.editable.updateTime && !this.dom.dragRight) { + // create and show drag area + var dragRight = document.createElement('div'); + dragRight.className = 'drag-right'; + dragRight.dragRightItem = this; + + // TODO: this should be redundant? + Hammer(dragRight, { + preventDefault: true + }).on('drag', function () { + //console.log('drag right') + }); + + this.dom.box.appendChild(dragRight); + this.dom.dragRight = dragRight; + } + else if (!this.selected && this.dom.dragRight) { + // delete drag area + if (this.dom.dragRight.parentNode) { + this.dom.dragRight.parentNode.removeChild(this.dom.dragRight); + } + this.dom.dragRight = null; + } + }; + + module.exports = RangeItem; + + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Component = __webpack_require__(24); + var moment = __webpack_require__(44); + var locales = __webpack_require__(48); + + /** + * A current time bar + * @param {{range: Range, dom: Object, domProps: Object}} body + * @param {Object} [options] Available parameters: + * {Boolean} [showCurrentTime] + * @constructor CurrentTime + * @extends Component + */ + function CurrentTime (body, options) { + this.body = body; + + // default options + this.defaultOptions = { + showCurrentTime: true, + + locales: locales, + locale: 'en' + }; + this.options = util.extend({}, this.defaultOptions); + this.offset = 0; + + this._create(); + + this.setOptions(options); + } + + CurrentTime.prototype = new Component(); + + /** + * Create the HTML DOM for the current time bar + * @private + */ + CurrentTime.prototype._create = function() { + var bar = document.createElement('div'); + bar.className = 'currenttime'; + bar.style.position = 'absolute'; + bar.style.top = '0px'; + bar.style.height = '100%'; + + this.bar = bar; + }; + + /** + * Destroy the CurrentTime bar + */ + CurrentTime.prototype.destroy = function () { + this.options.showCurrentTime = false; + this.redraw(); // will remove the bar from the DOM and stop refreshing + + this.body = null; + }; + + /** + * Set options for the component. Options will be merged in current options. + * @param {Object} options Available parameters: + * {boolean} [showCurrentTime] + */ + CurrentTime.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['showCurrentTime', 'locale', 'locales'], this.options, options); + } + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + CurrentTime.prototype.redraw = function() { + if (this.options.showCurrentTime) { + var parent = this.body.dom.backgroundVertical; + if (this.bar.parentNode != parent) { + // attach to the dom + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + parent.appendChild(this.bar); + + this.start(); + } + + var now = new Date(new Date().valueOf() + this.offset); + var x = this.body.util.toScreen(now); + + var locale = this.options.locales[this.options.locale]; + var title = locale.current + ' ' + locale.time + ': ' + moment(now).format('dddd, MMMM Do YYYY, H:mm:ss'); + title = title.charAt(0).toUpperCase() + title.substring(1); + + this.bar.style.left = x + 'px'; + this.bar.title = title; + } + else { + // remove the line from the DOM + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + this.stop(); + } + + return false; + }; + + /** + * Start auto refreshing the current time bar + */ + CurrentTime.prototype.start = function() { + var me = this; + + function update () { + me.stop(); + + // determine interval to refresh + var scale = me.body.range.conversion(me.body.domProps.center.width).scale; + var interval = 1 / scale / 10; + if (interval < 30) interval = 30; + if (interval > 1000) interval = 1000; + + me.redraw(); + + // start a timer to adjust for the new time + me.currentTimeTimer = setTimeout(update, interval); + } + + update(); + }; + + /** + * Stop auto refreshing the current time bar + */ + CurrentTime.prototype.stop = function() { + if (this.currentTimeTimer !== undefined) { + clearTimeout(this.currentTimeTimer); + delete this.currentTimeTimer; + } + }; + + /** + * Set a current time. This can be used for example to ensure that a client's + * time is synchronized with a shared server time. + * @param {Date | String | Number} time A Date, unix timestamp, or + * ISO date string. + */ + CurrentTime.prototype.setCurrentTime = function(time) { + var t = util.convert(time, 'Date').valueOf(); + var now = new Date().valueOf(); + this.offset = t - now; + this.redraw(); + }; + + /** + * Get the current time. + * @return {Date} Returns the current time. + */ + CurrentTime.prototype.getCurrentTime = function() { + return new Date(new Date().valueOf() + this.offset); + }; + + module.exports = CurrentTime; + + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + var Component = __webpack_require__(24); + var moment = __webpack_require__(44); + var locales = __webpack_require__(48); + + /** + * A custom time bar + * @param {{range: Range, dom: Object}} body + * @param {Object} [options] Available parameters: + * {Boolean} [showCustomTime] + * @constructor CustomTime + * @extends Component + */ + + function CustomTime (body, options) { + this.body = body; + + // default options + this.defaultOptions = { + showCustomTime: false, + locales: locales, + locale: 'en', + id: 0 + }; + this.options = util.extend({}, this.defaultOptions); + + if (options && options.time) { + this.customTime = options.time; + } else { + this.customTime = new Date(); + } + + this.eventParams = {}; // stores state parameters while dragging the bar + + // create the DOM + this._create(); + + this.setOptions(options); + } + + CustomTime.prototype = new Component(); + + /** + * Set options for the component. Options will be merged in current options. + * @param {Object} options Available parameters: + * {boolean} [showCustomTime] + */ + CustomTime.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['showCustomTime', 'locale', 'locales', 'id'], this.options, options); + + // Triggered by addCustomTimeBar, redraw to add new bar + if (this.options.id) { + this.redraw(); + } + } + }; + + /** + * Create the DOM for the custom time + * @private + */ + CustomTime.prototype._create = function() { + var bar = document.createElement('div'); + bar.className = 'customtime'; + bar.style.position = 'absolute'; + bar.style.top = '0px'; + bar.style.height = '100%'; + this.bar = bar; + + var drag = document.createElement('div'); + drag.style.position = 'relative'; + drag.style.top = '0px'; + drag.style.left = '-10px'; + drag.style.height = '100%'; + drag.style.width = '20px'; + bar.appendChild(drag); + + // attach event listeners + this.hammer = Hammer(bar, { + prevent_default: true + }); + this.hammer.on('dragstart', this._onDragStart.bind(this)); + this.hammer.on('drag', this._onDrag.bind(this)); + this.hammer.on('dragend', this._onDragEnd.bind(this)); + }; + + /** + * Destroy the CustomTime bar + */ + CustomTime.prototype.destroy = function () { + this.options.showCustomTime = false; + this.redraw(); // will remove the bar from the DOM + + this.hammer.enable(false); + this.hammer = null; + + this.body = null; + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + CustomTime.prototype.redraw = function () { + if (this.options.showCustomTime) { + var parent = this.body.dom.backgroundVertical; + if (this.bar.parentNode != parent) { + // attach to the dom + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + parent.appendChild(this.bar); + } + + var x = this.body.util.toScreen(this.customTime); + + var locale = this.options.locales[this.options.locale]; + var title = locale.time + ': ' + moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss'); + title = title.charAt(0).toUpperCase() + title.substring(1); + + this.bar.style.left = x + 'px'; + this.bar.title = title; + } + else { + // remove the line from the DOM + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + } + + return false; + }; + + /** + * Set custom time. + * @param {Date | number | string} time + */ + CustomTime.prototype.setCustomTime = function(time) { + this.customTime = util.convert(time, 'Date'); + this.redraw(); + }; + + /** + * Retrieve the current custom time. + * @return {Date} customTime + */ + CustomTime.prototype.getCustomTime = function() { + return new Date(this.customTime.valueOf()); + }; + + /** + * Start moving horizontally + * @param {Event} event + * @private + */ + CustomTime.prototype._onDragStart = function(event) { + this.eventParams.dragging = true; + this.eventParams.customTime = this.customTime; + + event.stopPropagation(); + event.preventDefault(); + }; + + /** + * Perform moving operating. + * @param {Event} event + * @private + */ + CustomTime.prototype._onDrag = function (event) { + if (!this.eventParams.dragging) return; + + var deltaX = event.gesture.deltaX, + x = this.body.util.toScreen(this.eventParams.customTime) + deltaX, + time = this.body.util.toTime(x); + + this.setCustomTime(time); + + // fire a timechange event + this.body.emitter.emit('timechange', { + id: this.options.id, + time: new Date(this.customTime.valueOf()) + }); + + event.stopPropagation(); + event.preventDefault(); + }; + + /** + * Stop moving operating. + * @param {event} event + * @private + */ + CustomTime.prototype._onDragEnd = function (event) { + if (!this.eventParams.dragging) return; + + // fire a timechanged event + this.body.emitter.emit('timechanged', { + id: this.options.id, + time: new Date(this.customTime.valueOf()) + }); + + event.stopPropagation(); + event.preventDefault(); + }; + + module.exports = CustomTime; + + +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(2); + var Component = __webpack_require__(24); + var DataStep = __webpack_require__(16); + + /** + * A horizontal time axis + * @param {Object} [options] See DataAxis.setOptions for the available + * options. + * @constructor DataAxis + * @extends Component + * @param body + */ + function DataAxis (body, options, svg, linegraphOptions) { + this.id = util.randomUUID(); + this.body = body; + + this.defaultOptions = { + orientation: 'left', // supported: 'left', 'right' + showMinorLabels: true, + showMajorLabels: true, + icons: true, + majorLinesOffset: 7, + minorLinesOffset: 4, + labelOffsetX: 10, + labelOffsetY: 2, + iconWidth: 20, + width: '40px', + visible: true, + alignZeros: true, + customRange: { + left: {min:undefined, max:undefined}, + right: {min:undefined, max:undefined} + }, + title: { + left: {text:undefined}, + right: {text:undefined} + }, + format: { + left: {decimals: undefined}, + right: {decimals: undefined} + } + }; + + this.linegraphOptions = linegraphOptions; + this.linegraphSVG = svg; + this.props = {}; + this.DOMelements = { // dynamic elements + lines: {}, + labels: {}, + title: {} + }; + + this.dom = {}; + + this.range = {start:0, end:0}; + + this.options = util.extend({}, this.defaultOptions); + this.conversionFactor = 1; + + this.setOptions(options); + this.width = Number(('' + this.options.width).replace("px","")); + this.minWidth = this.width; + this.height = this.linegraphSVG.offsetHeight; + this.hidden = false; + + this.stepPixels = 25; + this.stepPixelsForced = 25; + this.zeroCrossing = -1; + + this.lineOffset = 0; + this.master = true; + this.svgElements = {}; + this.iconsRemoved = false; + + + this.groups = {}; + this.amountOfGroups = 0; + + // create the HTML DOM + this._create(); + + var me = this; + this.body.emitter.on("verticalDrag", function() { + me.dom.lineContainer.style.top = me.body.domProps.scrollTop + 'px'; + }); + } + + DataAxis.prototype = new Component(); + + + DataAxis.prototype.addGroup = function(label, graphOptions) { + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; + } + this.amountOfGroups += 1; + }; + + DataAxis.prototype.updateGroup = function(label, graphOptions) { + this.groups[label] = graphOptions; + }; + + DataAxis.prototype.removeGroup = function(label) { + if (this.groups.hasOwnProperty(label)) { + delete this.groups[label]; + this.amountOfGroups -= 1; + } + }; + + + DataAxis.prototype.setOptions = function (options) { + if (options) { + var redraw = false; + if (this.options.orientation != options.orientation && options.orientation !== undefined) { + redraw = true; + } + var fields = [ + 'orientation', + 'showMinorLabels', + 'showMajorLabels', + 'icons', + 'majorLinesOffset', + 'minorLinesOffset', + 'labelOffsetX', + 'labelOffsetY', + 'iconWidth', + 'width', + 'visible', + 'customRange', + 'title', + 'format', + 'alignZeros' + ]; + util.selectiveExtend(fields, this.options, options); + + this.minWidth = Number(('' + this.options.width).replace("px","")); + + if (redraw == true && this.dom.frame) { + this.hide(); + this.show(); + } + } + }; + + + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype._create = function() { + this.dom.frame = document.createElement('div'); + this.dom.frame.style.width = this.options.width; + this.dom.frame.style.height = this.height; + + this.dom.lineContainer = document.createElement('div'); + this.dom.lineContainer.style.width = '100%'; + this.dom.lineContainer.style.height = this.height; + this.dom.lineContainer.style.position = 'relative'; + + // create svg element for graph drawing. + this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.svg.style.position = "absolute"; + this.svg.style.top = '0px'; + this.svg.style.height = '100%'; + this.svg.style.width = '100%'; + this.svg.style.display = "block"; + this.dom.frame.appendChild(this.svg); + }; + + DataAxis.prototype._redrawGroupIcons = function () { + DOMutil.prepareElements(this.svgElements); + + var x; + var iconWidth = this.options.iconWidth; + var iconHeight = 15; + var iconOffset = 4; + var y = iconOffset + 0.5 * iconHeight; + + if (this.options.orientation == 'left') { + x = iconOffset; + } + else { + x = this.width - iconWidth - iconOffset; + } + + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + y += iconHeight + iconOffset; + } + } + } + + DOMutil.cleanupElements(this.svgElements); + this.iconsRemoved = false; + }; + + DataAxis.prototype._cleanupIcons = function() { + if (this.iconsRemoved == false) { + DOMutil.prepareElements(this.svgElements); + DOMutil.cleanupElements(this.svgElements); + this.iconsRemoved = true; + } + } + + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype.show = function() { + this.hidden = false; + if (!this.dom.frame.parentNode) { + if (this.options.orientation == 'left') { + this.body.dom.left.appendChild(this.dom.frame); + } + else { + this.body.dom.right.appendChild(this.dom.frame); + } + } + + if (!this.dom.lineContainer.parentNode) { + this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer); + } + }; + + /** + * Create the HTML DOM for the DataAxis + */ + DataAxis.prototype.hide = function() { + this.hidden = true; + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); + } + + if (this.dom.lineContainer.parentNode) { + this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer); + } + }; + + /** + * Set a range (start and end) + * @param end + * @param start + * @param end + */ + DataAxis.prototype.setRange = function (start, end) { + if (this.master == false && this.options.alignZeros == true && this.zeroCrossing != -1) { + if (start > 0) { + start = 0; + } + } + this.range.start = start; + this.range.end = end; + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + DataAxis.prototype.redraw = function () { + var resized = false; + var activeGroups = 0; + + // Make sure the line container adheres to the vertical scrolling. + this.dom.lineContainer.style.top = this.body.domProps.scrollTop + 'px'; + + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + activeGroups++; + } + } + } + if (this.amountOfGroups == 0 || activeGroups == 0) { + this.hide(); + } + else { + this.show(); + this.height = Number(this.linegraphSVG.style.height.replace("px","")); + + // svg offsetheight did not work in firefox and explorer... + this.dom.lineContainer.style.height = this.height + 'px'; + this.width = this.options.visible == true ? Number(('' + this.options.width).replace("px","")) : 0; + + var props = this.props; + var frame = this.dom.frame; + + // update classname + frame.className = 'dataaxis'; + + // calculate character width and height + this._calculateCharSize(); + + var orientation = this.options.orientation; + var showMinorLabels = this.options.showMinorLabels; + var showMajorLabels = this.options.showMajorLabels; + + // determine the width and height of the elements for the axis + props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; + props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + + props.minorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.minorLinesOffset; + props.minorLineHeight = 1; + props.majorLineWidth = this.body.dom.backgroundHorizontal.offsetWidth - this.lineOffset - this.width + 2 * this.options.majorLinesOffset; + props.majorLineHeight = 1; + + // take frame offline while updating (is almost twice as fast) + if (orientation == 'left') { + frame.style.top = '0'; + frame.style.left = '0'; + frame.style.bottom = ''; + frame.style.width = this.width + 'px'; + frame.style.height = this.height + "px"; + this.props.width = this.body.domProps.left.width; + this.props.height = this.body.domProps.left.height; + } + else { // right + frame.style.top = ''; + frame.style.bottom = '0'; + frame.style.left = '0'; + frame.style.width = this.width + 'px'; + frame.style.height = this.height + "px"; + this.props.width = this.body.domProps.right.width; + this.props.height = this.body.domProps.right.height; + } + + resized = this._redrawLabels(); + resized = this._isResized() || resized; + + if (this.options.icons == true) { + this._redrawGroupIcons(); + } + else { + this._cleanupIcons(); + } + + this._redrawTitle(orientation); + } + return resized; + }; + + /** + * Repaint major and minor text labels and vertical grid lines + * @private + */ + DataAxis.prototype._redrawLabels = function () { + var resized = false; + DOMutil.prepareElements(this.DOMelements.lines); + DOMutil.prepareElements(this.DOMelements.labels); + + var orientation = this.options['orientation']; + + // calculate range and step (step such that we have space for 7 characters per label) + var minimumStep = this.master ? this.props.majorCharHeight || 10 : this.stepPixelsForced; + + var step = new DataStep( + this.range.start, + this.range.end, + minimumStep, + this.dom.frame.offsetHeight, + this.options.customRange[this.options.orientation], + this.master == false && this.options.alignZeros // doess the step have to align zeros? only if not master and the options is on + ); + + this.step = step; + // get the distance in pixels for a step + // dead space is space that is "left over" after a step + var stepPixels = (this.dom.frame.offsetHeight - (step.deadSpace * (this.dom.frame.offsetHeight / step.marginRange))) / (((step.marginRange - step.deadSpace) / step.step)); + + this.stepPixels = stepPixels; + + var amountOfSteps = this.height / stepPixels; + var stepDifference = 0; + + // the slave axis needs to use the same horizontal lines as the master axis. + if (this.master == false) { + stepPixels = this.stepPixelsForced; + stepDifference = Math.round((this.dom.frame.offsetHeight / stepPixels) - amountOfSteps); + for (var i = 0; i < 0.5 * stepDifference; i++) { + step.previous(); + } + amountOfSteps = this.height / stepPixels; + + if (this.zeroCrossing != -1 && this.options.alignZeros == true) { + var zeroStepDifference = (step.marginEnd / step.step) - this.zeroCrossing; + if (zeroStepDifference > 0) { + for (var i = 0; i < zeroStepDifference; i++) {step.next();} + } + else if (zeroStepDifference < 0) { + for (var i = 0; i < -zeroStepDifference; i++) {step.previous();} + } + } + } + else { + amountOfSteps += 0.25; + } + + + this.valueAtZero = step.marginEnd; + var marginStartPos = 0; + + // do not draw the first label + var max = 1; + + // Get the number of decimal places + var decimals; + if(this.options.format[orientation] !== undefined) { + decimals = this.options.format[orientation].decimals; + } + + this.maxLabelSize = 0; + var y = 0; + while (max < Math.round(amountOfSteps)) { + step.next(); + y = Math.round(max * stepPixels); + marginStartPos = max * stepPixels; + var isMajor = step.isMajor(); + + if (this.options['showMinorLabels'] && isMajor == false || this.master == false && this.options['showMinorLabels'] == true) { + this._redrawLabel(y - 2, step.getCurrent(decimals), orientation, 'yAxis minor', this.props.minorCharHeight); + } + + if (isMajor && this.options['showMajorLabels'] && this.master == true || + this.options['showMinorLabels'] == false && this.master == false && isMajor == true) { + if (y >= 0) { + this._redrawLabel(y - 2, step.getCurrent(decimals), orientation, 'yAxis major', this.props.majorCharHeight); + } + this._redrawLine(y, orientation, 'grid horizontal major', this.options.majorLinesOffset, this.props.majorLineWidth); + } + else { + this._redrawLine(y, orientation, 'grid horizontal minor', this.options.minorLinesOffset, this.props.minorLineWidth); + } + + if (this.master == true && step.current == 0) { + this.zeroCrossing = max; + } + + max++; + } + + if (this.master == false) { + this.conversionFactor = y / (this.valueAtZero - step.current); + } + else { + this.conversionFactor = this.dom.frame.offsetHeight / step.marginRange; + } + + // Note that title is rotated, so we're using the height, not width! + var titleWidth = 0; + if (this.options.title[orientation] !== undefined && this.options.title[orientation].text !== undefined) { + titleWidth = this.props.titleCharHeight; + } + var offset = this.options.icons == true ? Math.max(this.options.iconWidth, titleWidth) + this.options.labelOffsetX + 15 : titleWidth + this.options.labelOffsetX + 15; + + // this will resize the yAxis to accommodate the labels. + if (this.maxLabelSize > (this.width - offset) && this.options.visible == true) { + this.width = this.maxLabelSize + offset; + this.options.width = this.width + "px"; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + this.redraw(); + resized = true; + } + // this will resize the yAxis if it is too big for the labels. + else if (this.maxLabelSize < (this.width - offset) && this.options.visible == true && this.width > this.minWidth) { + this.width = Math.max(this.minWidth,this.maxLabelSize + offset); + this.options.width = this.width + "px"; + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + this.redraw(); + resized = true; + } + else { + DOMutil.cleanupElements(this.DOMelements.lines); + DOMutil.cleanupElements(this.DOMelements.labels); + resized = false; + } + + return resized; + }; + + DataAxis.prototype.convertValue = function (value) { + var invertedValue = this.valueAtZero - value; + var convertedValue = invertedValue * this.conversionFactor; + return convertedValue; + }; + + /** + * Create a label for the axis at position x + * @private + * @param y + * @param text + * @param orientation + * @param className + * @param characterHeight + */ + DataAxis.prototype._redrawLabel = function (y, text, orientation, className, characterHeight) { + // reuse redundant label + var label = DOMutil.getDOMElement('div',this.DOMelements.labels, this.dom.frame); //this.dom.redundant.labels.shift(); + label.className = className; + label.innerHTML = text; + if (orientation == 'left') { + label.style.left = '-' + this.options.labelOffsetX + 'px'; + label.style.textAlign = "right"; + } + else { + label.style.right = '-' + this.options.labelOffsetX + 'px'; + label.style.textAlign = "left"; + } + + label.style.top = y - 0.5 * characterHeight + this.options.labelOffsetY + 'px'; + + text += ''; + + var largestWidth = Math.max(this.props.majorCharWidth,this.props.minorCharWidth); + if (this.maxLabelSize < text.length * largestWidth) { + this.maxLabelSize = text.length * largestWidth; + } + }; + + /** + * Create a minor line for the axis at position y + * @param y + * @param orientation + * @param className + * @param offset + * @param width + */ + DataAxis.prototype._redrawLine = function (y, orientation, className, offset, width) { + if (this.master == true) { + var line = DOMutil.getDOMElement('div',this.DOMelements.lines, this.dom.lineContainer);//this.dom.redundant.lines.shift(); + line.className = className; + line.innerHTML = ''; + + if (orientation == 'left') { + line.style.left = (this.width - offset) + 'px'; + } + else { + line.style.right = (this.width - offset) + 'px'; + } + + line.style.width = width + 'px'; + line.style.top = y + 'px'; + } + }; + + /** + * Create a title for the axis + * @private + * @param orientation + */ + DataAxis.prototype._redrawTitle = function (orientation) { + DOMutil.prepareElements(this.DOMelements.title); + + // Check if the title is defined for this axes + if (this.options.title[orientation] !== undefined && this.options.title[orientation].text !== undefined) { + var title = DOMutil.getDOMElement('div', this.DOMelements.title, this.dom.frame); + title.className = 'yAxis title ' + orientation; + title.innerHTML = this.options.title[orientation].text; + + // Add style - if provided + if (this.options.title[orientation].style !== undefined) { + util.addCssText(title, this.options.title[orientation].style); + } + + if (orientation == 'left') { + title.style.left = this.props.titleCharHeight + 'px'; + } + else { + title.style.right = this.props.titleCharHeight + 'px'; + } + + title.style.width = this.height + 'px'; + } + + // we need to clean up in case we did not use all elements. + DOMutil.cleanupElements(this.DOMelements.title); + }; + + + + + /** + * Determine the size of text on the axis (both major and minor axis). + * The size is calculated only once and then cached in this.props. + * @private + */ + DataAxis.prototype._calculateCharSize = function () { + // determine the char width and height on the minor axis + if (!('minorCharHeight' in this.props)) { + var textMinor = document.createTextNode('0'); + var measureCharMinor = document.createElement('div'); + measureCharMinor.className = 'yAxis minor measure'; + measureCharMinor.appendChild(textMinor); + this.dom.frame.appendChild(measureCharMinor); + + this.props.minorCharHeight = measureCharMinor.clientHeight; + this.props.minorCharWidth = measureCharMinor.clientWidth; + + this.dom.frame.removeChild(measureCharMinor); + } + + if (!('majorCharHeight' in this.props)) { + var textMajor = document.createTextNode('0'); + var measureCharMajor = document.createElement('div'); + measureCharMajor.className = 'yAxis major measure'; + measureCharMajor.appendChild(textMajor); + this.dom.frame.appendChild(measureCharMajor); + + this.props.majorCharHeight = measureCharMajor.clientHeight; + this.props.majorCharWidth = measureCharMajor.clientWidth; + + this.dom.frame.removeChild(measureCharMajor); + } + + if (!('titleCharHeight' in this.props)) { + var textTitle = document.createTextNode('0'); + var measureCharTitle = document.createElement('div'); + measureCharTitle.className = 'yAxis title measure'; + measureCharTitle.appendChild(textTitle); + this.dom.frame.appendChild(measureCharTitle); + + this.props.titleCharHeight = measureCharTitle.clientHeight; + this.props.titleCharWidth = measureCharTitle.clientWidth; + + this.dom.frame.removeChild(measureCharTitle); + } + }; + + module.exports = DataAxis; + + +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(2); + var Line = __webpack_require__(49); + var Bar = __webpack_require__(50); + var Points = __webpack_require__(51); + + /** + * /** + * @param {object} group | the object of the group from the dataset + * @param {string} groupId | ID of the group + * @param {object} options | the default options + * @param {array} groupsUsingDefaultStyles | this array has one entree. + * It is passed as an array so it is passed by reference. + * It enumerates through the default styles + * @constructor + */ + function GraphGroup (group, groupId, options, groupsUsingDefaultStyles) { + this.id = groupId; + var fields = ['sampling','style','sort','yAxisOrientation','barChart','drawPoints','shaded','catmullRom'] + this.options = util.selectiveBridgeObject(fields,options); + this.usingDefaultStyle = group.className === undefined; + this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; + this.zeroPosition = 0; + this.update(group); + if (this.usingDefaultStyle == true) { + this.groupsUsingDefaultStyles[0] += 1; + } + this.itemsData = []; + this.visible = group.visible === undefined ? true : group.visible; + } + + + /** + * this loads a reference to all items in this group into this group. + * @param {array} items + */ + GraphGroup.prototype.setItems = function(items) { + if (items != null) { + this.itemsData = items; + if (this.options.sort == true) { + this.itemsData.sort(function (a,b) {return a.x - b.x;}) + } + } + else { + this.itemsData = []; + } + }; + + + /** + * this is used for plotting barcharts, this way, we only have to calculate it once. + * @param pos + */ + GraphGroup.prototype.setZeroPosition = function(pos) { + this.zeroPosition = pos; + }; + + + /** + * set the options of the graph group over the default options. + * @param options + */ + GraphGroup.prototype.setOptions = function(options) { + if (options !== undefined) { + var fields = ['sampling','style','sort','yAxisOrientation','barChart']; + util.selectiveDeepExtend(fields, this.options, options); + + util.mergeOptions(this.options, options,'catmullRom'); + util.mergeOptions(this.options, options,'drawPoints'); + util.mergeOptions(this.options, options,'shaded'); + + if (options.catmullRom) { + if (typeof options.catmullRom == 'object') { + if (options.catmullRom.parametrization) { + if (options.catmullRom.parametrization == 'uniform') { + this.options.catmullRom.alpha = 0; + } + else if (options.catmullRom.parametrization == 'chordal') { + this.options.catmullRom.alpha = 1.0; + } + else { + this.options.catmullRom.parametrization = 'centripetal'; + this.options.catmullRom.alpha = 0.5; + } + } + } + } + } + + if (this.options.style == 'line') { + this.type = new Line(this.id, this.options); + } + else if (this.options.style == 'bar') { + this.type = new Bar(this.id, this.options); + } + else if (this.options.style == 'points') { + this.type = new Points(this.id, this.options); + } + }; + + + /** + * this updates the current group class with the latest group dataset entree, used in _updateGroup in linegraph + * @param group + */ + GraphGroup.prototype.update = function(group) { + this.group = group; + this.content = group.content || 'graph'; + this.className = group.className || this.className || "graphGroup" + this.groupsUsingDefaultStyles[0] % 10; + this.visible = group.visible === undefined ? true : group.visible; + this.style = group.style; + this.setOptions(group.options); + }; + + + /** + * draw the icon for the legend. + * + * @param x + * @param y + * @param JSONcontainer + * @param SVGcontainer + * @param iconWidth + * @param iconHeight + */ + GraphGroup.prototype.drawIcon = function(x, y, JSONcontainer, SVGcontainer, iconWidth, iconHeight) { + var fillHeight = iconHeight * 0.5; + var path, fillPath; + + var outline = DOMutil.getSVGElement("rect", JSONcontainer, SVGcontainer); + outline.setAttributeNS(null, "x", x); + outline.setAttributeNS(null, "y", y - fillHeight); + outline.setAttributeNS(null, "width", iconWidth); + outline.setAttributeNS(null, "height", 2*fillHeight); + outline.setAttributeNS(null, "class", "outline"); + + if (this.options.style == 'line') { + path = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); + path.setAttributeNS(null, "class", this.className); + if(this.style !== undefined) { + path.setAttributeNS(null, "style", this.style); + } + + path.setAttributeNS(null, "d", "M" + x + ","+y+" L" + (x + iconWidth) + ","+y+""); + if (this.options.shaded.enabled == true) { + fillPath = DOMutil.getSVGElement("path", JSONcontainer, SVGcontainer); + if (this.options.shaded.orientation == 'top') { + fillPath.setAttributeNS(null, "d", "M"+x+", " + (y - fillHeight) + + "L"+x+","+y+" L"+ (x + iconWidth) + ","+y+" L"+ (x + iconWidth) + "," + (y - fillHeight)); + } + else { + fillPath.setAttributeNS(null, "d", "M"+x+","+y+" " + + "L"+x+"," + (y + fillHeight) + " " + + "L"+ (x + iconWidth) + "," + (y + fillHeight) + + "L"+ (x + iconWidth) + ","+y); + } + fillPath.setAttributeNS(null, "class", this.className + " iconFill"); + } + + if (this.options.drawPoints.enabled == true) { + DOMutil.drawPoint(x + 0.5 * iconWidth,y, this, JSONcontainer, SVGcontainer); + } + } + else { + var barWidth = Math.round(0.3 * iconWidth); + var bar1Height = Math.round(0.4 * iconHeight); + var bar2Height = Math.round(0.75 * iconHeight); + + var offset = Math.round((iconWidth - (2 * barWidth))/3); + + DOMutil.drawBar(x + 0.5*barWidth + offset , y + fillHeight - bar1Height - 1, barWidth, bar1Height, this.className + ' bar', JSONcontainer, SVGcontainer); + DOMutil.drawBar(x + 1.5*barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, this.className + ' bar', JSONcontainer, SVGcontainer); + } + }; + + + /** + * return the legend entree for this group. + * + * @param iconWidth + * @param iconHeight + * @returns {{icon: HTMLElement, label: (group.content|*|string), orientation: (.options.yAxisOrientation|*)}} + */ + GraphGroup.prototype.getLegend = function(iconWidth, iconHeight) { + var svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.drawIcon(0,0.5*iconHeight,[],svg,iconWidth,iconHeight); + return {icon: svg, label: this.content, orientation:this.options.yAxisOrientation}; + } + + GraphGroup.prototype.getYRange = function(groupData) { + return this.type.getYRange(groupData); + } + + GraphGroup.prototype.draw = function(dataset, group, framework) { + this.type.draw(dataset, group, framework); + } + + + module.exports = GraphGroup; + + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var stack = __webpack_require__(18); + var RangeItem = __webpack_require__(25); + + /** + * @constructor Group + * @param {Number | String} groupId + * @param {Object} data + * @param {ItemSet} itemSet + */ + function Group (groupId, data, itemSet) { + this.groupId = groupId; + this.subgroups = {}; + this.subgroupIndex = 0; + this.subgroupOrderer = data && data.subgroupOrder; + this.itemSet = itemSet; + + this.dom = {}; + this.props = { + label: { + width: 0, + height: 0 + } + }; + this.className = null; + + this.items = {}; // items filtered by groupId of this group + this.visibleItems = []; // items currently visible in window + this.orderedItems = { + byStart: [], + byEnd: [] + }; + this.checkRangedItems = false; // needed to refresh the ranged items if the window is programatically changed with NO overlap. + var me = this; + this.itemSet.body.emitter.on("checkRangedItems", function () { + me.checkRangedItems = true; + }) + + this._create(); + + this.setData(data); + } + + /** + * Create DOM elements for the group + * @private + */ + Group.prototype._create = function() { + var label = document.createElement('div'); + label.className = 'vlabel'; + this.dom.label = label; + + var inner = document.createElement('div'); + inner.className = 'inner'; + label.appendChild(inner); + this.dom.inner = inner; + + var foreground = document.createElement('div'); + foreground.className = 'group'; + foreground['timeline-group'] = this; + this.dom.foreground = foreground; + + this.dom.background = document.createElement('div'); + this.dom.background.className = 'group'; + + this.dom.axis = document.createElement('div'); + this.dom.axis.className = 'group'; + + // create a hidden marker to detect when the Timelines container is attached + // to the DOM, or the style of a parent of the Timeline is changed from + // display:none is changed to visible. + this.dom.marker = document.createElement('div'); + this.dom.marker.style.visibility = 'hidden'; // TODO: ask jos why this is not none? + this.dom.marker.innerHTML = '?'; + this.dom.background.appendChild(this.dom.marker); + }; + + /** + * Set the group data for this group + * @param {Object} data Group data, can contain properties content and className + */ + Group.prototype.setData = function(data) { + // update contents + var content = data && data.content; + if (content instanceof Element) { + this.dom.inner.appendChild(content); + } + else if (content !== undefined && content !== null) { + this.dom.inner.innerHTML = content; + } + else { + this.dom.inner.innerHTML = this.groupId || ''; // groupId can be null + } + + // update title + this.dom.label.title = data && data.title || ''; + + if (!this.dom.inner.firstChild) { + util.addClassName(this.dom.inner, 'hidden'); + } + else { + util.removeClassName(this.dom.inner, 'hidden'); + } + + // update className + var className = data && data.className || null; + if (className != this.className) { + if (this.className) { + util.removeClassName(this.dom.label, this.className); + util.removeClassName(this.dom.foreground, this.className); + util.removeClassName(this.dom.background, this.className); + util.removeClassName(this.dom.axis, this.className); + } + util.addClassName(this.dom.label, className); + util.addClassName(this.dom.foreground, className); + util.addClassName(this.dom.background, className); + util.addClassName(this.dom.axis, className); + this.className = className; + } + + // update style + if (this.style) { + util.removeCssText(this.dom.label, this.style); + this.style = null; + } + if (data && data.style) { + util.addCssText(this.dom.label, data.style); + this.style = data.style; + } + }; + + /** + * Get the width of the group label + * @return {number} width + */ + Group.prototype.getLabelWidth = function() { + return this.props.label.width; + }; + + + /** + * Repaint this group + * @param {{start: number, end: number}} range + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * @param {boolean} [restack=false] Force restacking of all items + * @return {boolean} Returns true if the group is resized + */ + Group.prototype.redraw = function(range, margin, restack) { + var resized = false; + + this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range); + + // force recalculation of the height of the items when the marker height changed + // (due to the Timeline being attached to the DOM or changed from display:none to visible) + var markerHeight = this.dom.marker.clientHeight; + if (markerHeight != this.lastMarkerHeight) { + this.lastMarkerHeight = markerHeight; + + util.forEach(this.items, function (item) { + item.dirty = true; + if (item.displayed) item.redraw(); + }); + + restack = true; + } + + // reposition visible items vertically + if (this.itemSet.options.stack) { // TODO: ugly way to access options... + stack.stack(this.visibleItems, margin, restack); + } + else { // no stacking + stack.nostack(this.visibleItems, margin, this.subgroups); + } + + // recalculate the height of the group + var height = this._calculateHeight(margin); + + // calculate actual size and position + var foreground = this.dom.foreground; + this.top = foreground.offsetTop; + this.left = foreground.offsetLeft; + this.width = foreground.offsetWidth; + resized = util.updateProperty(this, 'height', height) || resized; + + // recalculate size of label + resized = util.updateProperty(this.props.label, 'width', this.dom.inner.clientWidth) || resized; + resized = util.updateProperty(this.props.label, 'height', this.dom.inner.clientHeight) || resized; + + // apply new height + this.dom.background.style.height = height + 'px'; + this.dom.foreground.style.height = height + 'px'; + this.dom.label.style.height = height + 'px'; + + // update vertical position of items after they are re-stacked and the height of the group is calculated + for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { + var item = this.visibleItems[i]; + item.repositionY(margin); + } + + return resized; + }; + + /** + * recalculate the height of the group + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * @returns {number} Returns the height + * @private + */ + Group.prototype._calculateHeight = function (margin) { + // recalculate the height of the group + var height; + var visibleItems = this.visibleItems; + //var visibleSubgroups = []; + //this.visibleSubgroups = 0; + this.resetSubgroups(); + var me = this; + if (visibleItems.length) { + var min = visibleItems[0].top; + var max = visibleItems[0].top + visibleItems[0].height; + util.forEach(visibleItems, function (item) { + min = Math.min(min, item.top); + max = Math.max(max, (item.top + item.height)); + if (item.data.subgroup !== undefined) { + me.subgroups[item.data.subgroup].height = Math.max(me.subgroups[item.data.subgroup].height,item.height); + me.subgroups[item.data.subgroup].visible = true; + //if (visibleSubgroups.indexOf(item.data.subgroup) == -1){ + // visibleSubgroups.push(item.data.subgroup); + // me.visibleSubgroups += 1; + //} + } + }); + if (min > margin.axis) { + // there is an empty gap between the lowest item and the axis + var offset = min - margin.axis; + max -= offset; + util.forEach(visibleItems, function (item) { + item.top -= offset; + }); + } + height = max + margin.item.vertical / 2; + } + else { + height = margin.axis + margin.item.vertical; + } + height = Math.max(height, this.props.label.height); + + return height; + }; + + /** + * Show this group: attach to the DOM + */ + Group.prototype.show = function() { + if (!this.dom.label.parentNode) { + this.itemSet.dom.labelSet.appendChild(this.dom.label); + } + + if (!this.dom.foreground.parentNode) { + this.itemSet.dom.foreground.appendChild(this.dom.foreground); + } + + if (!this.dom.background.parentNode) { + this.itemSet.dom.background.appendChild(this.dom.background); + } + + if (!this.dom.axis.parentNode) { + this.itemSet.dom.axis.appendChild(this.dom.axis); + } + }; + + /** + * Hide this group: remove from the DOM + */ + Group.prototype.hide = function() { + var label = this.dom.label; + if (label.parentNode) { + label.parentNode.removeChild(label); + } + + var foreground = this.dom.foreground; + if (foreground.parentNode) { + foreground.parentNode.removeChild(foreground); + } + + var background = this.dom.background; + if (background.parentNode) { + background.parentNode.removeChild(background); + } + + var axis = this.dom.axis; + if (axis.parentNode) { + axis.parentNode.removeChild(axis); + } + }; + + /** + * Add an item to the group + * @param {Item} item + */ + Group.prototype.add = function(item) { + this.items[item.id] = item; + item.setParent(this); + + // add to + if (item.data.subgroup !== undefined) { + if (this.subgroups[item.data.subgroup] === undefined) { + this.subgroups[item.data.subgroup] = {height:0, visible: false, index:this.subgroupIndex, items: []}; + this.subgroupIndex++; + } + this.subgroups[item.data.subgroup].items.push(item); + } + this.orderSubgroups(); + + if (this.visibleItems.indexOf(item) == -1) { + var range = this.itemSet.body.range; // TODO: not nice accessing the range like this + this._checkIfVisible(item, this.visibleItems, range); + } + }; + + Group.prototype.orderSubgroups = function() { + if (this.subgroupOrderer !== undefined) { + var sortArray = []; + if (typeof this.subgroupOrderer == 'string') { + for (var subgroup in this.subgroups) { + sortArray.push({subgroup: subgroup, sortField: this.subgroups[subgroup].items[0].data[this.subgroupOrderer]}) + } + sortArray.sort(function (a, b) { + return a.sortField - b.sortField; + }) + } + else if (typeof this.subgroupOrderer == 'function') { + for (var subgroup in this.subgroups) { + sortArray.push(this.subgroups[subgroup].items[0].data); + } + sortArray.sort(this.subgroupOrderer); + } + + if (sortArray.length > 0) { + for (var i = 0; i < sortArray.length; i++) { + this.subgroups[sortArray[i].subgroup].index = i; + } + } + } + }; + + Group.prototype.resetSubgroups = function() { + for (var subgroup in this.subgroups) { + if (this.subgroups.hasOwnProperty(subgroup)) { + this.subgroups[subgroup].visible = false; + } + } + }; + + /** + * Remove an item from the group + * @param {Item} item + */ + Group.prototype.remove = function(item) { + delete this.items[item.id]; + item.setParent(null); + + // remove from visible items + var index = this.visibleItems.indexOf(item); + if (index != -1) this.visibleItems.splice(index, 1); + + // TODO: also remove from ordered items? + }; + + + /** + * Remove an item from the corresponding DataSet + * @param {Item} item + */ + Group.prototype.removeFromDataSet = function(item) { + this.itemSet.removeItem(item.id); + }; + + + /** + * Reorder the items + */ + Group.prototype.order = function() { + var array = util.toArray(this.items); + var startArray = []; + var endArray = []; + + for (var i = 0; i < array.length; i++) { + if (array[i].data.end !== undefined) { + endArray.push(array[i]); + } + startArray.push(array[i]); + } + this.orderedItems = { + byStart: startArray, + byEnd: endArray + }; + + stack.orderByStart(this.orderedItems.byStart); + stack.orderByEnd(this.orderedItems.byEnd); + }; + + + /** + * Update the visible items + * @param {{byStart: Item[], byEnd: Item[]}} orderedItems All items ordered by start date and by end date + * @param {Item[]} visibleItems The previously visible items. + * @param {{start: number, end: number}} range Visible range + * @return {Item[]} visibleItems The new visible items. + * @private + */ + Group.prototype._updateVisibleItems = function(orderedItems, oldVisibleItems, range) { + var visibleItems = []; + var visibleItemsLookup = {}; // we keep this to quickly look up if an item already exists in the list without using indexOf on visibleItems + var interval = (range.end - range.start) / 4; + var lowerBound = range.start - interval; + var upperBound = range.end + interval; + var item, i; + + // this function is used to do the binary search. + var searchFunction = function (value) { + if (value < lowerBound) {return -1;} + else if (value <= upperBound) {return 0;} + else {return 1;} + } + + // first check if the items that were in view previously are still in view. + // IMPORTANT: this handles the case for the items with startdate before the window and enddate after the window! + // also cleans up invisible items. + if (oldVisibleItems.length > 0) { + for (i = 0; i < oldVisibleItems.length; i++) { + this._checkIfVisibleWithReference(oldVisibleItems[i], visibleItems, visibleItemsLookup, range); + } + } + + // we do a binary search for the items that have only start values. + var initialPosByStart = util.binarySearchCustom(orderedItems.byStart, searchFunction, 'data','start'); + + // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the start values. + this._traceVisible(initialPosByStart, orderedItems.byStart, visibleItems, visibleItemsLookup, function (item) { + return (item.data.start < lowerBound || item.data.start > upperBound); + }); + + // if the window has changed programmatically without overlapping the old window, the ranged items with start < lowerBound and end > upperbound are not shown. + // We therefore have to brute force check all items in the byEnd list + if (this.checkRangedItems == true) { + this.checkRangedItems = false; + for (i = 0; i < orderedItems.byEnd.length; i++) { + this._checkIfVisibleWithReference(orderedItems.byEnd[i], visibleItems, visibleItemsLookup, range); + } + } + else { + // we do a binary search for the items that have defined end times. + var initialPosByEnd = util.binarySearchCustom(orderedItems.byEnd, searchFunction, 'data','end'); + + // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the end values. + this._traceVisible(initialPosByEnd, orderedItems.byEnd, visibleItems, visibleItemsLookup, function (item) { + return (item.data.end < lowerBound || item.data.end > upperBound); + }); + } + + + // finally, we reposition all the visible items. + for (i = 0; i < visibleItems.length; i++) { + item = visibleItems[i]; + if (!item.displayed) item.show(); + // reposition item horizontally + item.repositionX(); + } + + // debug + //console.log("new line") + //if (this.groupId == null) { + // for (i = 0; i < orderedItems.byStart.length; i++) { + // item = orderedItems.byStart[i].data; + // console.log('start',i,initialPosByStart, item.start.valueOf(), item.content, item.start >= lowerBound && item.start <= upperBound,i == initialPosByStart ? "<------------------- HEREEEE" : "") + // } + // for (i = 0; i < orderedItems.byEnd.length; i++) { + // item = orderedItems.byEnd[i].data; + // console.log('rangeEnd',i,initialPosByEnd, item.end.valueOf(), item.content, item.end >= range.start && item.end <= range.end,i == initialPosByEnd ? "<------------------- HEREEEE" : "") + // } + //} + + return visibleItems; + }; + + Group.prototype._traceVisible = function (initialPos, items, visibleItems, visibleItemsLookup, breakCondition) { + var item; + var i; + + if (initialPos != -1) { + for (i = initialPos; i >= 0; i--) { + item = items[i]; + if (breakCondition(item)) { + break; + } + else { + if (visibleItemsLookup[item.id] === undefined) { + visibleItemsLookup[item.id] = true; + visibleItems.push(item); + } + } + } + + for (i = initialPos + 1; i < items.length; i++) { + item = items[i]; + if (breakCondition(item)) { + break; + } + else { + if (visibleItemsLookup[item.id] === undefined) { + visibleItemsLookup[item.id] = true; + visibleItems.push(item); + } + } + } + } + } + + + /** + * this function is very similar to the _checkIfInvisible() but it does not + * return booleans, hides the item if it should not be seen and always adds to + * the visibleItems. + * this one is for brute forcing and hiding. + * + * @param {Item} item + * @param {Array} visibleItems + * @param {{start:number, end:number}} range + * @private + */ + Group.prototype._checkIfVisible = function(item, visibleItems, range) { + if (item.isVisible(range)) { + if (!item.displayed) item.show(); + // reposition item horizontally + item.repositionX(); + visibleItems.push(item); + } + else { + if (item.displayed) item.hide(); + } + }; + + + /** + * this function is very similar to the _checkIfInvisible() but it does not + * return booleans, hides the item if it should not be seen and always adds to + * the visibleItems. + * this one is for brute forcing and hiding. + * + * @param {Item} item + * @param {Array} visibleItems + * @param {{start:number, end:number}} range + * @private + */ + Group.prototype._checkIfVisibleWithReference = function(item, visibleItems, visibleItemsLookup, range) { + if (item.isVisible(range)) { + if (visibleItemsLookup[item.id] === undefined) { + visibleItemsLookup[item.id] = true; + visibleItems.push(item); + } + } + else { + if (item.displayed) item.hide(); + } + }; + + + + module.exports = Group; + + +/***/ }, +/* 31 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Group = __webpack_require__(30); + + /** + * @constructor BackgroundGroup + * @param {Number | String} groupId + * @param {Object} data + * @param {ItemSet} itemSet + */ + function BackgroundGroup (groupId, data, itemSet) { + Group.call(this, groupId, data, itemSet); + + this.width = 0; + this.height = 0; + this.top = 0; + this.left = 0; + } + + BackgroundGroup.prototype = Object.create(Group.prototype); + + /** + * Repaint this group + * @param {{start: number, end: number}} range + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * @param {boolean} [restack=false] Force restacking of all items + * @return {boolean} Returns true if the group is resized + */ + BackgroundGroup.prototype.redraw = function(range, margin, restack) { + var resized = false; + + this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range); + + // calculate actual size + this.width = this.dom.background.offsetWidth; + + // apply new height (just always zero for BackgroundGroup + this.dom.background.style.height = '0'; + + // update vertical position of items after they are re-stacked and the height of the group is calculated + for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { + var item = this.visibleItems[i]; + item.repositionY(margin); + } + + return resized; + }; + + /** + * Show this group: attach to the DOM + */ + BackgroundGroup.prototype.show = function() { + if (!this.dom.background.parentNode) { + this.itemSet.dom.background.appendChild(this.dom.background); + } + }; + + module.exports = BackgroundGroup; + + +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var TimeStep = __webpack_require__(19); + var Component = __webpack_require__(24); + var Group = __webpack_require__(30); + var BackgroundGroup = __webpack_require__(31); + var BoxItem = __webpack_require__(22); + var PointItem = __webpack_require__(23); + var RangeItem = __webpack_require__(25); + var BackgroundItem = __webpack_require__(21); + + + var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items + var BACKGROUND = '__background__'; // reserved group id for background items without group + + /** + * An ItemSet holds a set of items and ranges which can be displayed in a + * range. The width is determined by the parent of the ItemSet, and the height + * is determined by the size of the items. + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body + * @param {Object} [options] See ItemSet.setOptions for the available options. + * @constructor ItemSet + * @extends Component + */ + function ItemSet(body, options) { + this.body = body; + + this.defaultOptions = { + type: null, // 'box', 'point', 'range', 'background' + orientation: 'bottom', // 'top' or 'bottom' + align: 'auto', // alignment of box items + stack: true, + groupOrder: null, + + selectable: true, + editable: { + updateTime: false, + updateGroup: false, + add: false, + remove: false + }, + + snap: TimeStep.snap, + + onAdd: function (item, callback) { + callback(item); + }, + onUpdate: function (item, callback) { + callback(item); + }, + onMove: function (item, callback) { + callback(item); + }, + onRemove: function (item, callback) { + callback(item); + }, + onMoving: function (item, callback) { + callback(item); + }, + + margin: { + item: { + horizontal: 10, + vertical: 10 + }, + axis: 20 + }, + padding: 5 + }; + + // options is shared by this ItemSet and all its items + this.options = util.extend({}, this.defaultOptions); + + // options for getting items from the DataSet with the correct type + this.itemOptions = { + type: {start: 'Date', end: 'Date'} + }; + + this.conversion = { + toScreen: body.util.toScreen, + toTime: body.util.toTime + }; + this.dom = {}; + this.props = {}; + this.hammer = null; + + var me = this; + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet + + // listeners for the DataSet of the items + this.itemListeners = { + 'add': function (event, params, senderId) { + me._onAdd(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdate(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemove(params.items); + } + }; + + // listeners for the DataSet of the groups + this.groupListeners = { + 'add': function (event, params, senderId) { + me._onAddGroups(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdateGroups(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemoveGroups(params.items); + } + }; + + this.items = {}; // object with an Item for every data item + this.groups = {}; // Group object for every group + this.groupIds = []; + + this.selection = []; // list with the ids of all selected nodes + this.stackDirty = true; // if true, all items will be restacked on next redraw + + this.touchParams = {}; // stores properties while dragging + // create the HTML DOM + + this._create(); + + this.setOptions(options); + } + + ItemSet.prototype = new Component(); + + // available item types will be registered here + ItemSet.types = { + background: BackgroundItem, + box: BoxItem, + range: RangeItem, + point: PointItem + }; + + /** + * Create the HTML DOM for the ItemSet + */ + ItemSet.prototype._create = function(){ + var frame = document.createElement('div'); + frame.className = 'itemset'; + frame['timeline-itemset'] = this; + this.dom.frame = frame; + + // create background panel + var background = document.createElement('div'); + background.className = 'background'; + frame.appendChild(background); + this.dom.background = background; + + // create foreground panel + var foreground = document.createElement('div'); + foreground.className = 'foreground'; + frame.appendChild(foreground); + this.dom.foreground = foreground; + + // create axis panel + var axis = document.createElement('div'); + axis.className = 'axis'; + this.dom.axis = axis; + + // create labelset + var labelSet = document.createElement('div'); + labelSet.className = 'labelset'; + this.dom.labelSet = labelSet; + + // create ungrouped Group + this._updateUngrouped(); + + // create background Group + var backgroundGroup = new BackgroundGroup(BACKGROUND, null, this); + backgroundGroup.show(); + this.groups[BACKGROUND] = backgroundGroup; + + // attach event listeners + // Note: we bind to the centerContainer for the case where the height + // of the center container is larger than of the ItemSet, so we + // can click in the empty area to create a new item or deselect an item. + this.hammer = Hammer(this.body.dom.centerContainer, { + preventDefault: true + }); + + // drag items when selected + this.hammer.on('touch', this._onTouch.bind(this)); + this.hammer.on('dragstart', this._onDragStart.bind(this)); + this.hammer.on('drag', this._onDrag.bind(this)); + this.hammer.on('dragend', this._onDragEnd.bind(this)); + + // single select (or unselect) when tapping an item + this.hammer.on('tap', this._onSelectItem.bind(this)); + + // multi select when holding mouse/touch, or on ctrl+click + this.hammer.on('hold', this._onMultiSelectItem.bind(this)); + + // add item on doubletap + this.hammer.on('doubletap', this._onAddItem.bind(this)); + + // attach to the DOM + this.show(); + }; + + /** + * Set options for the ItemSet. Existing options will be extended/overwritten. + * @param {Object} [options] The following options are available: + * {String} type + * Default type for the items. Choose from 'box' + * (default), 'point', 'range', or 'background'. + * The default style can be overwritten by + * individual items. + * {String} align + * Alignment for the items, only applicable for + * BoxItem. Choose 'center' (default), 'left', or + * 'right'. + * {String} orientation + * Orientation of the item set. Choose 'top' or + * 'bottom' (default). + * {Function} groupOrder + * A sorting function for ordering groups + * {Boolean} stack + * If true (deafult), items will be stacked on + * top of each other. + * {Number} margin.axis + * Margin between the axis and the items in pixels. + * Default is 20. + * {Number} margin.item.horizontal + * Horizontal margin between items in pixels. + * Default is 10. + * {Number} margin.item.vertical + * Vertical Margin between items in pixels. + * Default is 10. + * {Number} margin.item + * Margin between items in pixels in both horizontal + * and vertical direction. Default is 10. + * {Number} margin + * Set margin for both axis and items in pixels. + * {Number} padding + * Padding of the contents of an item in pixels. + * Must correspond with the items css. Default is 5. + * {Boolean} selectable + * If true (default), items can be selected. + * {Boolean} editable + * Set all editable options to true or false + * {Boolean} editable.updateTime + * Allow dragging an item to an other moment in time + * {Boolean} editable.updateGroup + * Allow dragging an item to an other group + * {Boolean} editable.add + * Allow creating new items on double tap + * {Boolean} editable.remove + * Allow removing items by clicking the delete button + * top right of a selected item. + * {Function(item: Item, callback: Function)} onAdd + * Callback function triggered when an item is about to be added: + * when the user double taps an empty space in the Timeline. + * {Function(item: Item, callback: Function)} onUpdate + * Callback function fired when an item is about to be updated. + * This function typically has to show a dialog where the user + * change the item. If not implemented, nothing happens. + * {Function(item: Item, callback: Function)} onMove + * Fired when an item has been moved. If not implemented, + * the move action will be accepted. + * {Function(item: Item, callback: Function)} onRemove + * Fired when an item is about to be deleted. + * If not implemented, the item will be always removed. + */ + ItemSet.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + var fields = ['type', 'align', 'orientation', 'padding', 'stack', 'selectable', 'groupOrder', 'dataAttributes', 'template','hide', 'snap']; + util.selectiveExtend(fields, this.options, options); + + if ('margin' in options) { + if (typeof options.margin === 'number') { + this.options.margin.axis = options.margin; + this.options.margin.item.horizontal = options.margin; + this.options.margin.item.vertical = options.margin; + } + else if (typeof options.margin === 'object') { + util.selectiveExtend(['axis'], this.options.margin, options.margin); + if ('item' in options.margin) { + if (typeof options.margin.item === 'number') { + this.options.margin.item.horizontal = options.margin.item; + this.options.margin.item.vertical = options.margin.item; + } + else if (typeof options.margin.item === 'object') { + util.selectiveExtend(['horizontal', 'vertical'], this.options.margin.item, options.margin.item); + } + } + } + } + + if ('editable' in options) { + if (typeof options.editable === 'boolean') { + this.options.editable.updateTime = options.editable; + this.options.editable.updateGroup = options.editable; + this.options.editable.add = options.editable; + this.options.editable.remove = options.editable; + } + else if (typeof options.editable === 'object') { + util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove'], this.options.editable, options.editable); + } + } + + // callback functions + var addCallback = (function (name) { + var fn = options[name]; + if (fn) { + if (!(fn instanceof Function)) { + throw new Error('option ' + name + ' must be a function ' + name + '(item, callback)'); + } + this.options[name] = fn; + } + }).bind(this); + ['onAdd', 'onUpdate', 'onRemove', 'onMove', 'onMoving'].forEach(addCallback); + + // force the itemSet to refresh: options like orientation and margins may be changed + this.markDirty(); + } + }; + + /** + * Mark the ItemSet dirty so it will refresh everything with next redraw. + * Optionally, all items can be marked as dirty and be refreshed. + * @param {{refreshItems: boolean}} [options] + */ + ItemSet.prototype.markDirty = function(options) { + this.groupIds = []; + this.stackDirty = true; + + if (options && options.refreshItems) { + util.forEach(this.items, function (item) { + item.dirty = true; + if (item.displayed) item.redraw(); + }); + } + }; + + /** + * Destroy the ItemSet + */ + ItemSet.prototype.destroy = function() { + this.hide(); + this.setItems(null); + this.setGroups(null); + + this.hammer = null; + + this.body = null; + this.conversion = null; + }; + + /** + * Hide the component from the DOM + */ + ItemSet.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); + } + + // remove the axis with dots + if (this.dom.axis.parentNode) { + this.dom.axis.parentNode.removeChild(this.dom.axis); + } + + // remove the labelset containing all group labels + if (this.dom.labelSet.parentNode) { + this.dom.labelSet.parentNode.removeChild(this.dom.labelSet); + } + }; + + /** + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed + */ + ItemSet.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } + + // show axis with dots + if (!this.dom.axis.parentNode) { + this.body.dom.backgroundVertical.appendChild(this.dom.axis); + } + + // show labelset containing labels + if (!this.dom.labelSet.parentNode) { + this.body.dom.left.appendChild(this.dom.labelSet); + } + }; + + /** + * Set selected items by their id. Replaces the current selection + * Unknown id's are silently ignored. + * @param {string[] | string} [ids] An array with zero or more id's of the items to be + * selected, or a single item id. If ids is undefined + * or an empty array, all items will be unselected. + */ + ItemSet.prototype.setSelection = function(ids) { + var i, ii, id, item; + + if (ids == undefined) ids = []; + if (!Array.isArray(ids)) ids = [ids]; + + // unselect currently selected items + for (i = 0, ii = this.selection.length; i < ii; i++) { + id = this.selection[i]; + item = this.items[id]; + if (item) item.unselect(); + } + + // select items + this.selection = []; + for (i = 0, ii = ids.length; i < ii; i++) { + id = ids[i]; + item = this.items[id]; + if (item) { + this.selection.push(id); + item.select(); + } + } + }; + + /** + * Get the selected items by their id + * @return {Array} ids The ids of the selected items + */ + ItemSet.prototype.getSelection = function() { + return this.selection.concat([]); + }; + + /** + * Get the id's of the currently visible items. + * @returns {Array} The ids of the visible items + */ + ItemSet.prototype.getVisibleItems = function() { + var range = this.body.range.getRange(); + var left = this.body.util.toScreen(range.start); + var right = this.body.util.toScreen(range.end); + + var ids = []; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + var group = this.groups[groupId]; + var rawVisibleItems = group.visibleItems; + + // filter the "raw" set with visibleItems into a set which is really + // visible by pixels + for (var i = 0; i < rawVisibleItems.length; i++) { + var item = rawVisibleItems[i]; + // TODO: also check whether visible vertically + if ((item.left < right) && (item.left + item.width > left)) { + ids.push(item.id); + } + } + } + } + + return ids; + }; + + /** + * Deselect a selected item + * @param {String | Number} id + * @private + */ + ItemSet.prototype._deselect = function(id) { + var selection = this.selection; + for (var i = 0, ii = selection.length; i < ii; i++) { + if (selection[i] == id) { // non-strict comparison! + selection.splice(i, 1); + break; + } + } + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + ItemSet.prototype.redraw = function() { + var margin = this.options.margin, + range = this.body.range, + asSize = util.option.asSize, + options = this.options, + orientation = options.orientation, + resized = false, + frame = this.dom.frame, + editable = options.editable.updateTime || options.editable.updateGroup; + + // recalculate absolute position (before redrawing groups) + this.props.top = this.body.domProps.top.height + this.body.domProps.border.top; + this.props.left = this.body.domProps.left.width + this.body.domProps.border.left; + + // update class name + frame.className = 'itemset' + (editable ? ' editable' : ''); + + // reorder the groups (if needed) + resized = this._orderGroups() || resized; + + // check whether zoomed (in that case we need to re-stack everything) + // TODO: would be nicer to get this as a trigger from Range + var visibleInterval = range.end - range.start; + var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.props.width != this.props.lastWidth); + if (zoomed) this.stackDirty = true; + this.lastVisibleInterval = visibleInterval; + this.props.lastWidth = this.props.width; + + var restack = this.stackDirty; + var firstGroup = this._firstGroup(); + var firstMargin = { + item: margin.item, + axis: margin.axis + }; + var nonFirstMargin = { + item: margin.item, + axis: margin.item.vertical / 2 + }; + var height = 0; + var minHeight = margin.axis + margin.item.vertical; + + // redraw the background group + this.groups[BACKGROUND].redraw(range, nonFirstMargin, restack); + + // redraw all regular groups + util.forEach(this.groups, function (group) { + var groupMargin = (group == firstGroup) ? firstMargin : nonFirstMargin; + var groupResized = group.redraw(range, groupMargin, restack); + resized = groupResized || resized; + height += group.height; + }); + height = Math.max(height, minHeight); + this.stackDirty = false; + + // update frame height + frame.style.height = asSize(height); + + // calculate actual size + this.props.width = frame.offsetWidth; + this.props.height = height; + + // reposition axis + this.dom.axis.style.top = asSize((orientation == 'top') ? + (this.body.domProps.top.height + this.body.domProps.border.top) : + (this.body.domProps.top.height + this.body.domProps.centerContainer.height)); + this.dom.axis.style.left = '0'; + + // check if this component is resized + resized = this._isResized() || resized; + + return resized; + }; + + /** + * Get the first group, aligned with the axis + * @return {Group | null} firstGroup + * @private + */ + ItemSet.prototype._firstGroup = function() { + var firstGroupIndex = (this.options.orientation == 'top') ? 0 : (this.groupIds.length - 1); + var firstGroupId = this.groupIds[firstGroupIndex]; + var firstGroup = this.groups[firstGroupId] || this.groups[UNGROUPED]; + + return firstGroup || null; + }; + + /** + * Create or delete the group holding all ungrouped items. This group is used when + * there are no groups specified. + * @protected + */ + ItemSet.prototype._updateUngrouped = function() { + var ungrouped = this.groups[UNGROUPED]; + var background = this.groups[BACKGROUND]; + var item, itemId; + + if (this.groupsData) { + // remove the group holding all ungrouped items + if (ungrouped) { + ungrouped.hide(); + delete this.groups[UNGROUPED]; + + for (itemId in this.items) { + if (this.items.hasOwnProperty(itemId)) { + item = this.items[itemId]; + item.parent && item.parent.remove(item); + var groupId = this._getGroupId(item.data); + var group = this.groups[groupId]; + group && group.add(item) || item.hide(); + } + } + } + } + else { + // create a group holding all (unfiltered) items + if (!ungrouped) { + var id = null; + var data = null; + ungrouped = new Group(id, data, this); + this.groups[UNGROUPED] = ungrouped; + + for (itemId in this.items) { + if (this.items.hasOwnProperty(itemId)) { + item = this.items[itemId]; + ungrouped.add(item); + } + } + + ungrouped.show(); + } + } + }; + + /** + * Get the element for the labelset + * @return {HTMLElement} labelSet + */ + ItemSet.prototype.getLabelSet = function() { + return this.dom.labelSet; + }; + + /** + * Set items + * @param {vis.DataSet | null} items + */ + ItemSet.prototype.setItems = function(items) { + var me = this, + ids, + oldItemsData = this.itemsData; + + // replace the dataset + if (!items) { + this.itemsData = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + this.itemsData = items; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); + } + + if (oldItemsData) { + // unsubscribe from old dataset + util.forEach(this.itemListeners, function (callback, event) { + oldItemsData.off(event, callback); + }); + + // remove all drawn items + ids = oldItemsData.getIds(); + this._onRemove(ids); + } + + if (this.itemsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.itemListeners, function (callback, event) { + me.itemsData.on(event, callback, id); + }); + + // add all new items + ids = this.itemsData.getIds(); + this._onAdd(ids); + + // update the group holding all ungrouped items + this._updateUngrouped(); + } + }; + + /** + * Get the current items + * @returns {vis.DataSet | null} + */ + ItemSet.prototype.getItems = function() { + return this.itemsData; + }; + + /** + * Set groups + * @param {vis.DataSet} groups + */ + ItemSet.prototype.setGroups = function(groups) { + var me = this, + ids; + + // unsubscribe from current dataset + if (this.groupsData) { + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.unsubscribe(event, callback); + }); + + // remove all drawn groups + ids = this.groupsData.getIds(); + this.groupsData = null; + this._onRemoveGroups(ids); // note: this will cause a redraw + } + + // replace the dataset + if (!groups) { + this.groupsData = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + this.groupsData = groups; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); + } + + if (this.groupsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.on(event, callback, id); + }); + + // draw all ms + ids = this.groupsData.getIds(); + this._onAddGroups(ids); + } + + // update the group holding all ungrouped items + this._updateUngrouped(); + + // update the order of all items in each group + this._order(); + + this.body.emitter.emit('change', {queue: true}); + }; + + /** + * Get the current groups + * @returns {vis.DataSet | null} groups + */ + ItemSet.prototype.getGroups = function() { + return this.groupsData; + }; + + /** + * Remove an item by its id + * @param {String | Number} id + */ + ItemSet.prototype.removeItem = function(id) { + var item = this.itemsData.get(id), + dataset = this.itemsData.getDataSet(); + + if (item) { + // confirm deletion + this.options.onRemove(item, function (item) { + if (item) { + // remove by id here, it is possible that an item has no id defined + // itself, so better not delete by the item itself + dataset.remove(id); + } + }); + } + }; + + /** + * Get the time of an item based on it's data and options.type + * @param {Object} itemData + * @returns {string} Returns the type + * @private + */ + ItemSet.prototype._getType = function (itemData) { + return itemData.type || this.options.type || (itemData.end ? 'range' : 'box'); + }; + + + /** + * Get the group id for an item + * @param {Object} itemData + * @returns {string} Returns the groupId + * @private + */ + ItemSet.prototype._getGroupId = function (itemData) { + var type = this._getType(itemData); + if (type == 'background' && itemData.group == undefined) { + return BACKGROUND; + } + else { + return this.groupsData ? itemData.group : UNGROUPED; + } + }; + + /** + * Handle updated items + * @param {Number[]} ids + * @protected + */ + ItemSet.prototype._onUpdate = function(ids) { + var me = this; + + ids.forEach(function (id) { + var itemData = me.itemsData.get(id, me.itemOptions); + var item = me.items[id]; + var type = me._getType(itemData); + + var constructor = ItemSet.types[type]; + + if (item) { + // update item + if (!constructor || !(item instanceof constructor)) { + // item type has changed, delete the item and recreate it + me._removeItem(item); + item = null; + } + else { + me._updateItem(item, itemData); + } + } + + if (!item) { + // create item + if (constructor) { + item = new constructor(itemData, me.conversion, me.options); + item.id = id; // TODO: not so nice setting id afterwards + me._addItem(item); + } + else if (type == 'rangeoverflow') { + // TODO: deprecated since version 2.1.0 (or 3.0.0?). cleanup some day + throw new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: ' + + '.vis.timeline .item.range .content {overflow: visible;}'); + } + else { + throw new TypeError('Unknown item type "' + type + '"'); + } + } + }); + + this._order(); + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change', {queue: true}); + }; + + /** + * Handle added items + * @param {Number[]} ids + * @protected + */ + ItemSet.prototype._onAdd = ItemSet.prototype._onUpdate; + + /** + * Handle removed items + * @param {Number[]} ids + * @protected + */ + ItemSet.prototype._onRemove = function(ids) { + var count = 0; + var me = this; + ids.forEach(function (id) { + var item = me.items[id]; + if (item) { + count++; + me._removeItem(item); + } + }); + + if (count) { + // update order + this._order(); + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change', {queue: true}); + } + }; + + /** + * Update the order of item in all groups + * @private + */ + ItemSet.prototype._order = function() { + // reorder the items in all groups + // TODO: optimization: only reorder groups affected by the changed items + util.forEach(this.groups, function (group) { + group.order(); + }); + }; + + /** + * Handle updated groups + * @param {Number[]} ids + * @private + */ + ItemSet.prototype._onUpdateGroups = function(ids) { + this._onAddGroups(ids); + }; + + /** + * Handle changed groups (added or updated) + * @param {Number[]} ids + * @private + */ + ItemSet.prototype._onAddGroups = function(ids) { + var me = this; + + ids.forEach(function (id) { + var groupData = me.groupsData.get(id); + var group = me.groups[id]; + + if (!group) { + // check for reserved ids + if (id == UNGROUPED || id == BACKGROUND) { + throw new Error('Illegal group id. ' + id + ' is a reserved id.'); + } + + var groupOptions = Object.create(me.options); + util.extend(groupOptions, { + height: null + }); + + group = new Group(id, groupData, me); + me.groups[id] = group; + + // add items with this groupId to the new group + for (var itemId in me.items) { + if (me.items.hasOwnProperty(itemId)) { + var item = me.items[itemId]; + if (item.data.group == id) { + group.add(item); + } + } + } + + group.order(); + group.show(); + } + else { + // update group + group.setData(groupData); + } + }); + + this.body.emitter.emit('change', {queue: true}); + }; + + /** + * Handle removed groups + * @param {Number[]} ids + * @private + */ + ItemSet.prototype._onRemoveGroups = function(ids) { + var groups = this.groups; + ids.forEach(function (id) { + var group = groups[id]; + + if (group) { + group.hide(); + delete groups[id]; + } + }); + + this.markDirty(); + + this.body.emitter.emit('change', {queue: true}); + }; + + /** + * Reorder the groups if needed + * @return {boolean} changed + * @private + */ + ItemSet.prototype._orderGroups = function () { + if (this.groupsData) { + // reorder the groups + var groupIds = this.groupsData.getIds({ + order: this.options.groupOrder + }); + + var changed = !util.equalArray(groupIds, this.groupIds); + if (changed) { + // hide all groups, removes them from the DOM + var groups = this.groups; + groupIds.forEach(function (groupId) { + groups[groupId].hide(); + }); + + // show the groups again, attach them to the DOM in correct order + groupIds.forEach(function (groupId) { + groups[groupId].show(); + }); + + this.groupIds = groupIds; + } + + return changed; + } + else { + return false; + } + }; + + /** + * Add a new item + * @param {Item} item + * @private + */ + ItemSet.prototype._addItem = function(item) { + this.items[item.id] = item; + + // add to group + var groupId = this._getGroupId(item.data); + var group = this.groups[groupId]; + if (group) group.add(item); + }; + + /** + * Update an existing item + * @param {Item} item + * @param {Object} itemData + * @private + */ + ItemSet.prototype._updateItem = function(item, itemData) { + var oldGroupId = item.data.group; + + // update the items data (will redraw the item when displayed) + item.setData(itemData); + + // update group + if (oldGroupId != item.data.group) { + var oldGroup = this.groups[oldGroupId]; + if (oldGroup) oldGroup.remove(item); + + var groupId = this._getGroupId(item.data); + var group = this.groups[groupId]; + if (group) group.add(item); + } + }; + + /** + * Delete an item from the ItemSet: remove it from the DOM, from the map + * with items, and from the map with visible items, and from the selection + * @param {Item} item + * @private + */ + ItemSet.prototype._removeItem = function(item) { + // remove from DOM + item.hide(); + + // remove from items + delete this.items[item.id]; + + // remove from selection + var index = this.selection.indexOf(item.id); + if (index != -1) this.selection.splice(index, 1); + + // remove from group + item.parent && item.parent.remove(item); + }; + + /** + * Create an array containing all items being a range (having an end date) + * @param array + * @returns {Array} + * @private + */ + ItemSet.prototype._constructByEndArray = function(array) { + var endArray = []; + + for (var i = 0; i < array.length; i++) { + if (array[i] instanceof RangeItem) { + endArray.push(array[i]); + } + } + return endArray; + }; + + /** + * Register the clicked item on touch, before dragStart is initiated. + * + * dragStart is initiated from a mousemove event, which can have left the item + * already resulting in an item == null + * + * @param {Event} event + * @private + */ + ItemSet.prototype._onTouch = function (event) { + // store the touched item, used in _onDragStart + this.touchParams.item = ItemSet.itemFromTarget(event); + }; + + /** + * Start dragging the selected events + * @param {Event} event + * @private + */ + ItemSet.prototype._onDragStart = function (event) { + if (!this.options.editable.updateTime && !this.options.editable.updateGroup) { + return; + } + + var item = this.touchParams.item || null; + var me = this; + var props; + + if (item && item.selected) { + var dragLeftItem = event.target.dragLeftItem; + var dragRightItem = event.target.dragRightItem; + + if (dragLeftItem) { + props = { + item: dragLeftItem, + initialX: event.gesture.center.clientX + }; + + if (me.options.editable.updateTime) { + props.start = item.data.start.valueOf(); + } + if (me.options.editable.updateGroup) { + if ('group' in item.data) props.group = item.data.group; + } + + this.touchParams.itemProps = [props]; + } + else if (dragRightItem) { + props = { + item: dragRightItem, + initialX: event.gesture.center.clientX + }; + + if (me.options.editable.updateTime) { + props.end = item.data.end.valueOf(); + } + if (me.options.editable.updateGroup) { + if ('group' in item.data) props.group = item.data.group; + } + + this.touchParams.itemProps = [props]; + } + else { + this.touchParams.itemProps = this.getSelection().map(function (id) { + var item = me.items[id]; + var props = { + item: item, + initialX: event.gesture.center.clientX + }; + + if (me.options.editable.updateTime) { + if ('start' in item.data) { + props.start = item.data.start.valueOf(); + + if ('end' in item.data) { + // we store a duration here in order not to change the width + // of the item when moving it. + props.duration = item.data.end.valueOf() - props.start; + } + } + } + if (me.options.editable.updateGroup) { + if ('group' in item.data) props.group = item.data.group; + } + + return props; + }); + } + + event.stopPropagation(); + } + }; + + /** + * Drag selected items + * @param {Event} event + * @private + */ + ItemSet.prototype._onDrag = function (event) { + event.preventDefault(); + + if (this.touchParams.itemProps) { + var me = this; + var snap = this.options.snap || null; + var xOffset = this.body.dom.root.offsetLeft + this.body.domProps.left.width; + var scale = this.body.util.getScale(); + var step = this.body.util.getStep(); + + // move + this.touchParams.itemProps.forEach(function (props) { + var newProps = {}; + var current = me.body.util.toTime(event.gesture.center.clientX - xOffset); + var initial = me.body.util.toTime(props.initialX - xOffset); + var offset = current - initial; + + if ('start' in props) { + var start = new Date(props.start + offset); + newProps.start = snap ? snap(start, scale, step) : start; + } + + if ('end' in props) { + var end = new Date(props.end + offset); + newProps.end = snap ? snap(end, scale, step) : end; + } + else if ('duration' in props) { + newProps.end = new Date(newProps.start.valueOf() + props.duration); + } + + if ('group' in props) { + // drag from one group to another + var group = me.groupFromTarget(event); + newProps.group = group && group.groupId; + } + + // confirm moving the item + var itemData = util.extend({}, props.item.data, newProps); + me.options.onMoving(itemData, function (itemData) { + if (itemData) { + me._updateItemProps(props.item, itemData); + } + }); + }); + + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change'); + + event.stopPropagation(); + } + }; + + /** + * Update an items properties + * @param {Item} item + * @param {Object} props Can contain properties start, end, and group. + * @private + */ + ItemSet.prototype._updateItemProps = function(item, props) { + // TODO: copy all properties from props to item? (also new ones) + if ('start' in props) item.data.start = props.start; + if ('end' in props) item.data.end = props.end; + if ('group' in props && item.data.group != props.group) { + this._moveToGroup(item, props.group) + } + }; + + /** + * Move an item to another group + * @param {Item} item + * @param {String | Number} groupId + * @private + */ + ItemSet.prototype._moveToGroup = function(item, groupId) { + var group = this.groups[groupId]; + if (group && group.groupId != item.data.group) { + var oldGroup = item.parent; + oldGroup.remove(item); + oldGroup.order(); + group.add(item); + group.order(); + + item.data.group = group.groupId; + } + }; + + /** + * End of dragging selected items + * @param {Event} event + * @private + */ + ItemSet.prototype._onDragEnd = function (event) { + event.preventDefault() + + if (this.touchParams.itemProps) { + // prepare a change set for the changed items + var changes = [], + me = this, + dataset = this.itemsData.getDataSet(); + + var itemProps = this.touchParams.itemProps ; + this.touchParams.itemProps = null; + itemProps.forEach(function (props) { + var id = props.item.id, + itemData = me.itemsData.get(id, me.itemOptions); + + var changed = false; + if ('start' in props.item.data) { + changed = (props.start != props.item.data.start.valueOf()); + itemData.start = util.convert(props.item.data.start, + dataset._options.type && dataset._options.type.start || 'Date'); + } + if ('end' in props.item.data) { + changed = changed || (props.end != props.item.data.end.valueOf()); + itemData.end = util.convert(props.item.data.end, + dataset._options.type && dataset._options.type.end || 'Date'); + } + if ('group' in props.item.data) { + changed = changed || (props.group != props.item.data.group); + itemData.group = props.item.data.group; + } + + // only apply changes when start or end is actually changed + if (changed) { + me.options.onMove(itemData, function (itemData) { + if (itemData) { + // apply changes + itemData[dataset._fieldId] = id; // ensure the item contains its id (can be undefined) + changes.push(itemData); + } + else { + // restore original values + me._updateItemProps(props.item, props); + + me.stackDirty = true; // force re-stacking of all items next redraw + me.body.emitter.emit('change'); + } + }); + } + }); + + // apply the changes to the data (if there are changes) + if (changes.length) { + dataset.update(changes); + } + + event.stopPropagation(); + } + }; + + /** + * Handle selecting/deselecting an item when tapping it + * @param {Event} event + * @private + */ + ItemSet.prototype._onSelectItem = function (event) { + if (!this.options.selectable) return; + + var ctrlKey = event.gesture.srcEvent && event.gesture.srcEvent.ctrlKey; + var shiftKey = event.gesture.srcEvent && event.gesture.srcEvent.shiftKey; + if (ctrlKey || shiftKey) { + this._onMultiSelectItem(event); + return; + } + + var oldSelection = this.getSelection(); + + var item = ItemSet.itemFromTarget(event); + var selection = item ? [item.id] : []; + this.setSelection(selection); + + var newSelection = this.getSelection(); + + // emit a select event, + // except when old selection is empty and new selection is still empty + if (newSelection.length > 0 || oldSelection.length > 0) { + this.body.emitter.emit('select', { + items: newSelection + }); + } + }; + + /** + * Handle creation and updates of an item on double tap + * @param event + * @private + */ + ItemSet.prototype._onAddItem = function (event) { + if (!this.options.selectable) return; + if (!this.options.editable.add) return; + + var me = this, + snap = this.options.snap || null, + item = ItemSet.itemFromTarget(event); + + if (item) { + // update item + + // execute async handler to update the item (or cancel it) + var itemData = me.itemsData.get(item.id); // get a clone of the data from the dataset + this.options.onUpdate(itemData, function (itemData) { + if (itemData) { + me.itemsData.getDataSet().update(itemData); + } + }); + } + else { + // add item + var xAbs = util.getAbsoluteLeft(this.dom.frame); + var x = event.gesture.center.pageX - xAbs; + var start = this.body.util.toTime(x); + var scale = this.body.util.getScale(); + var step = this.body.util.getStep(); + + var newItem = { + start: snap ? snap(start, scale, step) : start, + content: 'new item' + }; + + // when default type is a range, add a default end date to the new item + if (this.options.type === 'range') { + var end = this.body.util.toTime(x + this.props.width / 5); + newItem.end = snap ? snap(end, scale, step) : end; + } + + newItem[this.itemsData._fieldId] = util.randomUUID(); + + var group = this.groupFromTarget(event); + if (group) { + newItem.group = group.groupId; + } + + // execute async handler to customize (or cancel) adding an item + this.options.onAdd(newItem, function (item) { + if (item) { + me.itemsData.getDataSet().add(item); + // TODO: need to trigger a redraw? + } + }); + } + }; + + /** + * Handle selecting/deselecting multiple items when holding an item + * @param {Event} event + * @private + */ + ItemSet.prototype._onMultiSelectItem = function (event) { + if (!this.options.selectable) return; + + var selection, + item = ItemSet.itemFromTarget(event); + + if (item) { + // multi select items + selection = this.getSelection(); // current selection + + var shiftKey = event.gesture.touches[0] && event.gesture.touches[0].shiftKey || false; + if (shiftKey) { + // select all items between the old selection and the tapped item + + // determine the selection range + selection.push(item.id); + var range = ItemSet._getItemRange(this.itemsData.get(selection, this.itemOptions)); + + // select all items within the selection range + selection = []; + for (var id in this.items) { + if (this.items.hasOwnProperty(id)) { + var _item = this.items[id]; + var start = _item.data.start; + var end = (_item.data.end !== undefined) ? _item.data.end : start; + + if (start >= range.min && end <= range.max) { + selection.push(_item.id); // do not use id but item.id, id itself is stringified + } + } + } + } + else { + // add/remove this item from the current selection + var index = selection.indexOf(item.id); + if (index == -1) { + // item is not yet selected -> select it + selection.push(item.id); + } + else { + // item is already selected -> deselect it + selection.splice(index, 1); + } + } + + this.setSelection(selection); + + this.body.emitter.emit('select', { + items: this.getSelection() + }); + } + }; + + /** + * Calculate the time range of a list of items + * @param {Array.} itemsData + * @return {{min: Date, max: Date}} Returns the range of the provided items + * @private + */ + ItemSet._getItemRange = function(itemsData) { + var max = null; + var min = null; + + itemsData.forEach(function (data) { + if (min == null || data.start < min) { + min = data.start; + } + + if (data.end != undefined) { + if (max == null || data.end > max) { + max = data.end; + } + } + else { + if (max == null || data.start > max) { + max = data.start; + } + } + }); + + return { + min: min, + max: max + } + }; + + /** + * Find an item from an event target: + * searches for the attribute 'timeline-item' in the event target's element tree + * @param {Event} event + * @return {Item | null} item + */ + ItemSet.itemFromTarget = function(event) { + var target = event.target; + while (target) { + if (target.hasOwnProperty('timeline-item')) { + return target['timeline-item']; + } + target = target.parentNode; + } + + return null; + }; + + /** + * Find the Group from an event target: + * searches for the attribute 'timeline-group' in the event target's element tree + * @param {Event} event + * @return {Group | null} group + */ + ItemSet.prototype.groupFromTarget = function(event) { + // TODO: cleanup when the new solution is stable (also on mobile) + //var target = event.target; + //while (target) { + // if (target.hasOwnProperty('timeline-group')) { + // return target['timeline-group']; + // } + // target = target.parentNode; + //} + // + + var clientY = event.gesture.center.clientY; + for (var i = 0; i < this.groupIds.length; i++) { + var groupId = this.groupIds[i]; + var group = this.groups[groupId]; + var foreground = group.dom.foreground; + var top = util.getAbsoluteTop(foreground); + if (clientY > top && clientY < top + foreground.offsetHeight) { + return group; + } + + if (this.options.orientation === 'top') { + if (i === this.groupIds.length - 1 && clientY > top) { + return group; + } + } + else { + if (i === 0 && clientY < top + foreground.offset) { + return group; + } + } + } + + return null; + }; + + /** + * Find the ItemSet from an event target: + * searches for the attribute 'timeline-itemset' in the event target's element tree + * @param {Event} event + * @return {ItemSet | null} item + */ + ItemSet.itemSetFromTarget = function(event) { + var target = event.target; + while (target) { + if (target.hasOwnProperty('timeline-itemset')) { + return target['timeline-itemset']; + } + target = target.parentNode; + } + + return null; + }; + + module.exports = ItemSet; + + +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(2); + var Component = __webpack_require__(24); + + /** + * Legend for Graph2d + */ + function Legend(body, options, side, linegraphOptions) { + this.body = body; + this.defaultOptions = { + enabled: true, + icons: true, + iconSize: 20, + iconSpacing: 6, + left: { + visible: true, + position: 'top-left' // top/bottom - left,center,right + }, + right: { + visible: true, + position: 'top-left' // top/bottom - left,center,right + } + } + this.side = side; + this.options = util.extend({},this.defaultOptions); + this.linegraphOptions = linegraphOptions; + + this.svgElements = {}; + this.dom = {}; + this.groups = {}; + this.amountOfGroups = 0; + this._create(); + + this.setOptions(options); + } + + Legend.prototype = new Component(); + + Legend.prototype.clear = function() { + this.groups = {}; + this.amountOfGroups = 0; + } + + Legend.prototype.addGroup = function(label, graphOptions) { + + if (!this.groups.hasOwnProperty(label)) { + this.groups[label] = graphOptions; + } + this.amountOfGroups += 1; + }; + + Legend.prototype.updateGroup = function(label, graphOptions) { + this.groups[label] = graphOptions; + }; + + Legend.prototype.removeGroup = function(label) { + if (this.groups.hasOwnProperty(label)) { + delete this.groups[label]; + this.amountOfGroups -= 1; + } + }; + + Legend.prototype._create = function() { + this.dom.frame = document.createElement('div'); + this.dom.frame.className = 'legend'; + this.dom.frame.style.position = "absolute"; + this.dom.frame.style.top = "10px"; + this.dom.frame.style.display = "block"; + + this.dom.textArea = document.createElement('div'); + this.dom.textArea.className = 'legendText'; + this.dom.textArea.style.position = "relative"; + this.dom.textArea.style.top = "0px"; + + this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); + this.svg.style.position = 'absolute'; + this.svg.style.top = 0 +'px'; + this.svg.style.width = this.options.iconSize + 5 + 'px'; + this.svg.style.height = '100%'; + + this.dom.frame.appendChild(this.svg); + this.dom.frame.appendChild(this.dom.textArea); + }; + + /** + * Hide the component from the DOM + */ + Legend.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); + } + }; + + /** + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed + */ + Legend.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } + }; + + Legend.prototype.setOptions = function(options) { + var fields = ['enabled','orientation','icons','left','right']; + util.selectiveDeepExtend(fields, this.options, options); + }; + + Legend.prototype.redraw = function() { + var activeGroups = 0; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + activeGroups++; + } + } + } + + if (this.options[this.side].visible == false || this.amountOfGroups == 0 || this.options.enabled == false || activeGroups == 0) { + this.hide(); + } + else { + this.show(); + if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') { + this.dom.frame.style.left = '4px'; + this.dom.frame.style.textAlign = "left"; + this.dom.textArea.style.textAlign = "left"; + this.dom.textArea.style.left = (this.options.iconSize + 15) + 'px'; + this.dom.textArea.style.right = ''; + this.svg.style.left = 0 +'px'; + this.svg.style.right = ''; + } + else { + this.dom.frame.style.right = '4px'; + this.dom.frame.style.textAlign = "right"; + this.dom.textArea.style.textAlign = "right"; + this.dom.textArea.style.right = (this.options.iconSize + 15) + 'px'; + this.dom.textArea.style.left = ''; + this.svg.style.right = 0 +'px'; + this.svg.style.left = ''; + } + + if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') { + this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; + this.dom.frame.style.bottom = ''; + } + else { + var scrollableHeight = this.body.domProps.center.height - this.body.domProps.centerContainer.height; + this.dom.frame.style.bottom = 4 + scrollableHeight + Number(this.body.dom.center.style.top.replace("px","")) + 'px'; + this.dom.frame.style.top = ''; + } + + if (this.options.icons == false) { + this.dom.frame.style.width = this.dom.textArea.offsetWidth + 10 + 'px'; + this.dom.textArea.style.right = ''; + this.dom.textArea.style.left = ''; + this.svg.style.width = '0px'; + } + else { + this.dom.frame.style.width = this.options.iconSize + 15 + this.dom.textArea.offsetWidth + 10 + 'px' + this.drawLegendIcons(); + } + + var content = ''; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + content += this.groups[groupId].content + '
'; + } + } + } + this.dom.textArea.innerHTML = content; + this.dom.textArea.style.lineHeight = ((0.75 * this.options.iconSize) + this.options.iconSpacing) + 'px'; + } + }; + + Legend.prototype.drawLegendIcons = function() { + if (this.dom.frame.parentNode) { + DOMutil.prepareElements(this.svgElements); + var padding = window.getComputedStyle(this.dom.frame).paddingTop; + var iconOffset = Number(padding.replace('px','')); + var x = iconOffset; + var iconWidth = this.options.iconSize; + var iconHeight = 0.75 * this.options.iconSize; + var y = iconOffset + 0.5 * iconHeight + 3; + + this.svg.style.width = iconWidth + 5 + iconOffset + 'px'; + + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { + this.groups[groupId].drawIcon(x, y, this.svgElements, this.svg, iconWidth, iconHeight); + y += iconHeight + this.options.iconSpacing; + } + } + } + + DOMutil.cleanupElements(this.svgElements); + } + }; + + module.exports = Legend; + + +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var DOMutil = __webpack_require__(2); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Component = __webpack_require__(24); + var DataAxis = __webpack_require__(28); + var GraphGroup = __webpack_require__(29); + var Legend = __webpack_require__(33); + var BarGraphFunctions = __webpack_require__(50); + + var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items + + /** + * This is the constructor of the LineGraph. It requires a Timeline body and options. + * + * @param body + * @param options + * @constructor + */ + function LineGraph(body, options) { + this.id = util.randomUUID(); + this.body = body; + + this.defaultOptions = { + yAxisOrientation: 'left', + defaultGroup: 'default', + sort: true, + sampling: true, + graphHeight: '400px', + shaded: { + enabled: false, + orientation: 'bottom' // top, bottom + }, + style: 'line', // line, bar + barChart: { + width: 50, + handleOverlap: 'overlap', + align: 'center' // left, center, right + }, + catmullRom: { + enabled: true, + parametrization: 'centripetal', // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) + alpha: 0.5 + }, + drawPoints: { + enabled: true, + size: 6, + style: 'square' // square, circle + }, + dataAxis: { + showMinorLabels: true, + showMajorLabels: true, + icons: false, + width: '40px', + visible: true, + alignZeros: true, + customRange: { + left: {min:undefined, max:undefined}, + right: {min:undefined, max:undefined} + } + //, these options are not set by default, but this shows the format they will be in + //format: { + // left: {decimals: 2}, + // right: {decimals: 2} + //}, + //title: { + // left: { + // text: 'left', + // style: 'color:black;' + // }, + // right: { + // text: 'right', + // style: 'color:black;' + // } + //} + }, + legend: { + enabled: false, + icons: true, + left: { + visible: true, + position: 'top-left' // top/bottom - left,right + }, + right: { + visible: true, + position: 'top-right' // top/bottom - left,right + } + }, + groups: { + visibility: {} + } + }; + + // options is shared by this ItemSet and all its items + this.options = util.extend({}, this.defaultOptions); + this.dom = {}; + this.props = {}; + this.hammer = null; + this.groups = {}; + this.abortedGraphUpdate = false; + this.updateSVGheight = false; + this.updateSVGheightOnResize = false; + + var me = this; + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet + + // listeners for the DataSet of the items + this.itemListeners = { + 'add': function (event, params, senderId) { + me._onAdd(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdate(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemove(params.items); + } + }; + + // listeners for the DataSet of the groups + this.groupListeners = { + 'add': function (event, params, senderId) { + me._onAddGroups(params.items); + }, + 'update': function (event, params, senderId) { + me._onUpdateGroups(params.items); + }, + 'remove': function (event, params, senderId) { + me._onRemoveGroups(params.items); + } + }; + + this.items = {}; // object with an Item for every data item + this.selection = []; // list with the ids of all selected nodes + this.lastStart = this.body.range.start; + this.touchParams = {}; // stores properties while dragging + + this.svgElements = {}; + this.setOptions(options); + this.groupsUsingDefaultStyles = [0]; + this.COUNTER = 0; + this.body.emitter.on('rangechanged', function() { + me.lastStart = me.body.range.start; + me.svg.style.left = util.option.asSize(-me.props.width); + me.redraw.call(me,true); + }); + + // create the HTML DOM + this._create(); + this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups}; + this.body.emitter.emit('change'); + + } + + LineGraph.prototype = new Component(); + + /** + * Create the HTML DOM for the ItemSet + */ + LineGraph.prototype._create = function(){ + var frame = document.createElement('div'); + frame.className = 'LineGraph'; + this.dom.frame = frame; + + // create svg element for graph drawing. + this.svg = document.createElementNS('http://www.w3.org/2000/svg','svg'); + this.svg.style.position = 'relative'; + this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; + this.svg.style.display = 'block'; + frame.appendChild(this.svg); + + // data axis + this.options.dataAxis.orientation = 'left'; + this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); + + this.options.dataAxis.orientation = 'right'; + this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); + delete this.options.dataAxis.orientation; + + // legends + this.legendLeft = new Legend(this.body, this.options.legend, 'left', this.options.groups); + this.legendRight = new Legend(this.body, this.options.legend, 'right', this.options.groups); + + this.show(); + }; + + /** + * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element. + * @param {object} options + */ + LineGraph.prototype.setOptions = function(options) { + if (options) { + var fields = ['sampling','defaultGroup','height','graphHeight','yAxisOrientation','style','barChart','dataAxis','sort','groups']; + if (options.graphHeight === undefined && options.height !== undefined && this.body.domProps.centerContainer.height !== undefined) { + this.updateSVGheight = true; + this.updateSVGheightOnResize = true; + } + else if (this.body.domProps.centerContainer.height !== undefined && options.graphHeight !== undefined) { + if (parseInt((options.graphHeight + '').replace("px",'')) < this.body.domProps.centerContainer.height) { + this.updateSVGheight = true; + } + } + util.selectiveDeepExtend(fields, this.options, options); + util.mergeOptions(this.options, options,'catmullRom'); + util.mergeOptions(this.options, options,'drawPoints'); + util.mergeOptions(this.options, options,'shaded'); + util.mergeOptions(this.options, options,'legend'); + + if (options.catmullRom) { + if (typeof options.catmullRom == 'object') { + if (options.catmullRom.parametrization) { + if (options.catmullRom.parametrization == 'uniform') { + this.options.catmullRom.alpha = 0; + } + else if (options.catmullRom.parametrization == 'chordal') { + this.options.catmullRom.alpha = 1.0; + } + else { + this.options.catmullRom.parametrization = 'centripetal'; + this.options.catmullRom.alpha = 0.5; + } + } + } + } + + if (this.yAxisLeft) { + if (options.dataAxis !== undefined) { + this.yAxisLeft.setOptions(this.options.dataAxis); + this.yAxisRight.setOptions(this.options.dataAxis); + } + } + + if (this.legendLeft) { + if (options.legend !== undefined) { + this.legendLeft.setOptions(this.options.legend); + this.legendRight.setOptions(this.options.legend); + } + } + + if (this.groups.hasOwnProperty(UNGROUPED)) { + this.groups[UNGROUPED].setOptions(options); + } + } + + // this is used to redraw the graph if the visibility of the groups is changed. + if (this.dom.frame) { + this.redraw(true); + } + }; + + /** + * Hide the component from the DOM + */ + LineGraph.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); + } + }; + + + /** + * Show the component in the DOM (when not already visible). + * @return {Boolean} changed + */ + LineGraph.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); + } + }; + + + /** + * Set items + * @param {vis.DataSet | null} items + */ + LineGraph.prototype.setItems = function(items) { + var me = this, + ids, + oldItemsData = this.itemsData; + + // replace the dataset + if (!items) { + this.itemsData = null; + } + else if (items instanceof DataSet || items instanceof DataView) { + this.itemsData = items; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); + } + + if (oldItemsData) { + // unsubscribe from old dataset + util.forEach(this.itemListeners, function (callback, event) { + oldItemsData.off(event, callback); + }); + + // remove all drawn items + ids = oldItemsData.getIds(); + this._onRemove(ids); + } + + if (this.itemsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.itemListeners, function (callback, event) { + me.itemsData.on(event, callback, id); + }); + + // add all new items + ids = this.itemsData.getIds(); + this._onAdd(ids); + } + this._updateUngrouped(); + //this._updateGraph(); + this.redraw(true); + }; + + + /** + * Set groups + * @param {vis.DataSet} groups + */ + LineGraph.prototype.setGroups = function(groups) { + var me = this; + var ids; + + // unsubscribe from current dataset + if (this.groupsData) { + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.unsubscribe(event, callback); + }); + + // remove all drawn groups + ids = this.groupsData.getIds(); + this.groupsData = null; + this._onRemoveGroups(ids); // note: this will cause a redraw + } + + // replace the dataset + if (!groups) { + this.groupsData = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + this.groupsData = groups; + } + else { + throw new TypeError('Data must be an instance of DataSet or DataView'); + } + + if (this.groupsData) { + // subscribe to new dataset + var id = this.id; + util.forEach(this.groupListeners, function (callback, event) { + me.groupsData.on(event, callback, id); + }); + + // draw all ms + ids = this.groupsData.getIds(); + this._onAddGroups(ids); + } + this._onUpdate(); + }; + + + /** + * Update the data + * @param [ids] + * @private + */ + LineGraph.prototype._onUpdate = function(ids) { + this._updateUngrouped(); + this._updateAllGroupData(); + //this._updateGraph(); + this.redraw(true); + }; + LineGraph.prototype._onAdd = function (ids) {this._onUpdate(ids);}; + LineGraph.prototype._onRemove = function (ids) {this._onUpdate(ids);}; + LineGraph.prototype._onUpdateGroups = function (groupIds) { + for (var i = 0; i < groupIds.length; i++) { + var group = this.groupsData.get(groupIds[i]); + this._updateGroup(group, groupIds[i]); + } + + //this._updateGraph(); + this.redraw(true); + }; + LineGraph.prototype._onAddGroups = function (groupIds) {this._onUpdateGroups(groupIds);}; + + + /** + * this cleans the group out off the legends and the dataaxis, updates the ungrouped and updates the graph + * @param {Array} groupIds + * @private + */ + LineGraph.prototype._onRemoveGroups = function (groupIds) { + for (var i = 0; i < groupIds.length; i++) { + if (this.groups.hasOwnProperty(groupIds[i])) { + if (this.groups[groupIds[i]].options.yAxisOrientation == 'right') { + this.yAxisRight.removeGroup(groupIds[i]); + this.legendRight.removeGroup(groupIds[i]); + this.legendRight.redraw(); + } + else { + this.yAxisLeft.removeGroup(groupIds[i]); + this.legendLeft.removeGroup(groupIds[i]); + this.legendLeft.redraw(); + } + delete this.groups[groupIds[i]]; + } + } + this._updateUngrouped(); + //this._updateGraph(); + this.redraw(true); + }; + + + /** + * update a group object with the group dataset entree + * + * @param group + * @param groupId + * @private + */ + LineGraph.prototype._updateGroup = function (group, groupId) { + if (!this.groups.hasOwnProperty(groupId)) { + this.groups[groupId] = new GraphGroup(group, groupId, this.options, this.groupsUsingDefaultStyles); + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.addGroup(groupId, this.groups[groupId]); + this.legendRight.addGroup(groupId, this.groups[groupId]); + } + else { + this.yAxisLeft.addGroup(groupId, this.groups[groupId]); + this.legendLeft.addGroup(groupId, this.groups[groupId]); + } + } + else { + this.groups[groupId].update(group); + if (this.groups[groupId].options.yAxisOrientation == 'right') { + this.yAxisRight.updateGroup(groupId, this.groups[groupId]); + this.legendRight.updateGroup(groupId, this.groups[groupId]); + } + else { + this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); + this.legendLeft.updateGroup(groupId, this.groups[groupId]); + } + } + this.legendLeft.redraw(); + this.legendRight.redraw(); + }; + + + /** + * this updates all groups, it is used when there is an update the the itemset. + * + * @private + */ + LineGraph.prototype._updateAllGroupData = function () { + if (this.itemsData != null) { + var groupsContent = {}; + var groupId; + for (groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + groupsContent[groupId] = []; + } + } + for (var itemId in this.itemsData._data) { + if (this.itemsData._data.hasOwnProperty(itemId)) { + var item = this.itemsData._data[itemId]; + if (groupsContent[item.group] === undefined) { + throw new Error('Cannot find referenced group. Possible reason: items added before groups? Groups need to be added before items, as items refer to groups.') + } + item.x = util.convert(item.x,'Date'); + groupsContent[item.group].push(item); + } + } + for (groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + this.groups[groupId].setItems(groupsContent[groupId]); + } + } + } + }; + + + /** + * Create or delete the group holding all ungrouped items. This group is used when + * there are no groups specified. This anonymous group is called 'graph'. + * @protected + */ + LineGraph.prototype._updateUngrouped = function() { + if (this.itemsData && this.itemsData != null) { + var ungroupedCounter = 0; + for (var itemId in this.itemsData._data) { + if (this.itemsData._data.hasOwnProperty(itemId)) { + var item = this.itemsData._data[itemId]; + if (item != undefined) { + if (item.hasOwnProperty('group')) { + if (item.group === undefined) { + item.group = UNGROUPED; + } + } + else { + item.group = UNGROUPED; + } + ungroupedCounter = item.group == UNGROUPED ? ungroupedCounter + 1 : ungroupedCounter; + } + } + } + + if (ungroupedCounter == 0) { + delete this.groups[UNGROUPED]; + this.legendLeft.removeGroup(UNGROUPED); + this.legendRight.removeGroup(UNGROUPED); + this.yAxisLeft.removeGroup(UNGROUPED); + this.yAxisRight.removeGroup(UNGROUPED); + } + else { + var group = {id: UNGROUPED, content: this.options.defaultGroup}; + this._updateGroup(group, UNGROUPED); + } + } + else { + delete this.groups[UNGROUPED]; + this.legendLeft.removeGroup(UNGROUPED); + this.legendRight.removeGroup(UNGROUPED); + this.yAxisLeft.removeGroup(UNGROUPED); + this.yAxisRight.removeGroup(UNGROUPED); + } + + this.legendLeft.redraw(); + this.legendRight.redraw(); + }; + + + /** + * Redraw the component, mandatory function + * @return {boolean} Returns true if the component is resized + */ + LineGraph.prototype.redraw = function(forceGraphUpdate) { + var resized = false; + + // calculate actual size and position + this.props.width = this.dom.frame.offsetWidth; + this.props.height = this.body.domProps.centerContainer.height; + + // update the graph if there is no lastWidth or with, used for the initial draw + if (this.lastWidth === undefined && this.props.width) { + forceGraphUpdate = true; + } + + // check if this component is resized + resized = this._isResized() || resized; + + // check whether zoomed (in that case we need to re-stack everything) + var visibleInterval = this.body.range.end - this.body.range.start; + var zoomed = (visibleInterval != this.lastVisibleInterval); + this.lastVisibleInterval = visibleInterval; + + + // the svg element is three times as big as the width, this allows for fully dragging left and right + // without reloading the graph. the controls for this are bound to events in the constructor + if (resized == true) { + this.svg.style.width = util.option.asSize(3*this.props.width); + this.svg.style.left = util.option.asSize(-this.props.width); + + // if the height of the graph is set as proportional, change the height of the svg + if ((this.options.height + '').indexOf("%") != -1 || this.updateSVGheightOnResize == true) { + this.updateSVGheight = true; + } + } + + // update the height of the graph on each redraw of the graph. + if (this.updateSVGheight == true) { + if (this.options.graphHeight != this.body.domProps.centerContainer.height + 'px') { + this.options.graphHeight = this.body.domProps.centerContainer.height + 'px'; + this.svg.style.height = this.body.domProps.centerContainer.height + 'px'; + } + this.updateSVGheight = false; + } + else { + this.svg.style.height = ('' + this.options.graphHeight).replace('px','') + 'px'; + } + + // zoomed is here to ensure that animations are shown correctly. + if (resized == true || zoomed == true || this.abortedGraphUpdate == true || forceGraphUpdate == true) { + resized = this._updateGraph() || resized; + } + else { + // move the whole svg while dragging + if (this.lastStart != 0) { + var offset = this.body.range.start - this.lastStart; + var range = this.body.range.end - this.body.range.start; + if (this.props.width != 0) { + var rangePerPixelInv = this.props.width/range; + var xOffset = offset * rangePerPixelInv; + this.svg.style.left = (-this.props.width - xOffset) + 'px'; + } + } + } + + this.legendLeft.redraw(); + this.legendRight.redraw(); + return resized; + }; + + + /** + * Update and redraw the graph. + * + */ + LineGraph.prototype._updateGraph = function () { + // reset the svg elements + DOMutil.prepareElements(this.svgElements); + if (this.props.width != 0 && this.itemsData != null) { + var group, i; + var preprocessedGroupData = {}; + var processedGroupData = {}; + var groupRanges = {}; + var changeCalled = false; + + // getting group Ids + var groupIds = []; + for (var groupId in this.groups) { + if (this.groups.hasOwnProperty(groupId)) { + group = this.groups[groupId]; + if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { + groupIds.push(groupId); + } + } + } + if (groupIds.length > 0) { + // this is the range of the SVG canvas + var minDate = this.body.util.toGlobalTime(-this.body.domProps.root.width); + var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); + var groupsData = {}; + // fill groups data, this only loads the data we require based on the timewindow + this._getRelevantData(groupIds, groupsData, minDate, maxDate); + + // apply sampling, if disabled, it will pass through this function. + this._applySampling(groupIds, groupsData); + + // we transform the X coordinates to detect collisions + for (i = 0; i < groupIds.length; i++) { + preprocessedGroupData[groupIds[i]] = this._convertXcoordinates(groupsData[groupIds[i]]); + } + + // now all needed data has been collected we start the processing. + this._getYRanges(groupIds, preprocessedGroupData, groupRanges); + + // update the Y axis first, we use this data to draw at the correct Y points + // changeCalled is required to clean the SVG on a change emit. + changeCalled = this._updateYAxis(groupIds, groupRanges); + var MAX_CYCLES = 5; + if (changeCalled == true && this.COUNTER < MAX_CYCLES) { + DOMutil.cleanupElements(this.svgElements); + this.abortedGraphUpdate = true; + this.COUNTER++; + this.body.emitter.emit('change'); + return true; + } + else { + if (this.COUNTER > MAX_CYCLES) { + console.log("WARNING: there may be an infinite loop in the _updateGraph emitter cycle.") + } + this.COUNTER = 0; + this.abortedGraphUpdate = false; + + // With the yAxis scaled correctly, use this to get the Y values of the points. + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + processedGroupData[groupIds[i]] = this._convertYcoordinates(groupsData[groupIds[i]], group); + } + + // draw the groups + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.style != 'bar') { // bar needs to be drawn enmasse + group.draw(processedGroupData[groupIds[i]], group, this.framework); + } + } + BarGraphFunctions.draw(groupIds, processedGroupData, this.framework); + } + } + } + + // cleanup unused svg elements + DOMutil.cleanupElements(this.svgElements); + return false; + }; + + + /** + * first select and preprocess the data from the datasets. + * the groups have their preselection of data, we now loop over this data to see + * what data we need to draw. Sorted data is much faster. + * more optimization is possible by doing the sampling before and using the binary search + * to find the end date to determine the increment. + * + * @param {array} groupIds + * @param {object} groupsData + * @param {date} minDate + * @param {date} maxDate + * @private + */ + LineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, maxDate) { + var group, i, j, item; + if (groupIds.length > 0) { + for (i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + groupsData[groupIds[i]] = []; + var dataContainer = groupsData[groupIds[i]]; + // optimization for sorted data + if (group.options.sort == true) { + var guess = Math.max(0, util.binarySearchValue(group.itemsData, minDate, 'x', 'before')); + for (j = guess; j < group.itemsData.length; j++) { + item = group.itemsData[j]; + if (item !== undefined) { + if (item.x > maxDate) { + dataContainer.push(item); + break; + } + else { + dataContainer.push(item); + } + } + } + } + else { + for (j = 0; j < group.itemsData.length; j++) { + item = group.itemsData[j]; + if (item !== undefined) { + if (item.x > minDate && item.x < maxDate) { + dataContainer.push(item); + } + } + } + } + } + } + }; + + + /** + * + * @param groupIds + * @param groupsData + * @private + */ + LineGraph.prototype._applySampling = function (groupIds, groupsData) { + var group; + if (groupIds.length > 0) { + for (var i = 0; i < groupIds.length; i++) { + group = this.groups[groupIds[i]]; + if (group.options.sampling == true) { + var dataContainer = groupsData[groupIds[i]]; + if (dataContainer.length > 0) { + var increment = 1; + var amountOfPoints = dataContainer.length; + + // the global screen is used because changing the width of the yAxis may affect the increment, resulting in an endless loop + // of width changing of the yAxis. + var xDistance = this.body.util.toGlobalScreen(dataContainer[dataContainer.length - 1].x) - this.body.util.toGlobalScreen(dataContainer[0].x); + var pointsPerPixel = amountOfPoints / xDistance; + increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); + + var sampledData = []; + for (var j = 0; j < amountOfPoints; j += increment) { + sampledData.push(dataContainer[j]); + + } + groupsData[groupIds[i]] = sampledData; + } + } + } + } + }; + + + /** + * + * + * @param {array} groupIds + * @param {object} groupsData + * @param {object} groupRanges | this is being filled here + * @private + */ + LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { + var groupData, group, i; + var barCombinedDataLeft = []; + var barCombinedDataRight = []; + var options; + if (groupIds.length > 0) { + for (i = 0; i < groupIds.length; i++) { + groupData = groupsData[groupIds[i]]; + options = this.groups[groupIds[i]].options; + if (groupData.length > 0) { + group = this.groups[groupIds[i]]; + // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. + if (options.barChart.handleOverlap == 'stack' && options.style == 'bar') { + if (options.yAxisOrientation == 'left') {barCombinedDataLeft = barCombinedDataLeft.concat(group.getYRange(groupData)) ;} + else {barCombinedDataRight = barCombinedDataRight.concat(group.getYRange(groupData));} + } + else { + groupRanges[groupIds[i]] = group.getYRange(groupData,groupIds[i]); + } + } + } + + // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. + BarGraphFunctions.getStackedBarYRange(barCombinedDataLeft , groupRanges, groupIds, '__barchartLeft' , 'left' ); + BarGraphFunctions.getStackedBarYRange(barCombinedDataRight, groupRanges, groupIds, '__barchartRight', 'right'); + } + }; + + + /** + * this sets the Y ranges for the Y axis. It also determines which of the axis should be shown or hidden. + * @param {Array} groupIds + * @param {Object} groupRanges + * @private + */ + LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { + var resized = false; + var yAxisLeftUsed = false; + var yAxisRightUsed = false; + var minLeft = 1e9, minRight = 1e9, maxLeft = -1e9, maxRight = -1e9, minVal, maxVal; + // if groups are present + if (groupIds.length > 0) { + // this is here to make sure that if there are no items in the axis but there are groups, that there is no infinite draw/redraw loop. + for (var i = 0; i < groupIds.length; i++) { + var group = this.groups[groupIds[i]]; + if (group && group.options.yAxisOrientation != 'right') { + yAxisLeftUsed = true; + minLeft = 0; + maxLeft = 0; + } + else if (group && group.options.yAxisOrientation) { + yAxisRightUsed = true; + minRight = 0; + maxRight = 0; + } + } + + // if there are items: + for (var i = 0; i < groupIds.length; i++) { + if (groupRanges.hasOwnProperty(groupIds[i])) { + if (groupRanges[groupIds[i]].ignore !== true) { + minVal = groupRanges[groupIds[i]].min; + maxVal = groupRanges[groupIds[i]].max; + + if (groupRanges[groupIds[i]].yAxisOrientation != 'right') { + yAxisLeftUsed = true; + minLeft = minLeft > minVal ? minVal : minLeft; + maxLeft = maxLeft < maxVal ? maxVal : maxLeft; + } + else { + yAxisRightUsed = true; + minRight = minRight > minVal ? minVal : minRight; + maxRight = maxRight < maxVal ? maxVal : maxRight; + } + } + } + } + + if (yAxisLeftUsed == true) { + this.yAxisLeft.setRange(minLeft, maxLeft); + } + if (yAxisRightUsed == true) { + this.yAxisRight.setRange(minRight, maxRight); + } + } + resized = this._toggleAxisVisiblity(yAxisLeftUsed , this.yAxisLeft) || resized; + resized = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || resized; + + if (yAxisRightUsed == true && yAxisLeftUsed == true) { + this.yAxisLeft.drawIcons = true; + this.yAxisRight.drawIcons = true; + } + else { + this.yAxisLeft.drawIcons = false; + this.yAxisRight.drawIcons = false; + } + this.yAxisRight.master = !yAxisLeftUsed; + if (this.yAxisRight.master == false) { + if (yAxisRightUsed == true) {this.yAxisLeft.lineOffset = this.yAxisRight.width;} + else {this.yAxisLeft.lineOffset = 0;} + + resized = this.yAxisLeft.redraw() || resized; + this.yAxisRight.stepPixelsForced = this.yAxisLeft.stepPixels; + this.yAxisRight.zeroCrossing = this.yAxisLeft.zeroCrossing; + resized = this.yAxisRight.redraw() || resized; + } + else { + resized = this.yAxisRight.redraw() || resized; + } + + // clean the accumulated lists + if (groupIds.indexOf('__barchartLeft') != -1) { + groupIds.splice(groupIds.indexOf('__barchartLeft'),1); + } + if (groupIds.indexOf('__barchartRight') != -1) { + groupIds.splice(groupIds.indexOf('__barchartRight'),1); + } + + return resized; + }; + + + /** + * This shows or hides the Y axis if needed. If there is a change, the changed event is emitted by the updateYAxis function + * + * @param {boolean} axisUsed + * @returns {boolean} + * @private + * @param axis + */ + LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { + var changed = false; + if (axisUsed == false) { + if (axis.dom.frame.parentNode && axis.hidden == false) { + axis.hide() + changed = true; + } + } + else { + if (!axis.dom.frame.parentNode && axis.hidden == true) { + axis.show(); + changed = true; + } + } + return changed; + }; + + + /** + * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the + * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for + * the yAxis. + * + * @param datapoints + * @returns {Array} + * @private + */ + LineGraph.prototype._convertXcoordinates = function (datapoints) { + var extractedData = []; + var xValue, yValue; + var toScreen = this.body.util.toScreen; + + for (var i = 0; i < datapoints.length; i++) { + xValue = toScreen(datapoints[i].x) + this.props.width; + yValue = datapoints[i].y; + extractedData.push({x: xValue, y: yValue}); + } + + return extractedData; + }; + + + /** + * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the + * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for + * the yAxis. + * + * @param datapoints + * @param group + * @returns {Array} + * @private + */ + LineGraph.prototype._convertYcoordinates = function (datapoints, group) { + var extractedData = []; + var xValue, yValue; + var toScreen = this.body.util.toScreen; + var axis = this.yAxisLeft; + var svgHeight = Number(this.svg.style.height.replace('px','')); + if (group.options.yAxisOrientation == 'right') { + axis = this.yAxisRight; + } + + for (var i = 0; i < datapoints.length; i++) { + var labelValue; + //if (datapoints[i].label) { + // labelValue = datapoints[i].label; + //} + //else { + // labelValue = null; + //} + labelValue = datapoints[i].label ? datapoints[i].label : null; + xValue = toScreen(datapoints[i].x) + this.props.width; + yValue = Math.round(axis.convertValue(datapoints[i].y)); + extractedData.push({x: xValue, y: yValue, label:labelValue}); + } + + group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); + + return extractedData; + }; + + + module.exports = LineGraph; + + +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Component = __webpack_require__(24); + var TimeStep = __webpack_require__(19); + var DateUtil = __webpack_require__(15); + var moment = __webpack_require__(44); + + /** + * A horizontal time axis + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body + * @param {Object} [options] See TimeAxis.setOptions for the available + * options. + * @constructor TimeAxis + * @extends Component + */ + function TimeAxis (body, options) { + this.dom = { + foreground: null, + lines: [], + majorTexts: [], + minorTexts: [], + redundant: { + lines: [], + majorTexts: [], + minorTexts: [] + } + }; + this.props = { + range: { + start: 0, + end: 0, + minimumStep: 0 + }, + lineTop: 0 + }; + + this.defaultOptions = { + orientation: 'bottom', // supported: 'top', 'bottom' + // TODO: implement timeaxis orientations 'left' and 'right' + showMinorLabels: true, + showMajorLabels: true, + format: null, + timeAxis: null + }; + this.options = util.extend({}, this.defaultOptions); + + this.body = body; + + // create the HTML DOM + this._create(); + + this.setOptions(options); + } + + TimeAxis.prototype = new Component(); + + /** + * Set options for the TimeAxis. + * Parameters will be merged in current options. + * @param {Object} options Available options: + * {string} [orientation] + * {boolean} [showMinorLabels] + * {boolean} [showMajorLabels] + */ + TimeAxis.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend([ + 'orientation', + 'showMinorLabels', + 'showMajorLabels', + 'hiddenDates', + 'format', + 'timeAxis' + ], this.options, options); + + // apply locale to moment.js + // TODO: not so nice, this is applied globally to moment.js + if ('locale' in options) { + if (typeof moment.locale === 'function') { + // moment.js 2.8.1+ + moment.locale(options.locale); + } + else { + moment.lang(options.locale); + } + } + } + }; + + /** + * Create the HTML DOM for the TimeAxis + */ + TimeAxis.prototype._create = function() { + this.dom.foreground = document.createElement('div'); + this.dom.background = document.createElement('div'); + + this.dom.foreground.className = 'timeaxis foreground'; + this.dom.background.className = 'timeaxis background'; + }; + + /** + * Destroy the TimeAxis + */ + TimeAxis.prototype.destroy = function() { + // remove from DOM + if (this.dom.foreground.parentNode) { + this.dom.foreground.parentNode.removeChild(this.dom.foreground); + } + if (this.dom.background.parentNode) { + this.dom.background.parentNode.removeChild(this.dom.background); + } + + this.body = null; + }; + + /** + * Repaint the component + * @return {boolean} Returns true if the component is resized + */ + TimeAxis.prototype.redraw = function () { + var options = this.options; + var props = this.props; + var foreground = this.dom.foreground; + var background = this.dom.background; + + // determine the correct parent DOM element (depending on option orientation) + var parent = (options.orientation == 'top') ? this.body.dom.top : this.body.dom.bottom; + var parentChanged = (foreground.parentNode !== parent); + + // calculate character width and height + this._calculateCharSize(); + + // TODO: recalculate sizes only needed when parent is resized or options is changed + var orientation = this.options.orientation, + showMinorLabels = this.options.showMinorLabels, + showMajorLabels = this.options.showMajorLabels; + + // determine the width and height of the elemens for the axis + props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; + props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + props.height = props.minorLabelHeight + props.majorLabelHeight; + props.width = foreground.offsetWidth; + + props.minorLineHeight = this.body.domProps.root.height - props.majorLabelHeight - + (options.orientation == 'top' ? this.body.domProps.bottom.height : this.body.domProps.top.height); + props.minorLineWidth = 1; // TODO: really calculate width + props.majorLineHeight = props.minorLineHeight + props.majorLabelHeight; + props.majorLineWidth = 1; // TODO: really calculate width + + // take foreground and background offline while updating (is almost twice as fast) + var foregroundNextSibling = foreground.nextSibling; + var backgroundNextSibling = background.nextSibling; + foreground.parentNode && foreground.parentNode.removeChild(foreground); + background.parentNode && background.parentNode.removeChild(background); + + foreground.style.height = this.props.height + 'px'; + + this._repaintLabels(); + + // put DOM online again (at the same place) + if (foregroundNextSibling) { + parent.insertBefore(foreground, foregroundNextSibling); + } + else { + parent.appendChild(foreground) + } + if (backgroundNextSibling) { + this.body.dom.backgroundVertical.insertBefore(background, backgroundNextSibling); + } + else { + this.body.dom.backgroundVertical.appendChild(background) + } + + return this._isResized() || parentChanged; + }; + + /** + * Repaint major and minor text labels and vertical grid lines + * @private + */ + TimeAxis.prototype._repaintLabels = function () { + var orientation = this.options.orientation; + + // calculate range and step (step such that we have space for 7 characters per label) + var start = util.convert(this.body.range.start, 'Number'); + var end = util.convert(this.body.range.end, 'Number'); + var timeLabelsize = this.body.util.toTime((this.props.minorCharWidth || 10) * 7).valueOf(); + var minimumStep = timeLabelsize - DateUtil.getHiddenDurationBefore(this.body.hiddenDates, this.body.range, timeLabelsize); + minimumStep -= this.body.util.toTime(0).valueOf(); + + var step = new TimeStep(new Date(start), new Date(end), minimumStep, this.body.hiddenDates); + if (this.options.format) { + step.setFormat(this.options.format); + } + if (this.options.timeAxis) { + step.setScale(this.options.timeAxis); + } + this.step = step; + + // Move all DOM elements to a "redundant" list, where they + // can be picked for re-use, and clear the lists with lines and texts. + // At the end of the function _repaintLabels, left over elements will be cleaned up + var dom = this.dom; + dom.redundant.lines = dom.lines; + dom.redundant.majorTexts = dom.majorTexts; + dom.redundant.minorTexts = dom.minorTexts; + dom.lines = []; + dom.majorTexts = []; + dom.minorTexts = []; + + var cur; + var x = 0; + var isMajor; + var xPrev = 0; + var width = 0; + var prevLine; + var xFirstMajorLabel = undefined; + var max = 0; + var className; + + step.first(); + while (step.hasNext() && max < 1000) { + max++; + + cur = step.getCurrent(); + isMajor = step.isMajor(); + className = step.getClassName(); + + xPrev = x; + x = this.body.util.toScreen(cur); + width = x - xPrev; + if (prevLine) { + prevLine.style.width = width + 'px'; + } + + if (this.options.showMinorLabels) { + this._repaintMinorText(x, step.getLabelMinor(), orientation, className); + } + + if (isMajor && this.options.showMajorLabels) { + if (x > 0) { + if (xFirstMajorLabel == undefined) { + xFirstMajorLabel = x; + } + this._repaintMajorText(x, step.getLabelMajor(), orientation, className); + } + prevLine = this._repaintMajorLine(x, orientation, className); + } + else { + prevLine = this._repaintMinorLine(x, orientation, className); + } + + step.next(); + } + + // create a major label on the left when needed + if (this.options.showMajorLabels) { + var leftTime = this.body.util.toTime(0), + leftText = step.getLabelMajor(leftTime), + widthText = leftText.length * (this.props.majorCharWidth || 10) + 10; // upper bound estimation + + if (xFirstMajorLabel == undefined || widthText < xFirstMajorLabel) { + this._repaintMajorText(0, leftText, orientation, className); + } + } + + // Cleanup leftover DOM elements from the redundant list + util.forEach(this.dom.redundant, function (arr) { + while (arr.length) { + var elem = arr.pop(); + if (elem && elem.parentNode) { + elem.parentNode.removeChild(elem); + } + } + }); + }; + + /** + * Create a minor label for the axis at position x + * @param {Number} x + * @param {String} text + * @param {String} orientation "top" or "bottom" (default) + * @param {String} className + * @private + */ + TimeAxis.prototype._repaintMinorText = function (x, text, orientation, className) { + // reuse redundant label + var label = this.dom.redundant.minorTexts.shift(); + + if (!label) { + // create new label + var content = document.createTextNode(''); + label = document.createElement('div'); + label.appendChild(content); + this.dom.foreground.appendChild(label); + } + this.dom.minorTexts.push(label); + + label.childNodes[0].nodeValue = text; + + label.style.top = (orientation == 'top') ? (this.props.majorLabelHeight + 'px') : '0'; + label.style.left = x + 'px'; + label.className = 'text minor ' + className; + //label.title = title; // TODO: this is a heavy operation + }; + + /** + * Create a Major label for the axis at position x + * @param {Number} x + * @param {String} text + * @param {String} orientation "top" or "bottom" (default) + * @param {String} className + * @private + */ + TimeAxis.prototype._repaintMajorText = function (x, text, orientation, className) { + // reuse redundant label + var label = this.dom.redundant.majorTexts.shift(); + + if (!label) { + // create label + var content = document.createTextNode(text); + label = document.createElement('div'); + label.appendChild(content); + this.dom.foreground.appendChild(label); + } + this.dom.majorTexts.push(label); + + label.childNodes[0].nodeValue = text; + label.className = 'text major ' + className; + //label.title = title; // TODO: this is a heavy operation + + label.style.top = (orientation == 'top') ? '0' : (this.props.minorLabelHeight + 'px'); + label.style.left = x + 'px'; + }; + + /** + * Create a minor line for the axis at position x + * @param {Number} x + * @param {String} orientation "top" or "bottom" (default) + * @param {String} className + * @return {Element} Returns the created line + * @private + */ + TimeAxis.prototype._repaintMinorLine = function (x, orientation, className) { + // reuse redundant line + var line = this.dom.redundant.lines.shift(); + if (!line) { + // create vertical line + line = document.createElement('div'); + this.dom.background.appendChild(line); + } + this.dom.lines.push(line); + + var props = this.props; + if (orientation == 'top') { + line.style.top = props.majorLabelHeight + 'px'; + } + else { + line.style.top = this.body.domProps.top.height + 'px'; + } + line.style.height = props.minorLineHeight + 'px'; + line.style.left = (x - props.minorLineWidth / 2) + 'px'; + + line.className = 'grid vertical minor ' + className; + + return line; + }; + + /** + * Create a Major line for the axis at position x + * @param {Number} x + * @param {String} orientation "top" or "bottom" (default) + * @param {String} className + * @return {Element} Returns the created line + * @private + */ + TimeAxis.prototype._repaintMajorLine = function (x, orientation, className) { + // reuse redundant line + var line = this.dom.redundant.lines.shift(); + if (!line) { + // create vertical line + line = document.createElement('div'); + this.dom.background.appendChild(line); + } + this.dom.lines.push(line); + + var props = this.props; + if (orientation == 'top') { + line.style.top = '0'; + } + else { + line.style.top = this.body.domProps.top.height + 'px'; + } + line.style.left = (x - props.majorLineWidth / 2) + 'px'; + line.style.height = props.majorLineHeight + 'px'; + + line.className = 'grid vertical major ' + className; + + return line; + }; + + /** + * Determine the size of text on the axis (both major and minor axis). + * The size is calculated only once and then cached in this.props. + * @private + */ + TimeAxis.prototype._calculateCharSize = function () { + // Note: We calculate char size with every redraw. Size may change, for + // example when any of the timelines parents had display:none for example. + + // determine the char width and height on the minor axis + if (!this.dom.measureCharMinor) { + this.dom.measureCharMinor = document.createElement('DIV'); + this.dom.measureCharMinor.className = 'text minor measure'; + this.dom.measureCharMinor.style.position = 'absolute'; + + this.dom.measureCharMinor.appendChild(document.createTextNode('0')); + this.dom.foreground.appendChild(this.dom.measureCharMinor); + } + this.props.minorCharHeight = this.dom.measureCharMinor.clientHeight; + this.props.minorCharWidth = this.dom.measureCharMinor.clientWidth; + + // determine the char width and height on the major axis + if (!this.dom.measureCharMajor) { + this.dom.measureCharMajor = document.createElement('DIV'); + this.dom.measureCharMajor.className = 'text major measure'; + this.dom.measureCharMajor.style.position = 'absolute'; + + this.dom.measureCharMajor.appendChild(document.createTextNode('0')); + this.dom.foreground.appendChild(this.dom.measureCharMajor); + } + this.props.majorCharHeight = this.dom.measureCharMajor.clientHeight; + this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth; + }; + + module.exports = TimeAxis; + + +/***/ }, +/* 36 */ +/***/ function(module, exports, __webpack_require__) { + + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); + var keycharm = __webpack_require__(57); + var util = __webpack_require__(1); + var hammerUtil = __webpack_require__(47); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var dotparser = __webpack_require__(42); + var gephiParser = __webpack_require__(43); + var Groups = __webpack_require__(38); + var Images = __webpack_require__(39); + var Node = __webpack_require__(40); + var Edge = __webpack_require__(37); + var Popup = __webpack_require__(41); + var MixinLoader = __webpack_require__(52); + var Activator = __webpack_require__(53); + var locales = __webpack_require__(54); + + // Load custom shapes into CanvasRenderingContext2D + __webpack_require__(55); + + /** + * @constructor Network + * Create a network visualization, displaying nodes and edges. + * + * @param {Element} container The DOM element in which the Network will + * be created. Normally a div element. + * @param {Object} data An object containing parameters + * {Array} nodes + * {Array} edges + * @param {Object} options Options + */ + function Network (container, data, options) { + if (!(this instanceof Network)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this._determineBrowserMethod(); + this._initializeMixinLoaders(); + + // create variables and set default values + this.containerElement = container; + + // render and calculation settings + this.renderRefreshRate = 60; // hz (fps) + this.renderTimestep = 1000 / this.renderRefreshRate; // ms -- saves calculation later on + this.renderTime = 0; // measured time it takes to render a frame + this.physicsTime = 0; // measured time it takes to render a frame + this.runDoubleSpeed = false; + this.physicsDiscreteStepsize = 0.50; // discrete stepsize of the simulation + + this.initializing = true; + + this.triggerFunctions = {add:null,edit:null,editEdge:null,connect:null,del:null}; + + var customScalingFunction = function (min,max,total,value) { + if (max == min) { + return 0.5; + } + else { + var scale = 1 / (max - min); + return Math.max(0,(value - min)*scale); + } + }; + // set constant values + this.defaultOptions = { + nodes: { + customScalingFunction: customScalingFunction, + mass: 1, + radiusMin: 10, + radiusMax: 30, + radius: 10, + shape: 'ellipse', + image: undefined, + widthMin: 16, // px + widthMax: 64, // px + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + fontFill: undefined, + fontStrokeWidth: 0, // px + fontStrokeColor: '#ffffff', + fontDrawThreshold: 3, + scaleFontWithValue: false, + fontSizeMin: 14, + fontSizeMax: 30, + fontSizeMaxVisible: 30, + level: -1, + color: { + border: '#2B7CE9', + background: '#97C2FC', + highlight: { + border: '#2B7CE9', + background: '#D2E5FF' + }, + hover: { + border: '#2B7CE9', + background: '#D2E5FF' + } + }, + group: undefined, + borderWidth: 1, + borderWidthSelected: undefined + }, + edges: { + customScalingFunction: customScalingFunction, + widthMin: 1, // + widthMax: 15,// + width: 1, + widthSelectionMultiplier: 2, + hoverWidth: 1.5, + style: 'line', + color: { + color:'#848484', + highlight:'#848484', + hover: '#848484' + }, + opacity:1.0, + fontColor: '#343434', + fontSize: 14, // px + fontFace: 'arial', + fontFill: 'white', + fontStrokeWidth: 0, // px + fontStrokeColor: 'white', + labelAlignment:'horizontal', + arrowScaleFactor: 1, + dash: { + length: 10, + gap: 5, + altLength: undefined + }, + inheritColor: "from", // to, from, false, true (== from) + useGradients: false // release in 4.0 + }, + configurePhysics:false, + physics: { + barnesHut: { + enabled: true, + thetaInverted: 1 / 0.5, // inverted to save time during calculation + gravitationalConstant: -2000, + centralGravity: 0.3, + springLength: 95, + springConstant: 0.04, + damping: 0.09 + }, + repulsion: { + centralGravity: 0.0, + springLength: 200, + springConstant: 0.05, + nodeDistance: 100, + damping: 0.09 + }, + hierarchicalRepulsion: { + enabled: false, + centralGravity: 0.0, + springLength: 100, + springConstant: 0.01, + nodeDistance: 150, + damping: 0.09 + }, + damping: null, + centralGravity: null, + springLength: null, + springConstant: null + }, + clustering: { // Per Node in Cluster = PNiC + enabled: false, // (Boolean) | global on/off switch for clustering. + initialMaxNodes: 100, // (# nodes) | if the initial amount of nodes is larger than this, we cluster until the total number is less than this threshold. + clusterThreshold:500, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than this. If it is, cluster until reduced to reduceToNodes + reduceToNodes:300, // (# nodes) | during calculate forces, we check if the total number of nodes is larger than clusterThreshold. If it is, cluster until reduced to this + chainThreshold: 0.4, // (% of all drawn nodes)| maximum percentage of allowed chainnodes (long strings of connected nodes) within all nodes. (lower means less chains). + clusterEdgeThreshold: 20, // (px) | edge length threshold. if smaller, this node is clustered. + sectorThreshold: 100, // (# nodes in cluster) | cluster size threshold. If larger, expanding in own sector. + screenSizeThreshold: 0.2, // (% of canvas) | relative size threshold. If the width or height of a clusternode takes up this much of the screen, decluster node. + fontSizeMultiplier: 4.0, // (px PNiC) | how much the cluster font size grows per node in cluster (in px). + maxFontSize: 1000, + forceAmplification: 0.1, // (multiplier PNiC) | factor of increase fo the repulsion force of a cluster (per node in cluster). + distanceAmplification: 0.1, // (multiplier PNiC) | factor how much the repulsion distance of a cluster increases (per node in cluster). + edgeGrowth: 20, // (px PNiC) | amount of clusterSize connected to the edge is multiplied with this and added to edgeLength. + nodeScaling: {width: 1, // (px PNiC) | growth of the width per node in cluster. + height: 1, // (px PNiC) | growth of the height per node in cluster. + radius: 1}, // (px PNiC) | growth of the radius per node in cluster. + maxNodeSizeIncrements: 600, // (# increments) | max growth of the width per node in cluster. + activeAreaBoxSize: 80, // (px) | box area around the curser where clusters are popped open. + clusterLevelDifference: 2, // used for normalization of the cluster levels + clusterByZoom: true // enable clustering through zooming in and out + }, + navigation: { + enabled: false + }, + keyboard: { + enabled: false, + speed: {x: 10, y: 10, zoom: 0.02}, + bindToWindow: true + }, + dataManipulation: { + enabled: false, + initiallyVisible: false + }, + hierarchicalLayout: { + enabled:false, + levelSeparation: 150, + nodeSpacing: 100, + direction: "UD", // UD, DU, LR, RL + layout: "hubsize" // hubsize, directed + }, + freezeForStabilization: false, + smoothCurves: { + enabled: true, + dynamic: true, + type: "continuous", + roundness: 0.5 + }, + maxVelocity: 50, + minVelocity: 0.1, // px/s + stabilize: true, // stabilize before displaying the network + stabilizationIterations: 1000, // maximum number of iteration to stabilize + zoomExtentOnStabilize: true, + locale: 'en', + locales: locales, + tooltip: { + delay: 300, + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + color: { + border: '#666', + background: '#FFFFC6' + } + }, + dragNetwork: true, + dragNodes: true, + zoomable: true, + hover: false, + hideEdgesOnDrag: false, + hideNodesOnDrag: false, + width : '100%', + height : '100%', + selectable: true, + useDefaultGroups: true + }; + this.constants = util.extend({}, this.defaultOptions); + this.pixelRatio = 1; + + + this.hoverObj = {nodes:{},edges:{}}; + this.controlNodesActive = false; + this.navigationHammers = []; + this.manipulationHammers = []; + + // animation properties + this.animationSpeed = 1/this.renderRefreshRate; + this.animationEasingFunction = "easeInOutQuint"; + this.animating = false; + this.easingTime = 0; + this.sourceScale = 0; + this.targetScale = 0; + this.sourceTranslation = 0; + this.targetTranslation = 0; + this.lockedOnNodeId = null; + this.lockedOnNodeOffset = null; + this.touchTime = 0; + this.redrawRequested = false; + + // Node variables + var network = this; + this.groups = new Groups(); // object with groups + this.images = new Images(); // object with images + this.images.setOnloadCallback(function (status) { + network._requestRedraw(); + }); + + // keyboard navigation variables + this.xIncrement = 0; + this.yIncrement = 0; + this.zoomIncrement = 0; + + // loading all the mixins: + // load the force calculation functions, grouped under the physics system. + this._loadPhysicsSystem(); + // create a frame and canvas + this._create(); + // load the sector system. (mandatory, fully integrated with Network) + this._loadSectorSystem(); + // load the cluster system. (mandatory, even when not using the cluster system, there are function calls to it) + this._loadClusterSystem(); + // load the selection system. (mandatory, required by Network) + this._loadSelectionSystem(); + // load the selection system. (mandatory, required by Network) + this._loadHierarchySystem(); + + + // apply options + this._setTranslation(this.frame.clientWidth / 2, this.frame.clientHeight / 2); + this._setScale(1); + this.setOptions(options); + + // other vars + this.freezeSimulationEnabled = false;// freeze the simulation + this.cachedFunctions = {}; + this.startedStabilization = false; + this.stabilized = false; + this.stabilizationIterations = null; + this.draggingNodes = false; + + // containers for nodes and edges + this.calculationNodes = {}; + this.calculationNodeIndices = []; + this.nodeIndices = []; // array with all the indices of the nodes. Used to speed up forces calculation + this.nodes = {}; // object with Node objects + this.edges = {}; // object with Edge objects + + // position and scale variables and objects + this.canvasTopLeft = {"x": 0,"y": 0}; // coordinates of the top left of the canvas. they will be set during _redraw. + this.canvasBottomRight = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw + this.pointerPosition = {"x": 0,"y": 0}; // coordinates of the bottom right of the canvas. they will be set during _redraw + this.areaCenter = {}; // object with x and y elements used for determining the center of the zoom action + this.scale = 1; // defining the global scale variable in the constructor + this.previousScale = this.scale; // this is used to check if the zoom operation is zooming in or out + + // datasets or dataviews + this.nodesData = null; // A DataSet or DataView + this.edgesData = null; // A DataSet or DataView + + // create event listeners used to subscribe on the DataSets of the nodes and edges + this.nodesListeners = { + 'add': function (event, params) { + network._addNodes(params.items); + network.start(); + }, + 'update': function (event, params) { + network._updateNodes(params.items, params.data); + network.start(); + }, + 'remove': function (event, params) { + network._removeNodes(params.items); + network.start(); + } + }; + this.edgesListeners = { + 'add': function (event, params) { + network._addEdges(params.items); + network.start(); + }, + 'update': function (event, params) { + network._updateEdges(params.items); + network.start(); + }, + 'remove': function (event, params) { + network._removeEdges(params.items); + network.start(); + } + }; + + // properties for the animation + this.moving = true; + this.timer = undefined; // Scheduling function. Is definded in this.start(); + + // load data (the disable start variable will be the same as the enabled clustering) + this.setData(data,this.constants.clustering.enabled || this.constants.hierarchicalLayout.enabled); + + // hierarchical layout + this.initializing = false; + if (this.constants.hierarchicalLayout.enabled == true) { + this._setupHierarchicalLayout(); + } + else { + // zoom so all data will fit on the screen, if clustering is enabled, we do not want start to be called here. + if (this.constants.stabilize == false) { + this.zoomExtent({duration:0}, true, this.constants.clustering.enabled); + } + } + + // if clustering is disabled, the simulation will have started in the setData function + if (this.constants.clustering.enabled) { + this.startWithClustering(); + } + } + + // Extend Network with an Emitter mixin + Emitter(Network.prototype); + + /** + * Determine if the browser requires a setTimeout or a requestAnimationFrame. This was required because + * some implementations (safari and IE9) did not support requestAnimationFrame + * @private + */ + Network.prototype._determineBrowserMethod = function() { + var browserType = navigator.userAgent.toLowerCase(); + this.requiresTimeout = false; + if (browserType.indexOf('msie 9.0') != -1) { // IE 9 + this.requiresTimeout = true; + } + else if (browserType.indexOf('safari') != -1) { // safari + if (browserType.indexOf('chrome') <= -1) { + this.requiresTimeout = true; + } + } + } + + + /** + * Get the script path where the vis.js library is located + * + * @returns {string | null} path Path or null when not found. Path does not + * end with a slash. + * @private + */ + Network.prototype._getScriptPath = function() { + var scripts = document.getElementsByTagName( 'script' ); + + // find script named vis.js or vis.min.js + for (var i = 0; i < scripts.length; i++) { + var src = scripts[i].src; + var match = src && /\/?vis(.min)?\.js$/.exec(src); + if (match) { + // return path without the script name + return src.substring(0, src.length - match[0].length); + } + } + + return null; + }; + + + /** + * Find the center position of the network + * @private + */ + Network.prototype._getRange = function(specificNodes) { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + if (specificNodes.length > 0) { + for (var i = 0; i < specificNodes.length; i++) { + node = this.nodes[specificNodes[i]]; + if (minX > (node.boundingBox.left)) { + minX = node.boundingBox.left; + } + if (maxX < (node.boundingBox.right)) { + maxX = node.boundingBox.right; + } + if (minY > (node.boundingBox.bottom)) { + minY = node.boundingBox.top; + } // top is negative, bottom is positive + if (maxY < (node.boundingBox.top)) { + maxY = node.boundingBox.bottom; + } // top is negative, bottom is positive + } + } + else { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (minX > (node.boundingBox.left)) { + minX = node.boundingBox.left; + } + if (maxX < (node.boundingBox.right)) { + maxX = node.boundingBox.right; + } + if (minY > (node.boundingBox.bottom)) { + minY = node.boundingBox.top; + } // top is negative, bottom is positive + if (maxY < (node.boundingBox.top)) { + maxY = node.boundingBox.bottom; + } // top is negative, bottom is positive + } + } + } + + if (minX == 1e9 && maxX == -1e9 && minY == 1e9 && maxY == -1e9) { + minY = 0, maxY = 0, minX = 0, maxX = 0; + } + return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + }; + + + /** + * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; + * @returns {{x: number, y: number}} + * @private + */ + Network.prototype._findCenter = function(range) { + return {x: (0.5 * (range.maxX + range.minX)), + y: (0.5 * (range.maxY + range.minY))}; + }; + + + /** + * This function zooms out to fit all data on screen based on amount of nodes + * + * @param {Boolean} [initialZoom] | zoom based on fitted formula or range, true = fitted, default = false; + * @param {Boolean} [disableStart] | If true, start is not called. + */ + Network.prototype.zoomExtent = function(options, initialZoom, disableStart) { + this._redraw(true); + + if (initialZoom === undefined) {initialZoom = false;} + if (disableStart === undefined) {disableStart = false;} + if (options === undefined) {options = {nodes:[]};} + if (options.nodes === undefined) { + options.nodes = []; + } + + var range; + var zoomLevel; + + if (initialZoom == true) { + // check if more than half of the nodes have a predefined position. If so, we use the range, not the approximation. + var positionDefined = 0; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.predefinedPosition == true) { + positionDefined += 1; + } + } + } + if (positionDefined > 0.5 * this.nodeIndices.length) { + this.zoomExtent(options,false,disableStart); + return; + } + + range = this._getRange(options.nodes); + + var numberOfNodes = this.nodeIndices.length; + if (this.constants.smoothCurves == true) { + if (this.constants.clustering.enabled == true && + numberOfNodes >= this.constants.clustering.initialMaxNodes) { + zoomLevel = 49.07548 / (numberOfNodes + 142.05338) + 9.1444e-04; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + } + else { + zoomLevel = 12.662 / (numberOfNodes + 7.4147) + 0.0964822; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + } + } + else { + if (this.constants.clustering.enabled == true && + numberOfNodes >= this.constants.clustering.initialMaxNodes) { + zoomLevel = 77.5271985 / (numberOfNodes + 187.266146) + 4.76710517e-05; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + } + else { + zoomLevel = 30.5062972 / (numberOfNodes + 19.93597763) + 0.08413486; // this is obtained from fitting a dataset from 5 points with scale levels that looked good. + } + } + + // correct for larger canvasses. + var factor = Math.min(this.frame.canvas.clientWidth / 600, this.frame.canvas.clientHeight / 600); + zoomLevel *= factor; + } + else { + range = this._getRange(options.nodes); + var xDistance = Math.abs(range.maxX - range.minX) * 1.1; + var yDistance = Math.abs(range.maxY - range.minY) * 1.1; + + var xZoomLevel = this.frame.canvas.clientWidth / xDistance; + var yZoomLevel = this.frame.canvas.clientHeight / yDistance; + zoomLevel = (xZoomLevel <= yZoomLevel) ? xZoomLevel : yZoomLevel; + } + + if (zoomLevel > 1.0) { + zoomLevel = 1.0; + } + + + var center = this._findCenter(range); + if (disableStart == false) { + var options = {position: center, scale: zoomLevel, animation: options}; + this.moveTo(options); + this.moving = true; + this.start(); + } + else { + center.x *= zoomLevel; + center.y *= zoomLevel; + center.x -= 0.5 * this.frame.canvas.clientWidth; + center.y -= 0.5 * this.frame.canvas.clientHeight; + this._setScale(zoomLevel); + this._setTranslation(-center.x,-center.y); + } + }; + + + /** + * Update the this.nodeIndices with the most recent node index list + * @private + */ + Network.prototype._updateNodeIndexList = function() { + this._clearNodeIndexList(); + for (var idx in this.nodes) { + if (this.nodes.hasOwnProperty(idx)) { + this.nodeIndices.push(idx); + } + } + }; + + + /** + * Set nodes and edges, and optionally options as well. + * + * @param {Object} data Object containing parameters: + * {Array | DataSet | DataView} [nodes] Array with nodes + * {Array | DataSet | DataView} [edges] Array with edges + * {String} [dot] String containing data in DOT format + * {String} [gephi] String containing data in gephi JSON format + * {Options} [options] Object with options + * @param {Boolean} [disableStart] | optional: disable the calling of the start function. + */ + Network.prototype.setData = function(data, disableStart) { + if (disableStart === undefined) { + disableStart = false; + } + + // unselect all to ensure no selections from old data are carried over. + this._unselectAll(true); + + // we set initializing to true to ensure that the hierarchical layout is not performed until both nodes and edges are added. + this.initializing = true; + + if (data && data.dot && (data.nodes || data.edges)) { + throw new SyntaxError('Data must contain either parameter "dot" or ' + + ' parameter pair "nodes" and "edges", but not both.'); + } + + // clean up in case there is anyone in an active mode of the manipulation. This is the same option as bound to the escape button. + if (this.constants.dataManipulation.enabled == true) { + this._createManipulatorBar(); + } + + // set options + this.setOptions(data && data.options); + // set all data + if (data && data.dot) { + // parse DOT file + if(data && data.dot) { + var dotData = dotparser.DOTToGraph(data.dot); + this.setData(dotData); + return; + } + } + else if (data && data.gephi) { + // parse DOT file + if(data && data.gephi) { + var gephiData = gephiParser.parseGephi(data.gephi); + this.setData(gephiData); + return; + } + } + else { + this._setNodes(data && data.nodes); + this._setEdges(data && data.edges); + } + this._putDataInSector(); + if (disableStart == false) { + if (this.constants.hierarchicalLayout.enabled == true) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + else { + // find a stable position or start animating to a stable position + if (this.constants.stabilize == true) { + this._stabilize(); + } + } + this.start(); + } + this.initializing = false; + }; + + /** + * Set options + * @param {Object} options + */ + Network.prototype.setOptions = function (options) { + if (options) { + var prop; + var fields = ['nodes','edges','smoothCurves','hierarchicalLayout','clustering','navigation', + 'keyboard','dataManipulation','onAdd','onEdit','onEditEdge','onConnect','onDelete','clickToUse' + ]; + // extend all but the values in fields + util.selectiveNotDeepExtend(fields,this.constants, options); + util.selectiveNotDeepExtend(['color'],this.constants.nodes, options.nodes); + util.selectiveNotDeepExtend(['color','length'],this.constants.edges, options.edges); + + this.groups.useDefaultGroups = this.constants.useDefaultGroups; + if (options.physics) { + util.mergeOptions(this.constants.physics, options.physics,'barnesHut'); + util.mergeOptions(this.constants.physics, options.physics,'repulsion'); + + if (options.physics.hierarchicalRepulsion) { + this.constants.hierarchicalLayout.enabled = true; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this.constants.physics.barnesHut.enabled = false; + for (prop in options.physics.hierarchicalRepulsion) { + if (options.physics.hierarchicalRepulsion.hasOwnProperty(prop)) { + this.constants.physics.hierarchicalRepulsion[prop] = options.physics.hierarchicalRepulsion[prop]; + } + } + } + } + + if (options.onAdd) {this.triggerFunctions.add = options.onAdd;} + if (options.onEdit) {this.triggerFunctions.edit = options.onEdit;} + if (options.onEditEdge) {this.triggerFunctions.editEdge = options.onEditEdge;} + if (options.onConnect) {this.triggerFunctions.connect = options.onConnect;} + if (options.onDelete) {this.triggerFunctions.del = options.onDelete;} + + util.mergeOptions(this.constants, options,'smoothCurves'); + util.mergeOptions(this.constants, options,'hierarchicalLayout'); + util.mergeOptions(this.constants, options,'clustering'); + util.mergeOptions(this.constants, options,'navigation'); + util.mergeOptions(this.constants, options,'keyboard'); + util.mergeOptions(this.constants, options,'dataManipulation'); + + + if (options.dataManipulation) { + this.editMode = this.constants.dataManipulation.initiallyVisible; + } + + + // TODO: work out these options and document them + if (options.edges) { + if (options.edges.color !== undefined) { + if (util.isString(options.edges.color)) { + this.constants.edges.color = {}; + this.constants.edges.color.color = options.edges.color; + this.constants.edges.color.highlight = options.edges.color; + this.constants.edges.color.hover = options.edges.color; + } + else { + if (options.edges.color.color !== undefined) {this.constants.edges.color.color = options.edges.color.color;} + if (options.edges.color.highlight !== undefined) {this.constants.edges.color.highlight = options.edges.color.highlight;} + if (options.edges.color.hover !== undefined) {this.constants.edges.color.hover = options.edges.color.hover;} + } + this.constants.edges.inheritColor = false; + } + + if (!options.edges.fontColor) { + if (options.edges.color !== undefined) { + if (util.isString(options.edges.color)) {this.constants.edges.fontColor = options.edges.color;} + else if (options.edges.color.color !== undefined) {this.constants.edges.fontColor = options.edges.color.color;} + } + } + } + + if (options.nodes) { + if (options.nodes.color) { + var newColorObj = util.parseColor(options.nodes.color); + this.constants.nodes.color.background = newColorObj.background; + this.constants.nodes.color.border = newColorObj.border; + this.constants.nodes.color.highlight.background = newColorObj.highlight.background; + this.constants.nodes.color.highlight.border = newColorObj.highlight.border; + this.constants.nodes.color.hover.background = newColorObj.hover.background; + this.constants.nodes.color.hover.border = newColorObj.hover.border; + } + } + if (options.groups) { + for (var groupname in options.groups) { + if (options.groups.hasOwnProperty(groupname)) { + var group = options.groups[groupname]; + this.groups.add(groupname, group); + } + } + } + + if (options.tooltip) { + for (prop in options.tooltip) { + if (options.tooltip.hasOwnProperty(prop)) { + this.constants.tooltip[prop] = options.tooltip[prop]; + } + } + if (options.tooltip.color) { + this.constants.tooltip.color = util.parseColor(options.tooltip.color); + } + } + + if ('clickToUse' in options) { + if (options.clickToUse) { + if (!this.activator) { + this.activator = new Activator(this.frame); + this.activator.on('change', this._createKeyBinds.bind(this)); + } + } + else { + if (this.activator) { + this.activator.destroy(); + delete this.activator; + } + } + } + + if (options.labels) { + throw new Error('Option "labels" is deprecated. Use options "locale" and "locales" instead.'); + } + + + // (Re)loading the mixins that can be enabled or disabled in the options. + // load the force calculation functions, grouped under the physics system. + this._loadPhysicsSystem(); + // load the navigation system. + this._loadNavigationControls(); + // load the data manipulation system + this._loadManipulationSystem(); + // configure the smooth curves + this._configureSmoothCurves(); + + // bind hammer + this._bindHammer(); + + // bind keys. If disabled, this will not do anything; + this._createKeyBinds(); + + this._markAllEdgesAsDirty(); + this.setSize(this.constants.width, this.constants.height); + this.moving = true; + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this.start(); + } + }; + + + + /** + * Create the main frame for the Network. + * This function is executed once when a Network object is created. The frame + * contains a canvas, and this canvas contains all objects like the axis and + * nodes. + * @private + */ + Network.prototype._create = function () { + // remove all elements from the container element. + while (this.containerElement.hasChildNodes()) { + this.containerElement.removeChild(this.containerElement.firstChild); + } + + this.frame = document.createElement('div'); + this.frame.className = 'vis network-frame'; + this.frame.style.position = 'relative'; + this.frame.style.overflow = 'hidden'; + this.frame.tabIndex = 900; + + + ////////////////////////////////////////////////////////////////// + + this.frame.canvas = document.createElement("canvas"); + this.frame.canvas.style.position = 'relative'; + this.frame.appendChild(this.frame.canvas); + + if (!this.frame.canvas.getContext) { + var noCanvas = document.createElement( 'DIV' ); + noCanvas.style.color = 'red'; + noCanvas.style.fontWeight = 'bold' ; + noCanvas.style.padding = '10px'; + noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; + this.frame.canvas.appendChild(noCanvas); + } + else { + var ctx = this.frame.canvas.getContext("2d"); + this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1); + + //this.pixelRatio = Math.max(1,this.pixelRatio); // this is to account for browser zooming out. The pixel ratio is ment to switch between 1 and 2 for HD screens. + this.frame.canvas.getContext("2d").setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); + } + + this._bindHammer(); + }; + + + /** + * This function binds hammer, it can be repeated over and over due to the uniqueness check. + * @private + */ + Network.prototype._bindHammer = function() { + var me = this; + if (this.hammer !== undefined) { + this.hammer.dispose(); + } + this.drag = {}; + this.pinch = {}; + this.hammer = Hammer(this.frame.canvas, { + prevent_default: true + }); + this.hammer.on('tap', me._onTap.bind(me) ); + this.hammer.on('doubletap', me._onDoubleTap.bind(me) ); + this.hammer.on('hold', me._onHold.bind(me) ); + this.hammer.on('touch', me._onTouch.bind(me) ); + this.hammer.on('dragstart', me._onDragStart.bind(me) ); + this.hammer.on('drag', me._onDrag.bind(me) ); + this.hammer.on('dragend', me._onDragEnd.bind(me) ); + + if (this.constants.zoomable == true) { + this.hammer.on('mousewheel', me._onMouseWheel.bind(me)); + this.hammer.on('DOMMouseScroll', me._onMouseWheel.bind(me)); // for FF + this.hammer.on('pinch', me._onPinch.bind(me) ); + } + + this.hammer.on('mousemove', me._onMouseMoveTitle.bind(me) ); + + this.hammerFrame = Hammer(this.frame, { + prevent_default: true + }); + this.hammerFrame.on('release', me._onRelease.bind(me) ); + + // add the frame to the container element + this.containerElement.appendChild(this.frame); + } + + /** + * Binding the keys for keyboard navigation. These functions are defined in the NavigationMixin + * @private + */ + Network.prototype._createKeyBinds = function() { + var me = this; + if (this.keycharm !== undefined) { + this.keycharm.destroy(); + } + + if (this.constants.keyboard.bindToWindow == true) { + this.keycharm = keycharm({container: window, preventDefault: false}); + } + else { + this.keycharm = keycharm({container: this.frame, preventDefault: false}); + } + + this.keycharm.reset(); + + if (this.constants.keyboard.enabled && this.isActive()) { + this.keycharm.bind("up", this._moveUp.bind(me) , "keydown"); + this.keycharm.bind("up", this._yStopMoving.bind(me), "keyup"); + this.keycharm.bind("down", this._moveDown.bind(me) , "keydown"); + this.keycharm.bind("down", this._yStopMoving.bind(me), "keyup"); + this.keycharm.bind("left", this._moveLeft.bind(me) , "keydown"); + this.keycharm.bind("left", this._xStopMoving.bind(me), "keyup"); + this.keycharm.bind("right",this._moveRight.bind(me), "keydown"); + this.keycharm.bind("right",this._xStopMoving.bind(me), "keyup"); + this.keycharm.bind("=", this._zoomIn.bind(me), "keydown"); + this.keycharm.bind("=", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("num+", this._zoomIn.bind(me), "keydown"); + this.keycharm.bind("num+", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("num-", this._zoomOut.bind(me), "keydown"); + this.keycharm.bind("num-", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("-", this._zoomOut.bind(me), "keydown"); + this.keycharm.bind("-", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("[", this._zoomIn.bind(me), "keydown"); + this.keycharm.bind("[", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("]", this._zoomOut.bind(me), "keydown"); + this.keycharm.bind("]", this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("pageup",this._zoomIn.bind(me), "keydown"); + this.keycharm.bind("pageup",this._stopZoom.bind(me), "keyup"); + this.keycharm.bind("pagedown",this._zoomOut.bind(me),"keydown"); + this.keycharm.bind("pagedown",this._stopZoom.bind(me), "keyup"); + } + + if (this.constants.dataManipulation.enabled == true) { + this.keycharm.bind("esc",this._createManipulatorBar.bind(me)); + this.keycharm.bind("delete",this._deleteSelected.bind(me)); + } + }; + + /** + * Cleans up all bindings of the network, removing it fully from the memory IF the variable is set to null after calling this function. + * var network = new vis.Network(..); + * network.destroy(); + * network = null; + */ + Network.prototype.destroy = function() { + this.start = function () {}; + this.redraw = function () {}; + this.timer = false; + + // cleanup physicsConfiguration if it exists + this._cleanupPhysicsConfiguration(); + + // remove keybindings + this.keycharm.reset(); + + // clear hammer bindings + this.hammer.dispose(); + + // clear events + this.off(); + + this._recursiveDOMDelete(this.containerElement); + } + + Network.prototype._recursiveDOMDelete = function(DOMobject) { + while (DOMobject.hasChildNodes() == true) { + this._recursiveDOMDelete(DOMobject.firstChild); + DOMobject.removeChild(DOMobject.firstChild); + } + } + + /** + * Get the pointer location from a touch location + * @param {{pageX: Number, pageY: Number}} touch + * @return {{x: Number, y: Number}} pointer + * @private + */ + Network.prototype._getPointer = function (touch) { + return { + x: touch.pageX - util.getAbsoluteLeft(this.frame.canvas), + y: touch.pageY - util.getAbsoluteTop(this.frame.canvas) + }; + }; + + /** + * On start of a touch gesture, store the pointer + * @param event + * @private + */ + Network.prototype._onTouch = function (event) { + if (new Date().valueOf() - this.touchTime > 100) { + this.drag.pointer = this._getPointer(event.gesture.center); + this.drag.pinched = false; + this.pinch.scale = this._getScale(); + + // to avoid double fireing of this event because we have two hammer instances. (on canvas and on frame) + this.touchTime = new Date().valueOf(); + + this._handleTouch(this.drag.pointer); + } + }; + + /** + * handle drag start event + * @private + */ + Network.prototype._onDragStart = function (event) { + this._handleDragStart(event); + }; + + + /** + * This function is called by _onDragStart. + * It is separated out because we can then overload it for the datamanipulation system. + * + * @private + */ + Network.prototype._handleDragStart = function(event) { + // in case the touch event was triggered on an external div, do the initial touch now. + if (this.drag.pointer === undefined) { + this._onTouch(event); + } + + var node = this._getNodeAt(this.drag.pointer); + // note: drag.pointer is set in _onTouch to get the initial touch location + + this.drag.dragging = true; + this.drag.selection = []; + this.drag.translation = this._getTranslation(); + this.drag.nodeId = null; + this.draggingNodes = false; + + if (node != null && this.constants.dragNodes == true) { + this.draggingNodes = true; + this.drag.nodeId = node.id; + // select the clicked node if not yet selected + if (!node.isSelected()) { + this._selectObject(node,false); + } + + this.emit("dragStart",{nodeIds:this.getSelection().nodes}); + + // create an array with the selected nodes and their original location and status + for (var objectId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(objectId)) { + var object = this.selectionObj.nodes[objectId]; + var s = { + id: object.id, + node: object, + + // store original x, y, xFixed and yFixed, make the node temporarily Fixed + x: object.x, + y: object.y, + xFixed: object.xFixed, + yFixed: object.yFixed + }; + + object.xFixed = true; + object.yFixed = true; + + this.drag.selection.push(s); + } + } + } + }; + + + /** + * handle drag event + * @private + */ + Network.prototype._onDrag = function (event) { + this._handleOnDrag(event) + }; + + + /** + * This function is called by _onDrag. + * It is separated out because we can then overload it for the datamanipulation system. + * + * @private + */ + Network.prototype._handleOnDrag = function(event) { + if (this.drag.pinched) { + return; + } + + // remove the focus on node if it is focussed on by the focusOnNode + this.releaseNode(); + + var pointer = this._getPointer(event.gesture.center); + var me = this; + var drag = this.drag; + var selection = drag.selection; + if (selection && selection.length && this.constants.dragNodes == true) { + // calculate delta's and new location + var deltaX = pointer.x - drag.pointer.x; + var deltaY = pointer.y - drag.pointer.y; + + // update position of all selected nodes + selection.forEach(function (s) { + var node = s.node; + + if (!s.xFixed) { + node.x = me._XconvertDOMtoCanvas(me._XconvertCanvasToDOM(s.x) + deltaX); + } + + if (!s.yFixed) { + node.y = me._YconvertDOMtoCanvas(me._YconvertCanvasToDOM(s.y) + deltaY); + } + }); + + + // start _animationStep if not yet running + if (!this.moving) { + this.moving = true; + this.start(); + } + } + else { + // move the network + if (this.constants.dragNetwork == true) { + // if the drag was not started properly because the click started outside the network div, start it now. + if (this.drag.pointer === undefined) { + this._handleDragStart(event); + return; + } + var diffX = pointer.x - this.drag.pointer.x; + var diffY = pointer.y - this.drag.pointer.y; + + this._setTranslation( + this.drag.translation.x + diffX, + this.drag.translation.y + diffY + ); + this._redraw(); + } + } + }; + + /** + * handle drag start event + * @private + */ + Network.prototype._onDragEnd = function (event) { + this._handleDragEnd(event); + }; + + + Network.prototype._handleDragEnd = function(event) { + this.drag.dragging = false; + var selection = this.drag.selection; + if (selection && selection.length) { + selection.forEach(function (s) { + // restore original xFixed and yFixed + s.node.xFixed = s.xFixed; + s.node.yFixed = s.yFixed; + }); + this.moving = true; + this.start(); + } + else { + this._redraw(); + } + if (this.draggingNodes == false) { + this.emit("dragEnd",{nodeIds:[]}); + } + else { + this.emit("dragEnd",{nodeIds:this.getSelection().nodes}); + } + + } + /** + * handle tap/click event: select/unselect a node + * @private + */ + Network.prototype._onTap = function (event) { + var pointer = this._getPointer(event.gesture.center); + this.pointerPosition = pointer; + this._handleTap(pointer); + + }; + + + /** + * handle doubletap event + * @private + */ + Network.prototype._onDoubleTap = function (event) { + var pointer = this._getPointer(event.gesture.center); + this._handleDoubleTap(pointer); + }; + + + /** + * handle long tap event: multi select nodes + * @private + */ + Network.prototype._onHold = function (event) { + var pointer = this._getPointer(event.gesture.center); + this.pointerPosition = pointer; + this._handleOnHold(pointer); + }; + + /** + * handle the release of the screen + * + * @private + */ + Network.prototype._onRelease = function (event) { + var pointer = this._getPointer(event.gesture.center); + this._handleOnRelease(pointer); + }; + + /** + * Handle pinch event + * @param event + * @private + */ + Network.prototype._onPinch = function (event) { + var pointer = this._getPointer(event.gesture.center); + + this.drag.pinched = true; + if (!('scale' in this.pinch)) { + this.pinch.scale = 1; + } + + // TODO: enabled moving while pinching? + var scale = this.pinch.scale * event.gesture.scale; + this._zoom(scale, pointer) + }; + + /** + * Zoom the network in or out + * @param {Number} scale a number around 1, and between 0.01 and 10 + * @param {{x: Number, y: Number}} pointer Position on screen + * @return {Number} appliedScale scale is limited within the boundaries + * @private + */ + Network.prototype._zoom = function(scale, pointer) { + if (this.constants.zoomable == true) { + var scaleOld = this._getScale(); + if (scale < 0.00001) { + scale = 0.00001; + } + if (scale > 10) { + scale = 10; + } + + var preScaleDragPointer = null; + if (this.drag !== undefined) { + if (this.drag.dragging == true) { + preScaleDragPointer = this.DOMtoCanvas(this.drag.pointer); + } + } + // + this.frame.canvas.clientHeight / 2 + var translation = this._getTranslation(); + + var scaleFrac = scale / scaleOld; + var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; + var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; + + this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), + "y" : this._YconvertDOMtoCanvas(pointer.y)}; + + this._setScale(scale); + this._setTranslation(tx, ty); + this.updateClustersDefault(); + + if (preScaleDragPointer != null) { + var postScaleDragPointer = this.canvasToDOM(preScaleDragPointer); + this.drag.pointer.x = postScaleDragPointer.x; + this.drag.pointer.y = postScaleDragPointer.y; + } + + this._redraw(); + + if (scaleOld < scale) { + this.emit("zoom", {direction:"+"}); + } + else { + this.emit("zoom", {direction:"-"}); + } + + return scale; + } + }; + + + /** + * Event handler for mouse wheel event, used to zoom the timeline + * See http://adomas.org/javascript-mouse-wheel/ + * https://github.com/EightMedia/hammer.js/issues/256 + * @param {MouseEvent} event + * @private + */ + Network.prototype._onMouseWheel = function(event) { + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta/120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail/3; + } + + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + + // calculate the new scale + var scale = this._getScale(); + var zoom = delta / 10; + if (delta < 0) { + zoom = zoom / (1 - zoom); + } + scale *= (1 + zoom); + + // calculate the pointer location + var gesture = hammerUtil.fakeGesture(this, event); + var pointer = this._getPointer(gesture.center); + + // apply the new scale + this._zoom(scale, pointer); + } + + // Prevent default actions caused by mouse wheel. + event.preventDefault(); + }; + + + /** + * Mouse move handler for checking whether the title moves over a node with a title. + * @param {Event} event + * @private + */ + Network.prototype._onMouseMoveTitle = function (event) { + var gesture = hammerUtil.fakeGesture(this, event); + var pointer = this._getPointer(gesture.center); + var popupVisible = false; + + // check if the previously selected node is still selected + if (this.popup !== undefined) { + if (this.popup.hidden === false) { + this._checkHidePopup(pointer); + } + + // if the popup was not hidden above + if (this.popup.hidden === false) { + popupVisible = true; + this.popup.setPosition(pointer.x + 3,pointer.y - 5) + this.popup.show(); + } + } + + // if we bind the keyboard to the div, we have to highlight it to use it. This highlights it on mouse over + if (this.constants.keyboard.bindToWindow == false && this.constants.keyboard.enabled == true) { + this.frame.focus(); + } + + // start a timeout that will check if the mouse is positioned above an element + if (popupVisible === false) { + var me = this; + var checkShow = function () { + me._checkShowPopup(pointer); + }; + if (this.popupTimer) { + clearInterval(this.popupTimer); // stop any running calculationTimer + } + if (!this.drag.dragging) { + this.popupTimer = setTimeout(checkShow, this.constants.tooltip.delay); + } + } + + /** + * Adding hover highlights + */ + if (this.constants.hover == true) { + // removing all hover highlights + for (var edgeId in this.hoverObj.edges) { + if (this.hoverObj.edges.hasOwnProperty(edgeId)) { + this.hoverObj.edges[edgeId].hover = false; + delete this.hoverObj.edges[edgeId]; + } + } + + // adding hover highlights + var obj = this._getNodeAt(pointer); + if (obj == null) { + obj = this._getEdgeAt(pointer); + } + if (obj != null) { + this._hoverObject(obj); + } + + // removing all node hover highlights except for the selected one. + for (var nodeId in this.hoverObj.nodes) { + if (this.hoverObj.nodes.hasOwnProperty(nodeId)) { + if (obj instanceof Node && obj.id != nodeId || obj instanceof Edge || obj == null) { + this._blurObject(this.hoverObj.nodes[nodeId]); + delete this.hoverObj.nodes[nodeId]; + } + } + } + this.redraw(); + } + }; + + /** + * Check if there is an element on the given position in the network + * (a node or edge). If so, and if this element has a title, + * show a popup window with its title. + * + * @param {{x:Number, y:Number}} pointer + * @private + */ + Network.prototype._checkShowPopup = function (pointer) { + var obj = { + left: this._XconvertDOMtoCanvas(pointer.x), + top: this._YconvertDOMtoCanvas(pointer.y), + right: this._XconvertDOMtoCanvas(pointer.x), + bottom: this._YconvertDOMtoCanvas(pointer.y) + }; + + var id; + var previousPopupObjId = this.popupObj === undefined ? "" : this.popupObj.id; + var nodeUnderCursor = false; + var popupType = "node"; + + if (this.popupObj == undefined) { + // search the nodes for overlap, select the top one in case of multiple nodes + var nodes = this.nodes; + var overlappingNodes = []; + for (id in nodes) { + if (nodes.hasOwnProperty(id)) { + var node = nodes[id]; + if (node.isOverlappingWith(obj)) { + if (node.getTitle() !== undefined) { + overlappingNodes.push(id); + } + } + } + } + + if (overlappingNodes.length > 0) { + // if there are overlapping nodes, select the last one, this is the + // one which is drawn on top of the others + this.popupObj = this.nodes[overlappingNodes[overlappingNodes.length - 1]]; + // if you hover over a node, the title of the edge is not supposed to be shown. + nodeUnderCursor = true; + } + } + + if (this.popupObj === undefined && nodeUnderCursor == false) { + // search the edges for overlap + var edges = this.edges; + var overlappingEdges = []; + for (id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + if (edge.connected && (edge.getTitle() !== undefined) && + edge.isOverlappingWith(obj)) { + overlappingEdges.push(id); + } + } + } + + if (overlappingEdges.length > 0) { + this.popupObj = this.edges[overlappingEdges[overlappingEdges.length - 1]]; + popupType = "edge"; + } + } + + if (this.popupObj) { + // show popup message window + if (this.popupObj.id != previousPopupObjId) { + if (this.popup === undefined) { + this.popup = new Popup(this.frame, this.constants.tooltip); + } + + this.popup.popupTargetType = popupType; + this.popup.popupTargetId = this.popupObj.id; + + // adjust a small offset such that the mouse cursor is located in the + // bottom left location of the popup, and you can easily move over the + // popup area + this.popup.setPosition(pointer.x + 3, pointer.y - 5); + this.popup.setText(this.popupObj.getTitle()); + this.popup.show(); + } + } + else { + if (this.popup) { + this.popup.hide(); + } + } + }; + + + /** + * Check if the popup must be hidden, which is the case when the mouse is no + * longer hovering on the object + * @param {{x:Number, y:Number}} pointer + * @private + */ + Network.prototype._checkHidePopup = function (pointer) { + var pointerObj = { + left: this._XconvertDOMtoCanvas(pointer.x), + top: this._YconvertDOMtoCanvas(pointer.y), + right: this._XconvertDOMtoCanvas(pointer.x), + bottom: this._YconvertDOMtoCanvas(pointer.y) + }; + + var stillOnObj = false; + if (this.popup.popupTargetType == 'node') { + stillOnObj = this.nodes[this.popup.popupTargetId].isOverlappingWith(pointerObj); + if (stillOnObj === true) { + var overNode = this._getNodeAt(pointer); + stillOnObj = overNode.id == this.popup.popupTargetId; + } + } + else { + if (this._getNodeAt(pointer) === null) { + stillOnObj = this.edges[this.popup.popupTargetId].isOverlappingWith(pointerObj); + } + } + + + if (stillOnObj === false) { + this.popupObj = undefined; + this.popup.hide(); + } + }; + + + /** + * Set a new size for the network + * @param {string} width Width in pixels or percentage (for example '800px' + * or '50%') + * @param {string} height Height in pixels or percentage (for example '400px' + * or '30%') + */ + Network.prototype.setSize = function(width, height) { + var emitEvent = false; + var oldWidth = this.frame.canvas.width; + var oldHeight = this.frame.canvas.height; + if (width != this.constants.width || height != this.constants.height || this.frame.style.width != width || this.frame.style.height != height) { + this.frame.style.width = width; + this.frame.style.height = height; + + this.frame.canvas.style.width = '100%'; + this.frame.canvas.style.height = '100%'; + + this.frame.canvas.width = this.frame.canvas.clientWidth * this.pixelRatio; + this.frame.canvas.height = this.frame.canvas.clientHeight * this.pixelRatio; + + this.constants.width = width; + this.constants.height = height; + + emitEvent = true; + } + else { + // this would adapt the width of the canvas to the width from 100% if and only if + // there is a change. + + if (this.frame.canvas.width != this.frame.canvas.clientWidth * this.pixelRatio) { + this.frame.canvas.width = this.frame.canvas.clientWidth * this.pixelRatio; + emitEvent = true; + } + if (this.frame.canvas.height != this.frame.canvas.clientHeight * this.pixelRatio) { + this.frame.canvas.height = this.frame.canvas.clientHeight * this.pixelRatio; + emitEvent = true; + } + } + + if (emitEvent == true) { + this.emit('resize', {width:this.frame.canvas.width * this.pixelRatio,height:this.frame.canvas.height * this.pixelRatio, oldWidth: oldWidth * this.pixelRatio, oldHeight: oldHeight * this.pixelRatio}); + } + }; + + /** + * Set a data set with nodes for the network + * @param {Array | DataSet | DataView} nodes The data containing the nodes. + * @private + */ + Network.prototype._setNodes = function(nodes) { + var oldNodesData = this.nodesData; + + if (nodes instanceof DataSet || nodes instanceof DataView) { + this.nodesData = nodes; + } + else if (Array.isArray(nodes)) { + this.nodesData = new DataSet(); + this.nodesData.add(nodes); + } + else if (!nodes) { + this.nodesData = new DataSet(); + } + else { + throw new TypeError('Array or DataSet expected'); + } + + if (oldNodesData) { + // unsubscribe from old dataset + util.forEach(this.nodesListeners, function (callback, event) { + oldNodesData.off(event, callback); + }); + } + + // remove drawn nodes + this.nodes = {}; + + if (this.nodesData) { + // subscribe to new dataset + var me = this; + util.forEach(this.nodesListeners, function (callback, event) { + me.nodesData.on(event, callback); + }); + + // draw all new nodes + var ids = this.nodesData.getIds(); + this._addNodes(ids); + } + this._updateSelection(); + }; + + /** + * Add nodes + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._addNodes = function(ids) { + var id; + for (var i = 0, len = ids.length; i < len; i++) { + id = ids[i]; + var data = this.nodesData.get(id); + var node = new Node(data, this.images, this.groups, this.constants); + this.nodes[id] = node; // note: this may replace an existing node + if ((node.xFixed == false || node.yFixed == false) && (node.x === null || node.y === null)) { + var radius = 10 * 0.1*ids.length + 10; + var angle = 2 * Math.PI * Math.random(); + if (node.xFixed == false) {node.x = radius * Math.cos(angle);} + if (node.yFixed == false) {node.y = radius * Math.sin(angle);} + } + this.moving = true; + } + + this._updateNodeIndexList(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateCalculationNodes(); + this._reconnectEdges(); + this._updateValueRange(this.nodes); + this.updateLabels(); + }; + + /** + * Update existing nodes, or create them when not yet existing + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._updateNodes = function(ids,changedData) { + var nodes = this.nodes; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + var node = nodes[id]; + var data = changedData[i]; + if (node) { + // update node + node.setProperties(data, this.constants); + } + else { + // create node + node = new Node(properties, this.images, this.groups, this.constants); + nodes[id] = node; + } + } + this.moving = true; + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateNodeIndexList(); + this._updateValueRange(nodes); + this._markAllEdgesAsDirty(); + }; + + + Network.prototype._markAllEdgesAsDirty = function() { + for (var edgeId in this.edges) { + this.edges[edgeId].colorDirty = true; + } + } + + /** + * Remove existing nodes. If nodes do not exist, the method will just ignore it. + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._removeNodes = function(ids) { + var nodes = this.nodes; + + // remove from selection + for (var i = 0, len = ids.length; i < len; i++) { + if (this.selectionObj.nodes[ids[i]] !== undefined) { + this.nodes[ids[i]].unselect(); + this._removeFromSelection(this.nodes[ids[i]]); + } + } + + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + delete nodes[id]; + } + + + + this._updateNodeIndexList(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateCalculationNodes(); + this._reconnectEdges(); + this._updateSelection(); + this._updateValueRange(nodes); + }; + + /** + * Load edges by reading the data table + * @param {Array | DataSet | DataView} edges The data containing the edges. + * @private + * @private + */ + Network.prototype._setEdges = function(edges) { + var oldEdgesData = this.edgesData; + + if (edges instanceof DataSet || edges instanceof DataView) { + this.edgesData = edges; + } + else if (Array.isArray(edges)) { + this.edgesData = new DataSet(); + this.edgesData.add(edges); + } + else if (!edges) { + this.edgesData = new DataSet(); + } + else { + throw new TypeError('Array or DataSet expected'); + } + + if (oldEdgesData) { + // unsubscribe from old dataset + util.forEach(this.edgesListeners, function (callback, event) { + oldEdgesData.off(event, callback); + }); + } + + // remove drawn edges + this.edges = {}; + + if (this.edgesData) { + // subscribe to new dataset + var me = this; + util.forEach(this.edgesListeners, function (callback, event) { + me.edgesData.on(event, callback); + }); + + // draw all new nodes + var ids = this.edgesData.getIds(); + this._addEdges(ids); + } + + this._reconnectEdges(); + }; + + /** + * Add edges + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._addEdges = function (ids) { + var edges = this.edges, + edgesData = this.edgesData; + + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + + var oldEdge = edges[id]; + if (oldEdge) { + oldEdge.disconnect(); + } + + var data = edgesData.get(id, {"showInternalIds" : true}); + edges[id] = new Edge(data, this, this.constants); + } + this.moving = true; + this._updateValueRange(edges); + this._createBezierNodes(); + this._updateCalculationNodes(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + }; + + /** + * Update existing edges, or create them when not yet existing + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._updateEdges = function (ids) { + var edges = this.edges, + edgesData = this.edgesData; + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + + var data = edgesData.get(id); + var edge = edges[id]; + if (edge) { + // update edge + edge.disconnect(); + edge.setProperties(data, this.constants); + edge.connect(); + } + else { + // create edge + edge = new Edge(data, this, this.constants); + this.edges[id] = edge; + } + } + + this._createBezierNodes(); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this.moving = true; + this._updateValueRange(edges); + }; + + /** + * Remove existing edges. Non existing ids will be ignored + * @param {Number[] | String[]} ids + * @private + */ + Network.prototype._removeEdges = function (ids) { + var edges = this.edges; + + // remove from selection + for (var i = 0, len = ids.length; i < len; i++) { + if (this.selectionObj.edges[ids[i]] !== undefined) { + edges[ids[i]].unselect(); + this._removeFromSelection(edges[ids[i]]); + } + } + + for (var i = 0, len = ids.length; i < len; i++) { + var id = ids[i]; + var edge = edges[id]; + if (edge) { + if (edge.via != null) { + delete this.sectors['support']['nodes'][edge.via.id]; + } + edge.disconnect(); + delete edges[id]; + } + } + + this.moving = true; + this._updateValueRange(edges); + if (this.constants.hierarchicalLayout.enabled == true && this.initializing == false) { + this._resetLevels(); + this._setupHierarchicalLayout(); + } + this._updateCalculationNodes(); + }; + + /** + * Reconnect all edges + * @private + */ + Network.prototype._reconnectEdges = function() { + var id, + nodes = this.nodes, + edges = this.edges; + for (id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].edges = []; + nodes[id].dynamicEdges = []; + } + } + + for (id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + edge.from = null; + edge.to = null; + edge.connect(); + } + } + }; + + /** + * Update the values of all object in the given array according to the current + * value range of the objects in the array. + * @param {Object} obj An object containing a set of Edges or Nodes + * The objects must have a method getValue() and + * setValueRange(min, max). + * @private + */ + Network.prototype._updateValueRange = function(obj) { + var id; + + // determine the range of the objects + var valueMin = undefined; + var valueMax = undefined; + var valueTotal = 0; + for (id in obj) { + if (obj.hasOwnProperty(id)) { + var value = obj[id].getValue(); + if (value !== undefined) { + valueMin = (valueMin === undefined) ? value : Math.min(value, valueMin); + valueMax = (valueMax === undefined) ? value : Math.max(value, valueMax); + valueTotal += value; + } + } + } + + // adjust the range of all objects + if (valueMin !== undefined && valueMax !== undefined) { + for (id in obj) { + if (obj.hasOwnProperty(id)) { + obj[id].setValueRange(valueMin, valueMax, valueTotal); + } + } + } + }; + + /** + * Redraw the network with the current data + * chart will be resized too. + */ + Network.prototype.redraw = function() { + this.setSize(this.constants.width, this.constants.height); + this._redraw(); + }; + + /** + * Redraw the network with the current data + * @param hidden | used to get the first estimate of the node sizes. only the nodes are drawn after which they are quickly drawn over. + * @private + */ + Network.prototype._requestRedraw = function(hidden) { + if (this.redrawRequested !== true) { + this.redrawRequested = true; + if (this.requiresTimeout === true) { + window.setTimeout(this._redraw.bind(this, hidden),0); + } + else { + window.requestAnimationFrame(this._redraw.bind(this, hidden, true)); + } + } + }; + + Network.prototype._redraw = function(hidden, requested) { + if (hidden === undefined) { + hidden = false; + } + this.redrawRequested = false; + var ctx = this.frame.canvas.getContext('2d'); + + ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); + + // clear the canvas + var w = this.frame.canvas.clientWidth; + var h = this.frame.canvas.clientHeight; + ctx.clearRect(0, 0, w, h); + + // set scaling and translation + ctx.save(); + ctx.translate(this.translation.x, this.translation.y); + ctx.scale(this.scale, this.scale); + + this.canvasTopLeft = { + "x": this._XconvertDOMtoCanvas(0), + "y": this._YconvertDOMtoCanvas(0) + }; + this.canvasBottomRight = { + "x": this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth), + "y": this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight) + }; + + if (hidden === false) { + this._doInAllSectors("_drawAllSectorNodes", ctx); + if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideEdgesOnDrag == false) { + this._doInAllSectors("_drawEdges", ctx); + } + } + + if (this.drag.dragging == false || this.drag.dragging === undefined || this.constants.hideNodesOnDrag == false) { + this._doInAllSectors("_drawNodes",ctx,false); + } + + if (hidden === false) { + if (this.controlNodesActive == true) { + this._doInAllSectors("_drawControlNodes", ctx); + } + } + + // this._doInSupportSector("_drawNodes",ctx,true); + // this._drawTree(ctx,"#F00F0F"); + + // restore original scaling and translation + ctx.restore(); + + if (hidden === true) { + ctx.clearRect(0, 0, w, h); + } + } + + /** + * Set the translation of the network + * @param {Number} offsetX Horizontal offset + * @param {Number} offsetY Vertical offset + * @private + */ + Network.prototype._setTranslation = function(offsetX, offsetY) { + if (this.translation === undefined) { + this.translation = { + x: 0, + y: 0 + }; + } + + if (offsetX !== undefined) { + this.translation.x = offsetX; + } + if (offsetY !== undefined) { + this.translation.y = offsetY; + } + + this.emit('viewChanged'); + }; + + /** + * Get the translation of the network + * @return {Object} translation An object with parameters x and y, both a number + * @private + */ + Network.prototype._getTranslation = function() { + return { + x: this.translation.x, + y: this.translation.y + }; + }; + + /** + * Scale the network + * @param {Number} scale Scaling factor 1.0 is unscaled + * @private + */ + Network.prototype._setScale = function(scale) { + this.scale = scale; + }; + + /** + * Get the current scale of the network + * @return {Number} scale Scaling factor 1.0 is unscaled + * @private + */ + Network.prototype._getScale = function() { + return this.scale; + }; + + /** + * Convert the X coordinate in DOM-space (coordinate point in browser relative to the container div) to + * the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) + * @param {number} x + * @returns {number} + * @private + */ + Network.prototype._XconvertDOMtoCanvas = function(x) { + return (x - this.translation.x) / this.scale; + }; + + /** + * Convert the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to + * the X coordinate in DOM-space (coordinate point in browser relative to the container div) + * @param {number} x + * @returns {number} + * @private + */ + Network.prototype._XconvertCanvasToDOM = function(x) { + return x * this.scale + this.translation.x; + }; + + /** + * Convert the Y coordinate in DOM-space (coordinate point in browser relative to the container div) to + * the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) + * @param {number} y + * @returns {number} + * @private + */ + Network.prototype._YconvertDOMtoCanvas = function(y) { + return (y - this.translation.y) / this.scale; + }; + + /** + * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to + * the Y coordinate in DOM-space (coordinate point in browser relative to the container div) + * @param {number} y + * @returns {number} + * @private + */ + Network.prototype._YconvertCanvasToDOM = function(y) { + return y * this.scale + this.translation.y ; + }; + + + /** + * + * @param {object} pos = {x: number, y: number} + * @returns {{x: number, y: number}} + * @constructor + */ + Network.prototype.canvasToDOM = function (pos) { + return {x: this._XconvertCanvasToDOM(pos.x), y: this._YconvertCanvasToDOM(pos.y)}; + }; + + /** + * + * @param {object} pos = {x: number, y: number} + * @returns {{x: number, y: number}} + * @constructor + */ + Network.prototype.DOMtoCanvas = function (pos) { + return {x: this._XconvertDOMtoCanvas(pos.x), y: this._YconvertDOMtoCanvas(pos.y)}; + }; + + /** + * Redraw all nodes + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @param {Boolean} [alwaysShow] + * @private + */ + Network.prototype._drawNodes = function(ctx,alwaysShow) { + if (alwaysShow === undefined) { + alwaysShow = false; + } + + // first draw the unselected nodes + var nodes = this.nodes; + var selected = []; + + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight); + if (nodes[id].isSelected()) { + selected.push(id); + } + else { + if (nodes[id].inArea() || alwaysShow) { + nodes[id].draw(ctx); + } + } + } + } + + // draw the selected nodes on top + for (var s = 0, sMax = selected.length; s < sMax; s++) { + if (nodes[selected[s]].inArea() || alwaysShow) { + nodes[selected[s]].draw(ctx); + } + } + }; + + /** + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Network.prototype._drawEdges = function(ctx) { + var edges = this.edges; + for (var id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + edge.setScale(this.scale); + if (edge.connected) { + edges[id].draw(ctx); + } + } + } + }; + + /** + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Network.prototype._drawControlNodes = function(ctx) { + var edges = this.edges; + for (var id in edges) { + if (edges.hasOwnProperty(id)) { + edges[id]._drawControlNodes(ctx); + } + } + }; + + /** + * Find a stable position for all nodes + * @private + */ + Network.prototype._stabilize = function() { + if (this.constants.freezeForStabilization == true) { + this._freezeDefinedNodes(); + } + + // find stable position + var count = 0; + while (this.moving && count < this.constants.stabilizationIterations) { + this._physicsTick(); + count++; + } + + + if (this.constants.zoomExtentOnStabilize == true) { + this.zoomExtent({duration:0}, false, true); + } + + if (this.constants.freezeForStabilization == true) { + this._restoreFrozenNodes(); + } + + this.emit("stabilizationIterationsDone"); + }; + + /** + * When initializing and stabilizing, we can freeze nodes with a predefined position. This greatly speeds up stabilization + * because only the supportnodes for the smoothCurves have to settle. + * + * @private + */ + Network.prototype._freezeDefinedNodes = function() { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + if (nodes[id].x != null && nodes[id].y != null) { + nodes[id].fixedData.x = nodes[id].xFixed; + nodes[id].fixedData.y = nodes[id].yFixed; + nodes[id].xFixed = true; + nodes[id].yFixed = true; + } + } + } + }; + + /** + * Unfreezes the nodes that have been frozen by _freezeDefinedNodes. + * + * @private + */ + Network.prototype._restoreFrozenNodes = function() { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + if (nodes[id].fixedData.x != null) { + nodes[id].xFixed = nodes[id].fixedData.x; + nodes[id].yFixed = nodes[id].fixedData.y; + } + } + } + }; + + + /** + * Check if any of the nodes is still moving + * @param {number} vmin the minimum velocity considered as 'moving' + * @return {boolean} true if moving, false if non of the nodes is moving + * @private + */ + Network.prototype._isMoving = function(vmin) { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes[id] !== undefined) { + if (nodes[id].isMoving(vmin) == true) { + return true; + } + } + } + return false; + }; + + + /** + * /** + * Perform one discrete step for all nodes + * + * @private + */ + Network.prototype._discreteStepNodes = function() { + var interval = this.physicsDiscreteStepsize; + var nodes = this.nodes; + var nodeId; + var nodesPresent = false; + + if (this.constants.maxVelocity > 0) { + for (nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + nodes[nodeId].discreteStepLimited(interval, this.constants.maxVelocity); + nodesPresent = true; + } + } + } + else { + for (nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + nodes[nodeId].discreteStep(interval); + nodesPresent = true; + } + } + } + + if (nodesPresent == true) { + var vminCorrected = this.constants.minVelocity / Math.max(this.scale,0.05); + if (vminCorrected > 0.5*this.constants.maxVelocity) { + return true; + } + else { + return this._isMoving(vminCorrected); + } + } + return false; + }; + + + Network.prototype._revertPhysicsState = function() { + var nodes = this.nodes; + for (var nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + nodes[nodeId].revertPosition(); + } + } + } + + Network.prototype._revertPhysicsTick = function() { + this._doInAllActiveSectors("_revertPhysicsState"); + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._doInSupportSector("_revertPhysicsState"); + } + } + + /** + * A single simulation step (or "tick") in the physics simulation + * + * @private + */ + Network.prototype._physicsTick = function() { + if (!this.freezeSimulationEnabled) { + if (this.moving == true) { + var mainMovingStatus = false; + var supportMovingStatus = false; + + this._doInAllActiveSectors("_initializeForceCalculation"); + var mainMoving = this._doInAllActiveSectors("_discreteStepNodes"); + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + supportMovingStatus = this._doInSupportSector("_discreteStepNodes"); + } + + // gather movement data from all sectors, if one moves, we are NOT stabilzied + for (var i = 0; i < mainMoving.length; i++) { + mainMovingStatus = mainMoving[i] || mainMovingStatus; + } + + // determine if the network has stabilzied + this.moving = mainMovingStatus || supportMovingStatus; + if (this.moving == false) { + this._revertPhysicsTick(); + } + else { + // this is here to ensure that there is no start event when the network is already stable. + if (this.startedStabilization == false) { + this.emit("startStabilization"); + this.startedStabilization = true; + } + } + + this.stabilizationIterations++; + } + } + }; + + + /** + * This function runs one step of the animation. It calls an x amount of physics ticks and one render tick. + * It reschedules itself at the beginning of the function + * + * @private + */ + Network.prototype._animationStep = function() { + // reset the timer so a new scheduled animation step can be set + this.timer = undefined; + + if (this.requiresTimeout == true) { + // this schedules a new animation step + this.start(); + } + + // handle the keyboad movement + this._handleNavigation(); + + // check if the physics have settled + if (this.moving == true) { + var startTime = Date.now(); + this._physicsTick(); + var physicsTime = Date.now() - startTime; + + // run double speed if it is a little graph + if ((this.renderTimestep - this.renderTime > 2 * physicsTime || this.runDoubleSpeed == true) && this.moving == true) { + this._physicsTick(); + + // this makes sure there is no jitter. The decision is taken once to run it at double speed. + if (this.renderTime != 0) { + this.runDoubleSpeed = true + } + } + } + + var renderStartTime = Date.now(); + this._redraw(); + this.renderTime = Date.now() - renderStartTime; + + if (this.requiresTimeout == false) { + // this schedules a new animation step + this.start(); + } + }; + + if (typeof window !== 'undefined') { + window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; + } + + /** + * Schedule a animation step with the refreshrate interval. + */ + Network.prototype.start = function() { + if (this.freezeSimulationEnabled == true) { + this.moving = false; + } + if (this.moving == true || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0 || this.animating == true) { + if (!this.timer) { + if (this.requiresTimeout == true) { + this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + } + else { + this.timer = window.requestAnimationFrame(this._animationStep.bind(this)); // wait this.renderTimeStep milliseconds and perform the animation step function + } + } + } + else { + this._requestRedraw(); + // this check is to ensure that the network does not emit these events if it was already stabilized and setOptions is called (setting moving to true and calling start()) + if (this.stabilizationIterations > 1) { + // trigger the "stabilized" event. + // The event is triggered on the next tick, to prevent the case that + // it is fired while initializing the Network, in which case you would not + // be able to catch it + var me = this; + var params = { + iterations: me.stabilizationIterations + }; + this.stabilizationIterations = 0; + this.startedStabilization = false; + setTimeout(function () { + me.emit("stabilized", params); + }, 0); + } + else { + this.stabilizationIterations = 0; + } + } + }; + + + /** + * Move the network according to the keyboard presses. + * + * @private + */ + Network.prototype._handleNavigation = function() { + if (this.xIncrement != 0 || this.yIncrement != 0) { + var translation = this._getTranslation(); + this._setTranslation(translation.x+this.xIncrement, translation.y+this.yIncrement); + } + if (this.zoomIncrement != 0) { + var center = { + x: this.frame.canvas.clientWidth / 2, + y: this.frame.canvas.clientHeight / 2 + }; + this._zoom(this.scale*(1 + this.zoomIncrement), center); + } + }; + + + /** + * Freeze the _animationStep + */ + Network.prototype.freezeSimulation = function(freeze) { + if (freeze == true) { + this.freezeSimulationEnabled = true; + this.moving = false; + } + else { + this.freezeSimulationEnabled = false; + this.moving = true; + this.start(); + } + }; + + + /** + * This function cleans the support nodes if they are not needed and adds them when they are. + * + * @param {boolean} [disableStart] + * @private + */ + Network.prototype._configureSmoothCurves = function(disableStart) { + if (disableStart === undefined) { + disableStart = true; + } + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._createBezierNodes(); + // cleanup unused support nodes + for (var nodeId in this.sectors['support']['nodes']) { + if (this.sectors['support']['nodes'].hasOwnProperty(nodeId)) { + if (this.edges[this.sectors['support']['nodes'][nodeId].parentEdgeId] === undefined) { + delete this.sectors['support']['nodes'][nodeId]; + } + } + } + } + else { + // delete the support nodes + this.sectors['support']['nodes'] = {}; + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + this.edges[edgeId].via = null; + } + } + } + + + this._updateCalculationNodes(); + if (!disableStart) { + this.moving = true; + this.start(); + } + }; + + + /** + * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but + * are used for the force calculation. + * + * @private + */ + Network.prototype._createBezierNodes = function() { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + var edge = this.edges[edgeId]; + if (edge.via == null) { + var nodeId = "edgeId:".concat(edge.id); + this.sectors['support']['nodes'][nodeId] = new Node( + {id:nodeId, + mass:1, + shape:'circle', + image:"", + internalMultiplier:1 + },{},{},this.constants); + edge.via = this.sectors['support']['nodes'][nodeId]; + edge.via.parentEdgeId = edge.id; + edge.positionBezierNode(); + } + } + } + } + }; + + /** + * load the functions that load the mixins into the prototype. + * + * @private + */ + Network.prototype._initializeMixinLoaders = function () { + for (var mixin in MixinLoader) { + if (MixinLoader.hasOwnProperty(mixin)) { + Network.prototype[mixin] = MixinLoader[mixin]; + } + } + }; + + /** + * Load the XY positions of the nodes into the dataset. + */ + Network.prototype.storePosition = function() { + console.log("storePosition is depricated: use .storePositions() from now on.") + this.storePositions(); + }; + + /** + * Load the XY positions of the nodes into the dataset. + */ + Network.prototype.storePositions = function() { + var dataArray = []; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + var allowedToMoveX = !this.nodes.xFixed; + var allowedToMoveY = !this.nodes.yFixed; + if (this.nodesData._data[nodeId].x != Math.round(node.x) || this.nodesData._data[nodeId].y != Math.round(node.y)) { + dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY}); + } + } + } + this.nodesData.update(dataArray); + }; + + /** + * Return the positions of the nodes. + */ + Network.prototype.getPositions = function(ids) { + var dataArray = {}; + if (ids !== undefined) { + if (Array.isArray(ids) == true) { + for (var i = 0; i < ids.length; i++) { + if (this.nodes[ids[i]] !== undefined) { + var node = this.nodes[ids[i]]; + dataArray[ids[i]] = {x: Math.round(node.x), y: Math.round(node.y)}; + } + } + } + else { + if (this.nodes[ids] !== undefined) { + var node = this.nodes[ids]; + dataArray[ids] = {x: Math.round(node.x), y: Math.round(node.y)}; + } + } + } + else { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + dataArray[nodeId] = {x: Math.round(node.x), y: Math.round(node.y)}; + } + } + } + return dataArray; + }; + + + + /** + * Center a node in view. + * + * @param {Number} nodeId + * @param {Number} [options] + */ + Network.prototype.focusOnNode = function (nodeId, options) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (options === undefined) { + options = {}; + } + var nodePosition = {x: this.nodes[nodeId].x, y: this.nodes[nodeId].y}; + options.position = nodePosition; + options.lockedOnNode = nodeId; + + this.moveTo(options) + } + else { + console.log("This nodeId cannot be found."); + } + }; + + /** + * + * @param {Object} options | options.offset = {x:Number, y:Number} // offset from the center in DOM pixels + * | options.scale = Number // scale to move to + * | options.position = {x:Number, y:Number} // position to move to + * | options.animation = {duration:Number, easingFunction:String} || Boolean // position to move to + */ + Network.prototype.moveTo = function (options) { + if (options === undefined) { + options = {}; + return; + } + if (options.offset === undefined) {options.offset = {x: 0, y: 0}; } + if (options.offset.x === undefined) {options.offset.x = 0; } + if (options.offset.y === undefined) {options.offset.y = 0; } + if (options.scale === undefined) {options.scale = this._getScale(); } + if (options.position === undefined) {options.position = this._getTranslation();} + if (options.animation === undefined) {options.animation = {duration:0}; } + if (options.animation === false ) {options.animation = {duration:0}; } + if (options.animation === true ) {options.animation = {}; } + if (options.animation.duration === undefined) {options.animation.duration = 1000; } // default duration + if (options.animation.easingFunction === undefined) {options.animation.easingFunction = "easeInOutQuad"; } // default easing function + + this.animateView(options); + }; + + /** + * + * @param {Object} options | options.offset = {x:Number, y:Number} // offset from the center in DOM pixels + * | options.time = Number // animation time in milliseconds + * | options.scale = Number // scale to animate to + * | options.position = {x:Number, y:Number} // position to animate to + * | options.easingFunction = String // linear, easeInQuad, easeOutQuad, easeInOutQuad, + * // easeInCubic, easeOutCubic, easeInOutCubic, + * // easeInQuart, easeOutQuart, easeInOutQuart, + * // easeInQuint, easeOutQuint, easeInOutQuint + */ + Network.prototype.animateView = function (options) { + if (options === undefined) { + options = {}; + return; + } + + // release if something focussed on the node + this.releaseNode(); + if (options.locked == true) { + this.lockedOnNodeId = options.lockedOnNode; + this.lockedOnNodeOffset = options.offset; + } + + // forcefully complete the old animation if it was still running + if (this.easingTime != 0) { + this._transitionRedraw(1); // by setting easingtime to 1, we finish the animation. + } + + this.sourceScale = this._getScale(); + this.sourceTranslation = this._getTranslation(); + this.targetScale = options.scale; + + // set the scale so the viewCenter is based on the correct zoom level. This is overridden in the transitionRedraw + // but at least then we'll have the target transition + this._setScale(this.targetScale); + var viewCenter = this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight}); + var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node + x: viewCenter.x - options.position.x, + y: viewCenter.y - options.position.y + }; + this.targetTranslation = { + x: this.sourceTranslation.x + distanceFromCenter.x * this.targetScale + options.offset.x, + y: this.sourceTranslation.y + distanceFromCenter.y * this.targetScale + options.offset.y + }; + + // if the time is set to 0, don't do an animation + if (options.animation.duration == 0) { + if (this.lockedOnNodeId != null) { + this._classicRedraw = this._redraw; + this._redraw = this._lockedRedraw; + } + else { + this._setScale(this.targetScale); + this._setTranslation(this.targetTranslation.x, this.targetTranslation.y); + this._redraw(); + } + } + else { + this.animating = true; + this.animationSpeed = 1 / (this.renderRefreshRate * options.animation.duration * 0.001) || 1 / this.renderRefreshRate; + this.animationEasingFunction = options.animation.easingFunction; + this._classicRedraw = this._redraw; + this._redraw = this._transitionRedraw; + this._redraw(); + this.start(); + } + }; + + /** + * used to animate smoothly by hijacking the redraw function. + * @private + */ + Network.prototype._lockedRedraw = function () { + var nodePosition = {x: this.nodes[this.lockedOnNodeId].x, y: this.nodes[this.lockedOnNodeId].y}; + var viewCenter = this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight}); + var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node + x: viewCenter.x - nodePosition.x, + y: viewCenter.y - nodePosition.y + }; + var sourceTranslation = this._getTranslation(); + var targetTranslation = { + x: sourceTranslation.x + distanceFromCenter.x * this.scale + this.lockedOnNodeOffset.x, + y: sourceTranslation.y + distanceFromCenter.y * this.scale + this.lockedOnNodeOffset.y + }; + + this._setTranslation(targetTranslation.x,targetTranslation.y); + this._classicRedraw(); + } + + Network.prototype.releaseNode = function () { + if (this.lockedOnNodeId != null) { + this._redraw = this._classicRedraw; + this.lockedOnNodeId = null; + this.lockedOnNodeOffset = null; + } + } + + /** + * + * @param easingTime + * @private + */ + Network.prototype._transitionRedraw = function (easingTime) { + this.easingTime = easingTime || this.easingTime + this.animationSpeed; + this.easingTime += this.animationSpeed; + + var progress = util.easingFunctions[this.animationEasingFunction](this.easingTime); + + this._setScale(this.sourceScale + (this.targetScale - this.sourceScale) * progress); + this._setTranslation( + this.sourceTranslation.x + (this.targetTranslation.x - this.sourceTranslation.x) * progress, + this.sourceTranslation.y + (this.targetTranslation.y - this.sourceTranslation.y) * progress + ); + + this._classicRedraw(); + + // cleanup + if (this.easingTime >= 1.0) { + this.animating = false; + this.easingTime = 0; + if (this.lockedOnNodeId != null) { + this._redraw = this._lockedRedraw; + } + else { + this._redraw = this._classicRedraw; + } + this.emit("animationFinished"); + } + }; + + Network.prototype._classicRedraw = function () { + // placeholder function to be overloaded by animations; + }; + + /** + * Returns true when the Network is active. + * @returns {boolean} + */ + Network.prototype.isActive = function () { + return !this.activator || this.activator.active; + }; + + + /** + * Sets the scale + * @returns {Number} + */ + Network.prototype.setScale = function () { + return this._setScale(); + }; + + + /** + * Returns the scale + * @returns {Number} + */ + Network.prototype.getScale = function () { + return this._getScale(); + }; + + + /** + * Returns the scale + * @returns {Number} + */ + Network.prototype.getCenterCoordinates = function () { + return this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight}); + }; + + + Network.prototype.getBoundingBox = function(nodeId) { + if (this.nodes[nodeId] !== undefined) { + return this.nodes[nodeId].boundingBox; + } + } + + Network.prototype.getConnectedNodes = function(nodeId) { + var nodeList = []; + if (this.nodes[nodeId] !== undefined) { + var node = this.nodes[nodeId]; + var nodeObj = {nodeId : true}; // used to quickly check if node already exists + for (var i = 0; i < node.edges.length; i++) { + var edge = node.edges[i]; + if (edge.toId == nodeId) { + if (nodeObj[edge.fromId] === undefined) { + nodeList.push(edge.fromId); + nodeObj[edge.fromId] = true; + } + } + else if (edge.fromId == nodeId) { + if (nodeObj[edge.toId] === undefined) { + nodeList.push(edge.toId) + nodeObj[edge.toId] = true; + } + } + } + } + return nodeList; + } + + + Network.prototype.getEdgesFromNode = function(nodeId) { + var edgesList = []; + if (this.nodes[nodeId] !== undefined) { + var node = this.nodes[nodeId]; + for (var i = 0; i < node.edges.length; i++) { + edgesList.push(node.edges[i].id); + } + } + return edgesList; + } + + Network.prototype.generateColorObject = function(color) { + return util.parseColor(color); + + } + + module.exports = Network; + + +/***/ }, +/* 37 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Node = __webpack_require__(40); + + /** + * @class Edge + * + * A edge connects two nodes + * @param {Object} properties Object with properties. Must contain + * At least properties from and to. + * Available properties: from (number), + * to (number), label (string, color (string), + * width (number), style (string), + * length (number), title (string) + * @param {Network} network A Network object, used to find and edge to + * nodes. + * @param {Object} constants An object with default values for + * example for the color + */ + function Edge (properties, network, networkConstants) { + if (!network) { + throw "No network provided"; + } + var fields = ['edges','physics']; + var constants = util.selectiveBridgeObject(fields,networkConstants); + this.options = constants.edges; + this.physics = constants.physics; + this.options['smoothCurves'] = networkConstants['smoothCurves']; + + + this.network = network; + + // initialize variables + this.id = undefined; + this.fromId = undefined; + this.toId = undefined; + this.title = undefined; + this.widthSelected = this.options.width * this.options.widthSelectionMultiplier; + this.value = undefined; + this.selected = false; + this.hover = false; + this.labelDimensions = {top:0,left:0,width:0,height:0,yLine:0}; // could be cached + this.dirtyLabel = true; + this.colorDirty = true; + + this.from = null; // a node + this.to = null; // a node + this.via = null; // a temp node + + this.fromBackup = null; // used to clean up after reconnect + this.toBackup = null;; // used to clean up after reconnect + + // we use this to be able to reconnect the edge to a cluster if its node is put into a cluster + // by storing the original information we can revert to the original connection when the cluser is opened. + this.originalFromId = []; + this.originalToId = []; + + this.connected = false; + + this.widthFixed = false; + this.lengthFixed = false; + + this.setProperties(properties); + + this.controlNodesEnabled = false; + this.controlNodes = {from:null, to:null, positions:{}}; + this.connectedNode = null; + } + + /** + * Set or overwrite properties for the edge + * @param {Object} properties an object with properties + * @param {Object} constants and object with default, global properties + */ + Edge.prototype.setProperties = function(properties) { + this.colorDirty = true; + if (!properties) { + return; + } + + var fields = ['style','fontSize','fontFace','fontColor','fontFill','fontStrokeWidth','fontStrokeColor','width', + 'widthSelectionMultiplier','hoverWidth','arrowScaleFactor','dash','inheritColor','labelAlignment', 'opacity', + 'customScalingFunction','useGradients' + ]; + util.selectiveDeepExtend(fields, this.options, properties); + + if (properties.from !== undefined) {this.fromId = properties.from;} + if (properties.to !== undefined) {this.toId = properties.to;} + + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.label !== undefined) {this.label = properties.label; this.dirtyLabel = true;} + + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.value !== undefined) {this.value = properties.value;} + if (properties.length !== undefined) {this.physics.springLength = properties.length;} + + if (properties.color !== undefined) { + this.options.inheritColor = false; + if (util.isString(properties.color)) { + this.options.color.color = properties.color; + this.options.color.highlight = properties.color; + } + else { + if (properties.color.color !== undefined) {this.options.color.color = properties.color.color;} + if (properties.color.highlight !== undefined) {this.options.color.highlight = properties.color.highlight;} + if (properties.color.hover !== undefined) {this.options.color.hover = properties.color.hover;} + } + } + + + + // A node is connected when it has a from and to node. + this.connect(); + + this.widthFixed = this.widthFixed || (properties.width !== undefined); + this.lengthFixed = this.lengthFixed || (properties.length !== undefined); + + this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; + + // set draw method based on style + switch (this.options.style) { + case 'line': this.draw = this._drawLine; break; + case 'arrow': this.draw = this._drawArrow; break; + case 'arrow-center': this.draw = this._drawArrowCenter; break; + case 'dash-line': this.draw = this._drawDashLine; break; + default: this.draw = this._drawLine; break; + } + }; + + + /** + * Connect an edge to its nodes + */ + Edge.prototype.connect = function () { + this.disconnect(); + + this.from = this.network.nodes[this.fromId] || null; + this.to = this.network.nodes[this.toId] || null; + this.connected = (this.from && this.to); + + if (this.connected) { + this.from.attachEdge(this); + this.to.attachEdge(this); + } + else { + if (this.from) { + this.from.detachEdge(this); + } + if (this.to) { + this.to.detachEdge(this); + } + } + }; + + /** + * Disconnect an edge from its nodes + */ + Edge.prototype.disconnect = function () { + if (this.from) { + this.from.detachEdge(this); + this.from = null; + } + if (this.to) { + this.to.detachEdge(this); + this.to = null; + } + + this.connected = false; + }; + + /** + * get the title of this edge. + * @return {string} title The title of the edge, or undefined when no title + * has been set. + */ + Edge.prototype.getTitle = function() { + return typeof this.title === "function" ? this.title() : this.title; + }; + + + /** + * Retrieve the value of the edge. Can be undefined + * @return {Number} value + */ + Edge.prototype.getValue = function() { + return this.value; + }; + + /** + * Adjust the value range of the edge. The edge will adjust it's width + * based on its value. + * @param {Number} min + * @param {Number} max + */ + Edge.prototype.setValueRange = function(min, max, total) { + if (!this.widthFixed && this.value !== undefined) { + var scale = this.options.customScalingFunction(min, max, total, this.value); + var widthDiff = this.options.widthMax - this.options.widthMin; + this.options.width = this.options.widthMin + scale * widthDiff; + this.widthSelected = this.options.width* this.options.widthSelectionMultiplier; + } + }; + + /** + * Redraw a edge + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + */ + Edge.prototype.draw = function(ctx) { + throw "Method draw not initialized in edge"; + }; + + /** + * Check if this object is overlapping with the provided object + * @param {Object} obj an object with parameters left, top + * @return {boolean} True if location is located on the edge + */ + Edge.prototype.isOverlappingWith = function(obj) { + if (this.connected) { + var distMax = 10; + var xFrom = this.from.x; + var yFrom = this.from.y; + var xTo = this.to.x; + var yTo = this.to.y; + var xObj = obj.left; + var yObj = obj.top; + + var dist = this._getDistanceToEdge(xFrom, yFrom, xTo, yTo, xObj, yObj); + + return (dist < distMax); + } + else { + return false + } + }; + + Edge.prototype._getColor = function(ctx) { + var colorObj = this.options.color; + if (this.options.useGradients == true) { + var grd = ctx.createLinearGradient(this.from.x, this.from.y, this.to.x, this.to.y); + var fromColor, toColor; + fromColor = this.from.options.color.highlight.border; + toColor = this.to.options.color.highlight.border; + + + if (this.from.selected == false && this.to.selected == false) { + fromColor = util.overrideOpacity(this.from.options.color.border, this.options.opacity); + toColor = util.overrideOpacity(this.to.options.color.border, this.options.opacity); + } + else if (this.from.selected == true && this.to.selected == false) { + toColor = this.to.options.color.border; + } + else if (this.from.selected == false && this.to.selected == true) { + fromColor = this.from.options.color.border; + } + grd.addColorStop(0, fromColor); + grd.addColorStop(1, toColor); + return grd; + } + + if (this.colorDirty === true) { + if (this.options.inheritColor == "to") { + colorObj = { + highlight: this.to.options.color.highlight.border, + hover: this.to.options.color.hover.border, + color: util.overrideOpacity(this.from.options.color.border, this.options.opacity) + }; + } + else if (this.options.inheritColor == "from" || this.options.inheritColor == true) { + colorObj = { + highlight: this.from.options.color.highlight.border, + hover: this.from.options.color.hover.border, + color: util.overrideOpacity(this.from.options.color.border, this.options.opacity) + }; + } + this.options.color = colorObj; + this.colorDirty = false; + } + + + + if (this.selected == true) {return colorObj.highlight;} + else if (this.hover == true) {return colorObj.hover;} + else {return colorObj.color;} + }; + + + /** + * Redraw a edge as a line + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._drawLine = function(ctx) { + // set style + ctx.strokeStyle = this._getColor(ctx); + ctx.lineWidth = this._getLineWidth(); + + if (this.from != this.to) { + // draw line + var via = this._line(ctx); + + // draw label + var point; + if (this.label) { + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + this._label(ctx, this.label, point.x, point.y); + } + } + else { + var x, y; + var radius = this.physics.springLength / 4; + var node = this.from; + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width / 2; + y = node.y - radius; + } + else { + x = node.x + radius; + y = node.y - node.height / 2; + } + this._circle(ctx, x, y, radius); + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); + } + }; + + /** + * Get the line width of the edge. Depends on width and whether one of the + * connected nodes is selected. + * @return {Number} width + * @private + */ + Edge.prototype._getLineWidth = function() { + if (this.selected == true) { + return Math.max(Math.min(this.widthSelected, this.options.widthMax), 0.3*this.networkScaleInv); + } + else { + if (this.hover == true) { + return Math.max(Math.min(this.options.hoverWidth, this.options.widthMax), 0.3*this.networkScaleInv); + } + else { + return Math.max(this.options.width, 0.3*this.networkScaleInv); + } + } + }; + + Edge.prototype._getViaCoordinates = function () { + if (this.options.smoothCurves.dynamic == true && this.options.smoothCurves.enabled == true ) { + return this.via; + } + else if (this.options.smoothCurves.enabled == false) { + return {x:0,y:0}; + } + else { + var xVia = null; + var yVia = null; + var factor = this.options.smoothCurves.roundness; + var type = this.options.smoothCurves.type; + var dx = Math.abs(this.from.x - this.to.x); + var dy = Math.abs(this.from.y - this.to.y); + if (type == 'discrete' || type == 'diagonalCross') { + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y - factor * dy; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y - factor * dy; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y + factor * dy; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y + factor * dy; + } + } + if (type == "discrete") { + xVia = dx < factor * dy ? this.from.x : xVia; + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y - factor * dx; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y - factor * dx; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y + factor * dx; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y + factor * dx; + } + } + if (type == "discrete") { + yVia = dy < factor * dx ? this.from.y : yVia; + } + } + } + else if (type == "straightCross") { + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { // up - down + xVia = this.from.x; + if (this.from.y < this.to.y) { + yVia = this.to.y - (1 - factor) * dy; + } + else { + yVia = this.to.y + (1 - factor) * dy; + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { // left - right + if (this.from.x < this.to.x) { + xVia = this.to.x - (1 - factor) * dx; + } + else { + xVia = this.to.x + (1 - factor) * dx; + } + yVia = this.from.y; + } + } + else if (type == 'horizontal') { + if (this.from.x < this.to.x) { + xVia = this.to.x - (1 - factor) * dx; + } + else { + xVia = this.to.x + (1 - factor) * dx; + } + yVia = this.from.y; + } + else if (type == 'vertical') { + xVia = this.from.x; + if (this.from.y < this.to.y) { + yVia = this.to.y - (1 - factor) * dy; + } + else { + yVia = this.to.y + (1 - factor) * dy; + } + } + else if (type == 'curvedCW') { + var dx = this.to.x - this.from.x; + var dy = this.from.y - this.to.y; + var radius = Math.sqrt(dx*dx + dy*dy); + var pi = Math.PI; + + var originalAngle = Math.atan2(dy,dx); + var myAngle = (originalAngle + ((factor * 0.5) + 0.5) * pi) % (2 * pi); + + xVia = this.from.x + (factor*0.5 + 0.5)*radius*Math.sin(myAngle); + yVia = this.from.y + (factor*0.5 + 0.5)*radius*Math.cos(myAngle); + } + else if (type == 'curvedCCW') { + var dx = this.to.x - this.from.x; + var dy = this.from.y - this.to.y; + var radius = Math.sqrt(dx*dx + dy*dy); + var pi = Math.PI; + + var originalAngle = Math.atan2(dy,dx); + var myAngle = (originalAngle + ((-factor * 0.5) + 0.5) * pi) % (2 * pi); + + xVia = this.from.x + (factor*0.5 + 0.5)*radius*Math.sin(myAngle); + yVia = this.from.y + (factor*0.5 + 0.5)*radius*Math.cos(myAngle); + } + else { // continuous + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y - factor * dy; + xVia = this.to.x < xVia ? this.to.x : xVia; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y - factor * dy; + xVia = this.to.x > xVia ? this.to.x : xVia; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y + factor * dy; + xVia = this.to.x < xVia ? this.to.x : xVia; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y + factor * dy; + xVia = this.to.x > xVia ? this.to.x : xVia; + } + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y - factor * dx; + yVia = this.to.y > yVia ? this.to.y : yVia; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y - factor * dx; + yVia = this.to.y > yVia ? this.to.y : yVia; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y + factor * dx; + yVia = this.to.y < yVia ? this.to.y : yVia; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y + factor * dx; + yVia = this.to.y < yVia ? this.to.y : yVia; + } + } + } + } + + + return {x: xVia, y: yVia}; + } + }; + + /** + * Draw a line between two nodes + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._line = function (ctx) { + // draw a straight line + ctx.beginPath(); + ctx.moveTo(this.from.x, this.from.y); + if (this.options.smoothCurves.enabled == true) { + if (this.options.smoothCurves.dynamic == false) { + var via = this._getViaCoordinates(); + if (via.x == null) { + ctx.lineTo(this.to.x, this.to.y); + ctx.stroke(); + return null; + } + else { + // this.via.x = via.x; + // this.via.y = via.y; + ctx.quadraticCurveTo(via.x,via.y,this.to.x, this.to.y); + ctx.stroke(); + //ctx.circle(via.x,via.y,2) + //ctx.stroke(); + return via; + } + } + else { + ctx.quadraticCurveTo(this.via.x,this.via.y,this.to.x, this.to.y); + ctx.stroke(); + return this.via; + } + } + else { + ctx.lineTo(this.to.x, this.to.y); + ctx.stroke(); + return null; + } + }; + + /** + * Draw a line from a node to itself, a circle + * @param {CanvasRenderingContext2D} ctx + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @private + */ + Edge.prototype._circle = function (ctx, x, y, radius) { + // draw a circle + ctx.beginPath(); + ctx.arc(x, y, radius, 0, 2 * Math.PI, false); + ctx.stroke(); + }; + + /** + * Draw label with white background and with the middle at (x, y) + * @param {CanvasRenderingContext2D} ctx + * @param {String} text + * @param {Number} x + * @param {Number} y + * @private + */ + Edge.prototype._label = function (ctx, text, x, y) { + if (text) { + ctx.font = ((this.from.selected || this.to.selected) ? "bold " : "") + + this.options.fontSize + "px " + this.options.fontFace; + var yLine; + + if (this.dirtyLabel == true) { + var lines = String(text).split('\n'); + var lineCount = lines.length; + var fontSize = Number(this.options.fontSize); + yLine = y + (1 - lineCount) / 2 * fontSize; + + var width = ctx.measureText(lines[0]).width; + for (var i = 1; i < lineCount; i++) { + var lineWidth = ctx.measureText(lines[i]).width; + width = lineWidth > width ? lineWidth : width; + } + var height = this.options.fontSize * lineCount; + var left = x - width / 2; + var top = y - height / 2; + + // cache + this.labelDimensions = {top:top,left:left,width:width,height:height,yLine:yLine}; + } + + var yLine = this.labelDimensions.yLine; + + ctx.save(); + + if (this.options.labelAlignment != "horizontal"){ + ctx.translate(x, yLine); + this._rotateForLabelAlignment(ctx); + x = 0; + yLine = 0; + } + + + this._drawLabelRect(ctx); + this._drawLabelText(ctx,x,yLine, lines, lineCount, fontSize); + + ctx.restore(); + } + }; + + /** + * Rotates the canvas so the text is most readable + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._rotateForLabelAlignment = function(ctx) { + var dy = this.from.y - this.to.y; + var dx = this.from.x - this.to.x; + var angleInDegrees = Math.atan2(dy, dx); + + // rotate so label it is readable + if((angleInDegrees < -1 && dx < 0) || (angleInDegrees > 0 && dx < 0)){ + angleInDegrees = angleInDegrees + Math.PI; + } + + ctx.rotate(angleInDegrees); + }; + + /** + * Draws the label rectangle + * @param {CanvasRenderingContext2D} ctx + * @param {String} labelAlignment + * @private + */ + Edge.prototype._drawLabelRect = function(ctx) { + if (this.options.fontFill !== undefined && this.options.fontFill !== null && this.options.fontFill !== "none") { + ctx.fillStyle = this.options.fontFill; + + var lineMargin = 2; + + if (this.options.labelAlignment == 'line-center') { + ctx.fillRect(-this.labelDimensions.width * 0.5, -this.labelDimensions.height * 0.5, this.labelDimensions.width, this.labelDimensions.height); + } + else if (this.options.labelAlignment == 'line-above') { + ctx.fillRect(-this.labelDimensions.width * 0.5, -(this.labelDimensions.height + lineMargin), this.labelDimensions.width, this.labelDimensions.height); + } + else if (this.options.labelAlignment == 'line-below') { + ctx.fillRect(-this.labelDimensions.width * 0.5, lineMargin, this.labelDimensions.width, this.labelDimensions.height); + } + else { + ctx.fillRect(this.labelDimensions.left, this.labelDimensions.top, this.labelDimensions.width, this.labelDimensions.height); + } + } + }; + + /** + * Draws the label text + * @param {CanvasRenderingContext2D} ctx + * @param {Number} x + * @param {Number} yLine + * @param {Array} lines + * @param {Number} lineCount + * @param {Number} fontSize + * @private + */ + Edge.prototype._drawLabelText = function(ctx, x, yLine, lines, lineCount, fontSize) { + // draw text + ctx.fillStyle = this.options.fontColor || "black"; + ctx.textAlign = "center"; + + // check for label alignment + if (this.options.labelAlignment != 'horizontal') { + var lineMargin = 2; + if (this.options.labelAlignment == 'line-above') { + ctx.textBaseline = "alphabetic"; + yLine -= 2 * lineMargin; // distance from edge, required because we use alphabetic. Alphabetic has less difference between browsers + } + else if (this.options.labelAlignment == 'line-below') { + ctx.textBaseline = "hanging"; + yLine += 2 * lineMargin;// distance from edge, required because we use hanging. Hanging has less difference between browsers + } + else { + ctx.textBaseline = "middle"; + } + } + else { + ctx.textBaseline = "middle"; + } + + // check for strokeWidth + if (this.options.fontStrokeWidth > 0){ + ctx.lineWidth = this.options.fontStrokeWidth; + ctx.strokeStyle = this.options.fontStrokeColor; + ctx.lineJoin = 'round'; + } + for (var i = 0; i < lineCount; i++) { + if(this.options.fontStrokeWidth > 0){ + ctx.strokeText(lines[i], x, yLine); + } + ctx.fillText(lines[i], x, yLine); + yLine += fontSize; + } + }; + + /** + * Redraw a edge as a dashed line + * Draw this edge in the given canvas + * @author David Jordan + * @date 2012-08-08 + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._drawDashLine = function(ctx) { + // set style + ctx.strokeStyle = this._getColor(ctx); + ctx.lineWidth = this._getLineWidth(); + + var via = null; + // only firefox and chrome support this method, else we use the legacy one. + if (ctx.setLineDash !== undefined) { + ctx.save(); + // configure the dash pattern + var pattern = [0]; + if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) { + pattern = [this.options.dash.length,this.options.dash.gap]; + } + else { + pattern = [5,5]; + } + + // set dash settings for chrome or firefox + ctx.setLineDash(pattern); + ctx.lineDashOffset = 0; + + // draw the line + via = this._line(ctx); + + // restore the dash settings. + ctx.setLineDash([0]); + ctx.lineDashOffset = 0; + ctx.restore(); + } + else { // unsupporting smooth lines + // draw dashed line + ctx.beginPath(); + ctx.lineCap = 'round'; + if (this.options.dash.altLength !== undefined) //If an alt dash value has been set add to the array this value + { + ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, + [this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap]); + } + else if (this.options.dash.length !== undefined && this.options.dash.gap !== undefined) //If a dash and gap value has been set add to the array this value + { + ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, + [this.options.dash.length,this.options.dash.gap]); + } + else //If all else fails draw a line + { + ctx.moveTo(this.from.x, this.from.y); + ctx.lineTo(this.to.x, this.to.y); + } + ctx.stroke(); + } + + // draw label + if (this.label) { + var point; + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + this._label(ctx, this.label, point.x, point.y); + } + }; + + /** + * Get a point on a line + * @param {Number} percentage. Value between 0 (line start) and 1 (line end) + * @return {Object} point + * @private + */ + Edge.prototype._pointOnLine = function (percentage) { + return { + x: (1 - percentage) * this.from.x + percentage * this.to.x, + y: (1 - percentage) * this.from.y + percentage * this.to.y + } + }; + + /** + * Get a point on a circle + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @param {Number} percentage. Value between 0 (line start) and 1 (line end) + * @return {Object} point + * @private + */ + Edge.prototype._pointOnCircle = function (x, y, radius, percentage) { + var angle = (percentage - 3/8) * 2 * Math.PI; + return { + x: x + radius * Math.cos(angle), + y: y - radius * Math.sin(angle) + } + }; + + /** + * Redraw a edge as a line with an arrow halfway the line + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._drawArrowCenter = function(ctx) { + var point; + // set style + ctx.strokeStyle = this._getColor(ctx); + ctx.fillStyle = ctx.strokeStyle; + ctx.lineWidth = this._getLineWidth(); + + if (this.from != this.to) { + // draw line + var via = this._line(ctx); + + var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + // draw an arrow halfway the line + if (this.options.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + + ctx.arrow(point.x, point.y, angle, length); + ctx.fill(); + ctx.stroke(); + + // draw label + if (this.label) { + this._label(ctx, this.label, point.x, point.y); + } + } + else { + // draw circle + var x, y; + var radius = 0.25 * Math.max(100,this.physics.springLength); + var node = this.from; + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width * 0.5; + y = node.y - radius; + } + else { + x = node.x + radius; + y = node.y - node.height * 0.5; + } + this._circle(ctx, x, y, radius); + + // draw all arrows + var angle = 0.2 * Math.PI; + var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + point = this._pointOnCircle(x, y, radius, 0.5); + ctx.arrow(point.x, point.y, angle, length); + ctx.fill(); + ctx.stroke(); + + // draw label + if (this.label) { + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); + } + } + }; + + Edge.prototype._pointOnBezier = function(t) { + var via = this._getViaCoordinates(); + + var x = Math.pow(1-t,2)*this.from.x + (2*t*(1 - t))*via.x + Math.pow(t,2)*this.to.x; + var y = Math.pow(1-t,2)*this.from.y + (2*t*(1 - t))*via.y + Math.pow(t,2)*this.to.y; + + return {x:x,y:y}; + } + + /** + * This function uses binary search to look for the point where the bezier curve crosses the border of the node. + * + * @param from + * @param ctx + * @returns {*} + * @private + */ + Edge.prototype._findBorderPosition = function(from,ctx) { + var maxIterations = 10; + var iteration = 0; + var low = 0; + var high = 1; + var pos,angle,distanceToBorder, distanceToNodes, difference; + var threshold = 0.2; + var node = this.to; + if (from == true) { + node = this.from; + } + + while (low <= high && iteration < maxIterations) { + var middle = (low + high) * 0.5; + + pos = this._pointOnBezier(middle); + angle = Math.atan2((node.y - pos.y), (node.x - pos.x)); + distanceToBorder = node.distanceToBorder(ctx,angle); + distanceToNodes = Math.sqrt(Math.pow(pos.x-node.x,2) + Math.pow(pos.y-node.y,2)); + difference = distanceToBorder - distanceToNodes; + if (Math.abs(difference) < threshold) { + break; // found + } + else if (difference < 0) { // distance to nodes is larger than distance to border --> t needs to be bigger if we're looking at the to node. + if (from == false) { + low = middle; + } + else { + high = middle; + } + } + else { + if (from == false) { + high = middle; + } + else { + low = middle; + } + } + + iteration++; + } + pos.t = middle; + + return pos; + }; + + /** + * Redraw a edge as a line with an arrow + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._drawArrow = function(ctx) { + // set style + ctx.strokeStyle = this._getColor(ctx); + ctx.fillStyle = ctx.strokeStyle; + ctx.lineWidth = this._getLineWidth(); + + // set vars + var angle, length, arrowPos; + + // if not connected to itself + if (this.from != this.to) { + // draw line + this._line(ctx); + + // draw arrow head + if (this.options.smoothCurves.enabled == true) { + var via = this._getViaCoordinates(); + arrowPos = this._findBorderPosition(false, ctx); + var guidePos = this._pointOnBezier(Math.max(0.0, arrowPos.t - 0.1)) + angle = Math.atan2((arrowPos.y - guidePos.y), (arrowPos.x - guidePos.x)); + } + else { + angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var dx = (this.to.x - this.from.x); + var dy = (this.to.y - this.from.y); + var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + var toBorderDist = this.to.distanceToBorder(ctx, angle); + var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; + + arrowPos = {}; + arrowPos.x = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; + arrowPos.y = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; + } + + // draw arrow at the end of the line + length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + ctx.arrow(arrowPos.x,arrowPos.y, angle, length); + ctx.fill(); + ctx.stroke(); + + // draw label + if (this.label) { + var point; + if (this.options.smoothCurves.enabled == true && via != null) { + point = this._pointOnBezier(0.5); + } + else { + point = this._pointOnLine(0.5); + } + this._label(ctx, this.label, point.x, point.y); + } + } + else { + // draw circle + var node = this.from; + var x, y, arrow; + var radius = 0.25 * Math.max(100,this.physics.springLength); + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width * 0.5; + y = node.y - radius; + arrow = { + x: x, + y: node.y, + angle: 0.9 * Math.PI + }; + } + else { + x = node.x + radius; + y = node.y - node.height * 0.5; + arrow = { + x: node.x, + y: y, + angle: 0.6 * Math.PI + }; + } + ctx.beginPath(); + // TODO: similarly, for a line without arrows, draw to the border of the nodes instead of the center + ctx.arc(x, y, radius, 0, 2 * Math.PI, false); + ctx.stroke(); + + // draw all arrows + var length = (10 + 5 * this.options.width) * this.options.arrowScaleFactor; + ctx.arrow(arrow.x, arrow.y, arrow.angle, length); + ctx.fill(); + ctx.stroke(); + + // draw label + if (this.label) { + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); + } + } + }; + + /** + * Calculate the distance between a point (x3,y3) and a line segment from + * (x1,y1) to (x2,y2). + * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @private + */ + Edge.prototype._getDistanceToEdge = function (x1,y1, x2,y2, x3,y3) { // x3,y3 is the point + var returnValue = 0; + if (this.from != this.to) { + if (this.options.smoothCurves.enabled == true) { + var xVia, yVia; + if (this.options.smoothCurves.enabled == true && this.options.smoothCurves.dynamic == true) { + xVia = this.via.x; + yVia = this.via.y; + } + else { + var via = this._getViaCoordinates(); + xVia = via.x; + yVia = via.y; + } + var minDistance = 1e9; + var distance; + var i,t,x,y, lastX, lastY; + for (i = 0; i < 10; i++) { + t = 0.1*i; + x = Math.pow(1-t,2)*x1 + (2*t*(1 - t))*xVia + Math.pow(t,2)*x2; + y = Math.pow(1-t,2)*y1 + (2*t*(1 - t))*yVia + Math.pow(t,2)*y2; + if (i > 0) { + distance = this._getDistanceToLine(lastX,lastY,x,y, x3,y3); + minDistance = distance < minDistance ? distance : minDistance; + } + lastX = x; lastY = y; + } + returnValue = minDistance; + } + else { + returnValue = this._getDistanceToLine(x1,y1,x2,y2,x3,y3); + } + } + else { + var x, y, dx, dy; + var radius = 0.25 * this.physics.springLength; + var node = this.from; + if (node.width > node.height) { + x = node.x + 0.5 * node.width; + y = node.y - radius; + } + else { + x = node.x + radius; + y = node.y - 0.5 * node.height; + } + dx = x - x3; + dy = y - y3; + returnValue = Math.abs(Math.sqrt(dx*dx + dy*dy) - radius); + } + + if (this.labelDimensions.left < x3 && + this.labelDimensions.left + this.labelDimensions.width > x3 && + this.labelDimensions.top < y3 && + this.labelDimensions.top + this.labelDimensions.height > y3) { + return 0; + } + else { + return returnValue; + } + }; + + Edge.prototype._getDistanceToLine = function(x1,y1,x2,y2,x3,y3) { + var px = x2-x1, + py = y2-y1, + something = px*px + py*py, + u = ((x3 - x1) * px + (y3 - y1) * py) / something; + + if (u > 1) { + u = 1; + } + else if (u < 0) { + u = 0; + } + + var x = x1 + u * px, + y = y1 + u * py, + dx = x - x3, + dy = y - y3; + + //# Note: If the actual distance does not matter, + //# if you only want to compare what this function + //# returns to other results of this function, you + //# can just return the squared distance instead + //# (i.e. remove the sqrt) to gain a little performance + + return Math.sqrt(dx*dx + dy*dy); + }; + + /** + * This allows the zoom level of the network to influence the rendering + * + * @param scale + */ + Edge.prototype.setScale = function(scale) { + this.networkScaleInv = 1.0/scale; + }; + + + Edge.prototype.select = function() { + this.selected = true; + }; + + Edge.prototype.unselect = function() { + this.selected = false; + }; + + Edge.prototype.positionBezierNode = function() { + if (this.via !== null && this.from !== null && this.to !== null) { + this.via.x = 0.5 * (this.from.x + this.to.x); + this.via.y = 0.5 * (this.from.y + this.to.y); + } + else if (this.via !== null) { + this.via.x = 0; + this.via.y = 0; + } + }; + + /** + * This function draws the control nodes for the manipulator. + * In order to enable this, only set the this.controlNodesEnabled to true. + * @param ctx + */ + Edge.prototype._drawControlNodes = function(ctx) { + if (this.controlNodesEnabled == true) { + if (this.controlNodes.from === null && this.controlNodes.to === null) { + var nodeIdFrom = "edgeIdFrom:".concat(this.id); + var nodeIdTo = "edgeIdTo:".concat(this.id); + var constants = { + nodes:{group:'', radius:7, borderWidth:2, borderWidthSelected: 2}, + physics:{damping:0}, + clustering: {maxNodeSizeIncrements: 0 ,nodeScaling: {width:0, height: 0, radius:0}} + }; + this.controlNodes.from = new Node( + {id:nodeIdFrom, + shape:'dot', + color:{background:'#ff0000', border:'#3c3c3c', highlight: {background:'#07f968'}} + },{},{},constants); + this.controlNodes.to = new Node( + {id:nodeIdTo, + shape:'dot', + color:{background:'#ff0000', border:'#3c3c3c', highlight: {background:'#07f968'}} + },{},{},constants); + } + + this.controlNodes.positions = {}; + if (this.controlNodes.from.selected == false) { + this.controlNodes.positions.from = this.getControlNodeFromPosition(ctx); + this.controlNodes.from.x = this.controlNodes.positions.from.x; + this.controlNodes.from.y = this.controlNodes.positions.from.y; + } + if (this.controlNodes.to.selected == false) { + this.controlNodes.positions.to = this.getControlNodeToPosition(ctx); + this.controlNodes.to.x = this.controlNodes.positions.to.x; + this.controlNodes.to.y = this.controlNodes.positions.to.y; + } + + this.controlNodes.from.draw(ctx); + this.controlNodes.to.draw(ctx); + } + else { + this.controlNodes = {from:null, to:null, positions:{}}; + } + }; + + /** + * Enable control nodes. + * @private + */ + Edge.prototype._enableControlNodes = function() { + this.fromBackup = this.from; + this.toBackup = this.to; + this.controlNodesEnabled = true; + }; + + /** + * disable control nodes and remove from dynamicEdges from old node + * @private + */ + Edge.prototype._disableControlNodes = function() { + this.fromId = this.from.id; + this.toId = this.to.id; + if (this.fromId != this.fromBackup.id) { // from was changed, remove edge from old 'from' node dynamic edges + this.fromBackup.detachEdge(this); + } + else if (this.toId != this.toBackup.id) { // to was changed, remove edge from old 'to' node dynamic edges + this.toBackup.detachEdge(this); + } + + this.fromBackup = null; + this.toBackup = null; + this.controlNodesEnabled = false; + }; + + + /** + * This checks if one of the control nodes is selected and if so, returns the control node object. Else it returns null. + * @param x + * @param y + * @returns {null} + * @private + */ + Edge.prototype._getSelectedControlNode = function(x,y) { + var positions = this.controlNodes.positions; + var fromDistance = Math.sqrt(Math.pow(x - positions.from.x,2) + Math.pow(y - positions.from.y,2)); + var toDistance = Math.sqrt(Math.pow(x - positions.to.x ,2) + Math.pow(y - positions.to.y ,2)); + + if (fromDistance < 15) { + this.connectedNode = this.from; + this.from = this.controlNodes.from; + return this.controlNodes.from; + } + else if (toDistance < 15) { + this.connectedNode = this.to; + this.to = this.controlNodes.to; + return this.controlNodes.to; + } + else { + return null; + } + }; + + + /** + * this resets the control nodes to their original position. + * @private + */ + Edge.prototype._restoreControlNodes = function() { + if (this.controlNodes.from.selected == true) { + this.from = this.connectedNode; + this.connectedNode = null; + this.controlNodes.from.unselect(); + } + else if (this.controlNodes.to.selected == true) { + this.to = this.connectedNode; + this.connectedNode = null; + this.controlNodes.to.unselect(); + } + }; + + /** + * this calculates the position of the control nodes on the edges of the parent nodes. + * + * @param ctx + * @returns {x: *, y: *} + */ + Edge.prototype.getControlNodeFromPosition = function(ctx) { + // draw arrow head + var controlnodeFromPos; + if (this.options.smoothCurves.enabled == true) { + controlnodeFromPos = this._findBorderPosition(true, ctx); + } + else { + var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var dx = (this.to.x - this.from.x); + var dy = (this.to.y - this.from.y); + var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + + var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); + var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; + controlnodeFromPos = {}; + controlnodeFromPos.x = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; + controlnodeFromPos.y = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; + } + + return controlnodeFromPos; + }; + + /** + * this calculates the position of the control nodes on the edges of the parent nodes. + * + * @param ctx + * @returns {{from: {x: number, y: number}, to: {x: *, y: *}}} + */ + Edge.prototype.getControlNodeToPosition = function(ctx) { + // draw arrow head + var controlnodeFromPos,controlnodeToPos; + if (this.options.smoothCurves.enabled == true) { + controlnodeToPos = this._findBorderPosition(false, ctx); + } + else { + var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var dx = (this.to.x - this.from.x); + var dy = (this.to.y - this.from.y); + var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + var toBorderDist = this.to.distanceToBorder(ctx, angle); + var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; + + controlnodeToPos = {}; + controlnodeToPos.x = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; + controlnodeToPos.y = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; + } + + return controlnodeToPos; + }; + + module.exports = Edge; + +/***/ }, +/* 38 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + + /** + * @class Groups + * This class can store groups and properties specific for groups. + */ + function Groups() { + this.clear(); + this.defaultIndex = 0; + this.groupsArray = []; + this.groupIndex = 0; + this.useDefaultGroups = true; + } + + + /** + * default constants for group colors + */ + Groups.DEFAULT = [ + {border: "#2B7CE9", background: "#97C2FC", highlight: {border: "#2B7CE9", background: "#D2E5FF"}, hover: {border: "#2B7CE9", background: "#D2E5FF"}}, // 0: blue + {border: "#FFA500", background: "#FFFF00", highlight: {border: "#FFA500", background: "#FFFFA3"}, hover: {border: "#FFA500", background: "#FFFFA3"}}, // 1: yellow + {border: "#FA0A10", background: "#FB7E81", highlight: {border: "#FA0A10", background: "#FFAFB1"}, hover: {border: "#FA0A10", background: "#FFAFB1"}}, // 2: red + {border: "#41A906", background: "#7BE141", highlight: {border: "#41A906", background: "#A1EC76"}, hover: {border: "#41A906", background: "#A1EC76"}}, // 3: green + {border: "#E129F0", background: "#EB7DF4", highlight: {border: "#E129F0", background: "#F0B3F5"}, hover: {border: "#E129F0", background: "#F0B3F5"}}, // 4: magenta + {border: "#7C29F0", background: "#AD85E4", highlight: {border: "#7C29F0", background: "#D3BDF0"}, hover: {border: "#7C29F0", background: "#D3BDF0"}}, // 5: purple + {border: "#C37F00", background: "#FFA807", highlight: {border: "#C37F00", background: "#FFCA66"}, hover: {border: "#C37F00", background: "#FFCA66"}}, // 6: orange + {border: "#4220FB", background: "#6E6EFD", highlight: {border: "#4220FB", background: "#9B9BFD"}, hover: {border: "#4220FB", background: "#9B9BFD"}}, // 7: darkblue + {border: "#FD5A77", background: "#FFC0CB", highlight: {border: "#FD5A77", background: "#FFD1D9"}, hover: {border: "#FD5A77", background: "#FFD1D9"}}, // 8: pink + {border: "#4AD63A", background: "#C2FABC", highlight: {border: "#4AD63A", background: "#E6FFE3"}, hover: {border: "#4AD63A", background: "#E6FFE3"}}, // 9: mint + + {border: "#990000", background: "#EE0000", highlight: {border: "#BB0000", background: "#FF3333"}, hover: {border: "#BB0000", background: "#FF3333"}}, // 10:bright red + + {border: "#FF6000", background: "#FF6000", highlight: {border: "#FF6000", background: "#FF6000"}, hover: {border: "#FF6000", background: "#FF6000"}}, // 12: real orange + {border: "#97C2FC", background: "#2B7CE9", highlight: {border: "#D2E5FF", background: "#2B7CE9"}, hover: {border: "#D2E5FF", background: "#2B7CE9"}}, // 13: blue + {border: "#399605", background: "#255C03", highlight: {border: "#399605", background: "#255C03"}, hover: {border: "#399605", background: "#255C03"}}, // 14: green + {border: "#B70054", background: "#FF007E", highlight: {border: "#B70054", background: "#FF007E"}, hover: {border: "#B70054", background: "#FF007E"}}, // 15: magenta + {border: "#AD85E4", background: "#7C29F0", highlight: {border: "#D3BDF0", background: "#7C29F0"}, hover: {border: "#D3BDF0", background: "#7C29F0"}}, // 16: purple + {border: "#4557FA", background: "#000EA1", highlight: {border: "#6E6EFD", background: "#000EA1"}, hover: {border: "#6E6EFD", background: "#000EA1"}}, // 17: darkblue + {border: "#FFC0CB", background: "#FD5A77", highlight: {border: "#FFD1D9", background: "#FD5A77"}, hover: {border: "#FFD1D9", background: "#FD5A77"}}, // 18: pink + {border: "#C2FABC", background: "#74D66A", highlight: {border: "#E6FFE3", background: "#74D66A"}, hover: {border: "#E6FFE3", background: "#74D66A"}}, // 19: mint + + {border: "#EE0000", background: "#990000", highlight: {border: "#FF3333", background: "#BB0000"}, hover: {border: "#FF3333", background: "#BB0000"}}, // 20:bright red + ]; + + + /** + * Clear all groups + */ + Groups.prototype.clear = function () { + this.groups = {}; + this.groups.length = function() + { + var i = 0; + for ( var p in this ) { + if (this.hasOwnProperty(p)) { + i++; + } + } + return i; + } + }; + + + /** + * get group properties of a groupname. If groupname is not found, a new group + * is added. + * @param {*} groupname Can be a number, string, Date, etc. + * @return {Object} group The created group, containing all group properties + */ + Groups.prototype.get = function (groupname) { + var group = this.groups[groupname]; + if (group == undefined) { + if (this.useDefaultGroups === false && this.groupsArray.length > 0) { + // create new group + var index = this.groupIndex % this.groupsArray.length; + this.groupIndex++; + group = {}; + group.color = this.groups[this.groupsArray[index]]; + this.groups[groupname] = group; + } + else { + // create new group + var index = this.defaultIndex % Groups.DEFAULT.length; + this.defaultIndex++; + group = {}; + group.color = Groups.DEFAULT[index]; + this.groups[groupname] = group; + } + } + + return group; + }; + + /** + * Add a custom group style + * @param {String} groupName + * @param {Object} style An object containing borderColor, + * backgroundColor, etc. + * @return {Object} group The created group object + */ + Groups.prototype.add = function (groupName, style) { + this.groups[groupName] = style; + this.groupsArray.push(groupName); + return style; + }; + + module.exports = Groups; + + +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @class Images + * This class loads images and keeps them stored. + */ + function Images() { + this.images = {}; + this.imageBroken = {}; + this.callback = undefined; + } + + /** + * Set an onload callback function. This will be called each time an image + * is loaded + * @param {function} callback + */ + Images.prototype.setOnloadCallback = function(callback) { + this.callback = callback; + }; + + /** + * + * @param {string} url Url of the image + * @param {string} url Url of an image to use if the url image is not found + * @return {Image} img The image object + */ + Images.prototype.load = function(url, brokenUrl) { + var img = this.images[url]; // make a pointer + if (img === undefined) { + // create the image + var me = this; + img = new Image(); + img.onload = function () { + // IE11 fix -- thanks dponch! + if (this.width == 0) { + document.body.appendChild(this); + this.width = this.offsetWidth; + this.height = this.offsetHeight; + document.body.removeChild(this); + } + + if (me.callback) { + me.images[url] = img; + me.callback(this); + } + }; + + img.onerror = function () { + if (brokenUrl === undefined) { + console.error("Could not load image:", url); + delete this.src; + if (me.callback) { + me.callback(this); + } + } + else { + if (me.imageBroken[url] === true) { + if (this.src == brokenUrl) { + console.error("Could not load brokenImage:", brokenUrl); + delete this.src; + if (me.callback) { + me.callback(this); + } + } + else { + console.error("Could not load image:", url); + this.src = brokenUrl; + } + } + else { + console.error("Could not load image:", url); + this.src = brokenUrl; + me.imageBroken[url] = true; + } + } + }; + + img.src = url; + } + + return img; + }; + + module.exports = Images; + + +/***/ }, +/* 40 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + + /** + * @class Node + * A node. A node can be connected to other nodes via one or multiple edges. + * @param {object} properties An object containing properties for the node. All + * properties are optional, except for the id. + * {number} id Id of the node. Required + * {string} label Text label for the node + * {number} x Horizontal position of the node + * {number} y Vertical position of the node + * {string} shape Node shape, available: + * "database", "circle", "ellipse", + * "box", "image", "text", "dot", + * "star", "triangle", "triangleDown", + * "square", "icon" + * {string} image An image url + * {string} title An title text, can be HTML + * {anytype} group A group name or number + * @param {Network.Images} imagelist A list with images. Only needed + * when the node has an image + * @param {Network.Groups} grouplist A list with groups. Needed for + * retrieving group properties + * @param {Object} constants An object with default values for + * example for the color + * + */ + function Node(properties, imagelist, grouplist, networkConstants) { + var constants = util.selectiveBridgeObject(['nodes'],networkConstants); + this.options = constants.nodes; + + this.selected = false; + this.hover = false; + + this.edges = []; // all edges connected to this node + this.dynamicEdges = []; + this.reroutedEdges = {}; + + // set defaults for the properties + this.id = undefined; + this.allowedToMoveX = false; + this.allowedToMoveY = false; + this.xFixed = false; + this.yFixed = false; + this.horizontalAlignLeft = true; // these are for the navigation controls + this.verticalAlignTop = true; // these are for the navigation controls + this.baseRadiusValue = networkConstants.nodes.radius; + this.radiusFixed = false; + this.level = -1; + this.preassignedLevel = false; + this.hierarchyEnumerated = false; + this.labelDimensions = {top:0, left:0, width:0, height:0, yLine:0}; // could be cached + this.boundingBox = {top:0, left:0, right:0, bottom:0}; + + this.imagelist = imagelist; + this.grouplist = grouplist; + + // physics properties + this.fx = 0.0; // external force x + this.fy = 0.0; // external force y + this.vx = 0.0; // velocity x + this.vy = 0.0; // velocity y + this.x = null; + this.y = null; + this.predefinedPosition = false; // used to check if initial zoomExtent should just take the range or approximate + + // used for reverting to previous position on stabilization + this.previousState = {vx:0,vy:0,x:0,y:0}; + + this.damping = networkConstants.physics.damping; // written every time gravity is calculated + this.fixedData = {x:null,y:null}; + + this.setProperties(properties, constants); + + // creating the variables for clustering + this.resetCluster(); + this.clusterSession = 0; + this.clusterSizeWidthFactor = networkConstants.clustering.nodeScaling.width; + this.clusterSizeHeightFactor = networkConstants.clustering.nodeScaling.height; + this.clusterSizeRadiusFactor = networkConstants.clustering.nodeScaling.radius; + this.maxNodeSizeIncrements = networkConstants.clustering.maxNodeSizeIncrements; + this.growthIndicator = 0; + + // variables to tell the node about the network. + this.networkScaleInv = 1; + this.networkScale = 1; + this.canvasTopLeft = {"x": -300, "y": -300}; + this.canvasBottomRight = {"x": 300, "y": 300}; + this.parentEdgeId = null; + } + + + /** + * Revert the position and velocity of the previous step. + */ + Node.prototype.revertPosition = function() { + this.x = this.previousState.x; + this.y = this.previousState.y; + this.vx = this.previousState.vx; + this.vy = this.previousState.vy; + } + + + /** + * (re)setting the clustering variables and objects + */ + Node.prototype.resetCluster = function() { + // clustering variables + this.formationScale = undefined; // this is used to determine when to open the cluster + this.clusterSize = 1; // this signifies the total amount of nodes in this cluster + this.containedNodes = {}; + this.containedEdges = {}; + this.clusterSessions = []; + }; + + /** + * Attach a edge to the node + * @param {Edge} edge + */ + Node.prototype.attachEdge = function(edge) { + if (this.edges.indexOf(edge) == -1) { + this.edges.push(edge); + } + if (this.dynamicEdges.indexOf(edge) == -1) { + this.dynamicEdges.push(edge); + } + }; + + /** + * Detach a edge from the node + * @param {Edge} edge + */ + Node.prototype.detachEdge = function(edge) { + var index = this.edges.indexOf(edge); + if (index != -1) { + this.edges.splice(index, 1); + } + index = this.dynamicEdges.indexOf(edge); + if (index != -1) { + this.dynamicEdges.splice(index, 1); + } + }; + + + /** + * Set or overwrite properties for the node + * @param {Object} properties an object with properties + * @param {Object} constants and object with default, global properties + */ + Node.prototype.setProperties = function(properties, constants) { + if (!properties) { + return; + } + + var fields = ['borderWidth','borderWidthSelected','shape','image','brokenImage','radius','fontColor', + 'fontSize','fontFace','fontFill','fontStrokeWidth','fontStrokeColor','group','mass','fontDrawThreshold', + 'scaleFontWithValue','fontSizeMaxVisible','customScalingFunction','iconFontFace', 'icon', 'iconColor', 'iconSize' + ]; + util.selectiveDeepExtend(fields, this.options, properties); + + // basic properties + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.label !== undefined) {this.label = properties.label; this.originalLabel = properties.label;} + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.x !== undefined) {this.x = properties.x; this.predefinedPosition = true;} + if (properties.y !== undefined) {this.y = properties.y; this.predefinedPosition = true;} + if (properties.value !== undefined) {this.value = properties.value;} + if (properties.level !== undefined) {this.level = properties.level; this.preassignedLevel = true;} + + // navigation controls properties + if (properties.horizontalAlignLeft !== undefined) {this.horizontalAlignLeft = properties.horizontalAlignLeft;} + if (properties.verticalAlignTop !== undefined) {this.verticalAlignTop = properties.verticalAlignTop;} + if (properties.triggerFunction !== undefined) {this.triggerFunction = properties.triggerFunction;} + + if (this.id === undefined) { + throw "Node must have an id"; + } + + // copy group properties + if (typeof properties.group === 'number' || (typeof properties.group === 'string' && properties.group != '')) { + var groupObj = this.grouplist.get(properties.group); + util.deepExtend(this.options, groupObj); + // the color object needs to be completely defined. Since groups can partially overwrite the colors, we parse it again, just in case. + this.options.color = util.parseColor(this.options.color); + } + // individual shape properties + if (properties.radius !== undefined) {this.baseRadiusValue = this.options.radius;} + if (properties.color !== undefined) {this.options.color = util.parseColor(properties.color);} + + if (this.options.image !== undefined && this.options.image!= "") { + if (this.imagelist) { + this.imageObj = this.imagelist.load(this.options.image, this.options.brokenImage); + } + else { + throw "No imagelist provided"; + } + } + + if (properties.allowedToMoveX !== undefined) { + this.xFixed = !properties.allowedToMoveX; + this.allowedToMoveX = properties.allowedToMoveX; + } + else if (properties.x !== undefined && this.allowedToMoveX == false) { + this.xFixed = true; + } + + + if (properties.allowedToMoveY !== undefined) { + this.yFixed = !properties.allowedToMoveY; + this.allowedToMoveY = properties.allowedToMoveY; + } + else if (properties.y !== undefined && this.allowedToMoveY == false) { + this.yFixed = true; + } + + this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); + + if (this.options.shape === 'image' || this.options.shape === 'circularImage') { + this.options.radiusMin = constants.nodes.widthMin; + this.options.radiusMax = constants.nodes.widthMax; + } + + // choose draw method depending on the shape + switch (this.options.shape) { + case 'database': this.draw = this._drawDatabase; this.resize = this._resizeDatabase; break; + case 'box': this.draw = this._drawBox; this.resize = this._resizeBox; break; + case 'circle': this.draw = this._drawCircle; this.resize = this._resizeCircle; break; + case 'ellipse': this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; + // TODO: add diamond shape + case 'image': this.draw = this._drawImage; this.resize = this._resizeImage; break; + case 'circularImage': this.draw = this._drawCircularImage; this.resize = this._resizeCircularImage; break; + case 'text': this.draw = this._drawText; this.resize = this._resizeText; break; + case 'dot': this.draw = this._drawDot; this.resize = this._resizeShape; break; + case 'square': this.draw = this._drawSquare; this.resize = this._resizeShape; break; + case 'triangle': this.draw = this._drawTriangle; this.resize = this._resizeShape; break; + case 'triangleDown': this.draw = this._drawTriangleDown; this.resize = this._resizeShape; break; + case 'star': this.draw = this._drawStar; this.resize = this._resizeShape; break; + case 'icon': this.draw = this._drawIcon; this.resize = this._resizeIcon; break; + default: this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; + } + // reset the size of the node, this can be changed + this._reset(); + + }; + + /** + * select this node + */ + Node.prototype.select = function() { + this.selected = true; + this._reset(); + }; + + /** + * unselect this node + */ + Node.prototype.unselect = function() { + this.selected = false; + this._reset(); + }; + + + /** + * Reset the calculated size of the node, forces it to recalculate its size + */ + Node.prototype.clearSizeCache = function() { + this._reset(); + }; + + /** + * Reset the calculated size of the node, forces it to recalculate its size + * @private + */ + Node.prototype._reset = function() { + this.width = undefined; + this.height = undefined; + }; + + /** + * get the title of this node. + * @return {string} title The title of the node, or undefined when no title + * has been set. + */ + Node.prototype.getTitle = function() { + return typeof this.title === "function" ? this.title() : this.title; + }; + + /** + * Calculate the distance to the border of the Node + * @param {CanvasRenderingContext2D} ctx + * @param {Number} angle Angle in radians + * @returns {number} distance Distance to the border in pixels + */ + Node.prototype.distanceToBorder = function (ctx, angle) { + var borderWidth = 1; + + if (!this.width) { + this.resize(ctx); + } + + switch (this.options.shape) { + case 'circle': + case 'dot': + return this.options.radius+ borderWidth; + + case 'ellipse': + var a = this.width / 2; + var b = this.height / 2; + var w = (Math.sin(angle) * a); + var h = (Math.cos(angle) * b); + return a * b / Math.sqrt(w * w + h * h); + + // TODO: implement distanceToBorder for database + // TODO: implement distanceToBorder for triangle + // TODO: implement distanceToBorder for triangleDown + + case 'box': + case 'image': + case 'text': + default: + if (this.width) { + return Math.min( + Math.abs(this.width / 2 / Math.cos(angle)), + Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; + // TODO: reckon with border radius too in case of box + } + else { + return 0; + } + + } + // TODO: implement calculation of distance to border for all shapes + }; + + /** + * Set forces acting on the node + * @param {number} fx Force in horizontal direction + * @param {number} fy Force in vertical direction + */ + Node.prototype._setForce = function(fx, fy) { + this.fx = fx; + this.fy = fy; + }; + + /** + * Add forces acting on the node + * @param {number} fx Force in horizontal direction + * @param {number} fy Force in vertical direction + * @private + */ + Node.prototype._addForce = function(fx, fy) { + this.fx += fx; + this.fy += fy; + }; + + /** + * Store the state before the next step + */ + Node.prototype.storeState = function() { + this.previousState.x = this.x; + this.previousState.y = this.y; + this.previousState.vx = this.vx; + this.previousState.vy = this.vy; + } + + /** + * Perform one discrete step for the node + * @param {number} interval Time interval in seconds + */ + Node.prototype.discreteStep = function(interval) { + this.storeState(); + if (!this.xFixed) { + var dx = this.damping * this.vx; // damping force + var ax = (this.fx - dx) / this.options.mass; // acceleration + this.vx += ax * interval; // velocity + this.x += this.vx * interval; // position + } + else { + this.fx = 0; + this.vx = 0; + } + + if (!this.yFixed) { + var dy = this.damping * this.vy; // damping force + var ay = (this.fy - dy) / this.options.mass; // acceleration + this.vy += ay * interval; // velocity + this.y += this.vy * interval; // position + } + else { + this.fy = 0; + this.vy = 0; + } + }; + + + + /** + * Perform one discrete step for the node + * @param {number} interval Time interval in seconds + * @param {number} maxVelocity The speed limit imposed on the velocity + */ + Node.prototype.discreteStepLimited = function(interval, maxVelocity) { + this.storeState(); + if (!this.xFixed) { + var dx = this.damping * this.vx; // damping force + var ax = (this.fx - dx) / this.options.mass; // acceleration + this.vx += ax * interval; // velocity + this.vx = (Math.abs(this.vx) > maxVelocity) ? ((this.vx > 0) ? maxVelocity : -maxVelocity) : this.vx; + this.x += this.vx * interval; // position + } + else { + this.fx = 0; + this.vx = 0; + } + + if (!this.yFixed) { + var dy = this.damping * this.vy; // damping force + var ay = (this.fy - dy) / this.options.mass; // acceleration + this.vy += ay * interval; // velocity + this.vy = (Math.abs(this.vy) > maxVelocity) ? ((this.vy > 0) ? maxVelocity : -maxVelocity) : this.vy; + this.y += this.vy * interval; // position + } + else { + this.fy = 0; + this.vy = 0; + } + }; + + /** + * Check if this node has a fixed x and y position + * @return {boolean} true if fixed, false if not + */ + Node.prototype.isFixed = function() { + return (this.xFixed && this.yFixed); + }; + + /** + * Check if this node is moving + * @param {number} vmin the minimum velocity considered as "moving" + * @return {boolean} true if moving, false if it has no velocity + */ + Node.prototype.isMoving = function(vmin) { + var velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)); + // this.velocity = Math.sqrt(Math.pow(this.vx,2) + Math.pow(this.vy,2)) + return (velocity > vmin); + }; + + /** + * check if this node is selecte + * @return {boolean} selected True if node is selected, else false + */ + Node.prototype.isSelected = function() { + return this.selected; + }; + + /** + * Retrieve the value of the node. Can be undefined + * @return {Number} value + */ + Node.prototype.getValue = function() { + return this.value; + }; + + /** + * Calculate the distance from the nodes location to the given location (x,y) + * @param {Number} x + * @param {Number} y + * @return {Number} value + */ + Node.prototype.getDistance = function(x, y) { + var dx = this.x - x, + dy = this.y - y; + return Math.sqrt(dx * dx + dy * dy); + }; + + + /** + * Adjust the value range of the node. The node will adjust it's radius + * based on its value. + * @param {Number} min + * @param {Number} max + */ + Node.prototype.setValueRange = function(min, max, total) { + if (!this.radiusFixed && this.value !== undefined) { + var scale = this.options.customScalingFunction(min, max, total, this.value); + var radiusDiff = this.options.radiusMax - this.options.radiusMin; + if (this.options.scaleFontWithValue == true) { + var fontDiff = this.options.fontSizeMax - this.options.fontSizeMin; + this.options.fontSize = this.options.fontSizeMin + scale * fontDiff; + } + this.options.radius = this.options.radiusMin + scale * radiusDiff; + } + + this.baseRadiusValue = this.options.radius; + }; + + /** + * Draw this node in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + */ + Node.prototype.draw = function(ctx) { + throw "Draw method not initialized for node"; + }; + + /** + * Recalculate the size of this node in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + */ + Node.prototype.resize = function(ctx) { + throw "Resize method not initialized for node"; + }; + + /** + * Check if this object is overlapping with the provided object + * @param {Object} obj an object with parameters left, top, right, bottom + * @return {boolean} True if location is located on node + */ + Node.prototype.isOverlappingWith = function(obj) { + return (this.left < obj.right && + this.left + this.width > obj.left && + this.top < obj.bottom && + this.top + this.height > obj.top); + }; + + Node.prototype._resizeImage = function (ctx) { + // TODO: pre calculate the image size + + if (!this.width || !this.height) { // undefined or 0 + var width, height; + if (this.value) { + this.options.radius= this.baseRadiusValue; + var scale = this.imageObj.height / this.imageObj.width; + if (scale !== undefined) { + width = this.options.radius|| this.imageObj.width; + height = this.options.radius* scale || this.imageObj.height; + } + else { + width = 0; + height = 0; + } + } + else { + width = this.imageObj.width; + height = this.imageObj.height; + } + this.width = width; + this.height = height; + + this.growthIndicator = 0; + if (this.width > 0 && this.height > 0) { + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - width; + } + } + }; + + Node.prototype._drawImageAtPosition = function (ctx) { + if (this.imageObj.width != 0 ) { + // draw the shade + if (this.clusterSize > 1) { + var lineWidth = ((this.clusterSize > 1) ? 10 : 0.0); + lineWidth *= this.networkScaleInv; + lineWidth = Math.min(0.2 * this.width,lineWidth); + + ctx.globalAlpha = 0.5; + ctx.drawImage(this.imageObj, this.left - lineWidth, this.top - lineWidth, this.width + 2*lineWidth, this.height + 2*lineWidth); + } + + // draw the image + ctx.globalAlpha = 1.0; + ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); + } + }; + + Node.prototype._drawImageLabel = function (ctx) { + var yLabel; + var offset = 0; + + if (this.height){ + offset = this.height / 2; + var labelDimensions = this.getTextSize(ctx); + + if (labelDimensions.lineCount >= 1){ + offset += labelDimensions.height / 2; + offset += 3; + } + } + + yLabel = this.y + offset; + + this._label(ctx, this.label, this.x, yLabel, undefined); + }; + + Node.prototype._drawImage = function (ctx) { + this._resizeImage(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + this._drawImageAtPosition(ctx); + + this.boundingBox.top = this.top; + this.boundingBox.left = this.left; + this.boundingBox.right = this.left + this.width; + this.boundingBox.bottom = this.top + this.height; + + this._drawImageLabel(ctx); + this.boundingBox.left = Math.min(this.boundingBox.left, this.labelDimensions.left); + this.boundingBox.right = Math.max(this.boundingBox.right, this.labelDimensions.left + this.labelDimensions.width); + this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelDimensions.height); + }; + + Node.prototype._resizeCircularImage = function (ctx) { + if(!this.imageObj.src || !this.imageObj.width || !this.imageObj.height){ + if (!this.width) { + var diameter = this.options.radius * 2; + this.width = diameter; + this.height = diameter; + + // scaling used for clustering + //this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; + //this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; + this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + this.growthIndicator = this.options.radius- 0.5*diameter; + this._swapToImageResizeWhenImageLoaded = true; + } + } + else { + if (this._swapToImageResizeWhenImageLoaded) { + this.width = 0; + this.height = 0; + delete this._swapToImageResizeWhenImageLoaded; + } + this._resizeImage(ctx); + } + + }; + + Node.prototype._drawCircularImage = function (ctx) { + this._resizeCircularImage(ctx); + + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + var centerX = this.left + (this.width / 2); + var centerY = this.top + (this.height / 2); + var radius = Math.abs(this.height / 2); + + this._drawRawCircle(ctx, centerX, centerY, radius); + + ctx.save(); + ctx.circle(this.x, this.y, radius); + ctx.stroke(); + ctx.clip(); + + this._drawImageAtPosition(ctx); + + ctx.restore(); + + this.boundingBox.top = this.y - this.options.radius; + this.boundingBox.left = this.x - this.options.radius; + this.boundingBox.right = this.x + this.options.radius; + this.boundingBox.bottom = this.y + this.options.radius; + + this._drawImageLabel(ctx); + + this.boundingBox.left = Math.min(this.boundingBox.left, this.labelDimensions.left); + this.boundingBox.right = Math.max(this.boundingBox.right, this.labelDimensions.left + this.labelDimensions.width); + this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelDimensions.height); + }; + + Node.prototype._resizeBox = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + this.width = textSize.width + 2 * margin; + this.height = textSize.height + 2 * margin; + + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; + this.growthIndicator = this.width - (textSize.width + 2 * margin); + // this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + + } + }; + + Node.prototype._drawBox = function (ctx) { + this._resizeBox(ctx); + + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.roundRect(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth, this.options.radius); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + + ctx.roundRect(this.left, this.top, this.width, this.height, this.options.radius); + ctx.fill(); + ctx.stroke(); + + this.boundingBox.top = this.top; + this.boundingBox.left = this.left; + this.boundingBox.right = this.left + this.width; + this.boundingBox.bottom = this.top + this.height; + + this._label(ctx, this.label, this.x, this.y); + }; + + + Node.prototype._resizeDatabase = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + var size = textSize.width + 2 * margin; + this.width = size; + this.height = size; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - size; + } + }; + + Node.prototype._drawDatabase = function (ctx) { + this._resizeDatabase(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.database(this.x - this.width/2 - 2*ctx.lineWidth, this.y - this.height*0.5 - 2*ctx.lineWidth, this.width + 4*ctx.lineWidth, this.height + 4*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + ctx.database(this.x - this.width/2, this.y - this.height*0.5, this.width, this.height); + ctx.fill(); + ctx.stroke(); + + this.boundingBox.top = this.top; + this.boundingBox.left = this.left; + this.boundingBox.right = this.left + this.width; + this.boundingBox.bottom = this.top + this.height; + + this._label(ctx, this.label, this.x, this.y); + }; + + + Node.prototype._resizeCircle = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + var diameter = Math.max(textSize.width, textSize.height) + 2 * margin; + this.options.radius = diameter / 2; + + this.width = diameter; + this.height = diameter; + + // scaling used for clustering + // this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; + // this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; + this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + this.growthIndicator = this.options.radius- 0.5*diameter; + } + }; + + Node.prototype._drawRawCircle = function (ctx, x, y, radius) { + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.circle(x, y, radius+2*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + ctx.circle(this.x, this.y, radius); + ctx.fill(); + ctx.stroke(); + }; + + Node.prototype._drawCircle = function (ctx) { + this._resizeCircle(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + this._drawRawCircle(ctx, this.x, this.y, this.options.radius); + + this.boundingBox.top = this.y - this.options.radius; + this.boundingBox.left = this.x - this.options.radius; + this.boundingBox.right = this.x + this.options.radius; + this.boundingBox.bottom = this.y + this.options.radius; + + this._label(ctx, this.label, this.x, this.y); + }; + + Node.prototype._resizeEllipse = function (ctx) { + if (!this.width) { + var textSize = this.getTextSize(ctx); + + this.width = textSize.width * 1.5; + this.height = textSize.height * 2; + if (this.width < this.height) { + this.width = this.height; + } + var defaultSize = this.width; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - defaultSize; + } + }; + + Node.prototype._drawEllipse = function (ctx) { + this._resizeEllipse(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.ellipse(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + + ctx.ellipse(this.left, this.top, this.width, this.height); + ctx.fill(); + ctx.stroke(); + + this.boundingBox.top = this.top; + this.boundingBox.left = this.left; + this.boundingBox.right = this.left + this.width; + this.boundingBox.bottom = this.top + this.height; + + this._label(ctx, this.label, this.x, this.y); + }; + + Node.prototype._drawDot = function (ctx) { + this._drawShape(ctx, 'circle'); + }; + + Node.prototype._drawTriangle = function (ctx) { + this._drawShape(ctx, 'triangle'); + }; + + Node.prototype._drawTriangleDown = function (ctx) { + this._drawShape(ctx, 'triangleDown'); + }; + + Node.prototype._drawSquare = function (ctx) { + this._drawShape(ctx, 'square'); + }; + + Node.prototype._drawStar = function (ctx) { + this._drawShape(ctx, 'star'); + }; + + Node.prototype._resizeShape = function (ctx) { + if (!this.width) { + this.options.radius= this.baseRadiusValue; + var size = 2 * this.options.radius; + this.width = size; + this.height = size; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - size; + } + }; + + Node.prototype._drawShape = function (ctx, shape) { + this._resizeShape(ctx); + + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + var clusterLineWidth = 2.5; + var borderWidth = this.options.borderWidth; + var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth; + var radiusMultiplier = 2; + + // choose draw method depending on the shape + switch (shape) { + case 'dot': radiusMultiplier = 2; break; + case 'square': radiusMultiplier = 2; break; + case 'triangle': radiusMultiplier = 3; break; + case 'triangleDown': radiusMultiplier = 3; break; + case 'star': radiusMultiplier = 4; break; + } + + ctx.strokeStyle = this.selected ? this.options.color.highlight.border : this.hover ? this.options.color.hover.border : this.options.color.border; + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx[shape](this.x, this.y, this.options.radius+ radiusMultiplier * ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : borderWidth) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(this.width,ctx.lineWidth); + + ctx.fillStyle = this.selected ? this.options.color.highlight.background : this.hover ? this.options.color.hover.background : this.options.color.background; + ctx[shape](this.x, this.y, this.options.radius); + ctx.fill(); + ctx.stroke(); + + this.boundingBox.top = this.y - this.options.radius; + this.boundingBox.left = this.x - this.options.radius; + this.boundingBox.right = this.x + this.options.radius; + this.boundingBox.bottom = this.y + this.options.radius; + + if (this.label) { + this._label(ctx, this.label, this.x, this.y + this.height / 2, undefined, 'hanging',true); + this.boundingBox.left = Math.min(this.boundingBox.left, this.labelDimensions.left); + this.boundingBox.right = Math.max(this.boundingBox.right, this.labelDimensions.left + this.labelDimensions.width); + this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelDimensions.height); + } + }; + + Node.prototype._resizeText = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + this.width = textSize.width + 2 * margin; + this.height = textSize.height + 2 * margin; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius+= Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - (textSize.width + 2 * margin); + } + }; + + Node.prototype._drawText = function (ctx) { + this._resizeText(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + + this._label(ctx, this.label, this.x, this.y); + + this.boundingBox.top = this.top; + this.boundingBox.left = this.left; + this.boundingBox.right = this.left + this.width; + this.boundingBox.bottom = this.top + this.height; + }; + + Node.prototype._resizeIcon = function (ctx) { + if (!this.width) { + var margin = 5; + var iconSize = + { + width: Number(this.options.iconSize), + height: Number(this.options.iconSize) + }; + this.width = iconSize.width + 2 * margin; + this.height = iconSize.height + 2 * margin; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.options.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - (iconSize.width + 2 * margin); + } + }; + + Node.prototype._drawIcon = function (ctx) { + this._resizeIcon(ctx); + + this.options.iconSize = this.options.iconSize || 50; + + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; + this._icon(ctx); + + + this.boundingBox.top = this.y - this.options.iconSize/2; + this.boundingBox.left = this.x - this.options.iconSize/2; + this.boundingBox.right = this.x + this.options.iconSize/2; + this.boundingBox.bottom = this.y + this.options.iconSize/2; + + if (this.label) { + var iconTextSpacing = 5; + this._label(ctx, this.label, this.x, this.y + this.height / 2 + iconTextSpacing, 'top', true); + + this.boundingBox.left = Math.min(this.boundingBox.left, this.labelDimensions.left); + this.boundingBox.right = Math.max(this.boundingBox.right, this.labelDimensions.left + this.labelDimensions.width); + this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelDimensions.height); + } + }; + + Node.prototype._icon = function (ctx) { + var relativeIconSize = Number(this.options.iconSize) * this.networkScale; + + if (this.options.icon && relativeIconSize > this.options.fontDrawThreshold - 1) { + + var iconSize = Number(this.options.iconSize); + + ctx.font = (this.selected ? "bold " : "") + iconSize + "px " + this.options.iconFontFace; + + // draw icon + ctx.fillStyle = this.options.iconColor || "black"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(this.options.icon, this.x, this.y); + } + }; + + Node.prototype._label = function (ctx, text, x, y, align, baseline, labelUnderNode) { + var relativeFontSize = Number(this.options.fontSize) * this.networkScale; + if (text && relativeFontSize >= this.options.fontDrawThreshold - 1) { + var fontSize = Number(this.options.fontSize); + + // this ensures that there will not be HUGE letters on screen by setting an upper limit on the visible text size (regardless of zoomLevel) + if (relativeFontSize >= this.options.fontSizeMaxVisible) { + fontSize = Number(this.options.fontSizeMaxVisible) * this.networkScaleInv; + } + + // fade in when relative scale is between threshold and threshold - 1 + var fontColor = this.options.fontColor || "#000000"; + var strokecolor = this.options.fontStrokeColor; + if (relativeFontSize <= this.options.fontDrawThreshold) { + var opacity = Math.max(0,Math.min(1,1 - (this.options.fontDrawThreshold - relativeFontSize))); + fontColor = util.overrideOpacity(fontColor, opacity); + strokecolor = util.overrideOpacity(strokecolor, opacity); + + } + + ctx.font = (this.selected ? "bold " : "") + fontSize + "px " + this.options.fontFace; + + var lines = text.split('\n'); + var lineCount = lines.length; + var yLine = y + (1 - lineCount) / 2 * fontSize; + if (labelUnderNode == true) { + yLine = y + (1 - lineCount) / (2 * fontSize); + } + + // font fill from edges now for nodes! + var width = ctx.measureText(lines[0]).width; + for (var i = 1; i < lineCount; i++) { + var lineWidth = ctx.measureText(lines[i]).width; + width = lineWidth > width ? lineWidth : width; + } + var height = fontSize * lineCount; + var left = x - width / 2; + var top = y - height / 2; + if (baseline == "hanging") { + top += 0.5 * fontSize; + top += 4; // distance from node, required because we use hanging. Hanging has less difference between browsers + yLine += 4; // distance from node + } + this.labelDimensions = {top:top,left:left,width:width,height:height,yLine:yLine}; + + // create the fontfill background + if (this.options.fontFill !== undefined && this.options.fontFill !== null && this.options.fontFill !== "none") { + ctx.fillStyle = this.options.fontFill; + ctx.fillRect(left, top, width, height); + } + + // draw text + ctx.fillStyle = fontColor; + ctx.textAlign = align || "center"; + ctx.textBaseline = baseline || "middle"; + if (this.options.fontStrokeWidth > 0){ + ctx.lineWidth = this.options.fontStrokeWidth; + ctx.strokeStyle = strokecolor; + ctx.lineJoin = 'round'; + } + for (var i = 0; i < lineCount; i++) { + if(this.options.fontStrokeWidth){ + ctx.strokeText(lines[i], x, yLine); + } + ctx.fillText(lines[i], x, yLine); + yLine += fontSize; + } + } + }; + + + Node.prototype.getTextSize = function(ctx) { + if (this.label !== undefined) { + var fontSize = Number(this.options.fontSize); + if (fontSize * this.networkScale > this.options.fontSizeMaxVisible) { + fontSize = Number(this.options.fontSizeMaxVisible) * this.networkScaleInv; + } + ctx.font = (this.selected ? "bold " : "") + fontSize + "px " + this.options.fontFace; + + var lines = this.label.split('\n'), + height = (fontSize + 4) * lines.length, + width = 0; + + for (var i = 0, iMax = lines.length; i < iMax; i++) { + width = Math.max(width, ctx.measureText(lines[i]).width); + } + + return {"width": width, "height": height, lineCount: lines.length}; + } + else { + return {"width": 0, "height": 0, lineCount: 0}; + } + }; + + /** + * this is used to determine if a node is visible at all. this is used to determine when it needs to be drawn. + * there is a safety margin of 0.3 * width; + * + * @returns {boolean} + */ + Node.prototype.inArea = function() { + if (this.width !== undefined) { + return (this.x + this.width *this.networkScaleInv >= this.canvasTopLeft.x && + this.x - this.width *this.networkScaleInv < this.canvasBottomRight.x && + this.y + this.height*this.networkScaleInv >= this.canvasTopLeft.y && + this.y - this.height*this.networkScaleInv < this.canvasBottomRight.y); + } + else { + return true; + } + }; + + /** + * checks if the core of the node is in the display area, this is used for opening clusters around zoom + * @returns {boolean} + */ + Node.prototype.inView = function() { + return (this.x >= this.canvasTopLeft.x && + this.x < this.canvasBottomRight.x && + this.y >= this.canvasTopLeft.y && + this.y < this.canvasBottomRight.y); + }; + + /** + * This allows the zoom level of the network to influence the rendering + * We store the inverted scale and the coordinates of the top left, and bottom right points of the canvas + * + * @param scale + * @param canvasTopLeft + * @param canvasBottomRight + */ + Node.prototype.setScaleAndPos = function(scale,canvasTopLeft,canvasBottomRight) { + this.networkScaleInv = 1.0/scale; + this.networkScale = scale; + this.canvasTopLeft = canvasTopLeft; + this.canvasBottomRight = canvasBottomRight; + }; + + + /** + * This allows the zoom level of the network to influence the rendering + * + * @param scale + */ + Node.prototype.setScale = function(scale) { + this.networkScaleInv = 1.0/scale; + this.networkScale = scale; + }; + + + + /** + * set the velocity at 0. Is called when this node is contained in another during clustering + */ + Node.prototype.clearVelocity = function() { + this.vx = 0; + this.vy = 0; + }; + + + /** + * Basic preservation of (kinectic) energy + * + * @param massBeforeClustering + */ + Node.prototype.updateVelocity = function(massBeforeClustering) { + var energyBefore = this.vx * this.vx * massBeforeClustering; + //this.vx = (this.vx < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); + this.vx = Math.sqrt(energyBefore/this.options.mass); + energyBefore = this.vy * this.vy * massBeforeClustering; + //this.vy = (this.vy < 0) ? -Math.sqrt(energyBefore/this.options.mass) : Math.sqrt(energyBefore/this.options.mass); + this.vy = Math.sqrt(energyBefore/this.options.mass); + }; + + module.exports = Node; + + +/***/ }, +/* 41 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Popup is a class to create a popup window with some text + * @param {Element} container The container object. + * @param {Number} [x] + * @param {Number} [y] + * @param {String} [text] + * @param {Object} [style] An object containing borderColor, + * backgroundColor, etc. + */ + function Popup(container, x, y, text, style) { + if (container) { + this.container = container; + } + else { + this.container = document.body; + } + + // x, y and text are optional, see if a style object was passed in their place + if (style === undefined) { + if (typeof x === "object") { + style = x; + x = undefined; + } else if (typeof text === "object") { + style = text; + text = undefined; + } else { + // for backwards compatibility, in case clients other than Network are creating Popup directly + style = { + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + color: { + border: '#666', + background: '#FFFFC6' + } + } + } + } + + this.x = 0; + this.y = 0; + this.padding = 5; + this.hidden = false; + + if (x !== undefined && y !== undefined) { + this.setPosition(x, y); + } + if (text !== undefined) { + this.setText(text); + } + + // create the frame + this.frame = document.createElement('div'); + this.frame.className = 'network-tooltip'; + this.frame.style.color = style.fontColor; + this.frame.style.backgroundColor = style.color.background; + this.frame.style.borderColor = style.color.border; + this.frame.style.fontSize = style.fontSize + 'px'; + this.frame.style.fontFamily = style.fontFace; + this.container.appendChild(this.frame); + } + + /** + * @param {number} x Horizontal position of the popup window + * @param {number} y Vertical position of the popup window + */ + Popup.prototype.setPosition = function(x, y) { + this.x = parseInt(x); + this.y = parseInt(y); + }; + + /** + * Set the content for the popup window. This can be HTML code or text. + * @param {string | Element} content + */ + Popup.prototype.setText = function(content) { + if (content instanceof Element) { + this.frame.innerHTML = ''; + this.frame.appendChild(content); + } + else { + this.frame.innerHTML = content; // string containing text or HTML + } + }; + + /** + * Show the popup window + * @param {boolean} show Optional. Show or hide the window + */ + Popup.prototype.show = function (show) { + if (show === undefined) { + show = true; + } + + if (show) { + var height = this.frame.clientHeight; + var width = this.frame.clientWidth; + var maxHeight = this.frame.parentNode.clientHeight; + var maxWidth = this.frame.parentNode.clientWidth; + + var top = (this.y - height); + if (top + height + this.padding > maxHeight) { + top = maxHeight - height - this.padding; + } + if (top < this.padding) { + top = this.padding; + } + + var left = this.x; + if (left + width + this.padding > maxWidth) { + left = maxWidth - width - this.padding; + } + if (left < this.padding) { + left = this.padding; + } + + this.frame.style.left = left + "px"; + this.frame.style.top = top + "px"; + this.frame.style.visibility = "visible"; + this.hidden = false; + } + else { + this.hide(); + } + }; + + /** + * Hide the popup window + */ + Popup.prototype.hide = function () { + this.hidden = true; + this.frame.style.visibility = "hidden"; + }; + + module.exports = Popup; + + +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Parse a text source containing data in DOT language into a JSON object. + * The object contains two lists: one with nodes and one with edges. + * + * DOT language reference: http://www.graphviz.org/doc/info/lang.html + * + * @param {String} data Text containing a graph in DOT-notation + * @return {Object} graph An object containing two parameters: + * {Object[]} nodes + * {Object[]} edges + */ + function parseDOT (data) { + dot = data; + return parseGraph(); + } + + // token types enumeration + var TOKENTYPE = { + NULL : 0, + DELIMITER : 1, + IDENTIFIER: 2, + UNKNOWN : 3 + }; + + // map with all delimiters + var DELIMITERS = { + '{': true, + '}': true, + '[': true, + ']': true, + ';': true, + '=': true, + ',': true, + + '->': true, + '--': true + }; + + var dot = ''; // current dot file + var index = 0; // current index in dot file + var c = ''; // current token character in expr + var token = ''; // current token + var tokenType = TOKENTYPE.NULL; // type of the token + + /** + * Get the first character from the dot file. + * The character is stored into the char c. If the end of the dot file is + * reached, the function puts an empty string in c. + */ + function first() { + index = 0; + c = dot.charAt(0); + } + + /** + * Get the next character from the dot file. + * The character is stored into the char c. If the end of the dot file is + * reached, the function puts an empty string in c. + */ + function next() { + index++; + c = dot.charAt(index); + } + + /** + * Preview the next character from the dot file. + * @return {String} cNext + */ + function nextPreview() { + return dot.charAt(index + 1); + } + + /** + * Test whether given character is alphabetic or numeric + * @param {String} c + * @return {Boolean} isAlphaNumeric + */ + var regexAlphaNumeric = /[a-zA-Z_0-9.:#]/; + function isAlphaNumeric(c) { + return regexAlphaNumeric.test(c); + } + + /** + * Merge all properties of object b into object b + * @param {Object} a + * @param {Object} b + * @return {Object} a + */ + function merge (a, b) { + if (!a) { + a = {}; + } + + if (b) { + for (var name in b) { + if (b.hasOwnProperty(name)) { + a[name] = b[name]; + } + } + } + return a; + } + + /** + * Set a value in an object, where the provided parameter name can be a + * path with nested parameters. For example: + * + * var obj = {a: 2}; + * setValue(obj, 'b.c', 3); // obj = {a: 2, b: {c: 3}} + * + * @param {Object} obj + * @param {String} path A parameter name or dot-separated parameter path, + * like "color.highlight.border". + * @param {*} value + */ + function setValue(obj, path, value) { + var keys = path.split('.'); + var o = obj; + while (keys.length) { + var key = keys.shift(); + if (keys.length) { + // this isn't the end point + if (!o[key]) { + o[key] = {}; + } + o = o[key]; + } + else { + // this is the end point + o[key] = value; + } + } + } + + /** + * Add a node to a graph object. If there is already a node with + * the same id, their attributes will be merged. + * @param {Object} graph + * @param {Object} node + */ + function addNode(graph, node) { + var i, len; + var current = null; + + // find root graph (in case of subgraph) + var graphs = [graph]; // list with all graphs from current graph to root graph + var root = graph; + while (root.parent) { + graphs.push(root.parent); + root = root.parent; + } + + // find existing node (at root level) by its id + if (root.nodes) { + for (i = 0, len = root.nodes.length; i < len; i++) { + if (node.id === root.nodes[i].id) { + current = root.nodes[i]; + break; + } + } + } + + if (!current) { + // this is a new node + current = { + id: node.id + }; + if (graph.node) { + // clone default attributes + current.attr = merge(current.attr, graph.node); + } + } + + // add node to this (sub)graph and all its parent graphs + for (i = graphs.length - 1; i >= 0; i--) { + var g = graphs[i]; + + if (!g.nodes) { + g.nodes = []; + } + if (g.nodes.indexOf(current) == -1) { + g.nodes.push(current); + } + } + + // merge attributes + if (node.attr) { + current.attr = merge(current.attr, node.attr); + } + } + + /** + * Add an edge to a graph object + * @param {Object} graph + * @param {Object} edge + */ + function addEdge(graph, edge) { + if (!graph.edges) { + graph.edges = []; + } + graph.edges.push(edge); + if (graph.edge) { + var attr = merge({}, graph.edge); // clone default attributes + edge.attr = merge(attr, edge.attr); // merge attributes + } + } + + /** + * Create an edge to a graph object + * @param {Object} graph + * @param {String | Number | Object} from + * @param {String | Number | Object} to + * @param {String} type + * @param {Object | null} attr + * @return {Object} edge + */ + function createEdge(graph, from, to, type, attr) { + var edge = { + from: from, + to: to, + type: type + }; + + if (graph.edge) { + edge.attr = merge({}, graph.edge); // clone default attributes + } + edge.attr = merge(edge.attr || {}, attr); // merge attributes + + return edge; + } + + /** + * Get next token in the current dot file. + * The token and token type are available as token and tokenType + */ + function getToken() { + tokenType = TOKENTYPE.NULL; + token = ''; + + // skip over whitespaces + while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter + next(); + } + + do { + var isComment = false; + + // skip comment + if (c == '#') { + // find the previous non-space character + var i = index - 1; + while (dot.charAt(i) == ' ' || dot.charAt(i) == '\t') { + i--; + } + if (dot.charAt(i) == '\n' || dot.charAt(i) == '') { + // the # is at the start of a line, this is indeed a line comment + while (c != '' && c != '\n') { + next(); + } + isComment = true; + } + } + if (c == '/' && nextPreview() == '/') { + // skip line comment + while (c != '' && c != '\n') { + next(); + } + isComment = true; + } + if (c == '/' && nextPreview() == '*') { + // skip block comment + while (c != '') { + if (c == '*' && nextPreview() == '/') { + // end of block comment found. skip these last two characters + next(); + next(); + break; + } + else { + next(); + } + } + isComment = true; + } + + // skip over whitespaces + while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter + next(); + } + } + while (isComment); + + // check for end of dot file + if (c == '') { + // token is still empty + tokenType = TOKENTYPE.DELIMITER; + return; + } + + // check for delimiters consisting of 2 characters + var c2 = c + nextPreview(); + if (DELIMITERS[c2]) { + tokenType = TOKENTYPE.DELIMITER; + token = c2; + next(); + next(); + return; + } + + // check for delimiters consisting of 1 character + if (DELIMITERS[c]) { + tokenType = TOKENTYPE.DELIMITER; + token = c; + next(); + return; + } + + // check for an identifier (number or string) + // TODO: more precise parsing of numbers/strings (and the port separator ':') + if (isAlphaNumeric(c) || c == '-') { + token += c; + next(); + + while (isAlphaNumeric(c)) { + token += c; + next(); + } + if (token == 'false') { + token = false; // convert to boolean + } + else if (token == 'true') { + token = true; // convert to boolean + } + else if (!isNaN(Number(token))) { + token = Number(token); // convert to number + } + tokenType = TOKENTYPE.IDENTIFIER; + return; + } + + // check for a string enclosed by double quotes + if (c == '"') { + next(); + while (c != '' && (c != '"' || (c == '"' && nextPreview() == '"'))) { + token += c; + if (c == '"') { // skip the escape character + next(); + } + next(); + } + if (c != '"') { + throw newSyntaxError('End of string " expected'); + } + next(); + tokenType = TOKENTYPE.IDENTIFIER; + return; + } + + // something unknown is found, wrong characters, a syntax error + tokenType = TOKENTYPE.UNKNOWN; + while (c != '') { + token += c; + next(); + } + throw new SyntaxError('Syntax error in part "' + chop(token, 30) + '"'); + } + + /** + * Parse a graph. + * @returns {Object} graph + */ + function parseGraph() { + var graph = {}; + + first(); + getToken(); + + // optional strict keyword + if (token == 'strict') { + graph.strict = true; + getToken(); + } + + // graph or digraph keyword + if (token == 'graph' || token == 'digraph') { + graph.type = token; + getToken(); + } + + // optional graph id + if (tokenType == TOKENTYPE.IDENTIFIER) { + graph.id = token; + getToken(); + } + + // open angle bracket + if (token != '{') { + throw newSyntaxError('Angle bracket { expected'); + } + getToken(); + + // statements + parseStatements(graph); + + // close angle bracket + if (token != '}') { + throw newSyntaxError('Angle bracket } expected'); + } + getToken(); + + // end of file + if (token !== '') { + throw newSyntaxError('End of file expected'); + } + getToken(); + + // remove temporary default properties + delete graph.node; + delete graph.edge; + delete graph.graph; + + return graph; + } + + /** + * Parse a list with statements. + * @param {Object} graph + */ + function parseStatements (graph) { + while (token !== '' && token != '}') { + parseStatement(graph); + if (token == ';') { + getToken(); + } + } + } + + /** + * Parse a single statement. Can be a an attribute statement, node + * statement, a series of node statements and edge statements, or a + * parameter. + * @param {Object} graph + */ + function parseStatement(graph) { + // parse subgraph + var subgraph = parseSubgraph(graph); + if (subgraph) { + // edge statements + parseEdge(graph, subgraph); + + return; + } + + // parse an attribute statement + var attr = parseAttributeStatement(graph); + if (attr) { + return; + } + + // parse node + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier expected'); + } + var id = token; // id can be a string or a number + getToken(); + + if (token == '=') { + // id statement + getToken(); + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier expected'); + } + graph[id] = token; + getToken(); + // TODO: implement comma separated list with "a_list: ID=ID [','] [a_list] " + } + else { + parseNodeStatement(graph, id); + } + } + + /** + * Parse a subgraph + * @param {Object} graph parent graph object + * @return {Object | null} subgraph + */ + function parseSubgraph (graph) { + var subgraph = null; + + // optional subgraph keyword + if (token == 'subgraph') { + subgraph = {}; + subgraph.type = 'subgraph'; + getToken(); + + // optional graph id + if (tokenType == TOKENTYPE.IDENTIFIER) { + subgraph.id = token; + getToken(); + } + } + + // open angle bracket + if (token == '{') { + getToken(); + + if (!subgraph) { + subgraph = {}; + } + subgraph.parent = graph; + subgraph.node = graph.node; + subgraph.edge = graph.edge; + subgraph.graph = graph.graph; + + // statements + parseStatements(subgraph); + + // close angle bracket + if (token != '}') { + throw newSyntaxError('Angle bracket } expected'); + } + getToken(); + + // remove temporary default properties + delete subgraph.node; + delete subgraph.edge; + delete subgraph.graph; + delete subgraph.parent; + + // register at the parent graph + if (!graph.subgraphs) { + graph.subgraphs = []; + } + graph.subgraphs.push(subgraph); + } + + return subgraph; + } + + /** + * parse an attribute statement like "node [shape=circle fontSize=16]". + * Available keywords are 'node', 'edge', 'graph'. + * The previous list with default attributes will be replaced + * @param {Object} graph + * @returns {String | null} keyword Returns the name of the parsed attribute + * (node, edge, graph), or null if nothing + * is parsed. + */ + function parseAttributeStatement (graph) { + // attribute statements + if (token == 'node') { + getToken(); + + // node attributes + graph.node = parseAttributeList(); + return 'node'; + } + else if (token == 'edge') { + getToken(); + + // edge attributes + graph.edge = parseAttributeList(); + return 'edge'; + } + else if (token == 'graph') { + getToken(); + + // graph attributes + graph.graph = parseAttributeList(); + return 'graph'; + } + + return null; + } + + /** + * parse a node statement + * @param {Object} graph + * @param {String | Number} id + */ + function parseNodeStatement(graph, id) { + // node statement + var node = { + id: id + }; + var attr = parseAttributeList(); + if (attr) { + node.attr = attr; + } + addNode(graph, node); + + // edge statements + parseEdge(graph, id); + } + + /** + * Parse an edge or a series of edges + * @param {Object} graph + * @param {String | Number} from Id of the from node + */ + function parseEdge(graph, from) { + while (token == '->' || token == '--') { + var to; + var type = token; + getToken(); + + var subgraph = parseSubgraph(graph); + if (subgraph) { + to = subgraph; + } + else { + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier or subgraph expected'); + } + to = token; + addNode(graph, { + id: to + }); + getToken(); + } + + // parse edge attributes + var attr = parseAttributeList(); + + // create edge + var edge = createEdge(graph, from, to, type, attr); + addEdge(graph, edge); + + from = to; + } + } + + /** + * Parse a set with attributes, + * for example [label="1.000", shape=solid] + * @return {Object | null} attr + */ + function parseAttributeList() { + var attr = null; + + while (token == '[') { + getToken(); + attr = {}; + while (token !== '' && token != ']') { + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Attribute name expected'); + } + var name = token; + + getToken(); + if (token != '=') { + throw newSyntaxError('Equal sign = expected'); + } + getToken(); + + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Attribute value expected'); + } + var value = token; + setValue(attr, name, value); // name can be a path + + getToken(); + if (token ==',') { + getToken(); + } + } + + if (token != ']') { + throw newSyntaxError('Bracket ] expected'); + } + getToken(); + } + + return attr; + } + + /** + * Create a syntax error with extra information on current token and index. + * @param {String} message + * @returns {SyntaxError} err + */ + function newSyntaxError(message) { + return new SyntaxError(message + ', got "' + chop(token, 30) + '" (char ' + index + ')'); + } + + /** + * Chop off text after a maximum length + * @param {String} text + * @param {Number} maxLength + * @returns {String} + */ + function chop (text, maxLength) { + return (text.length <= maxLength) ? text : (text.substr(0, 27) + '...'); + } + + /** + * Execute a function fn for each pair of elements in two arrays + * @param {Array | *} array1 + * @param {Array | *} array2 + * @param {function} fn + */ + function forEach2(array1, array2, fn) { + if (Array.isArray(array1)) { + array1.forEach(function (elem1) { + if (Array.isArray(array2)) { + array2.forEach(function (elem2) { + fn(elem1, elem2); + }); + } + else { + fn(elem1, array2); + } + }); + } + else { + if (Array.isArray(array2)) { + array2.forEach(function (elem2) { + fn(array1, elem2); + }); + } + else { + fn(array1, array2); + } + } + } + + /** + * Convert a string containing a graph in DOT language into a map containing + * with nodes and edges in the format of graph. + * @param {String} data Text containing a graph in DOT-notation + * @return {Object} graphData + */ + function DOTToGraph (data) { + // parse the DOT file + var dotData = parseDOT(data); + var graphData = { + nodes: [], + edges: [], + options: {} + }; + + // copy the nodes + if (dotData.nodes) { + dotData.nodes.forEach(function (dotNode) { + var graphNode = { + id: dotNode.id, + label: String(dotNode.label || dotNode.id) + }; + merge(graphNode, dotNode.attr); + if (graphNode.image) { + graphNode.shape = 'image'; + } + graphData.nodes.push(graphNode); + }); + } + + // copy the edges + if (dotData.edges) { + /** + * Convert an edge in DOT format to an edge with VisGraph format + * @param {Object} dotEdge + * @returns {Object} graphEdge + */ + var convertEdge = function (dotEdge) { + var graphEdge = { + from: dotEdge.from, + to: dotEdge.to + }; + merge(graphEdge, dotEdge.attr); + graphEdge.style = (dotEdge.type == '->') ? 'arrow' : 'line'; + return graphEdge; + } + + dotData.edges.forEach(function (dotEdge) { + var from, to; + if (dotEdge.from instanceof Object) { + from = dotEdge.from.nodes; + } + else { + from = { + id: dotEdge.from + } + } + + if (dotEdge.to instanceof Object) { + to = dotEdge.to.nodes; + } + else { + to = { + id: dotEdge.to + } + } + + if (dotEdge.from instanceof Object && dotEdge.from.edges) { + dotEdge.from.edges.forEach(function (subEdge) { + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); + } + + forEach2(from, to, function (from, to) { + var subEdge = createEdge(graphData, from.id, to.id, dotEdge.type, dotEdge.attr); + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); + + if (dotEdge.to instanceof Object && dotEdge.to.edges) { + dotEdge.to.edges.forEach(function (subEdge) { + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); + } + }); + } + + // copy the options + if (dotData.attr) { + graphData.options = dotData.attr; + } + + return graphData; + } + + // exports + exports.parseDOT = parseDOT; + exports.DOTToGraph = DOTToGraph; + + +/***/ }, +/* 43 */ +/***/ function(module, exports, __webpack_require__) { + + + function parseGephi(gephiJSON, options) { + var edges = []; + var nodes = []; + this.options = { + edges: { + inheritColor: true + }, + nodes: { + allowedToMove: false, + parseColor: false + } + }; + + if (options !== undefined) { + this.options.nodes['allowedToMove'] = options.allowedToMove | false; + this.options.nodes['parseColor'] = options.parseColor | false; + this.options.edges['inheritColor'] = options.inheritColor | true; + } + + var gEdges = gephiJSON.edges; + var gNodes = gephiJSON.nodes; + for (var i = 0; i < gEdges.length; i++) { + var edge = {}; + var gEdge = gEdges[i]; + edge['id'] = gEdge.id; + edge['from'] = gEdge.source; + edge['to'] = gEdge.target; + edge['attributes'] = gEdge.attributes; + // edge['value'] = gEdge.attributes !== undefined ? gEdge.attributes.Weight : undefined; + // edge['width'] = edge['value'] !== undefined ? undefined : edgegEdge.size; + edge['color'] = gEdge.color; + edge['inheritColor'] = edge['color'] !== undefined ? false : this.options.inheritColor; + edges.push(edge); + } + + for (var i = 0; i < gNodes.length; i++) { + var node = {}; + var gNode = gNodes[i]; + node['id'] = gNode.id; + node['attributes'] = gNode.attributes; + node['x'] = gNode.x; + node['y'] = gNode.y; + node['label'] = gNode.label; + if (this.options.nodes.parseColor == true) { + node['color'] = gNode.color; + } + else { + node['color'] = gNode.color !== undefined ? {background:gNode.color, border:gNode.color} : undefined; + } + node['radius'] = gNode.size; + node['allowedToMoveX'] = this.options.nodes.allowedToMove; + node['allowedToMoveY'] = this.options.nodes.allowedToMove; + nodes.push(node); + } + + return {nodes:nodes, edges:edges}; + } + + exports.parseGephi = parseGephi; + +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { + + // first check if moment.js is already loaded in the browser window, if so, + // use this instance. Else, load via commonjs. + module.exports = (typeof window !== 'undefined') && window['moment'] || __webpack_require__(58); + + +/***/ }, +/* 45 */ +/***/ function(module, exports, __webpack_require__) { + + // Only load hammer.js when in a browser environment + // (loading hammer.js in a node.js environment gives errors) + if (typeof window !== 'undefined') { + module.exports = window['Hammer'] || __webpack_require__(59); + } + else { + module.exports = function () { + throw Error('hammer.js is only available in a browser, not in node.js.'); + } + } + + +/***/ }, +/* 46 */ +/***/ function(module, exports, __webpack_require__) { + + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Range = __webpack_require__(17); + var ItemSet = __webpack_require__(32); + var Activator = __webpack_require__(53); + var DateUtil = __webpack_require__(15); + var CustomTime = __webpack_require__(27); + + /** + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {Object} [options] See Core.setOptions for the available options. + * @constructor + */ + function Core () {} + + // turn Core into an event emitter + Emitter(Core.prototype); + + /** + * Create the main DOM for the Core: a root panel containing left, right, + * top, bottom, content, and background panel. + * @param {Element} container The container element where the Core will + * be attached. + * @private + */ + Core.prototype._create = function (container) { + this.dom = {}; + + this.dom.root = document.createElement('div'); + this.dom.background = document.createElement('div'); + this.dom.backgroundVertical = document.createElement('div'); + this.dom.backgroundHorizontal = document.createElement('div'); + this.dom.centerContainer = document.createElement('div'); + this.dom.leftContainer = document.createElement('div'); + this.dom.rightContainer = document.createElement('div'); + this.dom.center = document.createElement('div'); + this.dom.left = document.createElement('div'); + this.dom.right = document.createElement('div'); + this.dom.top = document.createElement('div'); + this.dom.bottom = document.createElement('div'); + this.dom.shadowTop = document.createElement('div'); + this.dom.shadowBottom = document.createElement('div'); + this.dom.shadowTopLeft = document.createElement('div'); + this.dom.shadowBottomLeft = document.createElement('div'); + this.dom.shadowTopRight = document.createElement('div'); + this.dom.shadowBottomRight = document.createElement('div'); + + this.dom.root.className = 'vis timeline root'; + this.dom.background.className = 'vispanel background'; + this.dom.backgroundVertical.className = 'vispanel background vertical'; + this.dom.backgroundHorizontal.className = 'vispanel background horizontal'; + this.dom.centerContainer.className = 'vispanel center'; + this.dom.leftContainer.className = 'vispanel left'; + this.dom.rightContainer.className = 'vispanel right'; + this.dom.top.className = 'vispanel top'; + this.dom.bottom.className = 'vispanel bottom'; + this.dom.left.className = 'content'; + this.dom.center.className = 'content'; + this.dom.right.className = 'content'; + this.dom.shadowTop.className = 'shadow top'; + this.dom.shadowBottom.className = 'shadow bottom'; + this.dom.shadowTopLeft.className = 'shadow top'; + this.dom.shadowBottomLeft.className = 'shadow bottom'; + this.dom.shadowTopRight.className = 'shadow top'; + this.dom.shadowBottomRight.className = 'shadow bottom'; + + this.dom.root.appendChild(this.dom.background); + this.dom.root.appendChild(this.dom.backgroundVertical); + this.dom.root.appendChild(this.dom.backgroundHorizontal); + this.dom.root.appendChild(this.dom.centerContainer); + this.dom.root.appendChild(this.dom.leftContainer); + this.dom.root.appendChild(this.dom.rightContainer); + this.dom.root.appendChild(this.dom.top); + this.dom.root.appendChild(this.dom.bottom); + + this.dom.centerContainer.appendChild(this.dom.center); + this.dom.leftContainer.appendChild(this.dom.left); + this.dom.rightContainer.appendChild(this.dom.right); + + this.dom.centerContainer.appendChild(this.dom.shadowTop); + this.dom.centerContainer.appendChild(this.dom.shadowBottom); + this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); + this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); + this.dom.rightContainer.appendChild(this.dom.shadowTopRight); + this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); + + this.on('rangechange', this._redraw.bind(this)); + this.on('touch', this._onTouch.bind(this)); + this.on('pinch', this._onPinch.bind(this)); + this.on('dragstart', this._onDragStart.bind(this)); + this.on('drag', this._onDrag.bind(this)); + + var me = this; + this.on('change', function (properties) { + if (properties && properties.queue == true) { + // redraw once on next tick + if (!me._redrawTimer) { + me._redrawTimer = setTimeout(function () { + me._redrawTimer = null; + me._redraw(); + }, 0) + } + } + else { + // redraw immediately + me._redraw(); + } + }); + + // create event listeners for all interesting events, these events will be + // emitted via emitter + this.hammer = Hammer(this.dom.root, { + preventDefault: true + }); + this.listeners = {}; + + var events = [ + 'touch', 'pinch', + 'tap', 'doubletap', 'hold', + 'dragstart', 'drag', 'dragend', + 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox + ]; + events.forEach(function (event) { + var listener = function () { + var args = [event].concat(Array.prototype.slice.call(arguments, 0)); + if (me.isActive()) { + me.emit.apply(me, args); + } + }; + me.hammer.on(event, listener); + me.listeners[event] = listener; + }); + + // size properties of each of the panels + this.props = { + root: {}, + background: {}, + centerContainer: {}, + leftContainer: {}, + rightContainer: {}, + center: {}, + left: {}, + right: {}, + top: {}, + bottom: {}, + border: {}, + scrollTop: 0, + scrollTopMin: 0 + }; + this.touch = {}; // store state information needed for touch events + + this.redrawCount = 0; + + // attach the root panel to the provided container + if (!container) throw new Error('No container provided'); + container.appendChild(this.dom.root); + }; + + /** + * Set options. Options will be passed to all components loaded in the Timeline. + * @param {Object} [options] + * {String} orientation + * Vertical orientation for the Timeline, + * can be 'bottom' (default) or 'top'. + * {String | Number} width + * Width for the timeline, a number in pixels or + * a css string like '1000px' or '75%'. '100%' by default. + * {String | Number} height + * Fixed height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. If undefined, + * The Timeline will automatically size such that + * its contents fit. + * {String | Number} minHeight + * Minimum height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. + * {String | Number} maxHeight + * Maximum height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. + * {Number | Date | String} start + * Start date for the visible window + * {Number | Date | String} end + * End date for the visible window + */ + Core.prototype.setOptions = function (options) { + if (options) { + // copy the known options + var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'orientation', 'clickToUse', 'dataAttributes', 'hiddenDates']; + util.selectiveExtend(fields, this.options, options); + + if ('hiddenDates' in this.options) { + DateUtil.convertHiddenOptions(this.body, this.options.hiddenDates); + } + + if ('clickToUse' in options) { + if (options.clickToUse) { + if (!this.activator) { + this.activator = new Activator(this.dom.root); + } + } + else { + if (this.activator) { + this.activator.destroy(); + delete this.activator; + } + } + } + + // enable/disable autoResize + this._initAutoResize(); + } + + // propagate options to all components + this.components.forEach(function (component) { + component.setOptions(options); + }); + + // TODO: remove deprecation error one day (deprecated since version 0.8.0) + if (options && options.order) { + throw new Error('Option order is deprecated. There is no replacement for this feature.'); + } + + // redraw everything + this._redraw(); + }; + + /** + * Returns true when the Timeline is active. + * @returns {boolean} + */ + Core.prototype.isActive = function () { + return !this.activator || this.activator.active; + }; + + /** + * Destroy the Core, clean up all DOM elements and event listeners. + */ + Core.prototype.destroy = function () { + // unbind datasets + this.clear(); + + // remove all event listeners + this.off(); + + // stop checking for changed size + this._stopAutoResize(); + + // remove from DOM + if (this.dom.root.parentNode) { + this.dom.root.parentNode.removeChild(this.dom.root); + } + this.dom = null; + + // remove Activator + if (this.activator) { + this.activator.destroy(); + delete this.activator; + } + + // cleanup hammer touch events + for (var event in this.listeners) { + if (this.listeners.hasOwnProperty(event)) { + delete this.listeners[event]; + } + } + this.listeners = null; + this.hammer = null; + + // give all components the opportunity to cleanup + this.components.forEach(function (component) { + component.destroy(); + }); + + this.body = null; + }; + + + /** + * Set a custom time bar + * @param {Date} time + * @param {int} id + */ + Core.prototype.setCustomTime = function (time, id) { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); + } + + var barId = id || 0; + + this.components.forEach(function (element, index, components) { + if (element instanceof CustomTime && element.options.id === barId) { + element.setCustomTime(time); + } + }); + }; + + /** + * Retrieve the current custom time. + * @return {Date} customTime + * @param {int} id + */ + Core.prototype.getCustomTime = function(id) { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); + } + + var barId = id || 0, + customTime = this.customTime.getCustomTime(); + + this.components.forEach(function (element, index, components) { + if (element instanceof CustomTime && element.options.id === barId) { + customTime = element.getCustomTime(); + } + }); + + return customTime; + }; + + /** + * Add custom vertical bar + * @param {Date | String | Number} time A Date, unix timestamp, or + * ISO date string. Time point where the new bar should be placed + * @param {Number | String} ID of the new bar + * @return {Number | String} ID of the new bar + */ + Core.prototype.addCustomTime = function (time, id) { + if (!this.currentTime) { + throw new Error('Option showCurrentTime must be true'); + } + + if (time === undefined) { + throw new Error('Time parameter for the custom bar must be provided'); + } + + var ts = util.convert(time, 'Date').valueOf(), + numIds, customTime, customBarId; + + // All bar IDs are kept in 1 array, mixed types + // Bar with ID 0 is the default bar. + if (!this.customBarIds || this.customBarIds.constructor !== Array) { + this.customBarIds = [0]; + } + + // If the ID is not provided, generate one, otherwise just use it + if (id === undefined) { + + numIds = this.customBarIds.filter(function (element) { + return util.isNumber(element); + }); + + customBarId = numIds.length > 0 ? Math.max.apply(null, numIds) + 1 : 1; + + } else { + + // Check for duplicates + this.customBarIds.forEach(function (element) { + if (element === id) { + throw new Error('Custom time ID already exists'); + } + }); + + customBarId = id; + } + + this.customBarIds.push(customBarId); + + customTime = new CustomTime(this.body, { + showCustomTime : true, + time : ts, + id : customBarId + }); + + this.components.push(customTime); + this.redraw(); + + return customBarId; + }; + + /** + * Remove previously added custom bar + * @param {int} id ID of the custom bar to be removed + * @return {boolean} True if the bar exists and is removed, false otherwise + */ + Core.prototype.removeCustomTime = function (id) { + + var me = this; + + this.components.forEach(function (bar, index, components) { + if (bar instanceof CustomTime && bar.options.id === id) { + // Only the lines added by the user will be removed + if (bar.options.id !== 0) { + me.customBarIds.splice(me.customBarIds.indexOf(id), 1); + components.splice(index, 1); + bar.destroy(); + } + } + }); + }; + + + /** + * Get the id's of the currently visible items. + * @returns {Array} The ids of the visible items + */ + Core.prototype.getVisibleItems = function() { + return this.itemSet && this.itemSet.getVisibleItems() || []; + }; + + + + /** + * Clear the Core. By Default, items, groups and options are cleared. + * Example usage: + * + * timeline.clear(); // clear items, groups, and options + * timeline.clear({options: true}); // clear options only + * + * @param {Object} [what] Optionally specify what to clear. By default: + * {items: true, groups: true, options: true} + */ + Core.prototype.clear = function(what) { + // clear items + if (!what || what.items) { + this.setItems(null); + } + + // clear groups + if (!what || what.groups) { + this.setGroups(null); + } + + // clear options of timeline and of each of the components + if (!what || what.options) { + this.components.forEach(function (component) { + component.setOptions(component.defaultOptions); + }); + + this.setOptions(this.defaultOptions); // this will also do a redraw + } + }; + + /** + * Set Core window such that it fits all items + * @param {Object} [options] Available options: + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. + */ + Core.prototype.fit = function(options) { + var range = this._getDataRange(); + + // skip range set if there is no start and end date + if (range.start === null && range.end === null) { + return; + } + + var animate = (options && options.animate !== undefined) ? options.animate : true; + this.range.setRange(range.start, range.end, animate); + }; + + /** + * Calculate the data range of the items and applies a 5% window around it. + * @returns {{start: Date | null, end: Date | null}} + * @protected + */ + Core.prototype._getDataRange = function() { + // apply the data range as range + var dataRange = this.getItemRange(); + + // add 5% space on both sides + var start = dataRange.min; + var end = dataRange.max; + if (start != null && end != null) { + var interval = (end.valueOf() - start.valueOf()); + if (interval <= 0) { + // prevent an empty interval + interval = 24 * 60 * 60 * 1000; // 1 day + } + start = new Date(start.valueOf() - interval * 0.05); + end = new Date(end.valueOf() + interval * 0.05); + } + + return { + start: start, + end: end + } + }; + + /** + * Set the visible window. Both parameters are optional, you can change only + * start or only end. Syntax: + * + * TimeLine.setWindow(start, end) + * TimeLine.setWindow(start, end, options) + * TimeLine.setWindow(range) + * + * Where start and end can be a Date, number, or string, and range is an + * object with properties start and end. + * + * @param {Date | Number | String | Object} [start] Start date of visible window + * @param {Date | Number | String} [end] End date of visible window + * @param {Object} [options] Available options: + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. + */ + Core.prototype.setWindow = function(start, end, options) { + var animate; + if (arguments.length == 1) { + var range = arguments[0]; + animate = (range.animate !== undefined) ? range.animate : true; + this.range.setRange(range.start, range.end, animate); + } + else { + animate = (options && options.animate !== undefined) ? options.animate : true; + this.range.setRange(start, end, animate); + } + }; + + /** + * Move the window such that given time is centered on screen. + * @param {Date | Number | String} time + * @param {Object} [options] Available options: + * `animate: boolean | number` + * If true (default), the range is animated + * smoothly to the new window. + * If a number, the number is taken as duration + * for the animation. Default duration is 500 ms. + */ + Core.prototype.moveTo = function(time, options) { + var interval = this.range.end - this.range.start; + var t = util.convert(time, 'Date').valueOf(); + + var start = t - interval / 2; + var end = t + interval / 2; + var animate = (options && options.animate !== undefined) ? options.animate : true; + + this.range.setRange(start, end, animate); + }; + + /** + * Get the visible window + * @return {{start: Date, end: Date}} Visible range + */ + Core.prototype.getWindow = function() { + var range = this.range.getRange(); + return { + start: new Date(range.start), + end: new Date(range.end) + }; + }; + + /** + * Force a redraw. Can be overridden by implementations of Core + */ + Core.prototype.redraw = function() { + this._redraw(); + }; + + /** + * Redraw for internal use. Redraws all components. See also the public + * method redraw. + * @protected + */ + Core.prototype._redraw = function() { + var resized = false; + var options = this.options; + var props = this.props; + var dom = this.dom; + + if (!dom) return; // when destroyed + + DateUtil.updateHiddenDates(this.body, this.options.hiddenDates); + + // update class names + if (options.orientation == 'top') { + util.addClassName(dom.root, 'top'); + util.removeClassName(dom.root, 'bottom'); + } + else { + util.removeClassName(dom.root, 'top'); + util.addClassName(dom.root, 'bottom'); + } + + // update root width and height options + dom.root.style.maxHeight = util.option.asSize(options.maxHeight, ''); + dom.root.style.minHeight = util.option.asSize(options.minHeight, ''); + dom.root.style.width = util.option.asSize(options.width, ''); + + // calculate border widths + props.border.left = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2; + props.border.right = props.border.left; + props.border.top = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2; + props.border.bottom = props.border.top; + var borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight; + var borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth; + + // workaround for a bug in IE: the clientWidth of an element with + // a height:0px and overflow:hidden is not calculated and always has value 0 + if (dom.centerContainer.clientHeight === 0) { + props.border.left = props.border.top; + props.border.right = props.border.left; + } + if (dom.root.clientHeight === 0) { + borderRootWidth = borderRootHeight; + } + + // calculate the heights. If any of the side panels is empty, we set the height to + // minus the border width, such that the border will be invisible + props.center.height = dom.center.offsetHeight; + props.left.height = dom.left.offsetHeight; + props.right.height = dom.right.offsetHeight; + props.top.height = dom.top.clientHeight || -props.border.top; + props.bottom.height = dom.bottom.clientHeight || -props.border.bottom; + + // TODO: compensate borders when any of the panels is empty. + + // apply auto height + // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) + var contentHeight = Math.max(props.left.height, props.center.height, props.right.height); + var autoHeight = props.top.height + contentHeight + props.bottom.height + + borderRootHeight + props.border.top + props.border.bottom; + dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px'); + + // calculate heights of the content panels + props.root.height = dom.root.offsetHeight; + props.background.height = props.root.height - borderRootHeight; + var containerHeight = props.root.height - props.top.height - props.bottom.height - + borderRootHeight; + props.centerContainer.height = containerHeight; + props.leftContainer.height = containerHeight; + props.rightContainer.height = props.leftContainer.height; + + // calculate the widths of the panels + props.root.width = dom.root.offsetWidth; + props.background.width = props.root.width - borderRootWidth; + props.left.width = dom.leftContainer.clientWidth || -props.border.left; + props.leftContainer.width = props.left.width; + props.right.width = dom.rightContainer.clientWidth || -props.border.right; + props.rightContainer.width = props.right.width; + var centerWidth = props.root.width - props.left.width - props.right.width - borderRootWidth; + props.center.width = centerWidth; + props.centerContainer.width = centerWidth; + props.top.width = centerWidth; + props.bottom.width = centerWidth; + + // resize the panels + dom.background.style.height = props.background.height + 'px'; + dom.backgroundVertical.style.height = props.background.height + 'px'; + dom.backgroundHorizontal.style.height = props.centerContainer.height + 'px'; + dom.centerContainer.style.height = props.centerContainer.height + 'px'; + dom.leftContainer.style.height = props.leftContainer.height + 'px'; + dom.rightContainer.style.height = props.rightContainer.height + 'px'; + + dom.background.style.width = props.background.width + 'px'; + dom.backgroundVertical.style.width = props.centerContainer.width + 'px'; + dom.backgroundHorizontal.style.width = props.background.width + 'px'; + dom.centerContainer.style.width = props.center.width + 'px'; + dom.top.style.width = props.top.width + 'px'; + dom.bottom.style.width = props.bottom.width + 'px'; + + // reposition the panels + dom.background.style.left = '0'; + dom.background.style.top = '0'; + dom.backgroundVertical.style.left = (props.left.width + props.border.left) + 'px'; + dom.backgroundVertical.style.top = '0'; + dom.backgroundHorizontal.style.left = '0'; + dom.backgroundHorizontal.style.top = props.top.height + 'px'; + dom.centerContainer.style.left = props.left.width + 'px'; + dom.centerContainer.style.top = props.top.height + 'px'; + dom.leftContainer.style.left = '0'; + dom.leftContainer.style.top = props.top.height + 'px'; + dom.rightContainer.style.left = (props.left.width + props.center.width) + 'px'; + dom.rightContainer.style.top = props.top.height + 'px'; + dom.top.style.left = props.left.width + 'px'; + dom.top.style.top = '0'; + dom.bottom.style.left = props.left.width + 'px'; + dom.bottom.style.top = (props.top.height + props.centerContainer.height) + 'px'; + + // update the scrollTop, feasible range for the offset can be changed + // when the height of the Core or of the contents of the center changed + this._updateScrollTop(); + + // reposition the scrollable contents + var offset = this.props.scrollTop; + if (options.orientation == 'bottom') { + offset += Math.max(this.props.centerContainer.height - this.props.center.height - + this.props.border.top - this.props.border.bottom, 0); + } + dom.center.style.left = '0'; + dom.center.style.top = offset + 'px'; + dom.left.style.left = '0'; + dom.left.style.top = offset + 'px'; + dom.right.style.left = '0'; + dom.right.style.top = offset + 'px'; + + // show shadows when vertical scrolling is available + var visibilityTop = this.props.scrollTop == 0 ? 'hidden' : ''; + var visibilityBottom = this.props.scrollTop == this.props.scrollTopMin ? 'hidden' : ''; + dom.shadowTop.style.visibility = visibilityTop; + dom.shadowBottom.style.visibility = visibilityBottom; + dom.shadowTopLeft.style.visibility = visibilityTop; + dom.shadowBottomLeft.style.visibility = visibilityBottom; + dom.shadowTopRight.style.visibility = visibilityTop; + dom.shadowBottomRight.style.visibility = visibilityBottom; + + // redraw all components + this.components.forEach(function (component) { + resized = component.redraw() || resized; + }); + if (resized) { + // keep repainting until all sizes are settled + var MAX_REDRAWS = 3; // maximum number of consecutive redraws + if (this.redrawCount < MAX_REDRAWS) { + this.redrawCount++; + this._redraw(); + } + else { + console.log('WARNING: infinite loop in redraw?'); + } + this.redrawCount = 0; + } + + this.emit("finishedRedraw"); + }; + + // TODO: deprecated since version 1.1.0, remove some day + Core.prototype.repaint = function () { + throw new Error('Function repaint is deprecated. Use redraw instead.'); + }; + + /** + * Set a current time. This can be used for example to ensure that a client's + * time is synchronized with a shared server time. + * Only applicable when option `showCurrentTime` is true. + * @param {Date | String | Number} time A Date, unix timestamp, or + * ISO date string. + */ + Core.prototype.setCurrentTime = function(time) { + if (!this.currentTime) { + throw new Error('Option showCurrentTime must be true'); + } + + this.currentTime.setCurrentTime(time); + }; + + /** + * Get the current time. + * Only applicable when option `showCurrentTime` is true. + * @return {Date} Returns the current time. + */ + Core.prototype.getCurrentTime = function() { + if (!this.currentTime) { + throw new Error('Option showCurrentTime must be true'); + } + + return this.currentTime.getCurrentTime(); + }; + + /** + * Convert a position on screen (pixels) to a datetime + * @param {int} x Position on the screen in pixels + * @return {Date} time The datetime the corresponds with given position x + * @private + */ + // TODO: move this function to Range + Core.prototype._toTime = function(x) { + return DateUtil.toTime(this, x, this.props.center.width); + }; + + /** + * Convert a position on the global screen (pixels) to a datetime + * @param {int} x Position on the screen in pixels + * @return {Date} time The datetime the corresponds with given position x + * @private + */ + // TODO: move this function to Range + Core.prototype._toGlobalTime = function(x) { + return DateUtil.toTime(this, x, this.props.root.width); + //var conversion = this.range.conversion(this.props.root.width); + //return new Date(x / conversion.scale + conversion.offset); + }; + + /** + * Convert a datetime (Date object) into a position on the screen + * @param {Date} time A date + * @return {int} x The position on the screen in pixels which corresponds + * with the given date. + * @private + */ + // TODO: move this function to Range + Core.prototype._toScreen = function(time) { + return DateUtil.toScreen(this, time, this.props.center.width); + }; + + + + /** + * Convert a datetime (Date object) into a position on the root + * This is used to get the pixel density estimate for the screen, not the center panel + * @param {Date} time A date + * @return {int} x The position on root in pixels which corresponds + * with the given date. + * @private + */ + // TODO: move this function to Range + Core.prototype._toGlobalScreen = function(time) { + return DateUtil.toScreen(this, time, this.props.root.width); + //var conversion = this.range.conversion(this.props.root.width); + //return (time.valueOf() - conversion.offset) * conversion.scale; + }; + + + /** + * Initialize watching when option autoResize is true + * @private + */ + Core.prototype._initAutoResize = function () { + if (this.options.autoResize == true) { + this._startAutoResize(); + } + else { + this._stopAutoResize(); + } + }; + + /** + * Watch for changes in the size of the container. On resize, the Panel will + * automatically redraw itself. + * @private + */ + Core.prototype._startAutoResize = function () { + var me = this; + + this._stopAutoResize(); + + this._onResize = function() { + if (me.options.autoResize != true) { + // stop watching when the option autoResize is changed to false + me._stopAutoResize(); + return; + } + + if (me.dom.root) { + // check whether the frame is resized + // Note: we compare offsetWidth here, not clientWidth. For some reason, + // IE does not restore the clientWidth from 0 to the actual width after + // changing the timeline's container display style from none to visible + if ((me.dom.root.offsetWidth != me.props.lastWidth) || + (me.dom.root.offsetHeight != me.props.lastHeight)) { + me.props.lastWidth = me.dom.root.offsetWidth; + me.props.lastHeight = me.dom.root.offsetHeight; + + me.emit('change'); + } + } + }; + + // add event listener to window resize + util.addEventListener(window, 'resize', this._onResize); + + this.watchTimer = setInterval(this._onResize, 1000); + }; + + /** + * Stop watching for a resize of the frame. + * @private + */ + Core.prototype._stopAutoResize = function () { + if (this.watchTimer) { + clearInterval(this.watchTimer); + this.watchTimer = undefined; + } + + // remove event listener on window.resize + util.removeEventListener(window, 'resize', this._onResize); + this._onResize = null; + }; + + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onTouch = function (event) { + this.touch.allowDragging = true; + }; + + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onPinch = function (event) { + this.touch.allowDragging = false; + }; + + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onDragStart = function (event) { + this.touch.initialScrollTop = this.props.scrollTop; + }; + + /** + * Move the timeline vertically + * @param {Event} event + * @private + */ + Core.prototype._onDrag = function (event) { + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.touch.allowDragging) return; + + var delta = event.gesture.deltaY; + + var oldScrollTop = this._getScrollTop(); + var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); + + + if (newScrollTop != oldScrollTop) { + this._redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already + this.emit("verticalDrag"); + } + }; + + /** + * Apply a scrollTop + * @param {Number} scrollTop + * @returns {Number} scrollTop Returns the applied scrollTop + * @private + */ + Core.prototype._setScrollTop = function (scrollTop) { + this.props.scrollTop = scrollTop; + this._updateScrollTop(); + return this.props.scrollTop; + }; + + /** + * Update the current scrollTop when the height of the containers has been changed + * @returns {Number} scrollTop Returns the applied scrollTop + * @private + */ + Core.prototype._updateScrollTop = function () { + // recalculate the scrollTopMin + var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero + if (scrollTopMin != this.props.scrollTopMin) { + // in case of bottom orientation, change the scrollTop such that the contents + // do not move relative to the time axis at the bottom + if (this.options.orientation == 'bottom') { + this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); + } + this.props.scrollTopMin = scrollTopMin; + } + + // limit the scrollTop to the feasible scroll range + if (this.props.scrollTop > 0) this.props.scrollTop = 0; + if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; + + return this.props.scrollTop; + }; + + /** + * Get the current scrollTop + * @returns {number} scrollTop + * @private + */ + Core.prototype._getScrollTop = function () { + return this.props.scrollTop; + }; + + module.exports = Core; + + +/***/ }, +/* 47 */ +/***/ function(module, exports, __webpack_require__) { + + var Hammer = __webpack_require__(45); + + /** + * Fake a hammer.js gesture. Event can be a ScrollEvent or MouseMoveEvent + * @param {Element} element + * @param {Event} event + */ + exports.fakeGesture = function(element, event) { + var eventType = null; + + // for hammer.js 1.0.5 + // var gesture = Hammer.event.collectEventData(this, eventType, event); + + // for hammer.js 1.0.6+ + var touches = Hammer.event.getTouchList(event, eventType); + var gesture = Hammer.event.collectEventData(this, eventType, touches, event); + + // on IE in standards mode, no touches are recognized by hammer.js, + // resulting in NaN values for center.pageX and center.pageY + if (isNaN(gesture.center.pageX)) { + gesture.center.pageX = event.pageX; + } + if (isNaN(gesture.center.pageY)) { + gesture.center.pageY = event.pageY; + } + + return gesture; + }; + + +/***/ }, +/* 48 */ +/***/ function(module, exports, __webpack_require__) { + + // English + exports['en'] = { + current: 'current', + time: 'time' + }; + exports['en_EN'] = exports['en']; + exports['en_US'] = exports['en']; + + // Dutch + exports['nl'] = { + custom: 'aangepaste', + time: 'tijd' + }; + exports['nl_NL'] = exports['nl']; + exports['nl_BE'] = exports['nl']; + + +/***/ }, +/* 49 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Created by Alex on 11/11/2014. + */ + var DOMutil = __webpack_require__(2); + var Points = __webpack_require__(51); + + function Line(groupId, options) { + this.groupId = groupId; + this.options = options; + } + + Line.prototype.getYRange = function(groupData) { + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (var j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + } + return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; + }; + + + /** + * draw a line graph + * + * @param dataset + * @param group + */ + Line.prototype.draw = function (dataset, group, framework) { + if (dataset != null) { + if (dataset.length > 0) { + var path, d; + var svgHeight = Number(framework.svg.style.height.replace('px','')); + path = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); + path.setAttributeNS(null, "class", group.className); + if(group.style !== undefined) { + path.setAttributeNS(null, "style", group.style); + } + + // construct path from dataset + if (group.options.catmullRom.enabled == true) { + d = Line._catmullRom(dataset, group); + } + else { + d = Line._linear(dataset); + } + + // append with points for fill and finalize the path + if (group.options.shaded.enabled == true) { + var fillPath = DOMutil.getSVGElement('path', framework.svgElements, framework.svg); + var dFill; + if (group.options.shaded.orientation == 'top') { + dFill = 'M' + dataset[0].x + ',' + 0 + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + 0; + } + else { + dFill = 'M' + dataset[0].x + ',' + svgHeight + ' ' + d + 'L' + dataset[dataset.length - 1].x + ',' + svgHeight; + } + fillPath.setAttributeNS(null, "class", group.className + " fill"); + if(group.options.shaded.style !== undefined) { + fillPath.setAttributeNS(null, "style", group.options.shaded.style); + } + fillPath.setAttributeNS(null, "d", dFill); + } + // copy properties to path for drawing. + path.setAttributeNS(null, 'd', 'M' + d); + + // draw points + if (group.options.drawPoints.enabled == true) { + Points.draw(dataset, group, framework); + } + } + } + }; + + + + /** + * This uses an uniform parametrization of the CatmullRom algorithm: + * 'On the Parameterization of Catmull-Rom Curves' by Cem Yuksel et al. + * @param data + * @returns {string} + * @private + */ + Line._catmullRomUniform = function(data) { + // catmull rom + var p0, p1, p2, p3, bp1, bp2; + var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; + var normalization = 1/6; + var length = data.length; + for (var i = 0; i < length - 1; i++) { + + p0 = (i == 0) ? data[0] : data[i-1]; + p1 = data[i]; + p2 = data[i+1]; + p3 = (i + 2 < length) ? data[i+2] : p2; + + + // Catmull-Rom to Cubic Bezier conversion matrix + // 0 1 0 0 + // -1/6 1 1/6 0 + // 0 1/6 1 -1/6 + // 0 0 1 0 + + // bp0 = { x: p1.x, y: p1.y }; + bp1 = { x: ((-p0.x + 6*p1.x + p2.x) *normalization), y: ((-p0.y + 6*p1.y + p2.y) *normalization)}; + bp2 = { x: (( p1.x + 6*p2.x - p3.x) *normalization), y: (( p1.y + 6*p2.y - p3.y) *normalization)}; + // bp0 = { x: p2.x, y: p2.y }; + + d += 'C' + + bp1.x + ',' + + bp1.y + ' ' + + bp2.x + ',' + + bp2.y + ' ' + + p2.x + ',' + + p2.y + ' '; + } + + return d; + }; + + /** + * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. + * By default, the centripetal parameterization is used because this gives the nicest results. + * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. + * + * One optimization can be used to reuse distances since this is a sliding window approach. + * @param data + * @param group + * @returns {string} + * @private + */ + Line._catmullRom = function(data, group) { + var alpha = group.options.catmullRom.alpha; + if (alpha == 0 || alpha === undefined) { + return this._catmullRomUniform(data); + } + else { + var p0, p1, p2, p3, bp1, bp2, d1,d2,d3, A, B, N, M; + var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; + var d = Math.round(data[0].x) + ',' + Math.round(data[0].y) + ' '; + var length = data.length; + for (var i = 0; i < length - 1; i++) { + + p0 = (i == 0) ? data[0] : data[i-1]; + p1 = data[i]; + p2 = data[i+1]; + p3 = (i + 2 < length) ? data[i+2] : p2; + + d1 = Math.sqrt(Math.pow(p0.x - p1.x,2) + Math.pow(p0.y - p1.y,2)); + d2 = Math.sqrt(Math.pow(p1.x - p2.x,2) + Math.pow(p1.y - p2.y,2)); + d3 = Math.sqrt(Math.pow(p2.x - p3.x,2) + Math.pow(p2.y - p3.y,2)); + + // Catmull-Rom to Cubic Bezier conversion matrix + + // A = 2d1^2a + 3d1^a * d2^a + d3^2a + // B = 2d3^2a + 3d3^a * d2^a + d2^2a + + // [ 0 1 0 0 ] + // [ -d2^2a /N A/N d1^2a /N 0 ] + // [ 0 d3^2a /M B/M -d2^2a /M ] + // [ 0 0 1 0 ] + + d3powA = Math.pow(d3, alpha); + d3pow2A = Math.pow(d3,2*alpha); + d2powA = Math.pow(d2, alpha); + d2pow2A = Math.pow(d2,2*alpha); + d1powA = Math.pow(d1, alpha); + d1pow2A = Math.pow(d1,2*alpha); + + A = 2*d1pow2A + 3*d1powA * d2powA + d2pow2A; + B = 2*d3pow2A + 3*d3powA * d2powA + d2pow2A; + N = 3*d1powA * (d1powA + d2powA); + if (N > 0) {N = 1 / N;} + M = 3*d3powA * (d3powA + d2powA); + if (M > 0) {M = 1 / M;} + + bp1 = { x: ((-d2pow2A * p0.x + A*p1.x + d1pow2A * p2.x) * N), + y: ((-d2pow2A * p0.y + A*p1.y + d1pow2A * p2.y) * N)}; + + bp2 = { x: (( d3pow2A * p1.x + B*p2.x - d2pow2A * p3.x) * M), + y: (( d3pow2A * p1.y + B*p2.y - d2pow2A * p3.y) * M)}; + + if (bp1.x == 0 && bp1.y == 0) {bp1 = p1;} + if (bp2.x == 0 && bp2.y == 0) {bp2 = p2;} + d += 'C' + + bp1.x + ',' + + bp1.y + ' ' + + bp2.x + ',' + + bp2.y + ' ' + + p2.x + ',' + + p2.y + ' '; + } + + return d; + } + }; + + /** + * this generates the SVG path for a linear drawing between datapoints. + * @param data + * @returns {string} + * @private + */ + Line._linear = function(data) { + // linear + var d = ''; + for (var i = 0; i < data.length; i++) { + if (i == 0) { + d += data[i].x + ',' + data[i].y; + } + else { + d += ' ' + data[i].x + ',' + data[i].y; + } + } + return d; + }; + + module.exports = Line; + + +/***/ }, +/* 50 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Created by Alex on 11/11/2014. + */ + var DOMutil = __webpack_require__(2); + var Points = __webpack_require__(51); + + function Bargraph(groupId, options) { + this.groupId = groupId; + this.options = options; + } + + Bargraph.prototype.getYRange = function(groupData) { + if (this.options.barChart.handleOverlap != 'stack') { + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (var j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + } + return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; + } + else { + var barCombinedData = []; + for (var j = 0; j < groupData.length; j++) { + barCombinedData.push({ + x: groupData[j].x, + y: groupData[j].y, + groupId: this.groupId + }); + } + return barCombinedData; + } + }; + + + + /** + * draw a bar graph + * + * @param groupIds + * @param processedGroupData + */ + Bargraph.draw = function (groupIds, processedGroupData, framework) { + var combinedData = []; + var intersections = {}; + var coreDistance; + var key, drawData; + var group; + var i,j; + var barPoints = 0; + + // combine all barchart data + for (i = 0; i < groupIds.length; i++) { + group = framework.groups[groupIds[i]]; + if (group.options.style == 'bar') { + if (group.visible == true && (framework.options.groups.visibility[groupIds[i]] === undefined || framework.options.groups.visibility[groupIds[i]] == true)) { + for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { + combinedData.push({ + x: processedGroupData[groupIds[i]][j].x, + y: processedGroupData[groupIds[i]][j].y, + groupId: groupIds[i] + }); + barPoints += 1; + } + } + } + } + + if (barPoints == 0) {return;} + + // sort by time and by group + combinedData.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; + } + }); + + // get intersections + Bargraph._getDataIntersections(intersections, combinedData); + + // plot barchart + for (i = 0; i < combinedData.length; i++) { + group = framework.groups[combinedData[i].groupId]; + var minWidth = 0.1 * group.options.barChart.width; + + key = combinedData[i].x; + var heightOffset = 0; + if (intersections[key] === undefined) { + if (i+1 < combinedData.length) {coreDistance = Math.abs(combinedData[i+1].x - key);} + if (i > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[i-1].x - key));} + drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); + } + else { + var nextKey = i + (intersections[key].amount - intersections[key].resolved); + var prevKey = i - (intersections[key].resolved + 1); + if (nextKey < combinedData.length) {coreDistance = Math.abs(combinedData[nextKey].x - key);} + if (prevKey > 0) {coreDistance = Math.min(coreDistance,Math.abs(combinedData[prevKey].x - key));} + drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); + intersections[key].resolved += 1; + + if (group.options.barChart.handleOverlap == 'stack') { + heightOffset = intersections[key].accumulated; + intersections[key].accumulated += group.zeroPosition - combinedData[i].y; + } + else if (group.options.barChart.handleOverlap == 'sideBySide') { + drawData.width = drawData.width / intersections[key].amount; + drawData.offset += (intersections[key].resolved) * drawData.width - (0.5*drawData.width * (intersections[key].amount+1)); + if (group.options.barChart.align == 'left') {drawData.offset -= 0.5*drawData.width;} + else if (group.options.barChart.align == 'right') {drawData.offset += 0.5*drawData.width;} + } + } + DOMutil.drawBar(combinedData[i].x + drawData.offset, combinedData[i].y - heightOffset, drawData.width, group.zeroPosition - combinedData[i].y, group.className + ' bar', framework.svgElements, framework.svg); + // draw points + if (group.options.drawPoints.enabled == true) { + DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y, group, framework.svgElements, framework.svg); + } + } + }; + + + /** + * Fill the intersections object with counters of how many datapoints share the same x coordinates + * @param intersections + * @param combinedData + * @private + */ + Bargraph._getDataIntersections = function (intersections, combinedData) { + // get intersections + var coreDistance; + for (var i = 0; i < combinedData.length; i++) { + if (i + 1 < combinedData.length) { + coreDistance = Math.abs(combinedData[i + 1].x - combinedData[i].x); + } + if (i > 0) { + coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].x - combinedData[i].x)); + } + if (coreDistance == 0) { + if (intersections[combinedData[i].x] === undefined) { + intersections[combinedData[i].x] = {amount: 0, resolved: 0, accumulated: 0}; + } + intersections[combinedData[i].x].amount += 1; + } + } + }; + + + /** + * Get the width and offset for bargraphs based on the coredistance between datapoints + * + * @param coreDistance + * @param group + * @param minWidth + * @returns {{width: Number, offset: Number}} + * @private + */ + Bargraph._getSafeDrawData = function (coreDistance, group, minWidth) { + var width, offset; + if (coreDistance < group.options.barChart.width && coreDistance > 0) { + width = coreDistance < minWidth ? minWidth : coreDistance; + + offset = 0; // recalculate offset with the new width; + if (group.options.barChart.align == 'left') { + offset -= 0.5 * coreDistance; + } + else if (group.options.barChart.align == 'right') { + offset += 0.5 * coreDistance; + } + } + else { + // default settings + width = group.options.barChart.width; + offset = 0; + if (group.options.barChart.align == 'left') { + offset -= 0.5 * group.options.barChart.width; + } + else if (group.options.barChart.align == 'right') { + offset += 0.5 * group.options.barChart.width; + } + } + + return {width: width, offset: offset}; + }; + + Bargraph.getStackedBarYRange = function(barCombinedData, groupRanges, groupIds, groupLabel, orientation) { + if (barCombinedData.length > 0) { + // sort by time and by group + barCombinedData.sort(function (a, b) { + if (a.x == b.x) { + return a.groupId - b.groupId; + } else { + return a.x - b.x; + } + }); + var intersections = {}; + + Bargraph._getDataIntersections(intersections, barCombinedData); + groupRanges[groupLabel] = Bargraph._getStackedBarYRange(intersections, barCombinedData); + groupRanges[groupLabel].yAxisOrientation = orientation; + groupIds.push(groupLabel); + } + } + + Bargraph._getStackedBarYRange = function (intersections, combinedData) { + var key; + var yMin = combinedData[0].y; + var yMax = combinedData[0].y; + for (var i = 0; i < combinedData.length; i++) { + key = combinedData[i].x; + if (intersections[key] === undefined) { + yMin = yMin > combinedData[i].y ? combinedData[i].y : yMin; + yMax = yMax < combinedData[i].y ? combinedData[i].y : yMax; + } + else { + intersections[key].accumulated += combinedData[i].y; + } + } + for (var xpos in intersections) { + if (intersections.hasOwnProperty(xpos)) { + yMin = yMin > intersections[xpos].accumulated ? intersections[xpos].accumulated : yMin; + yMax = yMax < intersections[xpos].accumulated ? intersections[xpos].accumulated : yMax; + } + } + + return {min: yMin, max: yMax}; + }; + + module.exports = Bargraph; + +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Created by Alex on 11/11/2014. + */ + var DOMutil = __webpack_require__(2); + + function Points(groupId, options) { + this.groupId = groupId; + this.options = options; + } + + + Points.prototype.getYRange = function(groupData) { + var yMin = groupData[0].y; + var yMax = groupData[0].y; + for (var j = 0; j < groupData.length; j++) { + yMin = yMin > groupData[j].y ? groupData[j].y : yMin; + yMax = yMax < groupData[j].y ? groupData[j].y : yMax; + } + return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; + }; + + Points.prototype.draw = function(dataset, group, framework, offset) { + Points.draw(dataset, group, framework, offset); + } + + /** + * draw the data points + * + * @param {Array} dataset + * @param {Object} JSONcontainer + * @param {Object} svg | SVG DOM element + * @param {GraphGroup} group + * @param {Number} [offset] + */ + Points.draw = function (dataset, group, framework, offset) { + if (offset === undefined) {offset = 0;} + for (var i = 0; i < dataset.length; i++) { + DOMutil.drawPoint(dataset[i].x + offset, dataset[i].y, group, framework.svgElements, framework.svg, dataset[i].label); + } + }; + + + module.exports = Points; + +/***/ }, +/* 52 */ +/***/ function(module, exports, __webpack_require__) { + + var PhysicsMixin = __webpack_require__(60); + var ClusterMixin = __webpack_require__(61); + var SectorsMixin = __webpack_require__(62); + var SelectionMixin = __webpack_require__(63); + var ManipulationMixin = __webpack_require__(64); + var NavigationMixin = __webpack_require__(65); + var HierarchicalLayoutMixin = __webpack_require__(66); + + /** + * Load a mixin into the network object + * + * @param {Object} sourceVariable | this object has to contain functions. + * @private + */ + exports._loadMixin = function (sourceVariable) { + for (var mixinFunction in sourceVariable) { + if (sourceVariable.hasOwnProperty(mixinFunction)) { + this[mixinFunction] = sourceVariable[mixinFunction]; + } + } + }; + + + /** + * removes a mixin from the network object. + * + * @param {Object} sourceVariable | this object has to contain functions. + * @private + */ + exports._clearMixin = function (sourceVariable) { + for (var mixinFunction in sourceVariable) { + if (sourceVariable.hasOwnProperty(mixinFunction)) { + this[mixinFunction] = undefined; + } + } + }; + + + /** + * Mixin the physics system and initialize the parameters required. + * + * @private + */ + exports._loadPhysicsSystem = function () { + this._loadMixin(PhysicsMixin); + this._loadSelectedForceSolver(); + if (this.constants.configurePhysics == true) { + this._loadPhysicsConfiguration(); + } + else { + this._cleanupPhysicsConfiguration(); + } + }; + + + /** + * Mixin the cluster system and initialize the parameters required. + * + * @private + */ + exports._loadClusterSystem = function () { + this.clusterSession = 0; + this.hubThreshold = 5; + this._loadMixin(ClusterMixin); + }; + + + /** + * Mixin the sector system and initialize the parameters required + * + * @private + */ + exports._loadSectorSystem = function () { + this.sectors = {}; + this.activeSector = ["default"]; + this.sectors["active"] = {}; + this.sectors["active"]["default"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; + this.sectors["frozen"] = {}; + this.sectors["support"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; + + this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields + + this._loadMixin(SectorsMixin); + }; + + + /** + * Mixin the selection system and initialize the parameters required + * + * @private + */ + exports._loadSelectionSystem = function () { + this.selectionObj = {nodes: {}, edges: {}}; + + this._loadMixin(SelectionMixin); + }; + + + /** + * Mixin the navigationUI (User Interface) system and initialize the parameters required + * + * @private + */ + exports._loadManipulationSystem = function () { + // reset global variables -- these are used by the selection of nodes and edges. + this.blockConnectingEdgeSelection = false; + this.forceAppendSelection = false; + + if (this.constants.dataManipulation.enabled == true) { + // load the manipulator HTML elements. All styling done in css. + if (this.manipulationDiv === undefined) { + this.manipulationDiv = document.createElement('div'); + this.manipulationDiv.className = 'network-manipulationDiv'; + if (this.editMode == true) { + this.manipulationDiv.style.display = "block"; + } + else { + this.manipulationDiv.style.display = "none"; + } + this.frame.appendChild(this.manipulationDiv); + } + + if (this.editModeDiv === undefined) { + this.editModeDiv = document.createElement('div'); + this.editModeDiv.className = 'network-manipulation-editMode'; + if (this.editMode == true) { + this.editModeDiv.style.display = "none"; + } + else { + this.editModeDiv.style.display = "block"; + } + this.frame.appendChild(this.editModeDiv); + } + + if (this.closeDiv === undefined) { + this.closeDiv = document.createElement('div'); + this.closeDiv.className = 'network-manipulation-closeDiv'; + this.closeDiv.style.display = this.manipulationDiv.style.display; + this.frame.appendChild(this.closeDiv); + } + + // load the manipulation functions + this._loadMixin(ManipulationMixin); + + // create the manipulator toolbar + this._createManipulatorBar(); + } + else { + if (this.manipulationDiv !== undefined) { + // removes all the bindings and overloads + this._createManipulatorBar(); + + // remove the manipulation divs + this.frame.removeChild(this.manipulationDiv); + this.frame.removeChild(this.editModeDiv); + this.frame.removeChild(this.closeDiv); + + this.manipulationDiv = undefined; + this.editModeDiv = undefined; + this.closeDiv = undefined; + // remove the mixin functions + this._clearMixin(ManipulationMixin); + } + } + }; + + + /** + * Mixin the navigation (User Interface) system and initialize the parameters required + * + * @private + */ + exports._loadNavigationControls = function () { + this._loadMixin(NavigationMixin); + // the clean function removes the button divs, this is done to remove the bindings. + this._cleanNavigation(); + if (this.constants.navigation.enabled == true) { + this._loadNavigationElements(); + } + }; + + + /** + * Mixin the hierarchical layout system. + * + * @private + */ + exports._loadHierarchySystem = function () { + this._loadMixin(HierarchicalLayoutMixin); + }; + + +/***/ }, +/* 53 */ +/***/ function(module, exports, __webpack_require__) { + + var keycharm = __webpack_require__(57); + var Emitter = __webpack_require__(56); + var Hammer = __webpack_require__(45); + var util = __webpack_require__(1); + + /** + * Turn an element into an clickToUse element. + * When not active, the element has a transparent overlay. When the overlay is + * clicked, the mode is changed to active. + * When active, the element is displayed with a blue border around it, and + * the interactive contents of the element can be used. When clicked outside + * the element, the elements mode is changed to inactive. + * @param {Element} container + * @constructor + */ + function Activator(container) { + this.active = false; + + this.dom = { + container: container + }; + + this.dom.overlay = document.createElement('div'); + this.dom.overlay.className = 'overlay'; + + this.dom.container.appendChild(this.dom.overlay); + + this.hammer = Hammer(this.dom.overlay, {prevent_default: false}); + this.hammer.on('tap', this._onTapOverlay.bind(this)); + + // block all touch events (except tap) + var me = this; + var events = [ + 'touch', 'pinch', + 'doubletap', 'hold', + 'dragstart', 'drag', 'dragend', + 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox + ]; + events.forEach(function (event) { + me.hammer.on(event, function (event) { + event.stopPropagation(); + }); + }); + + // attach a tap event to the window, in order to deactivate when clicking outside the timeline + this.windowHammer = Hammer(window, {prevent_default: false}); + this.windowHammer.on('tap', function (event) { + // deactivate when clicked outside the container + if (!_hasParent(event.target, container)) { + me.deactivate(); + } + }); + + if (this.keycharm !== undefined) { + this.keycharm.destroy(); + } + this.keycharm = keycharm(); + + // keycharm listener only bounded when active) + this.escListener = this.deactivate.bind(this); + } + + // turn into an event emitter + Emitter(Activator.prototype); + + // The currently active activator + Activator.current = null; + + /** + * Destroy the activator. Cleans up all created DOM and event listeners + */ + Activator.prototype.destroy = function () { + this.deactivate(); + + // remove dom + this.dom.overlay.parentNode.removeChild(this.dom.overlay); + + // cleanup hammer instances + this.hammer = null; + this.windowHammer = null; + // FIXME: cleaning up hammer instances doesn't work (Timeline not removed from memory) + }; + + /** + * Activate the element + * Overlay is hidden, element is decorated with a blue shadow border + */ + Activator.prototype.activate = function () { + // we allow only one active activator at a time + if (Activator.current) { + Activator.current.deactivate(); + } + Activator.current = this; + + this.active = true; + this.dom.overlay.style.display = 'none'; + util.addClassName(this.dom.container, 'vis-active'); + + this.emit('change'); + this.emit('activate'); + + // ugly hack: bind ESC after emitting the events, as the Network rebinds all + // keyboard events on a 'change' event + this.keycharm.bind('esc', this.escListener); + }; + + /** + * Deactivate the element + * Overlay is displayed on top of the element + */ + Activator.prototype.deactivate = function () { + this.active = false; + this.dom.overlay.style.display = ''; + util.removeClassName(this.dom.container, 'vis-active'); + this.keycharm.unbind('esc', this.escListener); + + this.emit('change'); + this.emit('deactivate'); + }; + + /** + * Handle a tap event: activate the container + * @param event + * @private + */ + Activator.prototype._onTapOverlay = function (event) { + // activate the container + this.activate(); + event.stopPropagation(); + }; + + /** + * Test whether the element has the requested parent element somewhere in + * its chain of parent nodes. + * @param {HTMLElement} element + * @param {HTMLElement} parent + * @returns {boolean} Returns true when the parent is found somewhere in the + * chain of parent nodes. + * @private + */ + function _hasParent(element, parent) { + while (element) { + if (element === parent) { + return true + } + element = element.parentNode; + } + return false; + } + + module.exports = Activator; + + +/***/ }, +/* 54 */ +/***/ function(module, exports, __webpack_require__) { + + // English + exports['en'] = { + edit: 'Edit', + del: 'Delete selected', + back: 'Back', + addNode: 'Add Node', + addEdge: 'Add Edge', + editNode: 'Edit Node', + editEdge: 'Edit Edge', + addDescription: 'Click in an empty space to place a new node.', + edgeDescription: 'Click on a node and drag the edge to another node to connect them.', + editEdgeDescription: 'Click on the control points and drag them to a node to connect to it.', + createEdgeError: 'Cannot link edges to a cluster.', + deleteClusterError: 'Clusters cannot be deleted.' + }; + exports['en_EN'] = exports['en']; + exports['en_US'] = exports['en']; + + // Dutch + exports['nl'] = { + edit: 'Wijzigen', + del: 'Selectie verwijderen', + back: 'Terug', + addNode: 'Node toevoegen', + addEdge: 'Link toevoegen', + editNode: 'Node wijzigen', + editEdge: 'Link wijzigen', + addDescription: 'Klik op een leeg gebied om een nieuwe node te maken.', + edgeDescription: 'Klik op een node en sleep de link naar een andere node om ze te verbinden.', + editEdgeDescription: 'Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.', + createEdgeError: 'Kan geen link maken naar een cluster.', + deleteClusterError: 'Clusters kunnen niet worden verwijderd.' + }; + exports['nl_NL'] = exports['nl']; + exports['nl_BE'] = exports['nl']; + + +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Canvas shapes used by Network + */ + if (typeof CanvasRenderingContext2D !== 'undefined') { + + /** + * Draw a circle shape + */ + CanvasRenderingContext2D.prototype.circle = function(x, y, r) { + this.beginPath(); + this.arc(x, y, r, 0, 2*Math.PI, false); + }; + + /** + * Draw a square shape + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r size, width and height of the square + */ + CanvasRenderingContext2D.prototype.square = function(x, y, r) { + this.beginPath(); + this.rect(x - r, y - r, r * 2, r * 2); + }; + + /** + * Draw a triangle shape + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius, half the length of the sides of the triangle + */ + CanvasRenderingContext2D.prototype.triangle = function(x, y, r) { + // http://en.wikipedia.org/wiki/Equilateral_triangle + this.beginPath(); + + var s = r * 2; + var s2 = s / 2; + var ir = Math.sqrt(3) / 6 * s; // radius of inner circle + var h = Math.sqrt(s * s - s2 * s2); // height + + this.moveTo(x, y - (h - ir)); + this.lineTo(x + s2, y + ir); + this.lineTo(x - s2, y + ir); + this.lineTo(x, y - (h - ir)); + this.closePath(); + }; + + /** + * Draw a triangle shape in downward orientation + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius + */ + CanvasRenderingContext2D.prototype.triangleDown = function(x, y, r) { + // http://en.wikipedia.org/wiki/Equilateral_triangle + this.beginPath(); + + var s = r * 2; + var s2 = s / 2; + var ir = Math.sqrt(3) / 6 * s; // radius of inner circle + var h = Math.sqrt(s * s - s2 * s2); // height + + this.moveTo(x, y + (h - ir)); + this.lineTo(x + s2, y - ir); + this.lineTo(x - s2, y - ir); + this.lineTo(x, y + (h - ir)); + this.closePath(); + }; + + /** + * Draw a star shape, a star with 5 points + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius, half the length of the sides of the triangle + */ + CanvasRenderingContext2D.prototype.star = function(x, y, r) { + // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/ + this.beginPath(); + + for (var n = 0; n < 10; n++) { + var radius = (n % 2 === 0) ? r * 1.3 : r * 0.5; + this.lineTo( + x + radius * Math.sin(n * 2 * Math.PI / 10), + y - radius * Math.cos(n * 2 * Math.PI / 10) + ); + } + + this.closePath(); + }; + + /** + * http://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas + */ + CanvasRenderingContext2D.prototype.roundRect = function(x, y, w, h, r) { + var r2d = Math.PI/180; + if( w - ( 2 * r ) < 0 ) { r = ( w / 2 ); } //ensure that the radius isn't too large for x + if( h - ( 2 * r ) < 0 ) { r = ( h / 2 ); } //ensure that the radius isn't too large for y + this.beginPath(); + this.moveTo(x+r,y); + this.lineTo(x+w-r,y); + this.arc(x+w-r,y+r,r,r2d*270,r2d*360,false); + this.lineTo(x+w,y+h-r); + this.arc(x+w-r,y+h-r,r,0,r2d*90,false); + this.lineTo(x+r,y+h); + this.arc(x+r,y+h-r,r,r2d*90,r2d*180,false); + this.lineTo(x,y+r); + this.arc(x+r,y+r,r,r2d*180,r2d*270,false); + }; + + /** + * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + */ + CanvasRenderingContext2D.prototype.ellipse = function(x, y, w, h) { + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle + + this.beginPath(); + this.moveTo(x, ym); + this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + }; + + + + /** + * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + */ + CanvasRenderingContext2D.prototype.database = function(x, y, w, h) { + var f = 1/3; + var wEllipse = w; + var hEllipse = h * f; + + var kappa = .5522848, + ox = (wEllipse / 2) * kappa, // control point offset horizontal + oy = (hEllipse / 2) * kappa, // control point offset vertical + xe = x + wEllipse, // x-end + ye = y + hEllipse, // y-end + xm = x + wEllipse / 2, // x-middle + ym = y + hEllipse / 2, // y-middle + ymb = y + (h - hEllipse/2), // y-midlle, bottom ellipse + yeb = y + h; // y-end, bottom ellipse + + this.beginPath(); + this.moveTo(xe, ym); + + this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + + this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + + this.lineTo(xe, ymb); + + this.bezierCurveTo(xe, ymb + oy, xm + ox, yeb, xm, yeb); + this.bezierCurveTo(xm - ox, yeb, x, ymb + oy, x, ymb); + + this.lineTo(x, ym); + }; + + + /** + * Draw an arrow point (no line) + */ + CanvasRenderingContext2D.prototype.arrow = function(x, y, angle, length) { + // tail + var xt = x - length * Math.cos(angle); + var yt = y - length * Math.sin(angle); + + // inner tail + // TODO: allow to customize different shapes + var xi = x - length * 0.9 * Math.cos(angle); + var yi = y - length * 0.9 * Math.sin(angle); + + // left + var xl = xt + length / 3 * Math.cos(angle + 0.5 * Math.PI); + var yl = yt + length / 3 * Math.sin(angle + 0.5 * Math.PI); + + // right + var xr = xt + length / 3 * Math.cos(angle - 0.5 * Math.PI); + var yr = yt + length / 3 * Math.sin(angle - 0.5 * Math.PI); + + this.beginPath(); + this.moveTo(x, y); + this.lineTo(xl, yl); + this.lineTo(xi, yi); + this.lineTo(xr, yr); + this.closePath(); + }; + + /** + * Sets up the dashedLine functionality for drawing + * Original code came from http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas + * @author David Jordan + * @date 2012-08-08 + */ + CanvasRenderingContext2D.prototype.dashedLine = function(x,y,x2,y2,dashArray){ + if (!dashArray) dashArray=[10,5]; + if (dashLength==0) dashLength = 0.001; // Hack for Safari + var dashCount = dashArray.length; + this.moveTo(x, y); + var dx = (x2-x), dy = (y2-y); + var slope = dy/dx; + var distRemaining = Math.sqrt( dx*dx + dy*dy ); + var dashIndex=0, draw=true; + while (distRemaining>=0.1){ + var dashLength = dashArray[dashIndex++%dashCount]; + if (dashLength > distRemaining) dashLength = distRemaining; + var xStep = Math.sqrt( dashLength*dashLength / (1 + slope*slope) ); + if (dx<0) xStep = -xStep; + x += xStep; + y += slope*xStep; + this[draw ? 'lineTo' : 'moveTo'](x,y); + distRemaining -= dashLength; + draw = !draw; + } + }; + + // TODO: add diamond shape + } + + +/***/ }, +/* 56 */ +/***/ function(module, exports, __webpack_require__) { + + + /** + * Expose `Emitter`. + */ + + module.exports = Emitter; + + /** + * Initialize a new `Emitter`. + * + * @api public + */ + + function Emitter(obj) { + if (obj) return mixin(obj); + }; + + /** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + + function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + return obj; + } + + /** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + + Emitter.prototype.on = + Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks[event] = this._callbacks[event] || []) + .push(fn); + return this; + }; + + /** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + + Emitter.prototype.once = function(event, fn){ + var self = this; + this._callbacks = this._callbacks || {}; + + function on() { + self.off(event, on); + fn.apply(this, arguments); + } + + on.fn = fn; + this.on(event, on); + return this; + }; + + /** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + + Emitter.prototype.off = + Emitter.prototype.removeListener = + Emitter.prototype.removeAllListeners = + Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; + } + + // specific event + var callbacks = this._callbacks[event]; + if (!callbacks) return this; + + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks[event]; + return this; + } + + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } + return this; + }; + + /** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ + + Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + var args = [].slice.call(arguments, 1) + , callbacks = this._callbacks[event]; + + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } + + return this; + }; + + /** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ + + Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks[event] || []; + }; + + /** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ + + Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; + }; + + +/***/ }, +/* 57 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;"use strict"; + /** + * Created by Alex on 11/6/2014. + */ + + // https://github.com/umdjs/umd/blob/master/returnExports.js#L40-L60 + // if the module has no dependencies, the above pattern can be simplified to + (function (root, factory) { + if (true) { + // AMD. Register as an anonymous module. + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals (root is window) + root.keycharm = factory(); + } + }(this, function () { + + function keycharm(options) { + var preventDefault = options && options.preventDefault || false; + + var container = options && options.container || window; + var _exportFunctions = {}; + var _bound = {keydown:{}, keyup:{}}; + var _keys = {}; + var i; + + // a - z + for (i = 97; i <= 122; i++) {_keys[String.fromCharCode(i)] = {code:65 + (i - 97), shift: false};} + // A - Z + for (i = 65; i <= 90; i++) {_keys[String.fromCharCode(i)] = {code:i, shift: true};} + // 0 - 9 + for (i = 0; i <= 9; i++) {_keys['' + i] = {code:48 + i, shift: false};} + // F1 - F12 + for (i = 1; i <= 12; i++) {_keys['F' + i] = {code:111 + i, shift: false};} + // num0 - num9 + for (i = 0; i <= 9; i++) {_keys['num' + i] = {code:96 + i, shift: false};} + + // numpad misc + _keys['num*'] = {code:106, shift: false}; + _keys['num+'] = {code:107, shift: false}; + _keys['num-'] = {code:109, shift: false}; + _keys['num/'] = {code:111, shift: false}; + _keys['num.'] = {code:110, shift: false}; + // arrows + _keys['left'] = {code:37, shift: false}; + _keys['up'] = {code:38, shift: false}; + _keys['right'] = {code:39, shift: false}; + _keys['down'] = {code:40, shift: false}; + // extra keys + _keys['space'] = {code:32, shift: false}; + _keys['enter'] = {code:13, shift: false}; + _keys['shift'] = {code:16, shift: undefined}; + _keys['esc'] = {code:27, shift: false}; + _keys['backspace'] = {code:8, shift: false}; + _keys['tab'] = {code:9, shift: false}; + _keys['ctrl'] = {code:17, shift: false}; + _keys['alt'] = {code:18, shift: false}; + _keys['delete'] = {code:46, shift: false}; + _keys['pageup'] = {code:33, shift: false}; + _keys['pagedown'] = {code:34, shift: false}; + // symbols + _keys['='] = {code:187, shift: false}; + _keys['-'] = {code:189, shift: false}; + _keys[']'] = {code:221, shift: false}; + _keys['['] = {code:219, shift: false}; + + + + var down = function(event) {handleEvent(event,'keydown');}; + var up = function(event) {handleEvent(event,'keyup');}; + + // handle the actualy bound key with the event + var handleEvent = function(event,type) { + if (_bound[type][event.keyCode] !== undefined) { + var bound = _bound[type][event.keyCode]; + for (var i = 0; i < bound.length; i++) { + if (bound[i].shift === undefined) { + bound[i].fn(event); + } + else if (bound[i].shift == true && event.shiftKey == true) { + bound[i].fn(event); + } + else if (bound[i].shift == false && event.shiftKey == false) { + bound[i].fn(event); + } + } + + if (preventDefault == true) { + event.preventDefault(); + } + } + }; + + // bind a key to a callback + _exportFunctions.bind = function(key, callback, type) { + if (type === undefined) { + type = 'keydown'; + } + if (_keys[key] === undefined) { + throw new Error("unsupported key: " + key); + } + if (_bound[type][_keys[key].code] === undefined) { + _bound[type][_keys[key].code] = []; + } + _bound[type][_keys[key].code].push({fn:callback, shift:_keys[key].shift}); + }; + + + // bind all keys to a call back (demo purposes) + _exportFunctions.bindAll = function(callback, type) { + if (type === undefined) { + type = 'keydown'; + } + for (var key in _keys) { + if (_keys.hasOwnProperty(key)) { + _exportFunctions.bind(key,callback,type); + } + } + }; + + // get the key label from an event + _exportFunctions.getKey = function(event) { + for (var key in _keys) { + if (_keys.hasOwnProperty(key)) { + if (event.shiftKey == true && _keys[key].shift == true && event.keyCode == _keys[key].code) { + return key; + } + else if (event.shiftKey == false && _keys[key].shift == false && event.keyCode == _keys[key].code) { + return key; + } + else if (event.keyCode == _keys[key].code && key == 'shift') { + return key; + } + } + } + return "unknown key, currently not supported"; + }; + + // unbind either a specific callback from a key or all of them (by leaving callback undefined) + _exportFunctions.unbind = function(key, callback, type) { + if (type === undefined) { + type = 'keydown'; + } + if (_keys[key] === undefined) { + throw new Error("unsupported key: " + key); + } + if (callback !== undefined) { + var newBindings = []; + var bound = _bound[type][_keys[key].code]; + if (bound !== undefined) { + for (var i = 0; i < bound.length; i++) { + if (!(bound[i].fn == callback && bound[i].shift == _keys[key].shift)) { + newBindings.push(_bound[type][_keys[key].code][i]); + } + } + } + _bound[type][_keys[key].code] = newBindings; + } + else { + _bound[type][_keys[key].code] = []; + } + }; + + // reset all bound variables. + _exportFunctions.reset = function() { + _bound = {keydown:{}, keyup:{}}; + }; + + // unbind all listeners and reset all variables. + _exportFunctions.destroy = function() { + _bound = {keydown:{}, keyup:{}}; + container.removeEventListener('keydown', down, true); + container.removeEventListener('keyup', up, true); + }; + + // create listeners. + container.addEventListener('keydown',down,true); + container.addEventListener('keyup',up,true); + + // return the public functions. + return _exportFunctions; + } + + return keycharm; + })); + + + + +/***/ }, +/* 58 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {//! moment.js + //! version : 2.9.0 + //! authors : Tim Wood, Iskren Chernev, Moment.js contributors + //! license : MIT + //! momentjs.com + + (function (undefined) { + /************************************ + Constants + ************************************/ + + var moment, + VERSION = '2.9.0', + // the global-scope this is NOT the global object in Node.js + globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, + oldGlobalMoment, + round = Math.round, + hasOwnProperty = Object.prototype.hasOwnProperty, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for locale config files + locales = {}, + + // extra moment internal properties (plugins register props here) + momentProperties = [], + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + + isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], + ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], + ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], + ['GGGG-[W]WW', /\d{4}-W\d{2}/], + ['YYYY-DDD', /\d{4}-\d{3}/] + ], + + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], + + // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // default relative time thresholds + relativeTimeThresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.localeData().monthsShort(this, format); + }, + MMMM : function (format) { + return this.localeData().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.localeData().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.localeData().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.localeData().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), false); + }, + H : function () { + return this.hours(); + }, + h : function () { + return this.hours() % 12 || 12; + }, + m : function () { + return this.minutes(); + }, + s : function () { + return this.seconds(); + }, + S : function () { + return toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + x : function () { + return this.valueOf(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, + + deprecations = {}, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], + + updateInProgress = false; + + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error('Implement me'); + } + } + + function hasOwnProp(a, b) { + return hasOwnProperty.call(a, b); + } + + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + + function printMsg(msg) { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + return extend(function () { + if (firstTime) { + printMsg(msg); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + printMsg(msg); + deprecations[name] = true; + } + } + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.localeData().ordinal(func.call(this, a), period); + }; + } + + function monthDiff(a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // thie is not supposed to happen + return hour; + } + } + + /************************************ + Constructors + ************************************/ + + function Locale() { + } + + // Moment prototype object + function Moment(config, skipOverflow) { + if (skipOverflow !== false) { + checkOverflow(config); + } + copyConfig(this, config); + this._d = new Date(+config._d); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + moment.updateOffset(this); + updateInProgress = false; + } + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = moment.localeData(); + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function copyConfig(to, from) { + var i, prop, val; + + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = from._pf; + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } + + return to; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + other = makeAs(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = moment.duration(val, period); + addOrSubtractDurationFromMoment(this, dur, direction); + return this; + }; + } + + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment._locale[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment._locale, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 24 || + (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || + m._a[SECOND] !== 0 || + m._a[MILLISECOND] !== 0)) ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0 && + m._pf.bigHour === undefined; + } + } + return m._isValid; + } + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + if (!locales[name] && hasModule) { + try { + oldLocale = moment.locale(); + !(function webpackMissingModule() { var e = new Error("Cannot find module \"./locale\""); e.code = 'MODULE_NOT_FOUND'; throw e; }()); + // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales + moment.locale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // Return a moment from input, that is local/utc/utcOffset equivalent to + // model. + function makeAs(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (moment.isMoment(input) || isDate(input) ? + +input : +moment(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + moment.updateOffset(res, false); + return res; + } else { + return moment(input).local(); + } + } + + /************************************ + Locale + ************************************/ + + + extend(Locale.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); + }, + + _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = moment.utc([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM D, YYYY LT' + }, + longDateFormat : function (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + }, + + + _calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + calendar : function (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom, [now]) : output; + }, + + _relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + + relativeTime : function (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace('%d', number); + }, + _ordinal : '%d', + _ordinalParse : /\d{1,2}/, + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + firstDayOfWeek : function () { + return this._week.dow; + }, + + firstDayOfYear : function () { + return this._week.doy; + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { + return parseTokenOneDigit; + } + /* falls through */ + case 'SS': + if (strict) { + return parseTokenTwoDigits; + } + /* falls through */ + case 'SSS': + if (strict) { + return parseTokenThreeDigits; + } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return config._locale._meridiemParse; + case 'x': + return parseTokenOffsetMs; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); + return a; + } + } + + function utcOffsetFromString(string) { + string = string || ''; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt( + input.match(/\d{1,2}/)[0], 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._meridiem = input; + // config._isPm = config._locale.isPM(input); + break; + // HOUR + case 'h' : // fall through to hh + case 'hh' : + config._pf.bigHour = true; + /* falls through */ + case 'H' : // fall through to HH + case 'HH' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX OFFSET (MILLISECONDS) + case 'x': + config._d = new Date(toInt(input)); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = utcOffsetFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day || normalizedInput.date, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._pf.bigHour === true && config._a[HOUR] <= 12) { + config._pf.bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], + config._meridiem); + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += 'Z'; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function makeDateFromInput(config) { + var input = config._i, matched; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + dateFromConfig(config); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(posNegDuration, withoutSuffix, locale) { + var duration = moment.duration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + years = round(duration.as('y')), + + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < relativeTimeThresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < relativeTimeThresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; + + args[2] = withoutSuffix; + args[3] = +posNegDuration > 0; + args[4] = locale; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f, + res; + + config._locale = config._locale || moment.localeData(config._l); + + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (moment.isMoment(input)) { + return new Moment(input, true); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + res = new Moment(config); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + moment = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = locale; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); + }; + + moment.suppressDeprecationWarnings = false; + + moment.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; + + moment.max = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + }; + + // creating with utc + moment.utc = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); + + return makeMoment(c).utc(); + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + diffRes; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && + ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(moment(duration.from), moment(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function (threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return relativeTimeThresholds[threshold]; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; + + moment.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + function (key, value) { + return moment.locale(key, value); + } + ); + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + moment.locale = function (key, values) { + var data; + if (key) { + if (typeof(values) !== 'undefined') { + data = moment.defineLocale(key, values); + } + else { + data = moment.localeData(key); + } + + if (data) { + moment.duration._locale = moment._locale = data; + } + } + + return moment._locale._abbr; + }; + + moment.defineLocale = function (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); + + // backwards compat for now: also set the locale + moment.locale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + }; + + moment.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + function (key) { + return moment.localeData(key); + } + ); + + // returns locale data + moment.localeData = function (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return moment._locale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && hasOwnProp(obj, '_isAMomentObject')); + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; + + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + moment.isDate = isDate; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d - ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + }, + + local : function (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(this._dateUtcOffset(), 'm'); + } + } + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.localeData().postformat(output); + }, + + add : createAdder(1, 'add'), + + subtract : createAdder(-1, 'subtract'), + + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, + anchor, diff, output, daysAdjust; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + diff = this - that; + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're locat/utc/offset + // or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, moment(now))); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + }, + + month : makeAccessor('Month', true), + + startOf : function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + }, + + isAfter: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this > +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return inputMs < +this.clone().startOf(units); + } + }, + + isBefore: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this < +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return +this.clone().endOf(units) < inputMs; + } + }, + + isBetween: function (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + }, + + isSame: function (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this === +input; + } else { + inputMs = +moment(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + }, + + min: deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), + + max: deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), + + zone : deprecate( + 'moment().zone is deprecated, use moment().utcOffset instead. ' + + 'https://github.com/moment/moment/issues/1779', + function (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + ), + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + utcOffset : function (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = utcOffsetFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = this._dateUtcOffset(); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + + return this; + } else { + return this._isUTC ? offset : this._dateUtcOffset(); + } + }, + + isLocal : function () { + return !this._isUTC; + }, + + isUtcOffset : function () { + return this._isUTC; + }, + + isUtc : function () { + return this._isUTC && this._offset === 0; + }, + + zoneAbbr : function () { + return this._isUTC ? 'UTC' : ''; + }, + + zoneName : function () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + }, + + parseZone : function () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(utcOffsetFromString(this._i)); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).utcOffset(); + } + + return (this.utcOffset() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + }, + + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + week : function (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } + else { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + } + return this; + }, + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + locale : function (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = moment.localeData(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + }, + + lang : deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ), + + localeData : function () { + return this._locale; + }, + + _dateUtcOffset : function () { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(this._d.getTimezoneOffset() / 15) * 15; + } + + }); + + function rawMonthSetter(mom, value) { + var dayOfMonth; + + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } + + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } + + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + // alias isUtc for dev-friendliness + moment.fn.isUTC = moment.fn.isUtc; + + /************************************ + Duration Prototype + ************************************/ + + + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } + + function yearsToDays (years) { + // years * 365 + absRound(years / 4) - + // absRound(years / 100) + absRound(years / 400); + return years * 146097 / 400; + } + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years = 0; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + + // Accurately convert days to years, assume start from year 0. + years = absRound(daysToYears(days)); + days -= absRound(yearsToDays(years)); + + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absRound(days / 30); + days %= 30; + + // 12 months -> 1 year + years += absRound(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + }, + + abs : function () { + this._milliseconds = Math.abs(this._milliseconds); + this._days = Math.abs(this._days); + this._months = Math.abs(this._months); + + this._data.milliseconds = Math.abs(this._data.milliseconds); + this._data.seconds = Math.abs(this._data.seconds); + this._data.minutes = Math.abs(this._data.minutes); + this._data.hours = Math.abs(this._data.hours); + this._data.months = Math.abs(this._data.months); + this._data.years = Math.abs(this._data.years); + + return this; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var output = relativeTime(this, !withSuffix, this.localeData()); + + if (withSuffix) { + output = this.localeData().pastFuture(+this, output); + } + + return this.localeData().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + var days, months; + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + }, + + lang : moment.fn.lang, + locale : moment.fn.locale, + + toIsoString : deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead ' + + '(notice the capitals)', + function () { + return this.toISOString(); + } + ), + + toISOString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + }, + + localeData : function () { + return this._locale; + }, + + toJSON : function () { + return this.toISOString(); + } + }); + + moment.duration.fn.toString = moment.duration.fn.toISOString; + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + for (i in unitMillisecondFactors) { + if (hasOwnProp(unitMillisecondFactors, i)) { + makeDurationGetter(i.toLowerCase()); + } + } + + moment.duration.fn.asMilliseconds = function () { + return this.as('ms'); + }; + moment.duration.fn.asSeconds = function () { + return this.as('s'); + }; + moment.duration.fn.asMinutes = function () { + return this.as('m'); + }; + moment.duration.fn.asHours = function () { + return this.as('h'); + }; + moment.duration.fn.asDays = function () { + return this.as('d'); + }; + moment.duration.fn.asWeeks = function () { + return this.as('weeks'); + }; + moment.duration.fn.asMonths = function () { + return this.as('M'); + }; + moment.duration.fn.asYears = function () { + return this.as('y'); + }; + + /************************************ + Default Locale + ************************************/ + + + // Set default locale, other locale will inherit from English. + moment.locale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + /* EMBED_LOCALES */ + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + 'Accessing Moment through the global scope is ' + + 'deprecated, and will be removed in an upcoming ' + + 'release.', + moment); + } else { + globalScope.moment = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } + + return moment; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + makeGlobal(true); + } else { + makeGlobal(); + } + }).call(this); + + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(71)(module))) + +/***/ }, +/* 59 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v1.1.3 - 2014-05-20 + * http://eightmedia.github.io/hammer.js + * + * Copyright (c) 2014 Jorik Tangelder ; + * Licensed under the MIT license */ + + (function(window, undefined) { + 'use strict'; + + /** + * @main + * @module hammer + * + * @class Hammer + * @static + */ + + /** + * Hammer, use this to create instances + * ```` + * var hammertime = new Hammer(myElement); + * ```` + * + * @method Hammer + * @param {HTMLElement} element + * @param {Object} [options={}] + * @return {Hammer.Instance} + */ + var Hammer = function Hammer(element, options) { + return new Hammer.Instance(element, options || {}); + }; + + /** + * version, as defined in package.json + * the value will be set at each build + * @property VERSION + * @final + * @type {String} + */ + Hammer.VERSION = '1.1.3'; + + /** + * default settings. + * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled + * by setting it's name (like `swipe`) to false. + * You can set the defaults for all instances by changing this object before creating an instance. + * @example + * ```` + * Hammer.defaults.drag = false; + * Hammer.defaults.behavior.touchAction = 'pan-y'; + * delete Hammer.defaults.behavior.userSelect; + * ```` + * @property defaults + * @type {Object} + */ + Hammer.defaults = { + /** + * this setting object adds styles and attributes to the element to prevent the browser from doing + * its native behavior. The css properties are auto prefixed for the browsers when needed. + * @property defaults.behavior + * @type {Object} + */ + behavior: { + /** + * Disables text selection to improve the dragging gesture. When the value is `none` it also sets + * `onselectstart=false` for IE on the element. Mainly for desktop browsers. + * @property defaults.behavior.userSelect + * @type {String} + * @default 'none' + */ + userSelect: 'none', + + /** + * Specifies whether and how a given region can be manipulated by the user (for instance, by panning or zooming). + * Used by Chrome 35> and IE10>. By default this makes the element blocking any touch event. + * @property defaults.behavior.touchAction + * @type {String} + * @default: 'pan-y' + */ + touchAction: 'pan-y', + + /** + * Disables the default callout shown when you touch and hold a touch target. + * On iOS, when you touch and hold a touch target such as a link, Safari displays + * a callout containing information about the link. This property allows you to disable that callout. + * @property defaults.behavior.touchCallout + * @type {String} + * @default 'none' + */ + touchCallout: 'none', + + /** + * Specifies whether zooming is enabled. Used by IE10> + * @property defaults.behavior.contentZooming + * @type {String} + * @default 'none' + */ + contentZooming: 'none', + + /** + * Specifies that an entire element should be draggable instead of its contents. + * Mainly for desktop browsers. + * @property defaults.behavior.userDrag + * @type {String} + * @default 'none' + */ + userDrag: 'none', + + /** + * Overrides the highlight color shown when the user taps a link or a JavaScript + * clickable element in Safari on iPhone. This property obeys the alpha value, if specified. + * + * If you don't specify an alpha value, Safari on iPhone applies a default alpha value + * to the color. To disable tap highlighting, set the alpha value to 0 (invisible). + * If you set the alpha value to 1.0 (opaque), the element is not visible when tapped. + * @property defaults.behavior.tapHighlightColor + * @type {String} + * @default 'rgba(0,0,0,0)' + */ + tapHighlightColor: 'rgba(0,0,0,0)' + } + }; + + /** + * hammer document where the base events are added at + * @property DOCUMENT + * @type {HTMLElement} + * @default window.document + */ + Hammer.DOCUMENT = document; + + /** + * detect support for pointer events + * @property HAS_POINTEREVENTS + * @type {Boolean} + */ + Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; + + /** + * detect support for touch events + * @property HAS_TOUCHEVENTS + * @type {Boolean} + */ + Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); + + /** + * detect mobile browsers + * @property IS_MOBILE + * @type {Boolean} + */ + Hammer.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent); + + /** + * detect if we want to support mouseevents at all + * @property NO_MOUSEEVENTS + * @type {Boolean} + */ + Hammer.NO_MOUSEEVENTS = (Hammer.HAS_TOUCHEVENTS && Hammer.IS_MOBILE) || Hammer.HAS_POINTEREVENTS; + + /** + * interval in which Hammer recalculates current velocity/direction/angle in ms + * @property CALCULATE_INTERVAL + * @type {Number} + * @default 25 + */ + Hammer.CALCULATE_INTERVAL = 25; + + /** + * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup` + * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`) + * @property EVENT_TYPES + * @private + * @writeOnce + * @type {Object} + */ + var EVENT_TYPES = {}; + + /** + * direction strings, for safe comparisons + * @property DIRECTION_DOWN|LEFT|UP|RIGHT + * @final + * @type {String} + * @default 'down' 'left' 'up' 'right' + */ + var DIRECTION_DOWN = Hammer.DIRECTION_DOWN = 'down'; + var DIRECTION_LEFT = Hammer.DIRECTION_LEFT = 'left'; + var DIRECTION_UP = Hammer.DIRECTION_UP = 'up'; + var DIRECTION_RIGHT = Hammer.DIRECTION_RIGHT = 'right'; + + /** + * pointertype strings, for safe comparisons + * @property POINTER_MOUSE|TOUCH|PEN + * @final + * @type {String} + * @default 'mouse' 'touch' 'pen' + */ + var POINTER_MOUSE = Hammer.POINTER_MOUSE = 'mouse'; + var POINTER_TOUCH = Hammer.POINTER_TOUCH = 'touch'; + var POINTER_PEN = Hammer.POINTER_PEN = 'pen'; + + /** + * eventtypes + * @property EVENT_START|MOVE|END|RELEASE|TOUCH + * @final + * @type {String} + * @default 'start' 'change' 'move' 'end' 'release' 'touch' + */ + var EVENT_START = Hammer.EVENT_START = 'start'; + var EVENT_MOVE = Hammer.EVENT_MOVE = 'move'; + var EVENT_END = Hammer.EVENT_END = 'end'; + var EVENT_RELEASE = Hammer.EVENT_RELEASE = 'release'; + var EVENT_TOUCH = Hammer.EVENT_TOUCH = 'touch'; + + /** + * if the window events are set... + * @property READY + * @writeOnce + * @type {Boolean} + * @default false + */ + Hammer.READY = false; + + /** + * plugins namespace + * @property plugins + * @type {Object} + */ + Hammer.plugins = Hammer.plugins || {}; + + /** + * gestures namespace + * see `/gestures` for the definitions + * @property gestures + * @type {Object} + */ + Hammer.gestures = Hammer.gestures || {}; + + /** + * setup events to detect gestures on the document + * this function is called when creating an new instance + * @private + */ + function setup() { + if(Hammer.READY) { + return; + } + + // find what eventtypes we add listeners to + Event.determineEventTypes(); + + // Register all gestures inside Hammer.gestures + Utils.each(Hammer.gestures, function(gesture) { + Detection.register(gesture); + }); + + // Add touch events on the document + Event.onTouch(Hammer.DOCUMENT, EVENT_MOVE, Detection.detect); + Event.onTouch(Hammer.DOCUMENT, EVENT_END, Detection.detect); + + // Hammer is ready...! + Hammer.READY = true; + } + + /** + * @module hammer + * + * @class Utils + * @static + */ + var Utils = Hammer.utils = { + /** + * extend method, could also be used for cloning when `dest` is an empty object. + * changes the dest object + * @method extend + * @param {Object} dest + * @param {Object} src + * @param {Boolean} [merge=false] do a merge + * @return {Object} dest + */ + extend: function extend(dest, src, merge) { + for(var key in src) { + if(!src.hasOwnProperty(key) || (dest[key] !== undefined && merge)) { + continue; + } + dest[key] = src[key]; + } + return dest; + }, + + /** + * simple addEventListener wrapper + * @method on + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + */ + on: function on(element, type, handler) { + element.addEventListener(type, handler, false); + }, + + /** + * simple removeEventListener wrapper + * @method off + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + */ + off: function off(element, type, handler) { + element.removeEventListener(type, handler, false); + }, + + /** + * forEach over arrays and objects + * @method each + * @param {Object|Array} obj + * @param {Function} iterator + * @param {any} iterator.item + * @param {Number} iterator.index + * @param {Object|Array} iterator.obj the source object + * @param {Object} context value to use as `this` in the iterator + */ + each: function each(obj, iterator, context) { + var i, len; + + // native forEach on arrays + if('forEach' in obj) { + obj.forEach(iterator, context); + // arrays + } else if(obj.length !== undefined) { + for(i = 0, len = obj.length; i < len; i++) { + if(iterator.call(context, obj[i], i, obj) === false) { + return; + } + } + // objects + } else { + for(i in obj) { + if(obj.hasOwnProperty(i) && + iterator.call(context, obj[i], i, obj) === false) { + return; + } + } + } + }, + + /** + * find if a string contains the string using indexOf + * @method inStr + * @param {String} src + * @param {String} find + * @return {Boolean} found + */ + inStr: function inStr(src, find) { + return src.indexOf(find) > -1; + }, + + /** + * find if a array contains the object using indexOf or a simple polyfill + * @method inArray + * @param {String} src + * @param {String} find + * @return {Boolean|Number} false when not found, or the index + */ + inArray: function inArray(src, find) { + if(src.indexOf) { + var index = src.indexOf(find); + return (index === -1) ? false : index; + } else { + for(var i = 0, len = src.length; i < len; i++) { + if(src[i] === find) { + return i; + } + } + return false; + } + }, + + /** + * convert an array-like object (`arguments`, `touchlist`) to an array + * @method toArray + * @param {Object} obj + * @return {Array} + */ + toArray: function toArray(obj) { + return Array.prototype.slice.call(obj, 0); + }, + + /** + * find if a node is in the given parent + * @method hasParent + * @param {HTMLElement} node + * @param {HTMLElement} parent + * @return {Boolean} found + */ + hasParent: function hasParent(node, parent) { + while(node) { + if(node == parent) { + return true; + } + node = node.parentNode; + } + return false; + }, + + /** + * get the center of all the touches + * @method getCenter + * @param {Array} touches + * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties + */ + getCenter: function getCenter(touches) { + var pageX = [], + pageY = [], + clientX = [], + clientY = [], + min = Math.min, + max = Math.max; + + // no need to loop when only one touch + if(touches.length === 1) { + return { + pageX: touches[0].pageX, + pageY: touches[0].pageY, + clientX: touches[0].clientX, + clientY: touches[0].clientY + }; + } + + Utils.each(touches, function(touch) { + pageX.push(touch.pageX); + pageY.push(touch.pageY); + clientX.push(touch.clientX); + clientY.push(touch.clientY); + }); + + return { + pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2, + pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2, + clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2, + clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2 + }; + }, + + /** + * calculate the velocity between two points. unit is in px per ms. + * @method getVelocity + * @param {Number} deltaTime + * @param {Number} deltaX + * @param {Number} deltaY + * @return {Object} velocity `x` and `y` + */ + getVelocity: function getVelocity(deltaTime, deltaX, deltaY) { + return { + x: Math.abs(deltaX / deltaTime) || 0, + y: Math.abs(deltaY / deltaTime) || 0 + }; + }, + + /** + * calculate the angle between two coordinates + * @method getAngle + * @param {Touch} touch1 + * @param {Touch} touch2 + * @return {Number} angle + */ + getAngle: function getAngle(touch1, touch2) { + var x = touch2.clientX - touch1.clientX, + y = touch2.clientY - touch1.clientY; + + return Math.atan2(y, x) * 180 / Math.PI; + }, + + /** + * do a small comparision to get the direction between two touches. + * @method getDirection + * @param {Touch} touch1 + * @param {Touch} touch2 + * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN` + */ + getDirection: function getDirection(touch1, touch2) { + var x = Math.abs(touch1.clientX - touch2.clientX), + y = Math.abs(touch1.clientY - touch2.clientY); + + if(x >= y) { + return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN; + }, + + /** + * calculate the distance between two touches + * @method getDistance + * @param {Touch}touch1 + * @param {Touch} touch2 + * @return {Number} distance + */ + getDistance: function getDistance(touch1, touch2) { + var x = touch2.clientX - touch1.clientX, + y = touch2.clientY - touch1.clientY; + + return Math.sqrt((x * x) + (y * y)); + }, + + /** + * calculate the scale factor between two touchLists + * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out + * @method getScale + * @param {Array} start array of touches + * @param {Array} end array of touches + * @return {Number} scale + */ + getScale: function getScale(start, end) { + // need two fingers... + if(start.length >= 2 && end.length >= 2) { + return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]); + } + return 1; + }, + + /** + * calculate the rotation degrees between two touchLists + * @method getRotation + * @param {Array} start array of touches + * @param {Array} end array of touches + * @return {Number} rotation + */ + getRotation: function getRotation(start, end) { + // need two fingers + if(start.length >= 2 && end.length >= 2) { + return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]); + } + return 0; + }, + + /** + * find out if the direction is vertical * + * @method isVertical + * @param {String} direction matches `DIRECTION_UP|DOWN` + * @return {Boolean} is_vertical + */ + isVertical: function isVertical(direction) { + return direction == DIRECTION_UP || direction == DIRECTION_DOWN; + }, + + /** + * set css properties with their prefixes + * @param {HTMLElement} element + * @param {String} prop + * @param {String} value + * @param {Boolean} [toggle=true] + * @return {Boolean} + */ + setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) { + var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms']; + prop = Utils.toCamelCase(prop); + + for(var i = 0; i < prefixes.length; i++) { + var p = prop; + // prefixes + if(prefixes[i]) { + p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1); + } + + // test the style + if(p in element.style) { + element.style[p] = (toggle == null || toggle) && value || ''; + break; + } + } + }, + + /** + * toggle browser default behavior by setting css properties. + * `userSelect='none'` also sets `element.onselectstart` to false + * `userDrag='none'` also sets `element.ondragstart` to false + * + * @method toggleBehavior + * @param {HtmlElement} element + * @param {Object} props + * @param {Boolean} [toggle=true] + */ + toggleBehavior: function toggleBehavior(element, props, toggle) { + if(!props || !element || !element.style) { + return; + } + + // set the css properties + Utils.each(props, function(value, prop) { + Utils.setPrefixedCss(element, prop, value, toggle); + }); + + var falseFn = toggle && function() { + return false; + }; + + // also the disable onselectstart + if(props.userSelect == 'none') { + element.onselectstart = falseFn; + } + // and disable ondragstart + if(props.userDrag == 'none') { + element.ondragstart = falseFn; + } + }, + + /** + * convert a string with underscores to camelCase + * so prevent_default becomes preventDefault + * @param {String} str + * @return {String} camelCaseStr + */ + toCamelCase: function toCamelCase(str) { + return str.replace(/[_-]([a-z])/g, function(s) { + return s[1].toUpperCase(); + }); + } + }; + + + /** + * @module hammer + */ + /** + * @class Event + * @static + */ + var Event = Hammer.event = { + /** + * when touch events have been fired, this is true + * this is used to stop mouse events + * @property prevent_mouseevents + * @private + * @type {Boolean} + */ + preventMouseEvents: false, + + /** + * if EVENT_START has been fired + * @property started + * @private + * @type {Boolean} + */ + started: false, + + /** + * when the mouse is hold down, this is true + * @property should_detect + * @private + * @type {Boolean} + */ + shouldDetect: false, + + /** + * simple event binder with a hook and support for multiple types + * @method on + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + * @param {Function} [hook] + * @param {Object} hook.type + */ + on: function on(element, type, handler, hook) { + var types = type.split(' '); + Utils.each(types, function(type) { + Utils.on(element, type, handler); + hook && hook(type); + }); + }, + + /** + * simple event unbinder with a hook and support for multiple types + * @method off + * @param {HTMLElement} element + * @param {String} type + * @param {Function} handler + * @param {Function} [hook] + * @param {Object} hook.type + */ + off: function off(element, type, handler, hook) { + var types = type.split(' '); + Utils.each(types, function(type) { + Utils.off(element, type, handler); + hook && hook(type); + }); + }, + + /** + * the core touch event handler. + * this finds out if we should to detect gestures + * @method onTouch + * @param {HTMLElement} element + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Function} handler + * @return onTouchHandler {Function} the core event handler + */ + onTouch: function onTouch(element, eventType, handler) { + var self = this; + + var onTouchHandler = function onTouchHandler(ev) { + var srcType = ev.type.toLowerCase(), + isPointer = Hammer.HAS_POINTEREVENTS, + isMouse = Utils.inStr(srcType, 'mouse'), + triggerType; + + // if we are in a mouseevent, but there has been a touchevent triggered in this session + // we want to do nothing. simply break out of the event. + if(isMouse && self.preventMouseEvents) { + return; + + // mousebutton must be down + } else if(isMouse && eventType == EVENT_START && ev.button === 0) { + self.preventMouseEvents = false; + self.shouldDetect = true; + } else if(isPointer && eventType == EVENT_START) { + self.shouldDetect = (ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev)); + // just a valid start event, but no mouse + } else if(!isMouse && eventType == EVENT_START) { + self.preventMouseEvents = true; + self.shouldDetect = true; + } + + // update the pointer event before entering the detection + if(isPointer && eventType != EVENT_END) { + PointerEvent.updatePointer(eventType, ev); + } + + // we are in a touch/down state, so allowed detection of gestures + if(self.shouldDetect) { + triggerType = self.doDetect.call(self, ev, eventType, element, handler); + } + + // ...and we are done with the detection + // so reset everything to start each detection totally fresh + if(triggerType == EVENT_END) { + self.preventMouseEvents = false; + self.shouldDetect = false; + PointerEvent.reset(); + // update the pointerevent object after the detection + } + + if(isPointer && eventType == EVENT_END) { + PointerEvent.updatePointer(eventType, ev); + } + }; + + this.on(element, EVENT_TYPES[eventType], onTouchHandler); + return onTouchHandler; + }, + + /** + * the core detection method + * this finds out what hammer-touch-events to trigger + * @method doDetect + * @param {Object} ev + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {HTMLElement} element + * @param {Function} handler + * @return {String} triggerType matches `EVENT_START|MOVE|END` + */ + doDetect: function doDetect(ev, eventType, element, handler) { + var touchList = this.getTouchList(ev, eventType); + var touchListLength = touchList.length; + var triggerType = eventType; + var triggerChange = touchList.trigger; // used by fakeMultitouch plugin + var changedLength = touchListLength; + + // at each touchstart-like event we want also want to trigger a TOUCH event... + if(eventType == EVENT_START) { + triggerChange = EVENT_TOUCH; + // ...the same for a touchend-like event + } else if(eventType == EVENT_END) { + triggerChange = EVENT_RELEASE; + + // keep track of how many touches have been removed + changedLength = touchList.length - ((ev.changedTouches) ? ev.changedTouches.length : 1); + } + + // after there are still touches on the screen, + // we just want to trigger a MOVE event. so change the START or END to a MOVE + // but only after detection has been started, the first time we actualy want a START + if(changedLength > 0 && this.started) { + triggerType = EVENT_MOVE; + } + + // detection has been started, we keep track of this, see above + this.started = true; + + // generate some event data, some basic information + var evData = this.collectEventData(element, triggerType, touchList, ev); + + // trigger the triggerType event before the change (TOUCH, RELEASE) events + // but the END event should be at last + if(eventType != EVENT_END) { + handler.call(Detection, evData); + } + + // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed + if(triggerChange) { + evData.changedLength = changedLength; + evData.eventType = triggerChange; + + handler.call(Detection, evData); + + evData.eventType = triggerType; + delete evData.changedLength; + } + + // trigger the END event + if(triggerType == EVENT_END) { + handler.call(Detection, evData); + + // ...and we are done with the detection + // so reset everything to start each detection totally fresh + this.started = false; + } + + return triggerType; + }, + + /** + * we have different events for each device/browser + * determine what we need and set them in the EVENT_TYPES constant + * the `onTouch` method is bind to these properties. + * @method determineEventTypes + * @return {Object} events + */ + determineEventTypes: function determineEventTypes() { + var types; + if(Hammer.HAS_POINTEREVENTS) { + if(window.PointerEvent) { + types = [ + 'pointerdown', + 'pointermove', + 'pointerup pointercancel lostpointercapture' + ]; + } else { + types = [ + 'MSPointerDown', + 'MSPointerMove', + 'MSPointerUp MSPointerCancel MSLostPointerCapture' + ]; + } + } else if(Hammer.NO_MOUSEEVENTS) { + types = [ + 'touchstart', + 'touchmove', + 'touchend touchcancel' + ]; + } else { + types = [ + 'touchstart mousedown', + 'touchmove mousemove', + 'touchend touchcancel mouseup' + ]; + } + + EVENT_TYPES[EVENT_START] = types[0]; + EVENT_TYPES[EVENT_MOVE] = types[1]; + EVENT_TYPES[EVENT_END] = types[2]; + return EVENT_TYPES; + }, + + /** + * create touchList depending on the event + * @method getTouchList + * @param {Object} ev + * @param {String} eventType + * @return {Array} touches + */ + getTouchList: function getTouchList(ev, eventType) { + // get the fake pointerEvent touchlist + if(Hammer.HAS_POINTEREVENTS) { + return PointerEvent.getTouchList(); + } + + // get the touchlist + if(ev.touches) { + if(eventType == EVENT_MOVE) { + return ev.touches; + } + + var identifiers = []; + var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches)); + var touchList = []; + + Utils.each(concat, function(touch) { + if(Utils.inArray(identifiers, touch.identifier) === false) { + touchList.push(touch); + } + identifiers.push(touch.identifier); + }); + + return touchList; + } + + // make fake touchList from mouse position + ev.identifier = 1; + return [ev]; + }, + + /** + * collect basic event data + * @method collectEventData + * @param {HTMLElement} element + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Array} touches + * @param {Object} ev + * @return {Object} ev + */ + collectEventData: function collectEventData(element, eventType, touches, ev) { + // find out pointerType + var pointerType = POINTER_TOUCH; + if(Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) { + pointerType = POINTER_MOUSE; + } else if(PointerEvent.matchType(POINTER_PEN, ev)) { + pointerType = POINTER_PEN; + } + + return { + center: Utils.getCenter(touches), + timeStamp: Date.now(), + target: ev.target, + touches: touches, + eventType: eventType, + pointerType: pointerType, + srcEvent: ev, + + /** + * prevent the browser default actions + * mostly used to disable scrolling of the browser + */ + preventDefault: function() { + var srcEvent = this.srcEvent; + srcEvent.preventManipulation && srcEvent.preventManipulation(); + srcEvent.preventDefault && srcEvent.preventDefault(); + }, + + /** + * stop bubbling the event up to its parents + */ + stopPropagation: function() { + this.srcEvent.stopPropagation(); + }, + + /** + * immediately stop gesture detection + * might be useful after a swipe was detected + * @return {*} + */ + stopDetect: function() { + return Detection.stopDetect(); + } + }; + } + }; + + + /** + * @module hammer + * + * @class PointerEvent + * @static + */ + var PointerEvent = Hammer.PointerEvent = { + /** + * holds all pointers, by `identifier` + * @property pointers + * @type {Object} + */ + pointers: {}, + + /** + * get the pointers as an array + * @method getTouchList + * @return {Array} touchlist + */ + getTouchList: function getTouchList() { + var touchlist = []; + // we can use forEach since pointerEvents only is in IE10 + Utils.each(this.pointers, function(pointer) { + touchlist.push(pointer); + }); + return touchlist; + }, + + /** + * update the position of a pointer + * @method updatePointer + * @param {String} eventType matches `EVENT_START|MOVE|END` + * @param {Object} pointerEvent + */ + updatePointer: function updatePointer(eventType, pointerEvent) { + if(eventType == EVENT_END || (eventType != EVENT_END && pointerEvent.buttons !== 1)) { + delete this.pointers[pointerEvent.pointerId]; + } else { + pointerEvent.identifier = pointerEvent.pointerId; + this.pointers[pointerEvent.pointerId] = pointerEvent; + } + }, + + /** + * check if ev matches pointertype + * @method matchType + * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN` + * @param {PointerEvent} ev + */ + matchType: function matchType(pointerType, ev) { + if(!ev.pointerType) { + return false; + } + + var pt = ev.pointerType, + types = {}; + + types[POINTER_MOUSE] = (pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE)); + types[POINTER_TOUCH] = (pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH)); + types[POINTER_PEN] = (pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN)); + return types[pointerType]; + }, + + /** + * reset the stored pointers + * @method reset + */ + reset: function resetList() { + this.pointers = {}; + } + }; + + + /** + * @module hammer + * + * @class Detection + * @static + */ + var Detection = Hammer.detection = { + // contains all registred Hammer.gestures in the correct order + gestures: [], + + // data of the current Hammer.gesture detection session + current: null, + + // the previous Hammer.gesture session data + // is a full clone of the previous gesture.current object + previous: null, + + // when this becomes true, no gestures are fired + stopped: false, + + /** + * start Hammer.gesture detection + * @method startDetect + * @param {Hammer.Instance} inst + * @param {Object} eventData + */ + startDetect: function startDetect(inst, eventData) { + // already busy with a Hammer.gesture detection on an element + if(this.current) { + return; + } + + this.stopped = false; + + // holds current session + this.current = { + inst: inst, // reference to HammerInstance we're working for + startEvent: Utils.extend({}, eventData), // start eventData for distances, timing etc + lastEvent: false, // last eventData + lastCalcEvent: false, // last eventData for calculations. + futureCalcEvent: false, // last eventData for calculations. + lastCalcData: {}, // last lastCalcData + name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc + }; + + this.detect(eventData); + }, + + /** + * Hammer.gesture detection + * @method detect + * @param {Object} eventData + * @return {any} + */ + detect: function detect(eventData) { + if(!this.current || this.stopped) { + return; + } + + // extend event data with calculations about scale, distance etc + eventData = this.extendEventData(eventData); + + // hammer instance and instance options + var inst = this.current.inst, + instOptions = inst.options; + + // call Hammer.gesture handlers + Utils.each(this.gestures, function triggerGesture(gesture) { + // only when the instance options have enabled this gesture + if(!this.stopped && inst.enabled && instOptions[gesture.name]) { + gesture.handler.call(gesture, eventData, inst); + } + }, this); + + // store as previous event event + if(this.current) { + this.current.lastEvent = eventData; + } + + if(eventData.eventType == EVENT_END) { + this.stopDetect(); + } + + return eventData; + }, + + /** + * clear the Hammer.gesture vars + * this is called on endDetect, but can also be used when a final Hammer.gesture has been detected + * to stop other Hammer.gestures from being fired + * @method stopDetect + */ + stopDetect: function stopDetect() { + // clone current data to the store as the previous gesture + // used for the double tap gesture, since this is an other gesture detect session + this.previous = Utils.extend({}, this.current); + + // reset the current + this.current = null; + this.stopped = true; + }, + + /** + * calculate velocity, angle and direction + * @method getVelocityData + * @param {Object} ev + * @param {Object} center + * @param {Number} deltaTime + * @param {Number} deltaX + * @param {Number} deltaY + */ + getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) { + var cur = this.current, + recalc = false, + calcEv = cur.lastCalcEvent, + calcData = cur.lastCalcData; + + if(calcEv && ev.timeStamp - calcEv.timeStamp > Hammer.CALCULATE_INTERVAL) { + center = calcEv.center; + deltaTime = ev.timeStamp - calcEv.timeStamp; + deltaX = ev.center.clientX - calcEv.center.clientX; + deltaY = ev.center.clientY - calcEv.center.clientY; + recalc = true; + } + + if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { + cur.futureCalcEvent = ev; + } + + if(!cur.lastCalcEvent || recalc) { + calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY); + calcData.angle = Utils.getAngle(center, ev.center); + calcData.direction = Utils.getDirection(center, ev.center); + + cur.lastCalcEvent = cur.futureCalcEvent || ev; + cur.futureCalcEvent = ev; + } + + ev.velocityX = calcData.velocity.x; + ev.velocityY = calcData.velocity.y; + ev.interimAngle = calcData.angle; + ev.interimDirection = calcData.direction; + }, + + /** + * extend eventData for Hammer.gestures + * @method extendEventData + * @param {Object} ev + * @return {Object} ev + */ + extendEventData: function extendEventData(ev) { + var cur = this.current, + startEv = cur.startEvent, + lastEv = cur.lastEvent || startEv; + + // update the start touchlist to calculate the scale/rotation + if(ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) { + startEv.touches = []; + Utils.each(ev.touches, function(touch) { + startEv.touches.push({ + clientX: touch.clientX, + clientY: touch.clientY + }); + }); + } + + var deltaTime = ev.timeStamp - startEv.timeStamp, + deltaX = ev.center.clientX - startEv.center.clientX, + deltaY = ev.center.clientY - startEv.center.clientY; + + this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY); + + Utils.extend(ev, { + startEvent: startEv, + + deltaTime: deltaTime, + deltaX: deltaX, + deltaY: deltaY, + + distance: Utils.getDistance(startEv.center, ev.center), + angle: Utils.getAngle(startEv.center, ev.center), + direction: Utils.getDirection(startEv.center, ev.center), + scale: Utils.getScale(startEv.touches, ev.touches), + rotation: Utils.getRotation(startEv.touches, ev.touches) + }); + + return ev; + }, + + /** + * register new gesture + * @method register + * @param {Object} gesture object, see `gestures/` for documentation + * @return {Array} gestures + */ + register: function register(gesture) { + // add an enable gesture options if there is no given + var options = gesture.defaults || {}; + if(options[gesture.name] === undefined) { + options[gesture.name] = true; + } + + // extend Hammer default options with the Hammer.gesture options + Utils.extend(Hammer.defaults, options, true); + + // set its index + gesture.index = gesture.index || 1000; + + // add Hammer.gesture to the list + this.gestures.push(gesture); + + // sort the list by index + this.gestures.sort(function(a, b) { + if(a.index < b.index) { + return -1; + } + if(a.index > b.index) { + return 1; + } + return 0; + }); + + return this.gestures; + } + }; + + + /** + * @module hammer + */ + + /** + * create new hammer instance + * all methods should return the instance itself, so it is chainable. + * + * @class Instance + * @constructor + * @param {HTMLElement} element + * @param {Object} [options={}] options are merged with `Hammer.defaults` + * @return {Hammer.Instance} + */ + Hammer.Instance = function(element, options) { + var self = this; + + // setup HammerJS window events and register all gestures + // this also sets up the default options + setup(); + + /** + * @property element + * @type {HTMLElement} + */ + this.element = element; + + /** + * @property enabled + * @type {Boolean} + * @protected + */ + this.enabled = true; + + /** + * options, merged with the defaults + * options with an _ are converted to camelCase + * @property options + * @type {Object} + */ + Utils.each(options, function(value, name) { + delete options[name]; + options[Utils.toCamelCase(name)] = value; + }); + + this.options = Utils.extend(Utils.extend({}, Hammer.defaults), options || {}); + + // add some css to the element to prevent the browser from doing its native behavoir + if(this.options.behavior) { + Utils.toggleBehavior(this.element, this.options.behavior, true); + } + + /** + * event start handler on the element to start the detection + * @property eventStartHandler + * @type {Object} + */ + this.eventStartHandler = Event.onTouch(element, EVENT_START, function(ev) { + if(self.enabled && ev.eventType == EVENT_START) { + Detection.startDetect(self, ev); + } else if(ev.eventType == EVENT_TOUCH) { + Detection.detect(ev); + } + }); + + /** + * keep a list of user event handlers which needs to be removed when calling 'dispose' + * @property eventHandlers + * @type {Array} + */ + this.eventHandlers = []; + }; + + Hammer.Instance.prototype = { + /** + * bind events to the instance + * @method on + * @chainable + * @param {String} gestures multiple gestures by splitting with a space + * @param {Function} handler + * @param {Object} handler.ev event object + */ + on: function onEvent(gestures, handler) { + var self = this; + Event.on(self.element, gestures, handler, function(type) { + self.eventHandlers.push({ gesture: type, handler: handler }); + }); + return self; + }, + + /** + * unbind events to the instance + * @method off + * @chainable + * @param {String} gestures + * @param {Function} handler + */ + off: function offEvent(gestures, handler) { + var self = this; + + Event.off(self.element, gestures, handler, function(type) { + var index = Utils.inArray({ gesture: type, handler: handler }); + if(index !== false) { + self.eventHandlers.splice(index, 1); + } + }); + return self; + }, + + /** + * trigger gesture event + * @method trigger + * @chainable + * @param {String} gesture + * @param {Object} [eventData] + */ + trigger: function triggerEvent(gesture, eventData) { + // optional + if(!eventData) { + eventData = {}; + } + + // create DOM event + var event = Hammer.DOCUMENT.createEvent('Event'); + event.initEvent(gesture, true, true); + event.gesture = eventData; + + // trigger on the target if it is in the instance element, + // this is for event delegation tricks + var element = this.element; + if(Utils.hasParent(eventData.target, element)) { + element = eventData.target; + } + + element.dispatchEvent(event); + return this; + }, + + /** + * enable of disable hammer.js detection + * @method enable + * @chainable + * @param {Boolean} state + */ + enable: function enable(state) { + this.enabled = state; + return this; + }, + + /** + * dispose this hammer instance + * @method dispose + * @return {Null} + */ + dispose: function dispose() { + var i, eh; + + // undo all changes made by stop_browser_behavior + Utils.toggleBehavior(this.element, this.options.behavior, false); + + // unbind all custom event handlers + for(i = -1; (eh = this.eventHandlers[++i]);) { + Utils.off(this.element, eh.gesture, eh.handler); + } + + this.eventHandlers = []; + + // unbind the start event listener + Event.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler); + + return null; + } + }; + + + /** + * @module gestures + */ + /** + * Move with x fingers (default 1) around on the page. + * Preventing the default browser behavior is a good way to improve feel and working. + * ```` + * hammertime.on("drag", function(ev) { + * console.log(ev); + * ev.gesture.preventDefault(); + * }); + * ```` + * + * @class Drag + * @static + */ + /** + * @event drag + * @param {Object} ev + */ + /** + * @event dragstart + * @param {Object} ev + */ + /** + * @event dragend + * @param {Object} ev + */ + /** + * @event drapleft + * @param {Object} ev + */ + /** + * @event dragright + * @param {Object} ev + */ + /** + * @event dragup + * @param {Object} ev + */ + /** + * @event dragdown + * @param {Object} ev + */ + + /** + * @param {String} name + */ + (function(name) { + var triggered = false; + + function dragGesture(ev, inst) { + var cur = Detection.current; + + // max touches + if(inst.options.dragMaxTouches > 0 && + ev.touches.length > inst.options.dragMaxTouches) { + return; + } + + switch(ev.eventType) { + case EVENT_START: + triggered = false; + break; + + case EVENT_MOVE: + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.distance < inst.options.dragMinDistance && + cur.name != name) { + return; + } + + var startCenter = cur.startEvent.center; + + // we are dragging! + if(cur.name != name) { + cur.name = name; + if(inst.options.dragDistanceCorrection && ev.distance > 0) { + // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center. + // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0. + // It might be useful to save the original start point somewhere + var factor = Math.abs(inst.options.dragMinDistance / ev.distance); + startCenter.pageX += ev.deltaX * factor; + startCenter.pageY += ev.deltaY * factor; + startCenter.clientX += ev.deltaX * factor; + startCenter.clientY += ev.deltaY * factor; + + // recalculate event data using new start point + ev = Detection.extendEventData(ev); + } + } + + // lock drag to axis? + if(cur.lastEvent.dragLockToAxis || + ( inst.options.dragLockToAxis && + inst.options.dragLockMinDistance <= ev.distance + )) { + ev.dragLockToAxis = true; + } + + // keep direction on the axis that the drag gesture started on + var lastDirection = cur.lastEvent.direction; + if(ev.dragLockToAxis && lastDirection !== ev.direction) { + if(Utils.isVertical(lastDirection)) { + ev.direction = (ev.deltaY < 0) ? DIRECTION_UP : DIRECTION_DOWN; + } else { + ev.direction = (ev.deltaX < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + } + + // first time, trigger dragstart event + if(!triggered) { + inst.trigger(name + 'start', ev); + triggered = true; + } + + // trigger events + inst.trigger(name, ev); + inst.trigger(name + ev.direction, ev); + + var isVertical = Utils.isVertical(ev.direction); + + // block the browser events + if((inst.options.dragBlockVertical && isVertical) || + (inst.options.dragBlockHorizontal && !isVertical)) { + ev.preventDefault(); + } + break; + + case EVENT_RELEASE: + if(triggered && ev.changedLength <= inst.options.dragMaxTouches) { + inst.trigger(name + 'end', ev); + triggered = false; + } + break; + + case EVENT_END: + triggered = false; + break; + } + } + + Hammer.gestures.Drag = { + name: name, + index: 50, + handler: dragGesture, + defaults: { + /** + * minimal movement that have to be made before the drag event gets triggered + * @property dragMinDistance + * @type {Number} + * @default 10 + */ + dragMinDistance: 10, + + /** + * Set dragDistanceCorrection to true to make the starting point of the drag + * be calculated from where the drag was triggered, not from where the touch started. + * Useful to avoid a jerk-starting drag, which can make fine-adjustments + * through dragging difficult, and be visually unappealing. + * @property dragDistanceCorrection + * @type {Boolean} + * @default true + */ + dragDistanceCorrection: true, + + /** + * set 0 for unlimited, but this can conflict with transform + * @property dragMaxTouches + * @type {Number} + * @default 1 + */ + dragMaxTouches: 1, + + /** + * prevent default browser behavior when dragging occurs + * be careful with it, it makes the element a blocking element + * when you are using the drag gesture, it is a good practice to set this true + * @property dragBlockHorizontal + * @type {Boolean} + * @default false + */ + dragBlockHorizontal: false, + + /** + * same as `dragBlockHorizontal`, but for vertical movement + * @property dragBlockVertical + * @type {Boolean} + * @default false + */ + dragBlockVertical: false, + + /** + * dragLockToAxis keeps the drag gesture on the axis that it started on, + * It disallows vertical directions if the initial direction was horizontal, and vice versa. + * @property dragLockToAxis + * @type {Boolean} + * @default false + */ + dragLockToAxis: false, + + /** + * drag lock only kicks in when distance > dragLockMinDistance + * This way, locking occurs only when the distance has become large enough to reliably determine the direction + * @property dragLockMinDistance + * @type {Number} + * @default 25 + */ + dragLockMinDistance: 25 + } + }; + })('drag'); + + /** + * @module gestures + */ + /** + * trigger a simple gesture event, so you can do anything in your handler. + * only usable if you know what your doing... + * + * @class Gesture + * @static + */ + /** + * @event gesture + * @param {Object} ev + */ + Hammer.gestures.Gesture = { + name: 'gesture', + index: 1337, + handler: function releaseGesture(ev, inst) { + inst.trigger(this.name, ev); + } + }; + + /** + * @module gestures + */ + /** + * Touch stays at the same place for x time + * + * @class Hold + * @static + */ + /** + * @event hold + * @param {Object} ev + */ + + /** + * @param {String} name + */ + (function(name) { + var timer; + + function holdGesture(ev, inst) { + var options = inst.options, + current = Detection.current; + + switch(ev.eventType) { + case EVENT_START: + clearTimeout(timer); + + // set the gesture so we can check in the timeout if it still is + current.name = name; + + // set timer and if after the timeout it still is hold, + // we trigger the hold event + timer = setTimeout(function() { + if(current && current.name == name) { + inst.trigger(name, ev); + } + }, options.holdTimeout); + break; + + case EVENT_MOVE: + if(ev.distance > options.holdThreshold) { + clearTimeout(timer); + } + break; + + case EVENT_RELEASE: + clearTimeout(timer); + break; + } + } + + Hammer.gestures.Hold = { + name: name, + index: 10, + defaults: { + /** + * @property holdTimeout + * @type {Number} + * @default 500 + */ + holdTimeout: 500, + + /** + * movement allowed while holding + * @property holdThreshold + * @type {Number} + * @default 2 + */ + holdThreshold: 2 + }, + handler: holdGesture + }; + })('hold'); + + /** + * @module gestures + */ + /** + * when a touch is being released from the page + * + * @class Release + * @static + */ + /** + * @event release + * @param {Object} ev + */ + Hammer.gestures.Release = { + name: 'release', + index: Infinity, + handler: function releaseGesture(ev, inst) { + if(ev.eventType == EVENT_RELEASE) { + inst.trigger(this.name, ev); + } + } + }; + + /** + * @module gestures + */ + /** + * triggers swipe events when the end velocity is above the threshold + * for best usage, set `preventDefault` (on the drag gesture) to `true` + * ```` + * hammertime.on("dragleft swipeleft", function(ev) { + * console.log(ev); + * ev.gesture.preventDefault(); + * }); + * ```` + * + * @class Swipe + * @static + */ + /** + * @event swipe + * @param {Object} ev + */ + /** + * @event swipeleft + * @param {Object} ev + */ + /** + * @event swiperight + * @param {Object} ev + */ + /** + * @event swipeup + * @param {Object} ev + */ + /** + * @event swipedown + * @param {Object} ev + */ + Hammer.gestures.Swipe = { + name: 'swipe', + index: 40, + defaults: { + /** + * @property swipeMinTouches + * @type {Number} + * @default 1 + */ + swipeMinTouches: 1, + + /** + * @property swipeMaxTouches + * @type {Number} + * @default 1 + */ + swipeMaxTouches: 1, + + /** + * horizontal swipe velocity + * @property swipeVelocityX + * @type {Number} + * @default 0.6 + */ + swipeVelocityX: 0.6, + + /** + * vertical swipe velocity + * @property swipeVelocityY + * @type {Number} + * @default 0.6 + */ + swipeVelocityY: 0.6 + }, + + handler: function swipeGesture(ev, inst) { + if(ev.eventType == EVENT_RELEASE) { + var touches = ev.touches.length, + options = inst.options; + + // max touches + if(touches < options.swipeMinTouches || + touches > options.swipeMaxTouches) { + return; + } + + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.velocityX > options.swipeVelocityX || + ev.velocityY > options.swipeVelocityY) { + // trigger swipe events + inst.trigger(this.name, ev); + inst.trigger(this.name + ev.direction, ev); + } + } + } + }; + + /** + * @module gestures + */ + /** + * Single tap and a double tap on a place + * + * @class Tap + * @static + */ + /** + * @event tap + * @param {Object} ev + */ + /** + * @event doubletap + * @param {Object} ev + */ + + /** + * @param {String} name + */ + (function(name) { + var hasMoved = false; + + function tapGesture(ev, inst) { + var options = inst.options, + current = Detection.current, + prev = Detection.previous, + sincePrev, + didDoubleTap; + + switch(ev.eventType) { + case EVENT_START: + hasMoved = false; + break; + + case EVENT_MOVE: + hasMoved = hasMoved || (ev.distance > options.tapMaxDistance); + break; + + case EVENT_END: + if(!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) { + // previous gesture, for the double tap since these are two different gesture detections + sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp; + didDoubleTap = false; + + // check if double tap + if(prev && prev.name == name && + (sincePrev && sincePrev < options.doubleTapInterval) && + ev.distance < options.doubleTapDistance) { + inst.trigger('doubletap', ev); + didDoubleTap = true; + } + + // do a single tap + if(!didDoubleTap || options.tapAlways) { + current.name = name; + inst.trigger(current.name, ev); + } + } + break; + } + } + + Hammer.gestures.Tap = { + name: name, + index: 100, + handler: tapGesture, + defaults: { + /** + * max time of a tap, this is for the slow tappers + * @property tapMaxTime + * @type {Number} + * @default 250 + */ + tapMaxTime: 250, + + /** + * max distance of movement of a tap, this is for the slow tappers + * @property tapMaxDistance + * @type {Number} + * @default 10 + */ + tapMaxDistance: 10, + + /** + * always trigger the `tap` event, even while double-tapping + * @property tapAlways + * @type {Boolean} + * @default true + */ + tapAlways: true, + + /** + * max distance between two taps + * @property doubleTapDistance + * @type {Number} + * @default 20 + */ + doubleTapDistance: 20, + + /** + * max time between two taps + * @property doubleTapInterval + * @type {Number} + * @default 300 + */ + doubleTapInterval: 300 + } + }; + })('tap'); + + /** + * @module gestures + */ + /** + * when a touch is being touched at the page + * + * @class Touch + * @static + */ + /** + * @event touch + * @param {Object} ev + */ + Hammer.gestures.Touch = { + name: 'touch', + index: -Infinity, + defaults: { + /** + * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page, + * but it improves gestures like transforming and dragging. + * be careful with using this, it can be very annoying for users to be stuck on the page + * @property preventDefault + * @type {Boolean} + * @default false + */ + preventDefault: false, + + /** + * disable mouse events, so only touch (or pen!) input triggers events + * @property preventMouse + * @type {Boolean} + * @default false + */ + preventMouse: false + }, + handler: function touchGesture(ev, inst) { + if(inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) { + ev.stopDetect(); + return; + } + + if(inst.options.preventDefault) { + ev.preventDefault(); + } + + if(ev.eventType == EVENT_TOUCH) { + inst.trigger('touch', ev); + } + } + }; + + /** + * @module gestures + */ + /** + * User want to scale or rotate with 2 fingers + * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the + * `preventDefault` option. + * + * @class Transform + * @static + */ + /** + * @event transform + * @param {Object} ev + */ + /** + * @event transformstart + * @param {Object} ev + */ + /** + * @event transformend + * @param {Object} ev + */ + /** + * @event pinchin + * @param {Object} ev + */ + /** + * @event pinchout + * @param {Object} ev + */ + /** + * @event rotate + * @param {Object} ev + */ + + /** + * @param {String} name + */ + (function(name) { + var triggered = false; + + function transformGesture(ev, inst) { + switch(ev.eventType) { + case EVENT_START: + triggered = false; + break; + + case EVENT_MOVE: + // at least multitouch + if(ev.touches.length < 2) { + return; + } + + var scaleThreshold = Math.abs(1 - ev.scale); + var rotationThreshold = Math.abs(ev.rotation); + + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(scaleThreshold < inst.options.transformMinScale && + rotationThreshold < inst.options.transformMinRotation) { + return; + } + + // we are transforming! + Detection.current.name = name; + + // first time, trigger dragstart event + if(!triggered) { + inst.trigger(name + 'start', ev); + triggered = true; + } + + inst.trigger(name, ev); // basic transform event + + // trigger rotate event + if(rotationThreshold > inst.options.transformMinRotation) { + inst.trigger('rotate', ev); + } + + // trigger pinch event + if(scaleThreshold > inst.options.transformMinScale) { + inst.trigger('pinch', ev); + inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev); + } + break; + + case EVENT_RELEASE: + if(triggered && ev.changedLength < 2) { + inst.trigger(name + 'end', ev); + triggered = false; + } + break; + } + } + + Hammer.gestures.Transform = { + name: name, + index: 45, + defaults: { + /** + * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1 + * @property transformMinScale + * @type {Number} + * @default 0.01 + */ + transformMinScale: 0.01, + + /** + * rotation in degrees + * @property transformMinRotation + * @type {Number} + * @default 1 + */ + transformMinRotation: 1 + }, + + handler: transformGesture + }; + })('transform'); + + /** + * @module hammer + */ + + // AMD export + if(true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { + return Hammer; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + // commonjs export + } else if(typeof module !== 'undefined' && module.exports) { + module.exports = Hammer; + // browser export + } else { + window.Hammer = Hammer; + } + + })(window); + +/***/ }, +/* 60 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var RepulsionMixin = __webpack_require__(68); + var HierarchialRepulsionMixin = __webpack_require__(69); + var BarnesHutMixin = __webpack_require__(70); + + /** + * Toggling barnes Hut calculation on and off. + * + * @private + */ + exports._toggleBarnesHut = function () { + this.constants.physics.barnesHut.enabled = !this.constants.physics.barnesHut.enabled; + this._loadSelectedForceSolver(); + this.moving = true; + this.start(); + }; + + + /** + * This loads the node force solver based on the barnes hut or repulsion algorithm + * + * @private + */ + exports._loadSelectedForceSolver = function () { + // this overloads the this._calculateNodeForces + if (this.constants.physics.barnesHut.enabled == true) { + this._clearMixin(RepulsionMixin); + this._clearMixin(HierarchialRepulsionMixin); + + this.constants.physics.centralGravity = this.constants.physics.barnesHut.centralGravity; + this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; + this.constants.physics.springConstant = this.constants.physics.barnesHut.springConstant; + this.constants.physics.damping = this.constants.physics.barnesHut.damping; + + this._loadMixin(BarnesHutMixin); + } + else if (this.constants.physics.hierarchicalRepulsion.enabled == true) { + this._clearMixin(BarnesHutMixin); + this._clearMixin(RepulsionMixin); + + this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity; + this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; + this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant; + this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; + + this._loadMixin(HierarchialRepulsionMixin); + } + else { + this._clearMixin(BarnesHutMixin); + this._clearMixin(HierarchialRepulsionMixin); + this.barnesHutTree = undefined; + + this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity; + this.constants.physics.springLength = this.constants.physics.repulsion.springLength; + this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant; + this.constants.physics.damping = this.constants.physics.repulsion.damping; + + this._loadMixin(RepulsionMixin); + } + }; + + /** + * Before calculating the forces, we check if we need to cluster to keep up performance and we check + * if there is more than one node. If it is just one node, we dont calculate anything. + * + * @private + */ + exports._initializeForceCalculation = function () { + // stop calculation if there is only one node + if (this.nodeIndices.length == 1) { + this.nodes[this.nodeIndices[0]]._setForce(0, 0); + } + else { + // if there are too many nodes on screen, we cluster without repositioning + if (this.nodeIndices.length > this.constants.clustering.clusterThreshold && this.constants.clustering.enabled == true) { + this.clusterToFit(this.constants.clustering.reduceToNodes, false); + } + + // we now start the force calculation + this._calculateForces(); + } + }; + + + /** + * Calculate the external forces acting on the nodes + * Forces are caused by: edges, repulsing forces between nodes, gravity + * @private + */ + exports._calculateForces = function () { + // Gravity is required to keep separated groups from floating off + // the forces are reset to zero in this loop by using _setForce instead + // of _addForce + + this._calculateGravitationalForces(); + this._calculateNodeForces(); + + if (this.constants.physics.springConstant > 0) { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._calculateSpringForcesWithSupport(); + } + else { + if (this.constants.physics.hierarchicalRepulsion.enabled == true) { + this._calculateHierarchicalSpringForces(); + } + else { + this._calculateSpringForces(); + } + } + } + }; + + + /** + * Smooth curves are created by adding invisible nodes in the center of the edges. These nodes are also + * handled in the calculateForces function. We then use a quadratic curve with the center node as control. + * This function joins the datanodes and invisible (called support) nodes into one object. + * We do this so we do not contaminate this.nodes with the support nodes. + * + * @private + */ + exports._updateCalculationNodes = function () { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this.calculationNodes = {}; + this.calculationNodeIndices = []; + + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.calculationNodes[nodeId] = this.nodes[nodeId]; + } + } + var supportNodes = this.sectors['support']['nodes']; + for (var supportNodeId in supportNodes) { + if (supportNodes.hasOwnProperty(supportNodeId)) { + if (this.edges.hasOwnProperty(supportNodes[supportNodeId].parentEdgeId)) { + this.calculationNodes[supportNodeId] = supportNodes[supportNodeId]; + } + else { + supportNodes[supportNodeId]._setForce(0, 0); + } + } + } + + for (var idx in this.calculationNodes) { + if (this.calculationNodes.hasOwnProperty(idx)) { + this.calculationNodeIndices.push(idx); + } + } + } + else { + this.calculationNodes = this.nodes; + this.calculationNodeIndices = this.nodeIndices; + } + }; + + + /** + * this function applies the central gravity effect to keep groups from floating off + * + * @private + */ + exports._calculateGravitationalForces = function () { + var dx, dy, distance, node, i; + var nodes = this.calculationNodes; + var gravity = this.constants.physics.centralGravity; + var gravityForce = 0; + + for (i = 0; i < this.calculationNodeIndices.length; i++) { + node = nodes[this.calculationNodeIndices[i]]; + node.damping = this.constants.physics.damping; // possibly add function to alter damping properties of clusters. + // gravity does not apply when we are in a pocket sector + if (this._sector() == "default" && gravity != 0) { + dx = -node.x; + dy = -node.y; + distance = Math.sqrt(dx * dx + dy * dy); + + gravityForce = (distance == 0) ? 0 : (gravity / distance); + node.fx = dx * gravityForce; + node.fy = dy * gravityForce; + } + else { + node.fx = 0; + node.fy = 0; + } + } + }; + + + + + /** + * this function calculates the effects of the springs in the case of unsmooth curves. + * + * @private + */ + exports._calculateSpringForces = function () { + var edgeLength, edge, edgeId; + var dx, dy, fx, fy, springForce, distance; + var edges = this.edges; + + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + edgeLength = edge.physics.springLength; + // this implies that the edges between big clusters are longer + edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; + + dx = (edge.from.x - edge.to.x); + dy = (edge.from.y - edge.to.y); + distance = Math.sqrt(dx * dx + dy * dy); + + if (distance == 0) { + distance = 0.01; + } + + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + + fx = dx * springForce; + fy = dy * springForce; + + edge.from.fx += fx; + edge.from.fy += fy; + edge.to.fx -= fx; + edge.to.fy -= fy; + } + } + } + } + }; + + + + + /** + * This function calculates the springforces on the nodes, accounting for the support nodes. + * + * @private + */ + exports._calculateSpringForcesWithSupport = function () { + var edgeLength, edge, edgeId, combinedClusterSize; + var edges = this.edges; + + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + if (edge.via != null) { + var node1 = edge.to; + var node2 = edge.via; + var node3 = edge.from; + + edgeLength = edge.physics.springLength; + + combinedClusterSize = node1.clusterSize + node3.clusterSize - 2; + + // this implies that the edges between big clusters are longer + edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth; + this._calculateSpringForce(node1, node2, 0.5 * edgeLength); + this._calculateSpringForce(node2, node3, 0.5 * edgeLength); + } + } + } + } + } + }; + + + /** + * This is the code actually performing the calculation for the function above. It is split out to avoid repetition. + * + * @param node1 + * @param node2 + * @param edgeLength + * @private + */ + exports._calculateSpringForce = function (node1, node2, edgeLength) { + var dx, dy, fx, fy, springForce, distance; + + dx = (node1.x - node2.x); + dy = (node1.y - node2.y); + distance = Math.sqrt(dx * dx + dy * dy); + + if (distance == 0) { + distance = 0.01; + } + + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + + fx = dx * springForce; + fy = dy * springForce; + + node1.fx += fx; + node1.fy += fy; + node2.fx -= fx; + node2.fy -= fy; + }; + + + exports._cleanupPhysicsConfiguration = function() { + if (this.physicsConfiguration !== undefined) { + while (this.physicsConfiguration.hasChildNodes()) { + this.physicsConfiguration.removeChild(this.physicsConfiguration.firstChild); + } + + this.physicsConfiguration.parentNode.removeChild(this.physicsConfiguration); + this.physicsConfiguration = undefined; + } + } + + /** + * Load the HTML for the physics config and bind it + * @private + */ + exports._loadPhysicsConfiguration = function () { + if (this.physicsConfiguration === undefined) { + this.backupConstants = {}; + util.deepExtend(this.backupConstants,this.constants); + + var maxGravitational = Math.max(20000, (-1 * this.constants.physics.barnesHut.gravitationalConstant) * 10); + var maxSpring = Math.min(0.05, this.constants.physics.barnesHut.springConstant * 10) + + var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"]; + this.physicsConfiguration = document.createElement('div'); + this.physicsConfiguration.className = "PhysicsConfiguration"; + this.physicsConfiguration.innerHTML = '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
Simulation Mode:
Barnes HutRepulsionHierarchical
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
Options:
' + this.containerElement.parentElement.insertBefore(this.physicsConfiguration, this.containerElement); + this.optionsDiv = document.createElement("div"); + this.optionsDiv.style.fontSize = "14px"; + this.optionsDiv.style.fontFamily = "verdana"; + this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement); + + var rangeElement; + rangeElement = document.getElementById('graph_BH_gc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant"); + rangeElement = document.getElementById('graph_BH_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_BH_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_BH_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_BH_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping"); + + rangeElement = document.getElementById('graph_R_nd'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance"); + rangeElement = document.getElementById('graph_R_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_R_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_R_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_R_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping"); + + rangeElement = document.getElementById('graph_H_nd'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); + rangeElement = document.getElementById('graph_H_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_H_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_H_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_H_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping"); + rangeElement = document.getElementById('graph_H_direction'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction"); + rangeElement = document.getElementById('graph_H_levsep'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation"); + rangeElement = document.getElementById('graph_H_nspac'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing"); + + var radioButton1 = document.getElementById("graph_physicsMethod1"); + var radioButton2 = document.getElementById("graph_physicsMethod2"); + var radioButton3 = document.getElementById("graph_physicsMethod3"); + radioButton2.checked = true; + if (this.constants.physics.barnesHut.enabled) { + radioButton1.checked = true; + } + if (this.constants.hierarchicalLayout.enabled) { + radioButton3.checked = true; + } + + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + var graph_repositionNodes = document.getElementById("graph_repositionNodes"); + var graph_generateOptions = document.getElementById("graph_generateOptions"); + + graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this); + graph_repositionNodes.onclick = graphRepositionNodes.bind(this); + graph_generateOptions.onclick = graphGenerateOptions.bind(this); + if (this.constants.smoothCurves == true && this.constants.dynamicSmoothCurves == false) { + graph_toggleSmooth.style.background = "#A4FF56"; + } + else { + graph_toggleSmooth.style.background = "#FF8532"; + } + + + switchConfigurations.apply(this); + + radioButton1.onchange = switchConfigurations.bind(this); + radioButton2.onchange = switchConfigurations.bind(this); + radioButton3.onchange = switchConfigurations.bind(this); + } + }; + + /** + * This overwrites the this.constants. + * + * @param constantsVariableName + * @param value + * @private + */ + exports._overWriteGraphConstants = function (constantsVariableName, value) { + var nameArray = constantsVariableName.split("_"); + if (nameArray.length == 1) { + this.constants[nameArray[0]] = value; + } + else if (nameArray.length == 2) { + this.constants[nameArray[0]][nameArray[1]] = value; + } + else if (nameArray.length == 3) { + this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value; + } + }; + + + /** + * this function is bound to the toggle smooth curves button. That is also why it is not in the prototype. + */ + function graphToggleSmoothCurves () { + this.constants.smoothCurves.enabled = !this.constants.smoothCurves.enabled; + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} + else {graph_toggleSmooth.style.background = "#FF8532";} + + this._configureSmoothCurves(false); + } + + /** + * this function is used to scramble the nodes + * + */ + function graphRepositionNodes () { + for (var nodeId in this.calculationNodes) { + if (this.calculationNodes.hasOwnProperty(nodeId)) { + this.calculationNodes[nodeId].vx = 0; this.calculationNodes[nodeId].vy = 0; + this.calculationNodes[nodeId].fx = 0; this.calculationNodes[nodeId].fy = 0; + } + } + if (this.constants.hierarchicalLayout.enabled == true) { + this._setupHierarchicalLayout(); + showValueOfRange.call(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); + showValueOfRange.call(this, 'graph_H_cg', 1, "physics_centralGravity"); + showValueOfRange.call(this, 'graph_H_sc', 1, "physics_springConstant"); + showValueOfRange.call(this, 'graph_H_sl', 1, "physics_springLength"); + showValueOfRange.call(this, 'graph_H_damp', 1, "physics_damping"); + } + else { + this.repositionNodes(); + } + this.moving = true; + this.start(); + } + + /** + * this is used to generate an options file from the playing with physics system. + */ + function graphGenerateOptions () { + var options = "No options are required, default values used."; + var optionsSpecific = []; + var radioButton1 = document.getElementById("graph_physicsMethod1"); + var radioButton2 = document.getElementById("graph_physicsMethod2"); + if (radioButton1.checked == true) { + if (this.constants.physics.barnesHut.gravitationalConstant != this.backupConstants.physics.barnesHut.gravitationalConstant) {optionsSpecific.push("gravitationalConstant: " + this.constants.physics.barnesHut.gravitationalConstant);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.barnesHut.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.barnesHut.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options = "var options = {"; + options += "physics: {barnesHut: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " + } + } + options += '}}' + } + if (this.constants.smoothCurves.enabled != this.backupConstants.smoothCurves.enabled) { + if (optionsSpecific.length == 0) {options = "var options = {";} + else {options += ", "} + options += "smoothCurves: " + this.constants.smoothCurves.enabled; + } + if (options != "No options are required, default values used.") { + options += '};' + } + } + else if (radioButton2.checked == true) { + options = "var options = {"; + options += "physics: {barnesHut: {enabled: false}"; + if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.repulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options += ", repulsion: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " + } + } + options += '}}' + } + if (optionsSpecific.length == 0) {options += "}"} + if (this.constants.smoothCurves != this.backupConstants.smoothCurves) { + options += ", smoothCurves: " + this.constants.smoothCurves; + } + options += '};' + } + else { + options = "var options = {"; + if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options += "physics: {hierarchicalRepulsion: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", "; + } + } + options += '}},'; + } + options += 'hierarchicalLayout: {'; + optionsSpecific = []; + if (this.constants.hierarchicalLayout.direction != this.backupConstants.hierarchicalLayout.direction) {optionsSpecific.push("direction: " + this.constants.hierarchicalLayout.direction);} + if (Math.abs(this.constants.hierarchicalLayout.levelSeparation) != this.backupConstants.hierarchicalLayout.levelSeparation) {optionsSpecific.push("levelSeparation: " + this.constants.hierarchicalLayout.levelSeparation);} + if (this.constants.hierarchicalLayout.nodeSpacing != this.backupConstants.hierarchicalLayout.nodeSpacing) {optionsSpecific.push("nodeSpacing: " + this.constants.hierarchicalLayout.nodeSpacing);} + if (optionsSpecific.length != 0) { + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " + } + } + options += '}' + } + else { + options += "enabled:true}"; + } + options += '};' + } + + + this.optionsDiv.innerHTML = options; + } + + /** + * this is used to switch between barnesHut, repulsion and hierarchical. + * + */ + function switchConfigurations () { + var ids = ["graph_BH_table", "graph_R_table", "graph_H_table"]; + var radioButton = document.querySelector('input[name="graph_physicsMethod"]:checked').value; + var tableId = "graph_" + radioButton + "_table"; + var table = document.getElementById(tableId); + table.style.display = "block"; + for (var i = 0; i < ids.length; i++) { + if (ids[i] != tableId) { + table = document.getElementById(ids[i]); + table.style.display = "none"; + } + } + this._restoreNodes(); + if (radioButton == "R") { + this.constants.hierarchicalLayout.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = false; + this.constants.physics.barnesHut.enabled = false; + } + else if (radioButton == "H") { + if (this.constants.hierarchicalLayout.enabled == false) { + this.constants.hierarchicalLayout.enabled = true; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this.constants.physics.barnesHut.enabled = false; + this.constants.smoothCurves.enabled = false; + this._setupHierarchicalLayout(); + } + } + else { + this.constants.hierarchicalLayout.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = false; + this.constants.physics.barnesHut.enabled = true; + } + this._loadSelectedForceSolver(); + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} + else {graph_toggleSmooth.style.background = "#FF8532";} + this.moving = true; + this.start(); + } + + + /** + * this generates the ranges depending on the iniital values. + * + * @param id + * @param map + * @param constantsVariableName + */ + function showValueOfRange (id,map,constantsVariableName) { + var valueId = id + "_value"; + var rangeValue = document.getElementById(id).value; + + if (Array.isArray(map)) { + document.getElementById(valueId).value = map[parseInt(rangeValue)]; + this._overWriteGraphConstants(constantsVariableName,map[parseInt(rangeValue)]); + } + else { + document.getElementById(valueId).value = parseInt(map) * parseFloat(rangeValue); + this._overWriteGraphConstants(constantsVariableName, parseInt(map) * parseFloat(rangeValue)); + } + + if (constantsVariableName == "hierarchicalLayout_direction" || + constantsVariableName == "hierarchicalLayout_levelSeparation" || + constantsVariableName == "hierarchicalLayout_nodeSpacing") { + this._setupHierarchicalLayout(); + } + this.moving = true; + this.start(); + } + + + + +/***/ }, +/* 61 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Creation of the ClusterMixin var. + * + * This contains all the functions the Network object can use to employ clustering + */ + + /** + * This is only called in the constructor of the network object + * + */ + exports.startWithClustering = function() { + // cluster if the data set is big + this.clusterToFit(this.constants.clustering.initialMaxNodes, true); + + // updates the lables after clustering + this.updateLabels(); + + // this is called here because if clusterin is disabled, the start and stabilize are called in + // the setData function. + if (this.constants.stabilize == true) { + this._stabilize(); + } + this.start(); + }; + + /** + * This function clusters until the initialMaxNodes has been reached + * + * @param {Number} maxNumberOfNodes + * @param {Boolean} reposition + */ + exports.clusterToFit = function(maxNumberOfNodes, reposition) { + var numberOfNodes = this.nodeIndices.length; + + var maxLevels = 50; + var level = 0; + + // we first cluster the hubs, then we pull in the outliers, repeat + while (numberOfNodes > maxNumberOfNodes && level < maxLevels) { + if (level % 3 == 0.0) { + this.forceAggregateHubs(true); + this.normalizeClusterLevels(); + } + else { + this.increaseClusterLevel(); // this also includes a cluster normalization + } + this.forceAggregateHubs(true); + numberOfNodes = this.nodeIndices.length; + level += 1; + } + + // after the clustering we reposition the nodes to reduce the initial chaos + if (level > 0 && reposition == true) { + this.repositionNodes(); + } + this._updateCalculationNodes(); + }; + + /** + * This function can be called to open up a specific cluster. + * It will unpack the cluster back one level. + * + * @param node | Node object: cluster to open. + */ + exports.openCluster = function(node) { + var isMovingBeforeClustering = this.moving; + if (node.clusterSize > this.constants.clustering.sectorThreshold && this._nodeInActiveArea(node) && + !(this._sector() == "default" && this.nodeIndices.length == 1)) { + // this loads a new sector, loads the nodes and edges and nodeIndices of it. + this._addSector(node); + var level = 0; + + // we decluster until we reach a decent number of nodes + while ((this.nodeIndices.length < this.constants.clustering.initialMaxNodes) && (level < 10)) { + this.decreaseClusterLevel(); + level += 1; + } + + } + else { + this._expandClusterNode(node,false,true); + + // update the index list and labels + this._updateNodeIndexList(); + this._updateCalculationNodes(); + this.updateLabels(); + } + + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } + }; + + + /** + * This calls the updateClustes with default arguments + */ + exports.updateClustersDefault = function() { + if (this.constants.clustering.enabled == true && this.constants.clustering.clusterByZoom == true) { + this.updateClusters(0,false,false); + } + }; + + + /** + * This function can be called to increase the cluster level. This means that the nodes with only one edge connection will + * be clustered with their connected node. This can be repeated as many times as needed. + * This can be called externally (by a keybind for instance) to reduce the complexity of big datasets. + */ + exports.increaseClusterLevel = function() { + this.updateClusters(-1,false,true); + }; + + + /** + * This function can be called to decrease the cluster level. This means that the nodes with only one edge connection will + * be unpacked if they are a cluster. This can be repeated as many times as needed. + * This can be called externally (by a key-bind for instance) to look into clusters without zooming. + */ + exports.decreaseClusterLevel = function() { + this.updateClusters(1,false,true); + }; + + + /** + * This is the main clustering function. It clusters and declusters on zoom or forced + * This function clusters on zoom, it can be called with a predefined zoom direction + * If out, check if we can form clusters, if in, check if we can open clusters. + * This function is only called from _zoom() + * + * @param {Number} zoomDirection | -1 / 0 / +1 for zoomOut / determineByZoom / zoomIn + * @param {Boolean} recursive | enabled or disable recursive calling of the opening of clusters + * @param {Boolean} force | enabled or disable forcing + * @param {Boolean} doNotStart | if true do not call start + * + */ + exports.updateClusters = function(zoomDirection,recursive,force,doNotStart) { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; + + var detectedZoomingIn = (this.previousScale < this.scale && zoomDirection == 0); + var detectedZoomingOut = (this.previousScale > this.scale && zoomDirection == 0); + + // on zoom out collapse the sector if the scale is at the level the sector was made + if (detectedZoomingOut == true) { + this._collapseSector(); + } + + // check if we zoom in or out + if (detectedZoomingOut == true || zoomDirection == -1) { // zoom out + // forming clusters when forced pulls outliers in. When not forced, the edge length of the + // outer nodes determines if it is being clustered + this._formClusters(force); + } + else if (detectedZoomingIn == true || zoomDirection == 1) { // zoom in + if (force == true) { + // _openClusters checks for each node if the formationScale of the cluster is smaller than + // the current scale and if so, declusters. When forced, all clusters are reduced by one step + this._openClusters(recursive,force); + } + else { + // if a cluster takes up a set percentage of the active window + //this._openClustersBySize(); + this._openClusters(recursive, false); + } + } + this._updateNodeIndexList(); + + // if a cluster was NOT formed and the user zoomed out, we try clustering by hubs + if (this.nodeIndices.length == amountOfNodes && (detectedZoomingOut == true || zoomDirection == -1)) { + this._aggregateHubs(force); + this._updateNodeIndexList(); + } + + // we now reduce chains. + if (detectedZoomingOut == true || zoomDirection == -1) { // zoom out + this.handleChains(); + this._updateNodeIndexList(); + } + + this.previousScale = this.scale; + + // update labels + this.updateLabels(); + + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length < amountOfNodes) { // this means a clustering operation has taken place + this.clusterSession += 1; + // if clusters have been made, we normalize the cluster level + this.normalizeClusterLevels(); + } + + if (doNotStart == false || doNotStart === undefined) { + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } + } + + this._updateCalculationNodes(); + }; + + /** + * This function handles the chains. It is called on every updateClusters(). + */ + exports.handleChains = function() { + // after clustering we check how many chains there are + var chainPercentage = this._getChainFraction(); + if (chainPercentage > this.constants.clustering.chainThreshold) { + this._reduceAmountOfChains(1 - this.constants.clustering.chainThreshold / chainPercentage) + + } + }; + + /** + * this functions starts clustering by hubs + * The minimum hub threshold is set globally + * + * @private + */ + exports._aggregateHubs = function(force) { + this._getHubSize(); + this._formClustersByHub(force,false); + }; + + + /** + * This function forces hubs to form. + * + */ + exports.forceAggregateHubs = function(doNotStart) { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; + + this._aggregateHubs(true); + + // update the index list, dynamic edges and labels + this._updateNodeIndexList(); + this.updateLabels(); + + this._updateCalculationNodes(); + + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length != amountOfNodes) { + this.clusterSession += 1; + } + + if (doNotStart == false || doNotStart === undefined) { + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } + } + }; + + /** + * If a cluster takes up more than a set percentage of the screen, open the cluster + * + * @private + */ + exports._openClustersBySize = function() { + if (this.constants.clustering.clusterByZoom == true) { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.inView() == true) { + if ((node.width * this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (node.height * this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + this.openCluster(node); + } + } + } + } + } + }; + + + /** + * This function loops over all nodes in the nodeIndices list. For each node it checks if it is a cluster and if it + * has to be opened based on the current zoom level. + * + * @private + */ + exports._openClusters = function(recursive,force) { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + this._expandClusterNode(node,recursive,force); + this._updateCalculationNodes(); + } + }; + + /** + * This function checks if a node has to be opened. This is done by checking the zoom level. + * If the node contains child nodes, this function is recursively called on the child nodes as well. + * This recursive behaviour is optional and can be set by the recursive argument. + * + * @param {Node} parentNode | to check for cluster and expand + * @param {Boolean} recursive | enabled or disable recursive calling + * @param {Boolean} force | enabled or disable forcing + * @param {Boolean} [openAll] | This will recursively force all nodes in the parent to be released + * @private + */ + exports._expandClusterNode = function(parentNode, recursive, force, openAll) { + // first check if node is a cluster + if (parentNode.clusterSize > 1) { + if (openAll === undefined) { + openAll = false; + } + // this means that on a double tap event or a zoom event, the cluster fully unpacks if it is smaller than 20 + + recursive = openAll || recursive; + // if the last child has been added on a smaller scale than current scale decluster + if (parentNode.formationScale < this.scale || force == true) { + // we will check if any of the contained child nodes should be removed from the cluster + for (var containedNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(containedNodeId)) { + var childNode = parentNode.containedNodes[containedNodeId]; + + // force expand will expand the largest cluster size clusters. Since we cluster from outside in, we assume that + // the largest cluster is the one that comes from outside + if (force == true) { + if (childNode.clusterSession == parentNode.clusterSessions[parentNode.clusterSessions.length-1] + || openAll) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + else { + if (this._nodeInActiveArea(parentNode)) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + } + } + } + } + }; + + /** + * ONLY CALLED FROM _expandClusterNode + * + * This function will expel a child_node from a parent_node. This is to de-cluster the node. This function will remove + * the child node from the parent contained_node object and put it back into the global nodes object. + * The same holds for the edge that was connected to the child node. It is moved back into the global edges object. + * + * @param {Node} parentNode | the parent node + * @param {String} containedNodeId | child_node id as it is contained in the containedNodes object of the parent node + * @param {Boolean} recursive | This will also check if the child needs to be expanded. + * With force and recursive both true, the entire cluster is unpacked + * @param {Boolean} force | This will disregard the zoom level and will expel this child from the parent + * @param {Boolean} openAll | This will recursively force all nodes in the parent to be released + * @private + */ + exports._expelChildFromParent = function(parentNode, containedNodeId, recursive, force, openAll) { + var childNode = parentNode.containedNodes[containedNodeId] + + // if child node has been added on smaller scale than current, kick out + if (childNode.formationScale < this.scale || force == true) { + // unselect all selected items + this._unselectAll(); + + // put the child node back in the global nodes object + this.nodes[containedNodeId] = childNode; + + // release the contained edges from this childNode back into the global edges + this._releaseContainedEdges(parentNode,childNode); + + // reconnect rerouted edges to the childNode + this._connectEdgeBackToChild(parentNode,childNode); + + // validate all edges in dynamicEdges + this._validateEdges(parentNode); + + // undo the changes from the clustering operation on the parent node + parentNode.options.mass -= childNode.options.mass; + parentNode.clusterSize -= childNode.clusterSize; + parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*(parentNode.clusterSize-1)); + + // place the child node near the parent, not at the exact same location to avoid chaos in the system + childNode.x = parentNode.x + parentNode.growthIndicator * (0.5 - Math.random()); + childNode.y = parentNode.y + parentNode.growthIndicator * (0.5 - Math.random()); + + // remove node from the list + delete parentNode.containedNodes[containedNodeId]; + + // check if there are other childs with this clusterSession in the parent. + var othersPresent = false; + for (var childNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(childNodeId)) { + if (parentNode.containedNodes[childNodeId].clusterSession == childNode.clusterSession) { + othersPresent = true; + break; + } + } + } + // if there are no others, remove the cluster session from the list + if (othersPresent == false) { + parentNode.clusterSessions.pop(); + } + + this._repositionBezierNodes(childNode); + // this._repositionBezierNodes(parentNode); + + // remove the clusterSession from the child node + childNode.clusterSession = 0; + + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); + + // restart the simulation to reorganise all nodes + this.moving = true; + } + + // check if a further expansion step is possible if recursivity is enabled + if (recursive == true) { + this._expandClusterNode(childNode,recursive,force,openAll); + } + }; + + + /** + * position the bezier nodes at the center of the edges + * + * @param node + * @private + */ + exports._repositionBezierNodes = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + node.dynamicEdges[i].positionBezierNode(); + } + }; + + + /** + * This function checks if any nodes at the end of their trees have edges below a threshold length + * This function is called only from updateClusters() + * forceLevelCollapse ignores the length of the edge and collapses one level + * This means that a node with only one edge will be clustered with its connected node + * + * @private + * @param {Boolean} force + */ + exports._formClusters = function(force) { + if (force == false) { + if (this.constants.clustering.clusterByZoom == true) { + this._formClustersByZoom(); + } + } + else { + this._forceClustersByZoom(); + } + }; + + + /** + * This function handles the clustering by zooming out, this is based on a minimum edge distance + * + * @private + */ + exports._formClustersByZoom = function() { + var dx,dy,length; + var minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; + + // check if any edges are shorter than minLength and start the clustering + // the clustering favours the node with the larger mass + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + var edge = this.edges[edgeId]; + if (edge.connected) { + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); + + + if (length < minLength) { + // first check which node is larger + var parentNode = edge.from; + var childNode = edge.to; + if (edge.to.options.mass > edge.from.options.mass) { + parentNode = edge.to; + childNode = edge.from; + } + + if (childNode.dynamicEdges.length == 1) { + this._addToCluster(parentNode,childNode,false); + } + else if (parentNode.dynamicEdges.length == 1) { + this._addToCluster(childNode,parentNode,false); + } + } + } + } + } + } + }; + + /** + * This function forces the network to cluster all nodes with only one connecting edge to their + * connected node. + * + * @private + */ + exports._forceClustersByZoom = function() { + for (var nodeId in this.nodes) { + // another node could have absorbed this child. + if (this.nodes.hasOwnProperty(nodeId)) { + var childNode = this.nodes[nodeId]; + + // the edges can be swallowed by another decrease + if (childNode.dynamicEdges.length == 1) { + var edge = childNode.dynamicEdges[0]; + var parentNode = (edge.toId == childNode.id) ? this.nodes[edge.fromId] : this.nodes[edge.toId]; + // group to the largest node + if (childNode.id != parentNode.id) { + if (parentNode.options.mass > childNode.options.mass) { + this._addToCluster(parentNode,childNode,true); + } + else { + this._addToCluster(childNode,parentNode,true); + } + } + } + } + } + }; + + + /** + * To keep the nodes of roughly equal size we normalize the cluster levels. + * This function clusters a node to its smallest connected neighbour. + * + * @param node + * @private + */ + exports._clusterToSmallestNeighbour = function(node) { + var smallestNeighbour = -1; + var smallestNeighbourNode = null; + for (var i = 0; i < node.dynamicEdges.length; i++) { + if (node.dynamicEdges[i] !== undefined) { + var neighbour = null; + if (node.dynamicEdges[i].fromId != node.id) { + neighbour = node.dynamicEdges[i].from; + } + else if (node.dynamicEdges[i].toId != node.id) { + neighbour = node.dynamicEdges[i].to; + } + + + if (neighbour != null && smallestNeighbour > neighbour.clusterSessions.length) { + smallestNeighbour = neighbour.clusterSessions.length; + smallestNeighbourNode = neighbour; + } + } + } + + if (neighbour != null && this.nodes[neighbour.id] !== undefined) { + this._addToCluster(neighbour, node, true); + } + }; + + + /** + * This function forms clusters from hubs, it loops over all nodes + * + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges + * @private + */ + exports._formClustersByHub = function(force, onlyEqual) { + // we loop over all nodes in the list + for (var nodeId in this.nodes) { + // we check if it is still available since it can be used by the clustering in this loop + if (this.nodes.hasOwnProperty(nodeId)) { + this._formClusterFromHub(this.nodes[nodeId],force,onlyEqual); + } + } + }; + + /** + * This function forms a cluster from a specific preselected hub node + * + * @param {Node} hubNode | the node we will cluster as a hub + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges + * @param {Number} [absorptionSizeOffset] | + * @private + */ + exports._formClusterFromHub = function(hubNode, force, onlyEqual, absorptionSizeOffset) { + if (absorptionSizeOffset === undefined) { + absorptionSizeOffset = 0; + } + //this.hubThreshold = 43 + //if (hubNode.dynamicEdgesLength < 0) { + // console.error(hubNode.dynamicEdgesLength, this.hubThreshold, onlyEqual) + //} + // we decide if the node is a hub + if ((hubNode.dynamicEdges.length >= this.hubThreshold && onlyEqual == false) || + (hubNode.dynamicEdges.length == this.hubThreshold && onlyEqual == true)) { + // initialize variables + var dx,dy,length; + var minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; + var allowCluster = false; + + // we create a list of edges because the dynamicEdges change over the course of this loop + var edgesIdarray = []; + var amountOfInitialEdges = hubNode.dynamicEdges.length; + for (var j = 0; j < amountOfInitialEdges; j++) { + edgesIdarray.push(hubNode.dynamicEdges[j].id); + } + + // if the hub clustering is not forced, we check if one of the edges connected + // to a cluster is small enough based on the constants.clustering.clusterEdgeThreshold + if (force == false) { + allowCluster = false; + for (j = 0; j < amountOfInitialEdges; j++) { + var edge = this.edges[edgesIdarray[j]]; + if (edge !== undefined) { + if (edge.connected) { + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); + + if (length < minLength) { + allowCluster = true; + break; + } + } + } + } + } + } + + // start the clustering if allowed + if ((!force && allowCluster) || force) { + var children = []; + var childrenIds = {}; + // we loop over all edges INITIALLY connected to this hub to get a list of the childNodes + for (j = 0; j < amountOfInitialEdges; j++) { + edge = this.edges[edgesIdarray[j]]; + var childNode = this.nodes[(edge.fromId == hubNode.id) ? edge.toId : edge.fromId]; + if (childrenIds[childNode.id] === undefined) { + childrenIds[childNode.id] = true; + children.push(childNode); + } + } + + for (j = 0; j < children.length; j++) { + var childNode = children[j]; + // we do not want hubs to merge with other hubs nor do we want to cluster itself. + if ((childNode.dynamicEdges.length <= (this.hubThreshold + absorptionSizeOffset)) && + (childNode.id != hubNode.id)) { + this._addToCluster(hubNode,childNode,force); + + } + else { + //console.log("WILL NOT MERGE:",childNode.dynamicEdges.length , (this.hubThreshold + absorptionSizeOffset)) + } + } + + } + } + }; + + + + /** + * This function adds the child node to the parent node, creating a cluster if it is not already. + * + * @param {Node} parentNode | this is the node that will house the child node + * @param {Node} childNode | this node will be deleted from the global this.nodes and stored in the parent node + * @param {Boolean} force | true will only update the remainingEdges at the very end of the clustering, ensuring single level collapse + * @private + */ + exports._addToCluster = function(parentNode, childNode, force) { + // join child node in the parent node + parentNode.containedNodes[childNode.id] = childNode; + //console.log(parentNode.id, childNode.id) + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < childNode.dynamicEdges.length; i++) { + var edge = childNode.dynamicEdges[i]; + if (edge.toId == parentNode.id || edge.fromId == parentNode.id) { // edge connected to parentNode + //console.log("COLLECT",parentNode.id, childNode.id, edge.toId, edge.fromId) + this._addToContainedEdges(parentNode,childNode,edge); + } + else { + //console.log("REWIRE",parentNode.id, childNode.id, edge.toId, edge.fromId) + this._connectEdgeToCluster(parentNode,childNode,edge); + } + } + // a contained node has no dynamic edges. + childNode.dynamicEdges = []; + + // remove circular edges from clusters + this._containCircularEdgesFromNode(parentNode,childNode); + + + // remove the childNode from the global nodes object + delete this.nodes[childNode.id]; + + // update the properties of the child and parent + var massBefore = parentNode.options.mass; + childNode.clusterSession = this.clusterSession; + parentNode.options.mass += childNode.options.mass; + parentNode.clusterSize += childNode.clusterSize; + parentNode.options.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); + + // keep track of the clustersessions so we can open the cluster up as it has been formed. + if (parentNode.clusterSessions[parentNode.clusterSessions.length - 1] != this.clusterSession) { + parentNode.clusterSessions.push(this.clusterSession); + } + + // forced clusters only open from screen size and double tap + if (force == true) { + parentNode.formationScale = 0; + } + else { + parentNode.formationScale = this.scale; // The latest child has been added on this scale + } + + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); + + // set the pop-out scale for the childnode + parentNode.containedNodes[childNode.id].formationScale = parentNode.formationScale; + + // nullify the movement velocity of the child, this is to avoid hectic behaviour + childNode.clearVelocity(); + + // the mass has altered, preservation of energy dictates the velocity to be updated + parentNode.updateVelocity(massBefore); + + // restart the simulation to reorganise all nodes + this.moving = true; + }; + + + /** + * This adds an edge from the childNode to the contained edges of the parent node + * + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object + * @private + */ + exports._addToContainedEdges = function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + if (parentNode.containedEdges[childNode.id] === undefined) { + parentNode.containedEdges[childNode.id] = [] + } + // add this edge to the list + parentNode.containedEdges[childNode.id].push(edge); + + // remove the edge from the global edges object + delete this.edges[edge.id]; + + // remove the edge from the parent object + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + if (parentNode.dynamicEdges[i].id == edge.id) { + parentNode.dynamicEdges.splice(i,1); + break; + } + } + }; + + /** + * This function connects an edge that was connected to a child node to the parent node. + * It keeps track of which nodes it has been connected to with the originalId array. + * + * @param {Node} parentNode | Node object + * @param {Node} childNode | Node object + * @param {Edge} edge | Edge object + * @private + */ + exports._connectEdgeToCluster = function(parentNode, childNode, edge) { + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); + } + else { + if (edge.toId == childNode.id) { // edge connected to other node on the "to" side + edge.originalToId.push(childNode.id); + edge.to = parentNode; + edge.toId = parentNode.id; + } + else { // edge connected to other node with the "from" side + edge.originalFromId.push(childNode.id); + edge.from = parentNode; + edge.fromId = parentNode.id; + } + + this._addToReroutedEdges(parentNode,childNode,edge); + } + }; + + + /** + * If a node is connected to itself, a circular edge is drawn. When clustering we want to contain + * these edges inside of the cluster. + * + * @param parentNode + * @param childNode + * @private + */ + exports._containCircularEdgesFromNode = function(parentNode, childNode) { + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); + } + } + }; + + + /** + * This adds an edge from the childNode to the rerouted edges of the parent node + * + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object + * @private + */ + exports._addToReroutedEdges = function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + // we store the edge in the rerouted edges so we can restore it when the cluster pops open + if (!(parentNode.reroutedEdges.hasOwnProperty(childNode.id))) { + parentNode.reroutedEdges[childNode.id] = []; + } + parentNode.reroutedEdges[childNode.id].push(edge); + + // this edge becomes part of the dynamicEdges of the cluster node + parentNode.dynamicEdges.push(edge); + }; + + + + /** + * This function connects an edge that was connected to a cluster node back to the child node. + * + * @param parentNode | Node object + * @param childNode | Node object + * @private + */ + exports._connectEdgeBackToChild = function(parentNode, childNode) { + if (parentNode.reroutedEdges.hasOwnProperty(childNode.id)) { + for (var i = 0; i < parentNode.reroutedEdges[childNode.id].length; i++) { + var edge = parentNode.reroutedEdges[childNode.id][i]; + if (edge.originalFromId[edge.originalFromId.length-1] == childNode.id) { + edge.originalFromId.pop(); + edge.fromId = childNode.id; + edge.from = childNode; + } + else { + edge.originalToId.pop(); + edge.toId = childNode.id; + edge.to = childNode; + } + + // append this edge to the list of edges connecting to the childnode + childNode.dynamicEdges.push(edge); + + // remove the edge from the parent object + for (var j = 0; j < parentNode.dynamicEdges.length; j++) { + if (parentNode.dynamicEdges[j].id == edge.id) { + parentNode.dynamicEdges.splice(j,1); + break; + } + } + } + // remove the entry from the rerouted edges + delete parentNode.reroutedEdges[childNode.id]; + } + }; + + + /** + * When loops are clustered, an edge can be both in the rerouted array and the contained array. + * This function is called last to verify that all edges in dynamicEdges are in fact connected to the + * parentNode + * + * @param parentNode | Node object + * @private + */ + exports._validateEdges = function(parentNode) { + var dynamicEdges = [] + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + if (parentNode.id == edge.toId || parentNode.id == edge.fromId) { + dynamicEdges.push(edge); + } + } + parentNode.dynamicEdges = dynamicEdges; + }; + + + /** + * This function released the contained edges back into the global domain and puts them back into the + * dynamic edges of both parent and child. + * + * @param {Node} parentNode | + * @param {Node} childNode | + * @private + */ + exports._releaseContainedEdges = function(parentNode, childNode) { + for (var i = 0; i < parentNode.containedEdges[childNode.id].length; i++) { + var edge = parentNode.containedEdges[childNode.id][i]; + + // put the edge back in the global edges object + this.edges[edge.id] = edge; + + // put the edge back in the dynamic edges of the child and parent + childNode.dynamicEdges.push(edge); + parentNode.dynamicEdges.push(edge); + } + // remove the entry from the contained edges + delete parentNode.containedEdges[childNode.id]; + + }; + + + + + // ------------------- UTILITY FUNCTIONS ---------------------------- // + + + /** + * This updates the node labels for all nodes (for debugging purposes) + */ + exports.updateLabels = function() { + var nodeId; + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.clusterSize > 1) { + node.label = "[".concat(String(node.clusterSize),"]"); + } + } + } + + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.clusterSize == 1) { + if (node.originalLabel !== undefined) { + node.label = node.originalLabel; + } + else { + node.label = String(node.id); + } + } + } + } + + // /* Debug Override */ + // for (nodeId in this.nodes) { + // if (this.nodes.hasOwnProperty(nodeId)) { + // node = this.nodes[nodeId]; + // node.label = String(node.clusterSize + ":" + node.dynamicEdges.length); + // } + // } + + }; + + + /** + * We want to keep the cluster level distribution rather small. This means we do not want unclustered nodes + * if the rest of the nodes are already a few cluster levels in. + * To fix this we use this function. It determines the min and max cluster level and sends nodes that have not + * clustered enough to the clusterToSmallestNeighbours function. + */ + exports.normalizeClusterLevels = function() { + var maxLevel = 0; + var minLevel = 1e9; + var clusterLevel = 0; + var nodeId; + + // we loop over all nodes in the list + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + clusterLevel = this.nodes[nodeId].clusterSessions.length; + if (maxLevel < clusterLevel) {maxLevel = clusterLevel;} + if (minLevel > clusterLevel) {minLevel = clusterLevel;} + } + } + + if (maxLevel - minLevel > this.constants.clustering.clusterLevelDifference) { + var amountOfNodes = this.nodeIndices.length; + var targetLevel = maxLevel - this.constants.clustering.clusterLevelDifference; + // we loop over all nodes in the list + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].clusterSessions.length < targetLevel) { + this._clusterToSmallestNeighbour(this.nodes[nodeId]); + } + } + } + this._updateNodeIndexList(); + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length != amountOfNodes) { + this.clusterSession += 1; + } + } + }; + + + + /** + * This function determines if the cluster we want to decluster is in the active area + * this means around the zoom center + * + * @param {Node} node + * @returns {boolean} + * @private + */ + exports._nodeInActiveArea = function(node) { + return ( + Math.abs(node.x - this.areaCenter.x) <= this.constants.clustering.activeAreaBoxSize/this.scale + && + Math.abs(node.y - this.areaCenter.y) <= this.constants.clustering.activeAreaBoxSize/this.scale + ) + }; + + + /** + * This is an adaptation of the original repositioning function. This is called if the system is clustered initially + * It puts large clusters away from the center and randomizes the order. + * + */ + exports.repositionNodes = function() { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + if ((node.xFixed == false || node.yFixed == false)) { + var radius = 10 * 0.1*this.nodeIndices.length * Math.min(100,node.options.mass); + var angle = 2 * Math.PI * Math.random(); + if (node.xFixed == false) {node.x = radius * Math.cos(angle);} + if (node.yFixed == false) {node.y = radius * Math.sin(angle);} + this._repositionBezierNodes(node); + } + } + }; + + + /** + * We determine how many connections denote an important hub. + * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%) + * + * @private + */ + exports._getHubSize = function() { + var average = 0; + var averageSquared = 0; + var hubCounter = 0; + var largestHub = 0; + + for (var i = 0; i < this.nodeIndices.length; i++) { + + var node = this.nodes[this.nodeIndices[i]]; + if (node.dynamicEdges.length > largestHub) { + largestHub = node.dynamicEdges.length; + } + average += node.dynamicEdges.length; + averageSquared += Math.pow(node.dynamicEdges.length,2); + hubCounter += 1; + } + average = average / hubCounter; + averageSquared = averageSquared / hubCounter; + + var variance = averageSquared - Math.pow(average,2); + + var standardDeviation = Math.sqrt(variance); + + this.hubThreshold = Math.floor(average + 2*standardDeviation); + + // always have at least one to cluster + if (this.hubThreshold > largestHub) { + this.hubThreshold = largestHub; + } + + // console.log("average",average,"averageSQ",averageSquared,"var",variance,"std",standardDeviation); + // console.log("hubThreshold:",this.hubThreshold); + }; + + + /** + * We reduce the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. + * + * @param {Number} fraction | between 0 and 1, the percentage of chains to reduce + * @private + */ + exports._reduceAmountOfChains = function(fraction) { + this.hubThreshold = 2; + var reduceAmount = Math.floor(this.nodeIndices.length * fraction); + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdges.length == 2) { + if (reduceAmount > 0) { + this._formClusterFromHub(this.nodes[nodeId],true,true,1); + reduceAmount -= 1; + } + } + } + } + }; + + /** + * We get the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. + * + * @private + */ + exports._getChainFraction = function() { + var chains = 0; + var total = 0; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdges.length == 2) { + chains += 1; + } + total += 1; + } + } + return chains/total; + }; + + +/***/ }, +/* 62 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Node = __webpack_require__(40); + + /** + * Creation of the SectorMixin var. + * + * This contains all the functions the Network object can use to employ the sector system. + * The sector system is always used by Network, though the benefits only apply to the use of clustering. + * If clustering is not used, there is no overhead except for a duplicate object with references to nodes and edges. + */ + + /** + * This function is only called by the setData function of the Network object. + * This loads the global references into the active sector. This initializes the sector. + * + * @private + */ + exports._putDataInSector = function() { + this.sectors["active"][this._sector()].nodes = this.nodes; + this.sectors["active"][this._sector()].edges = this.edges; + this.sectors["active"][this._sector()].nodeIndices = this.nodeIndices; + }; + + + /** + * /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied (active) sector. If a type is defined, do the specific type + * + * @param {String} sectorId + * @param {String} [sectorType] | "active" or "frozen" + * @private + */ + exports._switchToSector = function(sectorId, sectorType) { + if (sectorType === undefined || sectorType == "active") { + this._switchToActiveSector(sectorId); + } + else { + this._switchToFrozenSector(sectorId); + } + }; + + + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied active sector. + * + * @param sectorId + * @private + */ + exports._switchToActiveSector = function(sectorId) { + this.nodeIndices = this.sectors["active"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["active"][sectorId]["nodes"]; + this.edges = this.sectors["active"][sectorId]["edges"]; + }; + + + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied active sector. + * + * @private + */ + exports._switchToSupportSector = function() { + this.nodeIndices = this.sectors["support"]["nodeIndices"]; + this.nodes = this.sectors["support"]["nodes"]; + this.edges = this.sectors["support"]["edges"]; + }; + + + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied frozen sector. + * + * @param sectorId + * @private + */ + exports._switchToFrozenSector = function(sectorId) { + this.nodeIndices = this.sectors["frozen"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["frozen"][sectorId]["nodes"]; + this.edges = this.sectors["frozen"][sectorId]["edges"]; + }; + + + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the currently active sector. + * + * @private + */ + exports._loadLatestSector = function() { + this._switchToSector(this._sector()); + }; + + + /** + * This function returns the currently active sector Id + * + * @returns {String} + * @private + */ + exports._sector = function() { + return this.activeSector[this.activeSector.length-1]; + }; + + + /** + * This function returns the previously active sector Id + * + * @returns {String} + * @private + */ + exports._previousSector = function() { + if (this.activeSector.length > 1) { + return this.activeSector[this.activeSector.length-2]; + } + else { + throw new TypeError('there are not enough sectors in the this.activeSector array.'); + } + }; + + + /** + * We add the active sector at the end of the this.activeSector array + * This ensures it is the currently active sector returned by _sector() and it reaches the top + * of the activeSector stack. When we reverse our steps we move from the end to the beginning of this stack. + * + * @param newId + * @private + */ + exports._setActiveSector = function(newId) { + this.activeSector.push(newId); + }; + + + /** + * We remove the currently active sector id from the active sector stack. This happens when + * we reactivate the previously active sector + * + * @private + */ + exports._forgetLastSector = function() { + this.activeSector.pop(); + }; + + + /** + * This function creates a new active sector with the supplied newId. This newId + * is the expanding node id. + * + * @param {String} newId | Id of the new active sector + * @private + */ + exports._createNewSector = function(newId) { + // create the new sector + this.sectors["active"][newId] = {"nodes":{}, + "edges":{}, + "nodeIndices":[], + "formationScale": this.scale, + "drawingNode": undefined}; + + // create the new sector render node. This gives visual feedback that you are in a new sector. + this.sectors["active"][newId]['drawingNode'] = new Node( + {id:newId, + color: { + background: "#eaefef", + border: "495c5e" + } + },{},{},this.constants); + this.sectors["active"][newId]['drawingNode'].clusterSize = 2; + }; + + + /** + * This function removes the currently active sector. This is called when we create a new + * active sector. + * + * @param {String} sectorId | Id of the active sector that will be removed + * @private + */ + exports._deleteActiveSector = function(sectorId) { + delete this.sectors["active"][sectorId]; + }; + + + /** + * This function removes the currently active sector. This is called when we reactivate + * the previously active sector. + * + * @param {String} sectorId | Id of the active sector that will be removed + * @private + */ + exports._deleteFrozenSector = function(sectorId) { + delete this.sectors["frozen"][sectorId]; + }; + + + /** + * Freezing an active sector means moving it from the "active" object to the "frozen" object. + * We copy the references, then delete the active entree. + * + * @param sectorId + * @private + */ + exports._freezeSector = function(sectorId) { + // we move the set references from the active to the frozen stack. + this.sectors["frozen"][sectorId] = this.sectors["active"][sectorId]; + + // we have moved the sector data into the frozen set, we now remove it from the active set + this._deleteActiveSector(sectorId); + }; + + + /** + * This is the reverse operation of _freezeSector. Activating means moving the sector from the "frozen" + * object to the "active" object. + * + * @param sectorId + * @private + */ + exports._activateSector = function(sectorId) { + // we move the set references from the frozen to the active stack. + this.sectors["active"][sectorId] = this.sectors["frozen"][sectorId]; + + // we have moved the sector data into the active set, we now remove it from the frozen stack + this._deleteFrozenSector(sectorId); + }; + + + /** + * This function merges the data from the currently active sector with a frozen sector. This is used + * in the process of reverting back to the previously active sector. + * The data that is placed in the frozen (the previously active) sector is the node that has been removed from it + * upon the creation of a new active sector. + * + * @param sectorId + * @private + */ + exports._mergeThisWithFrozen = function(sectorId) { + // copy all nodes + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.sectors["frozen"][sectorId]["nodes"][nodeId] = this.nodes[nodeId]; + } + } + + // copy all edges (if not fully clustered, else there are no edges) + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + this.sectors["frozen"][sectorId]["edges"][edgeId] = this.edges[edgeId]; + } + } + + // merge the nodeIndices + for (var i = 0; i < this.nodeIndices.length; i++) { + this.sectors["frozen"][sectorId]["nodeIndices"].push(this.nodeIndices[i]); + } + }; + + + /** + * This clusters the sector to one cluster. It was a single cluster before this process started so + * we revert to that state. The clusterToFit function with a maximum size of 1 node does this. + * + * @private + */ + exports._collapseThisToSingleCluster = function() { + this.clusterToFit(1,false); + }; + + + /** + * We create a new active sector from the node that we want to open. + * + * @param node + * @private + */ + exports._addSector = function(node) { + // this is the currently active sector + var sector = this._sector(); + + // // this should allow me to select nodes from a frozen set. + // if (this.sectors['active'][sector]["nodes"].hasOwnProperty(node.id)) { + // console.log("the node is part of the active sector"); + // } + // else { + // console.log("I dont know what the fuck happened!!"); + // } + + // when we switch to a new sector, we remove the node that will be expanded from the current nodes list. + delete this.nodes[node.id]; + + var unqiueIdentifier = util.randomUUID(); + + // we fully freeze the currently active sector + this._freezeSector(sector); + + // we create a new active sector. This sector has the Id of the node to ensure uniqueness + this._createNewSector(unqiueIdentifier); + + // we add the active sector to the sectors array to be able to revert these steps later on + this._setActiveSector(unqiueIdentifier); + + // we redirect the global references to the new sector's references. this._sector() now returns unqiueIdentifier + this._switchToSector(this._sector()); + + // finally we add the node we removed from our previous active sector to the new active sector + this.nodes[node.id] = node; + }; + + + /** + * We close the sector that is currently open and revert back to the one before. + * If the active sector is the "default" sector, nothing happens. + * + * @private + */ + exports._collapseSector = function() { + // the currently active sector + var sector = this._sector(); + + // we cannot collapse the default sector + if (sector != "default") { + if ((this.nodeIndices.length == 1) || + (this.sectors["active"][sector]["drawingNode"].width*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (this.sectors["active"][sector]["drawingNode"].height*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + var previousSector = this._previousSector(); + + // we collapse the sector back to a single cluster + this._collapseThisToSingleCluster(); + + // we move the remaining nodes, edges and nodeIndices to the previous sector. + // This previous sector is the one we will reactivate + this._mergeThisWithFrozen(previousSector); + + // the previously active (frozen) sector now has all the data from the currently active sector. + // we can now delete the active sector. + this._deleteActiveSector(sector); + + // we activate the previously active (and currently frozen) sector. + this._activateSector(previousSector); + + // we load the references from the newly active sector into the global references + this._switchToSector(previousSector); + + // we forget the previously active sector because we reverted to the one before + this._forgetLastSector(); + + // finally, we update the node index list. + this._updateNodeIndexList(); + + // we refresh the list with calulation nodes and calculation node indices. + this._updateCalculationNodes(); + } + } + }; + + + /** + * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we dont pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @private + */ + exports._doInAllActiveSectors = function(runFunction,argument) { + var returnValues = []; + if (argument === undefined) { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + returnValues.push( this[runFunction]() ); + } + } + } + else { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + returnValues.push( this[runFunction](args[0],args[1]) ); + } + else { + returnValues.push( this[runFunction](argument) ); + } + } + } + } + // we revert the global references back to our active sector + this._loadLatestSector(); + return returnValues; + }; + + + /** + * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we dont pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @private + */ + exports._doInSupportSector = function(runFunction,argument) { + var returnValues = false; + if (argument === undefined) { + this._switchToSupportSector(); + returnValues = this[runFunction](); + } + else { + this._switchToSupportSector(); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + returnValues = this[runFunction](args[0],args[1]); + } + else { + returnValues = this[runFunction](argument); + } + } + // we revert the global references back to our active sector + this._loadLatestSector(); + return returnValues; + }; + + + /** + * This runs a function in all frozen sectors. This is used in the _redraw(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @private + */ + exports._doInAllFrozenSectors = function(runFunction,argument) { + if (argument === undefined) { + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + this[runFunction](); + } + } + } + else { + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); + } + else { + this[runFunction](argument); + } + } + } + } + this._loadLatestSector(); + }; + + + /** + * This runs a function in all sectors. This is used in the _redraw(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @private + */ + exports._doInAllSectors = function(runFunction,argument) { + var args = Array.prototype.splice.call(arguments, 1); + if (argument === undefined) { + this._doInAllActiveSectors(runFunction); + this._doInAllFrozenSectors(runFunction); + } + else { + if (args.length > 1) { + this._doInAllActiveSectors(runFunction,args[0],args[1]); + this._doInAllFrozenSectors(runFunction,args[0],args[1]); + } + else { + this._doInAllActiveSectors(runFunction,argument); + this._doInAllFrozenSectors(runFunction,argument); + } + } + }; + + + /** + * This clears the nodeIndices list. We cannot use this.nodeIndices = [] because we would break the link with the + * active sector. Thus we clear the nodeIndices in the active sector, then reconnect the this.nodeIndices to it. + * + * @private + */ + exports._clearNodeIndexList = function() { + var sector = this._sector(); + this.sectors["active"][sector]["nodeIndices"] = []; + this.nodeIndices = this.sectors["active"][sector]["nodeIndices"]; + }; + + + /** + * Draw the encompassing sector node + * + * @param ctx + * @param sectorType + * @private + */ + exports._drawSectorNodes = function(ctx,sectorType) { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + for (var sector in this.sectors[sectorType]) { + if (this.sectors[sectorType].hasOwnProperty(sector)) { + if (this.sectors[sectorType][sector]["drawingNode"] !== undefined) { + + this._switchToSector(sector,sectorType); + + minY = 1e9; maxY = -1e9; minX = 1e9; maxX = -1e9; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.resize(ctx); + if (minX > node.x - 0.5 * node.width) {minX = node.x - 0.5 * node.width;} + if (maxX < node.x + 0.5 * node.width) {maxX = node.x + 0.5 * node.width;} + if (minY > node.y - 0.5 * node.height) {minY = node.y - 0.5 * node.height;} + if (maxY < node.y + 0.5 * node.height) {maxY = node.y + 0.5 * node.height;} + } + } + node = this.sectors[sectorType][sector]["drawingNode"]; + node.x = 0.5 * (maxX + minX); + node.y = 0.5 * (maxY + minY); + node.width = 2 * (node.x - minX); + node.height = 2 * (node.y - minY); + node.options.radius = Math.sqrt(Math.pow(0.5*node.width,2) + Math.pow(0.5*node.height,2)); + node.setScale(this.scale); + node._drawCircle(ctx); + } + } + } + }; + + exports._drawAllSectorNodes = function(ctx) { + this._drawSectorNodes(ctx,"frozen"); + this._drawSectorNodes(ctx,"active"); + this._loadLatestSector(); + }; + + +/***/ }, +/* 63 */ +/***/ function(module, exports, __webpack_require__) { + + var Node = __webpack_require__(40); + + /** + * This function can be called from the _doInAllSectors function + * + * @param object + * @param overlappingNodes + * @private + */ + exports._getNodesOverlappingWith = function(object, overlappingNodes) { + var nodes = this.nodes; + for (var nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + if (nodes[nodeId].isOverlappingWith(object)) { + overlappingNodes.push(nodeId); + } + } + } + }; + + /** + * retrieve all nodes overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private + */ + exports._getAllNodesOverlappingWith = function (object) { + var overlappingNodes = []; + this._doInAllActiveSectors("_getNodesOverlappingWith",object,overlappingNodes); + return overlappingNodes; + }; + + + /** + * Return a position object in canvasspace from a single point in screenspace + * + * @param pointer + * @returns {{left: number, top: number, right: number, bottom: number}} + * @private + */ + exports._pointerToPositionObject = function(pointer) { + var x = this._XconvertDOMtoCanvas(pointer.x); + var y = this._YconvertDOMtoCanvas(pointer.y); + + return { + left: x, + top: y, + right: x, + bottom: y + }; + }; + + + /** + * Get the top node at the a specific point (like a click) + * + * @param {{x: Number, y: Number}} pointer + * @return {Node | null} node + * @private + */ + exports._getNodeAt = function (pointer) { + // we first check if this is an navigation controls element + var positionObject = this._pointerToPositionObject(pointer); + var overlappingNodes = this._getAllNodesOverlappingWith(positionObject); + + // if there are overlapping nodes, select the last one, this is the + // one which is drawn on top of the others + if (overlappingNodes.length > 0) { + return this.nodes[overlappingNodes[overlappingNodes.length - 1]]; + } + else { + return null; + } + }; + + + /** + * retrieve all edges overlapping with given object, selector is around center + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private + */ + exports._getEdgesOverlappingWith = function (object, overlappingEdges) { + var edges = this.edges; + for (var edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + if (edges[edgeId].isOverlappingWith(object)) { + overlappingEdges.push(edgeId); + } + } + } + }; + + + /** + * retrieve all nodes overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes + * @private + */ + exports._getAllEdgesOverlappingWith = function (object) { + var overlappingEdges = []; + this._doInAllActiveSectors("_getEdgesOverlappingWith",object,overlappingEdges); + return overlappingEdges; + }; + + /** + * Place holder. To implement change the _getNodeAt to a _getObjectAt. Have the _getObjectAt call + * _getNodeAt and _getEdgesAt, then priortize the selection to user preferences. + * + * @param pointer + * @returns {null} + * @private + */ + exports._getEdgeAt = function(pointer) { + var positionObject = this._pointerToPositionObject(pointer); + var overlappingEdges = this._getAllEdgesOverlappingWith(positionObject); + + if (overlappingEdges.length > 0) { + return this.edges[overlappingEdges[overlappingEdges.length - 1]]; + } + else { + return null; + } + }; + + + /** + * Add object to the selection array. + * + * @param obj + * @private + */ + exports._addToSelection = function(obj) { + if (obj instanceof Node) { + this.selectionObj.nodes[obj.id] = obj; + } + else { + this.selectionObj.edges[obj.id] = obj; + } + }; + + /** + * Add object to the selection array. + * + * @param obj + * @private + */ + exports._addToHover = function(obj) { + if (obj instanceof Node) { + this.hoverObj.nodes[obj.id] = obj; + } + else { + this.hoverObj.edges[obj.id] = obj; + } + }; + + + /** + * Remove a single option from selection. + * + * @param {Object} obj + * @private + */ + exports._removeFromSelection = function(obj) { + if (obj instanceof Node) { + delete this.selectionObj.nodes[obj.id]; + } + else { + delete this.selectionObj.edges[obj.id]; + } + }; + + /** + * Unselect all. The selectionObj is useful for this. + * + * @param {Boolean} [doNotTrigger] | ignore trigger + * @private + */ + exports._unselectAll = function(doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + this.selectionObj.nodes[nodeId].unselect(); + } + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + this.selectionObj.edges[edgeId].unselect(); + } + } + + this.selectionObj = {nodes:{},edges:{}}; + + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); + } + }; + + /** + * Unselect all clusters. The selectionObj is useful for this. + * + * @param {Boolean} [doNotTrigger] | ignore trigger + * @private + */ + exports._unselectClusters = function(doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } + + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (this.selectionObj.nodes[nodeId].clusterSize > 1) { + this.selectionObj.nodes[nodeId].unselect(); + this._removeFromSelection(this.selectionObj.nodes[nodeId]); + } + } + } + + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); + } + }; + + + /** + * return the number of selected nodes + * + * @returns {number} + * @private + */ + exports._getSelectedNodeCount = function() { + var count = 0; + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + count += 1; + } + } + return count; + }; + + /** + * return the selected node + * + * @returns {number} + * @private + */ + exports._getSelectedNode = function() { + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + return this.selectionObj.nodes[nodeId]; + } + } + return null; + }; + + /** + * return the selected edge + * + * @returns {number} + * @private + */ + exports._getSelectedEdge = function() { + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + return this.selectionObj.edges[edgeId]; + } + } + return null; + }; + + + /** + * return the number of selected edges + * + * @returns {number} + * @private + */ + exports._getSelectedEdgeCount = function() { + var count = 0; + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + count += 1; + } + } + return count; + }; + + + /** + * return the number of selected objects. + * + * @returns {number} + * @private + */ + exports._getSelectedObjectCount = function() { + var count = 0; + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + count += 1; + } + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + count += 1; + } + } + return count; + }; + + /** + * Check if anything is selected + * + * @returns {boolean} + * @private + */ + exports._selectionIsEmpty = function() { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + return false; + } + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + return false; + } + } + return true; + }; + + + /** + * check if one of the selected nodes is a cluster. + * + * @returns {boolean} + * @private + */ + exports._clusterInSelection = function() { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (this.selectionObj.nodes[nodeId].clusterSize > 1) { + return true; + } + } + } + return false; + }; + + /** + * select the edges connected to the node that is being selected + * + * @param {Node} node + * @private + */ + exports._selectConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.select(); + this._addToSelection(edge); + } + }; + + /** + * select the edges connected to the node that is being selected + * + * @param {Node} node + * @private + */ + exports._hoverConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.hover = true; + this._addToHover(edge); + } + }; + + + /** + * unselect the edges connected to the node that is being selected + * + * @param {Node} node + * @private + */ + exports._unselectConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.unselect(); + this._removeFromSelection(edge); + } + }; + + + + + /** + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection + * + * @param {Node || Edge} object + * @param {Boolean} append + * @param {Boolean} [doNotTrigger] | ignore trigger + * @private + */ + exports._selectObject = function(object, append, doNotTrigger, highlightEdges, overrideSelectable) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } + if (highlightEdges === undefined) { + highlightEdges = true; + } + + if (this._selectionIsEmpty() == false && append == false && this.forceAppendSelection == false) { + this._unselectAll(true); + } + + // selectable allows the object to be selected. Override can be used if needed to bypass this. + if (object.selected == false && (this.constants.selectable == true || overrideSelectable)) { + object.select(); + this._addToSelection(object); + if (object instanceof Node && this.blockConnectingEdgeSelection == false && highlightEdges == true) { + this._selectConnectedEdges(object); + } + } + // do not select the object if selectable is false, only add it to selection to allow drag to work + else if (object.selected == false) { + this._addToSelection(object); + doNotTrigger = true; + } + else { + object.unselect(); + this._removeFromSelection(object); + } + + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); + } + }; + + + /** + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection + * + * @param {Node || Edge} object + * @private + */ + exports._blurObject = function(object) { + if (object.hover == true) { + object.hover = false; + this.emit("blurNode",{node:object.id}); + } + }; + + /** + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection + * + * @param {Node || Edge} object + * @private + */ + exports._hoverObject = function(object) { + if (object.hover == false) { + object.hover = true; + this._addToHover(object); + if (object instanceof Node) { + this.emit("hoverNode",{node:object.id}); + } + } + if (object instanceof Node) { + this._hoverConnectedEdges(object); + } + }; + + + /** + * handles the selection part of the touch, only for navigation controls elements; + * Touch is triggered before tap, also before hold. Hold triggers after a while. + * This is the most responsive solution + * + * @param {Object} pointer + * @private + */ + exports._handleTouch = function(pointer) { + }; + + + /** + * handles the selection part of the tap; + * + * @param {Object} pointer + * @private + */ + exports._handleTap = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectObject(node, false); + } + else { + var edge = this._getEdgeAt(pointer); + if (edge != null) { + this._selectObject(edge, false); + } + else { + this._unselectAll(); + } + } + var properties = this.getSelection(); + properties['pointer'] = { + DOM: {x: pointer.x, y: pointer.y}, + canvas: {x: this._XconvertDOMtoCanvas(pointer.x), y: this._YconvertDOMtoCanvas(pointer.y)} + } + this.emit("click", properties); + this._requestRedraw(); + }; + + + /** + * handles the selection part of the double tap and opens a cluster if needed + * + * @param {Object} pointer + * @private + */ + exports._handleDoubleTap = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null && node !== undefined) { + // we reset the areaCenter here so the opening of the node will occur + this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), + "y" : this._YconvertDOMtoCanvas(pointer.y)}; + this.openCluster(node); + } + var properties = this.getSelection(); + properties['pointer'] = { + DOM: {x: pointer.x, y: pointer.y}, + canvas: {x: this._XconvertDOMtoCanvas(pointer.x), y: this._YconvertDOMtoCanvas(pointer.y)} + } + this.emit("doubleClick", properties); + }; + + + /** + * Handle the onHold selection part + * + * @param pointer + * @private + */ + exports._handleOnHold = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectObject(node,true); + } + else { + var edge = this._getEdgeAt(pointer); + if (edge != null) { + this._selectObject(edge,true); + } + } + this._requestRedraw(); + }; + + + /** + * handle the onRelease event. These functions are here for the navigation controls module + * and data manipulation module. + * + * @private + */ + exports._handleOnRelease = function(pointer) { + this._manipulationReleaseOverload(pointer); + this._navigationReleaseOverload(pointer); + }; + + exports._manipulationReleaseOverload = function (pointer) {}; + exports._navigationReleaseOverload = function (pointer) {}; + + /** + * + * retrieve the currently selected objects + * @return {{nodes: Array., edges: Array.}} selection + */ + exports.getSelection = function() { + var nodeIds = this.getSelectedNodes(); + var edgeIds = this.getSelectedEdges(); + return {nodes:nodeIds, edges:edgeIds}; + }; + + /** + * + * retrieve the currently selected nodes + * @return {String[]} selection An array with the ids of the + * selected nodes. + */ + exports.getSelectedNodes = function() { + var idArray = []; + if (this.constants.selectable == true) { + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + idArray.push(nodeId); + } + } + } + return idArray + }; + + /** + * + * retrieve the currently selected edges + * @return {Array} selection An array with the ids of the + * selected nodes. + */ + exports.getSelectedEdges = function() { + var idArray = []; + if (this.constants.selectable == true) { + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + idArray.push(edgeId); + } + } + } + return idArray; + }; + + + /** + * select zero or more nodes DEPRICATED + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. + */ + exports.setSelection = function() { + console.log("setSelection is deprecated. Please use selectNodes instead.") + }; + + + /** + * select zero or more nodes with the option to highlight edges + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. + * @param {boolean} [highlightEdges] + */ + exports.selectNodes = function(selection, highlightEdges) { + var i, iMax, id; + + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; + + // first unselect any selected node + this._unselectAll(true); + + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; + + var node = this.nodes[id]; + if (!node) { + throw new RangeError('Node with id "' + id + '" not found'); + } + this._selectObject(node,true,true,highlightEdges,true); + } + this.redraw(); + }; + + + /** + * select zero or more edges + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. + */ + exports.selectEdges = function(selection) { + var i, iMax, id; + + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; + + // first unselect any selected node + this._unselectAll(true); + + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; + + var edge = this.edges[id]; + if (!edge) { + throw new RangeError('Edge with id "' + id + '" not found'); + } + this._selectObject(edge,true,true,false,true); + } + this.redraw(); + }; + + /** + * Validate the selection: remove ids of nodes which no longer exist + * @private + */ + exports._updateSelection = function () { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (!this.nodes.hasOwnProperty(nodeId)) { + delete this.selectionObj.nodes[nodeId]; + } + } + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + if (!this.edges.hasOwnProperty(edgeId)) { + delete this.selectionObj.edges[edgeId]; + } + } + } + }; + + +/***/ }, +/* 64 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Node = __webpack_require__(40); + var Edge = __webpack_require__(37); + var Hammer = __webpack_require__(45); + + /** + * clears the toolbar div element of children + * + * @private + */ + exports._clearManipulatorBar = function() { + this._recursiveDOMDelete(this.manipulationDiv); + this.manipulationDOM = {}; + + this._cleanManipulatorHammers(); + + this._manipulationReleaseOverload = function () {}; + delete this.sectors['support']['nodes']['targetNode']; + delete this.sectors['support']['nodes']['targetViaNode']; + this.controlNodesActive = false; + this.freezeSimulation(false); + }; + + + exports._cleanManipulatorHammers = function() { + // clean hammer bindings + if (this.manipulationHammers.length != 0) { + for (var i = 0; i < this.manipulationHammers.length; i++) { + this.manipulationHammers[i].dispose(); + } + this.manipulationHammers = []; + } + }; + + /** + * Manipulation UI temporarily overloads certain functions to extend or replace them. To be able to restore + * these functions to their original functionality, we saved them in this.cachedFunctions. + * This function restores these functions to their original function. + * + * @private + */ + exports._restoreOverloadedFunctions = function() { + for (var functionName in this.cachedFunctions) { + if (this.cachedFunctions.hasOwnProperty(functionName)) { + this[functionName] = this.cachedFunctions[functionName]; + delete this.cachedFunctions[functionName]; + } + } + }; + + /** + * Enable or disable edit-mode. + * + * @private + */ + exports._toggleEditMode = function() { + this.editMode = !this.editMode; + var toolbar = this.manipulationDiv; + var closeDiv = this.closeDiv; + var editModeDiv = this.editModeDiv; + if (this.editMode == true) { + toolbar.style.display="block"; + closeDiv.style.display="block"; + editModeDiv.style.display="none"; + this._bindHammerToDiv(closeDiv,'_toggleEditMode'); + } + else { + toolbar.style.display="none"; + closeDiv.style.display="none"; + editModeDiv.style.display="block"; + } + this._createManipulatorBar() + }; + + /** + * main function, creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar. + * + * @private + */ + exports._createManipulatorBar = function() { + // remove bound functions + if (this.boundFunction) { + this.off('select', this.boundFunction); + } + + this._cleanManipulatorHammers(); + + var locale = this.constants.locales[this.constants.locale]; + + if (this.edgeBeingEdited !== undefined) { + this.edgeBeingEdited._disableControlNodes(); + this.edgeBeingEdited = undefined; + this.selectedControlNode = null; + this.controlNodesActive = false; + this._redraw(); + } + + // restore overloaded functions + this._restoreOverloadedFunctions(); + + // resume calculation + this.freezeSimulation(false); + + // reset global variables + this.blockConnectingEdgeSelection = false; + this.forceAppendSelection = false; + this.manipulationDOM = {}; + + if (this.editMode == true) { + while (this.manipulationDiv.hasChildNodes()) { + this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); + } + + this.manipulationDOM['addNodeSpan'] = document.createElement('div'); + this.manipulationDOM['addNodeSpan'].className = 'network-manipulationUI add'; + + this.manipulationDOM['addNodeLabelSpan'] = document.createElement('div'); + this.manipulationDOM['addNodeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['addNodeLabelSpan'].innerHTML = locale['addNode']; + this.manipulationDOM['addNodeSpan'].appendChild(this.manipulationDOM['addNodeLabelSpan']); + + this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; + + this.manipulationDOM['addEdgeSpan'] = document.createElement('div'); + this.manipulationDOM['addEdgeSpan'].className = 'network-manipulationUI connect'; + this.manipulationDOM['addEdgeLabelSpan'] = document.createElement('div'); + this.manipulationDOM['addEdgeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['addEdgeLabelSpan'].innerHTML = locale['addEdge']; + this.manipulationDOM['addEdgeSpan'].appendChild(this.manipulationDOM['addEdgeLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['addNodeSpan']); + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); + this.manipulationDiv.appendChild(this.manipulationDOM['addEdgeSpan']); + + if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { + this.manipulationDOM['seperatorLineDiv2'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv2'].className = 'network-seperatorLine'; + + this.manipulationDOM['editNodeSpan'] = document.createElement('div'); + this.manipulationDOM['editNodeSpan'].className = 'network-manipulationUI edit'; + this.manipulationDOM['editNodeLabelSpan'] = document.createElement('div'); + this.manipulationDOM['editNodeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['editNodeLabelSpan'].innerHTML = locale['editNode']; + this.manipulationDOM['editNodeSpan'].appendChild(this.manipulationDOM['editNodeLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv2']); + this.manipulationDiv.appendChild(this.manipulationDOM['editNodeSpan']); + } + else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { + this.manipulationDOM['seperatorLineDiv3'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv3'].className = 'network-seperatorLine'; + + this.manipulationDOM['editEdgeSpan'] = document.createElement('div'); + this.manipulationDOM['editEdgeSpan'].className = 'network-manipulationUI edit'; + this.manipulationDOM['editEdgeLabelSpan'] = document.createElement('div'); + this.manipulationDOM['editEdgeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['editEdgeLabelSpan'].innerHTML = locale['editEdge']; + this.manipulationDOM['editEdgeSpan'].appendChild(this.manipulationDOM['editEdgeLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv3']); + this.manipulationDiv.appendChild(this.manipulationDOM['editEdgeSpan']); + } + if (this._selectionIsEmpty() == false) { + this.manipulationDOM['seperatorLineDiv4'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv4'].className = 'network-seperatorLine'; + + this.manipulationDOM['deleteSpan'] = document.createElement('div'); + this.manipulationDOM['deleteSpan'].className = 'network-manipulationUI delete'; + this.manipulationDOM['deleteLabelSpan'] = document.createElement('div'); + this.manipulationDOM['deleteLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['deleteLabelSpan'].innerHTML = locale['del']; + this.manipulationDOM['deleteSpan'].appendChild(this.manipulationDOM['deleteLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv4']); + this.manipulationDiv.appendChild(this.manipulationDOM['deleteSpan']); + } + + // bind the icons + this._bindHammerToDiv(this.manipulationDOM['addNodeSpan'],'_createAddNodeToolbar'); + this._bindHammerToDiv(this.manipulationDOM['addEdgeSpan'],'_createAddEdgeToolbar'); + this._bindHammerToDiv(this.closeDiv,'_toggleEditMode'); + + if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { + this._bindHammerToDiv(this.manipulationDOM['editNodeSpan'],'_editNode'); + } + else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { + this._bindHammerToDiv(this.manipulationDOM['editEdgeSpan'],'_createEditEdgeToolbar'); + } + if (this._selectionIsEmpty() == false) { + this._bindHammerToDiv(this.manipulationDOM['deleteSpan'],'_deleteSelected'); + } + + var me = this; + this.boundFunction = me._createManipulatorBar; + this.on('select', this.boundFunction); + } + else { + while (this.editModeDiv.hasChildNodes()) { + this.editModeDiv.removeChild(this.editModeDiv.firstChild); + } + + this.manipulationDOM['editModeSpan'] = document.createElement('div'); + this.manipulationDOM['editModeSpan'].className = 'network-manipulationUI edit editmode'; + this.manipulationDOM['editModeLabelSpan'] = document.createElement('div'); + this.manipulationDOM['editModeLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['editModeLabelSpan'].innerHTML = locale['edit']; + this.manipulationDOM['editModeSpan'].appendChild(this.manipulationDOM['editModeLabelSpan']); + + this.editModeDiv.appendChild(this.manipulationDOM['editModeSpan']); + + this._bindHammerToDiv(this.manipulationDOM['editModeSpan'],'_toggleEditMode'); + } + }; + + + exports._bindHammerToDiv = function(domElement, funct) { + var hammer = Hammer(domElement, {prevent_default: true}); + hammer.on('touch', this[funct].bind(this)); + this.manipulationHammers.push(hammer); + } + + + /** + * Create the toolbar for adding Nodes + * + * @private + */ + exports._createAddNodeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + if (this.boundFunction) { + this.off('select', this.boundFunction); + } + + var locale = this.constants.locales[this.constants.locale]; + + this.manipulationDOM = {}; + this.manipulationDOM['backSpan'] = document.createElement('div'); + this.manipulationDOM['backSpan'].className = 'network-manipulationUI back'; + this.manipulationDOM['backLabelSpan'] = document.createElement('div'); + this.manipulationDOM['backLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['backLabelSpan'].innerHTML = locale['back']; + this.manipulationDOM['backSpan'].appendChild(this.manipulationDOM['backLabelSpan']); + + this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; + + this.manipulationDOM['descriptionSpan'] = document.createElement('div'); + this.manipulationDOM['descriptionSpan'].className = 'network-manipulationUI none'; + this.manipulationDOM['descriptionLabelSpan'] = document.createElement('div'); + this.manipulationDOM['descriptionLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['descriptionLabelSpan'].innerHTML = locale['addDescription']; + this.manipulationDOM['descriptionSpan'].appendChild(this.manipulationDOM['descriptionLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['backSpan']); + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); + this.manipulationDiv.appendChild(this.manipulationDOM['descriptionSpan']); + + // bind the icon + this._bindHammerToDiv(this.manipulationDOM['backSpan'],'_createManipulatorBar'); + + // we use the boundFunction so we can reference it when we unbind it from the "select" event. + var me = this; + this.boundFunction = me._addNode; + this.on('select', this.boundFunction); + }; + + + /** + * create the toolbar to connect nodes + * + * @private + */ + exports._createAddEdgeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + this._unselectAll(true); + this.freezeSimulation(true); + + if (this.boundFunction) { + this.off('select', this.boundFunction); + } + + var locale = this.constants.locales[this.constants.locale]; + + this._unselectAll(); + this.forceAppendSelection = false; + this.blockConnectingEdgeSelection = true; + + this.manipulationDOM = {}; + this.manipulationDOM['backSpan'] = document.createElement('div'); + this.manipulationDOM['backSpan'].className = 'network-manipulationUI back'; + this.manipulationDOM['backLabelSpan'] = document.createElement('div'); + this.manipulationDOM['backLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['backLabelSpan'].innerHTML = locale['back']; + this.manipulationDOM['backSpan'].appendChild(this.manipulationDOM['backLabelSpan']); + + this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; + + this.manipulationDOM['descriptionSpan'] = document.createElement('div'); + this.manipulationDOM['descriptionSpan'].className = 'network-manipulationUI none'; + this.manipulationDOM['descriptionLabelSpan'] = document.createElement('div'); + this.manipulationDOM['descriptionLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['descriptionLabelSpan'].innerHTML = locale['edgeDescription']; + this.manipulationDOM['descriptionSpan'].appendChild(this.manipulationDOM['descriptionLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['backSpan']); + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); + this.manipulationDiv.appendChild(this.manipulationDOM['descriptionSpan']); + + // bind the icon + this._bindHammerToDiv(this.manipulationDOM['backSpan'],'_createManipulatorBar'); + + // we use the boundFunction so we can reference it when we unbind it from the "select" event. + var me = this; + this.boundFunction = me._handleConnect; + this.on('select', this.boundFunction); + + // temporarily overload functions + this.cachedFunctions["_handleTouch"] = this._handleTouch; + this.cachedFunctions["_manipulationReleaseOverload"] = this._manipulationReleaseOverload; + this.cachedFunctions["_handleDragStart"] = this._handleDragStart; + this.cachedFunctions["_handleDragEnd"] = this._handleDragEnd; + this.cachedFunctions["_handleOnHold"] = this._handleOnHold; + this._handleTouch = this._handleConnect; + this._manipulationReleaseOverload = function () {}; + this._handleOnHold = function () {}; + this._handleDragStart = function () {}; + this._handleDragEnd = this._finishConnect; + + // redraw to show the unselect + this._redraw(); + }; + + /** + * create the toolbar to edit edges + * + * @private + */ + exports._createEditEdgeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + this.controlNodesActive = true; + + if (this.boundFunction) { + this.off('select', this.boundFunction); + } + + this.edgeBeingEdited = this._getSelectedEdge(); + this.edgeBeingEdited._enableControlNodes(); + + var locale = this.constants.locales[this.constants.locale]; + + this.manipulationDOM = {}; + this.manipulationDOM['backSpan'] = document.createElement('div'); + this.manipulationDOM['backSpan'].className = 'network-manipulationUI back'; + this.manipulationDOM['backLabelSpan'] = document.createElement('div'); + this.manipulationDOM['backLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['backLabelSpan'].innerHTML = locale['back']; + this.manipulationDOM['backSpan'].appendChild(this.manipulationDOM['backLabelSpan']); + + this.manipulationDOM['seperatorLineDiv1'] = document.createElement('div'); + this.manipulationDOM['seperatorLineDiv1'].className = 'network-seperatorLine'; + + this.manipulationDOM['descriptionSpan'] = document.createElement('div'); + this.manipulationDOM['descriptionSpan'].className = 'network-manipulationUI none'; + this.manipulationDOM['descriptionLabelSpan'] = document.createElement('div'); + this.manipulationDOM['descriptionLabelSpan'].className = 'network-manipulationLabel'; + this.manipulationDOM['descriptionLabelSpan'].innerHTML = locale['editEdgeDescription']; + this.manipulationDOM['descriptionSpan'].appendChild(this.manipulationDOM['descriptionLabelSpan']); + + this.manipulationDiv.appendChild(this.manipulationDOM['backSpan']); + this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv1']); + this.manipulationDiv.appendChild(this.manipulationDOM['descriptionSpan']); + + // bind the icon + this._bindHammerToDiv(this.manipulationDOM['backSpan'],'_createManipulatorBar'); + + // temporarily overload functions + this.cachedFunctions["_handleTouch"] = this._handleTouch; + this.cachedFunctions["_manipulationReleaseOverload"] = this._manipulationReleaseOverload; + this.cachedFunctions["_handleTap"] = this._handleTap; + this.cachedFunctions["_handleDragStart"] = this._handleDragStart; + this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; + this._handleTouch = this._selectControlNode; + this._handleTap = function () {}; + this._handleOnDrag = this._controlNodeDrag; + this._handleDragStart = function () {} + this._manipulationReleaseOverload = this._releaseControlNode; + + // redraw to show the unselect + this._redraw(); + }; + + + /** + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. + * + * @private + */ + exports._selectControlNode = function(pointer) { + this.edgeBeingEdited.controlNodes.from.unselect(); + this.edgeBeingEdited.controlNodes.to.unselect(); + this.selectedControlNode = this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(pointer.x),this._YconvertDOMtoCanvas(pointer.y)); + if (this.selectedControlNode !== null) { + this.selectedControlNode.select(); + this.freezeSimulation(true); + } + this._redraw(); + }; + + + /** + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. + * + * @private + */ + exports._controlNodeDrag = function(event) { + var pointer = this._getPointer(event.gesture.center); + if (this.selectedControlNode !== null && this.selectedControlNode !== undefined) { + this.selectedControlNode.x = this._XconvertDOMtoCanvas(pointer.x); + this.selectedControlNode.y = this._YconvertDOMtoCanvas(pointer.y); + } + this._redraw(); + }; + + + /** + * + * @param pointer + * @private + */ + exports._releaseControlNode = function(pointer) { + var newNode = this._getNodeAt(pointer); + if (newNode !== null) { + if (this.edgeBeingEdited.controlNodes.from.selected == true) { + this.edgeBeingEdited._restoreControlNodes(); + this._editEdge(newNode.id, this.edgeBeingEdited.to.id); + this.edgeBeingEdited.controlNodes.from.unselect(); + } + if (this.edgeBeingEdited.controlNodes.to.selected == true) { + this.edgeBeingEdited._restoreControlNodes(); + this._editEdge(this.edgeBeingEdited.from.id, newNode.id); + this.edgeBeingEdited.controlNodes.to.unselect(); + } + } + else { + this.edgeBeingEdited._restoreControlNodes(); + } + this.freezeSimulation(false); + this._redraw(); + }; + + /** + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. + * + * @private + */ + exports._handleConnect = function(pointer) { + if (this._getSelectedNodeCount() == 0) { + var node = this._getNodeAt(pointer); + + if (node != null) { + if (node.clusterSize > 1) { + alert(this.constants.locales[this.constants.locale]['createEdgeError']) + } + else { + this._selectObject(node,false); + var supportNodes = this.sectors['support']['nodes']; + + // create a node the temporary line can look at + supportNodes['targetNode'] = new Node({id:'targetNode'},{},{},this.constants); + var targetNode = supportNodes['targetNode']; + targetNode.x = node.x; + targetNode.y = node.y; + + // create a temporary edge + this.edges['connectionEdge'] = new Edge({id:"connectionEdge",from:node.id,to:targetNode.id}, this, this.constants); + var connectionEdge = this.edges['connectionEdge']; + connectionEdge.from = node; + connectionEdge.connected = true; + connectionEdge.options.smoothCurves = {enabled: true, + dynamic: false, + type: "continuous", + roundness: 0.5 + }; + connectionEdge.selected = true; + connectionEdge.to = targetNode; + + this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; + var me = this; + this._handleOnDrag = function(event) { + var pointer = this._getPointer(event.gesture.center); + var connectionEdge = me.edges['connectionEdge']; + connectionEdge.to.x = me._XconvertDOMtoCanvas(pointer.x); + connectionEdge.to.y = me._YconvertDOMtoCanvas(pointer.y); + me._redraw(); + }; + + this.moving = true; + this.start(); + } + } + } + }; + + exports._finishConnect = function(event) { + if (this._getSelectedNodeCount() == 1) { + var pointer = this._getPointer(event.gesture.center); + // restore the drag function + this._handleOnDrag = this.cachedFunctions["_handleOnDrag"]; + delete this.cachedFunctions["_handleOnDrag"]; + + // remember the edge id + var connectFromId = this.edges['connectionEdge'].fromId; + + // remove the temporary nodes and edge + delete this.edges['connectionEdge']; + delete this.sectors['support']['nodes']['targetNode']; + delete this.sectors['support']['nodes']['targetViaNode']; + + var node = this._getNodeAt(pointer); + if (node != null) { + if (node.clusterSize > 1) { + alert(this.constants.locales[this.constants.locale]["createEdgeError"]) + } + else { + this._createEdge(connectFromId,node.id); + this._createManipulatorBar(); + } + } + this._unselectAll(); + } + }; + + + /** + * Adds a node on the specified location + */ + exports._addNode = function() { + if (this._selectionIsEmpty() && this.editMode == true) { + var positionObject = this._pointerToPositionObject(this.pointerPosition); + var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMoveX:true,allowedToMoveY:true}; + if (this.triggerFunctions.add) { + if (this.triggerFunctions.add.length == 2) { + var me = this; + this.triggerFunctions.add(defaultData, function(finalizedData) { + me.nodesData.add(finalizedData); + me._createManipulatorBar(); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for add does not support two arguments (data,callback)'); + this._createManipulatorBar(); + this.moving = true; + this.start(); + } + } + else { + this.nodesData.add(defaultData); + this._createManipulatorBar(); + this.moving = true; + this.start(); + } + } + }; + + + /** + * connect two nodes with a new edge. + * + * @private + */ + exports._createEdge = function(sourceNodeId,targetNodeId) { + if (this.editMode == true) { + var defaultData = {from:sourceNodeId, to:targetNodeId}; + if (this.triggerFunctions.connect) { + if (this.triggerFunctions.connect.length == 2) { + var me = this; + this.triggerFunctions.connect(defaultData, function(finalizedData) { + me.edgesData.add(finalizedData); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for connect does not support two arguments (data,callback)'); + this.moving = true; + this.start(); + } + } + else { + this.edgesData.add(defaultData); + this.moving = true; + this.start(); + } + } + }; + + /** + * connect two nodes with a new edge. + * + * @private + */ + exports._editEdge = function(sourceNodeId,targetNodeId) { + if (this.editMode == true) { + var defaultData = {id: this.edgeBeingEdited.id, from:sourceNodeId, to:targetNodeId}; + if (this.triggerFunctions.editEdge) { + if (this.triggerFunctions.editEdge.length == 2) { + var me = this; + this.triggerFunctions.editEdge(defaultData, function(finalizedData) { + me.edgesData.update(finalizedData); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for edit does not support two arguments (data, callback)'); + this.moving = true; + this.start(); + } + } + else { + this.edgesData.update(defaultData); + this.moving = true; + this.start(); + } + } + }; + + /** + * Create the toolbar to edit the selected node. The label and the color can be changed. Other colors are derived from the chosen color. + * + * @private + */ + exports._editNode = function() { + if (this.triggerFunctions.edit && this.editMode == true) { + var node = this._getSelectedNode(); + var data = {id:node.id, + label: node.label, + group: node.options.group, + shape: node.options.shape, + color: { + background:node.options.color.background, + border:node.options.color.border, + highlight: { + background:node.options.color.highlight.background, + border:node.options.color.highlight.border + } + }}; + if (this.triggerFunctions.edit.length == 2) { + var me = this; + this.triggerFunctions.edit(data, function (finalizedData) { + me.nodesData.update(finalizedData); + me._createManipulatorBar(); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for edit does not support two arguments (data, callback)'); + } + } + else { + throw new Error('No edit function has been bound to this button'); + } + }; + + + + + /** + * delete everything in the selection + * + * @private + */ + exports._deleteSelected = function() { + if (!this._selectionIsEmpty() && this.editMode == true) { + if (!this._clusterInSelection()) { + var selectedNodes = this.getSelectedNodes(); + var selectedEdges = this.getSelectedEdges(); + if (this.triggerFunctions.del) { + var me = this; + var data = {nodes: selectedNodes, edges: selectedEdges}; + if (this.triggerFunctions.del.length == 2) { + this.triggerFunctions.del(data, function (finalizedData) { + me.edgesData.remove(finalizedData.edges); + me.nodesData.remove(finalizedData.nodes); + me._unselectAll(); + me.moving = true; + me.start(); + }); + } + else { + throw new Error('The function for delete does not support two arguments (data, callback)') + } + } + else { + this.edgesData.remove(selectedEdges); + this.nodesData.remove(selectedNodes); + this._unselectAll(); + this.moving = true; + this.start(); + } + } + else { + alert(this.constants.locales[this.constants.locale]["deleteClusterError"]); + } + } + }; + + +/***/ }, +/* 65 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Hammer = __webpack_require__(45); + + exports._cleanNavigation = function() { + // clean hammer bindings + if (this.navigationHammers.length != 0) { + for (var i = 0; i < this.navigationHammers.length; i++) { + this.navigationHammers[i].dispose(); + } + this.navigationHammers = []; + } + + this._navigationReleaseOverload = function () {}; + + // clean up previous navigation items + if (this.navigationDOM && this.navigationDOM['wrapper'] && this.navigationDOM['wrapper'].parentNode) { + this.navigationDOM['wrapper'].parentNode.removeChild(this.navigationDOM['wrapper']); + } + }; + + /** + * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation + * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent + * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false. + * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas. + * + * @private + */ + exports._loadNavigationElements = function() { + this._cleanNavigation(); + + this.navigationDOM = {}; + var navigationDivs = ['up','down','left','right','zoomIn','zoomOut','zoomExtends']; + var navigationDivActions = ['_moveUp','_moveDown','_moveLeft','_moveRight','_zoomIn','_zoomOut','_zoomExtent']; + + this.navigationDOM['wrapper'] = document.createElement('div'); + this.frame.appendChild(this.navigationDOM['wrapper']); + + for (var i = 0; i < navigationDivs.length; i++) { + this.navigationDOM[navigationDivs[i]] = document.createElement('div'); + this.navigationDOM[navigationDivs[i]].className = 'network-navigation ' + navigationDivs[i]; + this.navigationDOM['wrapper'].appendChild(this.navigationDOM[navigationDivs[i]]); + + var hammer = Hammer(this.navigationDOM[navigationDivs[i]], {prevent_default: true}); + hammer.on('touch', this[navigationDivActions[i]].bind(this)); + this.navigationHammers.push(hammer); + } + + this._navigationReleaseOverload = this._stopMovement; + + }; + + + /** + * this stops all movement induced by the navigation buttons + * + * @private + */ + exports._zoomExtent = function(event) { + this.zoomExtent({duration:700}); + event.stopPropagation(); + }; + + /** + * this stops all movement induced by the navigation buttons + * + * @private + */ + exports._stopMovement = function() { + this._xStopMoving(); + this._yStopMoving(); + this._stopZoom(); + }; + + + /** + * move the screen up + * By using the increments, instead of adding a fixed number to the translation, we keep fluent and + * instant movement. The onKeypress event triggers immediately, then pauses, then triggers frequently + * To avoid this behaviour, we do the translation in the start loop. + * + * @private + */ + exports._moveUp = function(event) { + this.yIncrement = this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; + + + /** + * move the screen down + * @private + */ + exports._moveDown = function(event) { + this.yIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; + + + /** + * move the screen left + * @private + */ + exports._moveLeft = function(event) { + this.xIncrement = this.constants.keyboard.speed.x; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; + + + /** + * move the screen right + * @private + */ + exports._moveRight = function(event) { + this.xIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; + + + /** + * Zoom in, using the same method as the movement. + * @private + */ + exports._zoomIn = function(event) { + this.zoomIncrement = this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; + + + /** + * Zoom out + * @private + */ + exports._zoomOut = function(event) { + this.zoomIncrement = -this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + event.preventDefault(); + }; + + + /** + * Stop zooming and unhighlight the zoom controls + * @private + */ + exports._stopZoom = function(event) { + this.zoomIncrement = 0; + event && event.preventDefault(); + }; + + + /** + * Stop moving in the Y direction and unHighlight the up and down + * @private + */ + exports._yStopMoving = function(event) { + this.yIncrement = 0; + event && event.preventDefault(); + }; + + + /** + * Stop moving in the X direction and unHighlight left and right. + * @private + */ + exports._xStopMoving = function(event) { + this.xIncrement = 0; + event && event.preventDefault(); + }; + + +/***/ }, +/* 66 */ +/***/ function(module, exports, __webpack_require__) { + + exports._resetLevels = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.preassignedLevel == false) { + node.level = -1; + node.hierarchyEnumerated = false; + } + } + } + }; + + /** + * This is the main function to layout the nodes in a hierarchical way. + * It checks if the node details are supplied correctly + * + * @private + */ + exports._setupHierarchicalLayout = function() { + if (this.constants.hierarchicalLayout.enabled == true && this.nodeIndices.length > 0) { + // get the size of the largest hubs and check if the user has defined a level for a node. + var hubsize = 0; + var node, nodeId; + var definedLevel = false; + var undefinedLevel = false; + + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.level != -1) { + definedLevel = true; + } + else { + undefinedLevel = true; + } + if (hubsize < node.edges.length) { + hubsize = node.edges.length; + } + } + } + + // if the user defined some levels but not all, alert and run without hierarchical layout + if (undefinedLevel == true && definedLevel == true) { + throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes."); + this.zoomExtent({duration:0},true,this.constants.clustering.enabled); + if (!this.constants.clustering.enabled) { + this.start(); + } + } + else { + // setup the system to use hierarchical method. + this._changeConstants(); + + // define levels if undefined by the users. Based on hubsize + if (undefinedLevel == true) { + if (this.constants.hierarchicalLayout.layout == "hubsize") { + this._determineLevels(hubsize); + } + else { + this._determineLevelsDirected(false); + } + + } + // check the distribution of the nodes per level. + var distribution = this._getDistribution(); + + // place the nodes on the canvas. This also stablilizes the system. + this._placeNodesByHierarchy(distribution); + + // start the simulation. + this.start(); + } + } + }; + + + /** + * This function places the nodes on the canvas based on the hierarchial distribution. + * + * @param {Object} distribution | obtained by the function this._getDistribution() + * @private + */ + exports._placeNodesByHierarchy = function(distribution) { + var nodeId, node; + + // start placing all the level 0 nodes first. Then recursively position their branches. + for (var level in distribution) { + if (distribution.hasOwnProperty(level)) { + + for (nodeId in distribution[level].nodes) { + if (distribution[level].nodes.hasOwnProperty(nodeId)) { + node = distribution[level].nodes[nodeId]; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + if (node.xFixed) { + node.x = distribution[level].minPos; + node.xFixed = false; + + distribution[level].minPos += distribution[level].nodeSpacing; + } + } + else { + if (node.yFixed) { + node.y = distribution[level].minPos; + node.yFixed = false; + + distribution[level].minPos += distribution[level].nodeSpacing; + } + } + this._placeBranchNodes(node.edges,node.id,distribution,node.level); + } + } + } + } + + // stabilize the system after positioning. This function calls zoomExtent. + this._stabilize(); + }; + + + /** + * This function get the distribution of levels based on hubsize + * + * @returns {Object} + * @private + */ + exports._getDistribution = function() { + var distribution = {}; + var nodeId, node, level; + + // we fix Y because the hierarchy is vertical, we fix X so we do not give a node an x position for a second time. + // the fix of X is removed after the x value has been set. + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.xFixed = true; + node.yFixed = true; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + node.y = this.constants.hierarchicalLayout.levelSeparation*node.level; + } + else { + node.x = this.constants.hierarchicalLayout.levelSeparation*node.level; + } + if (distribution[node.level] === undefined) { + distribution[node.level] = {amount: 0, nodes: {}, minPos:0, nodeSpacing:0}; + } + distribution[node.level].amount += 1; + distribution[node.level].nodes[nodeId] = node; + } + } + + // determine the largest amount of nodes of all levels + var maxCount = 0; + for (level in distribution) { + if (distribution.hasOwnProperty(level)) { + if (maxCount < distribution[level].amount) { + maxCount = distribution[level].amount; + } + } + } + + // set the initial position and spacing of each nodes accordingly + for (level in distribution) { + if (distribution.hasOwnProperty(level)) { + distribution[level].nodeSpacing = (maxCount + 1) * this.constants.hierarchicalLayout.nodeSpacing; + distribution[level].nodeSpacing /= (distribution[level].amount + 1); + distribution[level].minPos = distribution[level].nodeSpacing - (0.5 * (distribution[level].amount + 1) * distribution[level].nodeSpacing); + } + } + + return distribution; + }; + + + /** + * this function allocates nodes in levels based on the recursive branching from the largest hubs. + * + * @param hubsize + * @private + */ + exports._determineLevels = function(hubsize) { + var nodeId, node; + + // determine hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.edges.length == hubsize) { + node.level = 0; + } + } + } + + // branch from hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.level == 0) { + this._setLevel(1,node.edges,node.id); + } + } + } + }; + + + + /** + * this function allocates nodes in levels based on the direction of the edges + * + * @param hubsize + * @private + */ + exports._determineLevelsDirected = function() { + var nodeId, node, firstNode; + var minLevel = 10000; + + // set first node to source + firstNode = this.nodes[this.nodeIndices[0]]; + firstNode.level = minLevel; + this._setLevelDirected(minLevel,firstNode.edges,firstNode.id); + + // get the minimum level + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + minLevel = node.level < minLevel ? node.level : minLevel; + } + } + + // subtract the minimum from the set so we have a range starting from 0 + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.level -= minLevel; + } + } + }; + + + /** + * Since hierarchical layout does not support: + * - smooth curves (based on the physics), + * - clustering (based on dynamic node counts) + * + * We disable both features so there will be no problems. + * + * @private + */ + exports._changeConstants = function() { + this.constants.clustering.enabled = false; + this.constants.physics.barnesHut.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this._loadSelectedForceSolver(); + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.dynamic = false; + } + this._configureSmoothCurves(); + + var config = this.constants.hierarchicalLayout; + config.levelSeparation = Math.abs(config.levelSeparation); + if (config.direction == "RL" || config.direction == "DU") { + config.levelSeparation *= -1; + } + + if (config.direction == "RL" || config.direction == "LR") { + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.type = "vertical"; + } + } + else { + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.type = "horizontal"; + } + } + }; + + + /** + * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes + * on a X position that ensures there will be no overlap. + * + * @param edges + * @param parentId + * @param distribution + * @param parentLevel + * @private + */ + exports._placeBranchNodes = function(edges, parentId, distribution, parentLevel) { + for (var i = 0; i < edges.length; i++) { + var childNode = null; + if (edges[i].toId == parentId) { + childNode = edges[i].from; + } + else { + childNode = edges[i].to; + } + + // if a node is conneceted to another node on the same level (or higher (means lower level))!, this is not handled here. + var nodeMoved = false; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + if (childNode.xFixed && childNode.level > parentLevel) { + childNode.xFixed = false; + childNode.x = distribution[childNode.level].minPos; + nodeMoved = true; + } + } + else { + if (childNode.yFixed && childNode.level > parentLevel) { + childNode.yFixed = false; + childNode.y = distribution[childNode.level].minPos; + nodeMoved = true; + } + } + + if (nodeMoved == true) { + distribution[childNode.level].minPos += distribution[childNode.level].nodeSpacing; + if (childNode.edges.length > 1) { + this._placeBranchNodes(childNode.edges,childNode.id,distribution,childNode.level); + } + } + } + }; + + + /** + * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. + * + * @param level + * @param edges + * @param parentId + * @private + */ + exports._setLevel = function(level, edges, parentId) { + for (var i = 0; i < edges.length; i++) { + var childNode = null; + if (edges[i].toId == parentId) { + childNode = edges[i].from; + } + else { + childNode = edges[i].to; + } + if (childNode.level == -1 || childNode.level > level) { + childNode.level = level; + if (childNode.edges.length > 1) { + this._setLevel(level+1, childNode.edges, childNode.id); + } + } + } + }; + + + /** + * this function is called recursively to enumerate the branched of the first node and give each node a level based on edge direction + * + * @param level + * @param edges + * @param parentId + * @private + */ + exports._setLevelDirected = function(level, edges, parentId) { + this.nodes[parentId].hierarchyEnumerated = true; + var childNode, direction; + for (var i = 0; i < edges.length; i++) { + direction = 1; + if (edges[i].toId == parentId) { + childNode = edges[i].from; + direction = -1; + } + else { + childNode = edges[i].to; + } + if (childNode.level == -1) { + childNode.level = level + direction; + } + } + + for (var i = 0; i < edges.length; i++) { + if (edges[i].toId == parentId) {childNode = edges[i].from;} + else {childNode = edges[i].to;} + + if (childNode.edges.length > 1 && childNode.hierarchyEnumerated === false) { + this._setLevelDirected(childNode.level, childNode.edges, childNode.id); + } + } + }; + + + /** + * Unfix nodes + * + * @private + */ + exports._restoreNodes = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.nodes[nodeId].xFixed = false; + this.nodes[nodeId].yFixed = false; + } + } + }; + + +/***/ }, +/* 67 */ +/***/ function(module, exports, __webpack_require__) { + + function webpackContext(req) { + throw new Error("Cannot find module '" + req + "'."); + } + webpackContext.keys = function() { return []; }; + webpackContext.resolve = webpackContext; + module.exports = webpackContext; + webpackContext.id = 67; + + +/***/ }, +/* 68 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Calculate the forces the nodes apply on each other based on a repulsion field. + * This field is linearly approximated. + * + * @private + */ + exports._calculateNodeForces = function () { + var dx, dy, angle, distance, fx, fy, combinedClusterSize, + repulsingForce, node1, node2, i, j; + + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; + + // approximation constants + var a_base = -2 / 3; + var b = 4 / 3; + + // repulsing forces between nodes + var nodeDistance = this.constants.physics.repulsion.nodeDistance; + var minimumDistance = nodeDistance; + + // we loop from i over all but the last entree in the array + // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j + for (i = 0; i < nodeIndices.length - 1; i++) { + node1 = nodes[nodeIndices[i]]; + for (j = i + 1; j < nodeIndices.length; j++) { + node2 = nodes[nodeIndices[j]]; + combinedClusterSize = node1.clusterSize + node2.clusterSize - 2; + + dx = node2.x - node1.x; + dy = node2.y - node1.y; + distance = Math.sqrt(dx * dx + dy * dy); + + // same condition as BarnesHut, making sure nodes are never 100% overlapping. + if (distance == 0) { + distance = 0.1*Math.random(); + dx = distance; + } + + minimumDistance = (combinedClusterSize == 0) ? nodeDistance : (nodeDistance * (1 + combinedClusterSize * this.constants.clustering.distanceAmplification)); + var a = a_base / minimumDistance; + if (distance < 2 * minimumDistance) { + if (distance < 0.5 * minimumDistance) { + repulsingForce = 1.0; + } + else { + repulsingForce = a * distance + b; // linear approx of 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)) + } + + // amplify the repulsion for clusters. + repulsingForce *= (combinedClusterSize == 0) ? 1 : 1 + combinedClusterSize * this.constants.clustering.forceAmplification; + repulsingForce = repulsingForce / Math.max(distance,0.01*minimumDistance); + + fx = dx * repulsingForce; + fy = dy * repulsingForce; + node1.fx -= fx; + node1.fy -= fy; + node2.fx += fx; + node2.fy += fy; + + } + } + } + }; + + +/***/ }, +/* 69 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Calculate the forces the nodes apply on eachother based on a repulsion field. + * This field is linearly approximated. + * + * @private + */ + exports._calculateNodeForces = function () { + var dx, dy, distance, fx, fy, + repulsingForce, node1, node2, i, j; + + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; + + // repulsing forces between nodes + var nodeDistance = this.constants.physics.hierarchicalRepulsion.nodeDistance; + + // we loop from i over all but the last entree in the array + // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j + for (i = 0; i < nodeIndices.length - 1; i++) { + node1 = nodes[nodeIndices[i]]; + for (j = i + 1; j < nodeIndices.length; j++) { + node2 = nodes[nodeIndices[j]]; + + // nodes only affect nodes on their level + if (node1.level == node2.level) { + + dx = node2.x - node1.x; + dy = node2.y - node1.y; + distance = Math.sqrt(dx * dx + dy * dy); + + + var steepness = 0.05; + if (distance < nodeDistance) { + repulsingForce = -Math.pow(steepness*distance,2) + Math.pow(steepness*nodeDistance,2); + } + else { + repulsingForce = 0; + } + // normalize force with + if (distance == 0) { + distance = 0.01; + } + else { + repulsingForce = repulsingForce / distance; + } + fx = dx * repulsingForce; + fy = dy * repulsingForce; + + node1.fx -= fx; + node1.fy -= fy; + node2.fx += fx; + node2.fy += fy; + } + } + } + }; + + + /** + * this function calculates the effects of the springs in the case of unsmooth curves. + * + * @private + */ + exports._calculateHierarchicalSpringForces = function () { + var edgeLength, edge, edgeId; + var dx, dy, fx, fy, springForce, distance; + var edges = this.edges; + + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; + + + for (var i = 0; i < nodeIndices.length; i++) { + var node1 = nodes[nodeIndices[i]]; + node1.springFx = 0; + node1.springFy = 0; + } + + + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + edgeLength = edge.physics.springLength; + // this implies that the edges between big clusters are longer + edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; + + dx = (edge.from.x - edge.to.x); + dy = (edge.from.y - edge.to.y); + distance = Math.sqrt(dx * dx + dy * dy); + + if (distance == 0) { + distance = 0.01; + } + + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + + fx = dx * springForce; + fy = dy * springForce; + + + + if (edge.to.level != edge.from.level) { + edge.to.springFx -= fx; + edge.to.springFy -= fy; + edge.from.springFx += fx; + edge.from.springFy += fy; + } + else { + var factor = 0.5; + edge.to.fx -= factor*fx; + edge.to.fy -= factor*fy; + edge.from.fx += factor*fx; + edge.from.fy += factor*fy; + } + } + } + } + } + + // normalize spring forces + var springForce = 1; + var springFx, springFy; + for (i = 0; i < nodeIndices.length; i++) { + var node = nodes[nodeIndices[i]]; + springFx = Math.min(springForce,Math.max(-springForce,node.springFx)); + springFy = Math.min(springForce,Math.max(-springForce,node.springFy)); + + node.fx += springFx; + node.fy += springFy; + } + + // retain energy balance + var totalFx = 0; + var totalFy = 0; + for (i = 0; i < nodeIndices.length; i++) { + var node = nodes[nodeIndices[i]]; + totalFx += node.fx; + totalFy += node.fy; + } + var correctionFx = totalFx / nodeIndices.length; + var correctionFy = totalFy / nodeIndices.length; + + for (i = 0; i < nodeIndices.length; i++) { + var node = nodes[nodeIndices[i]]; + node.fx -= correctionFx; + node.fy -= correctionFy; + } + + }; + +/***/ }, +/* 70 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * This function calculates the forces the nodes apply on eachother based on a gravitational model. + * The Barnes Hut method is used to speed up this N-body simulation. + * + * @private + */ + exports._calculateNodeForces = function() { + if (this.constants.physics.barnesHut.gravitationalConstant != 0) { + var node; + var nodes = this.calculationNodes; + var nodeIndices = this.calculationNodeIndices; + var nodeCount = nodeIndices.length; + + this._formBarnesHutTree(nodes,nodeIndices); + + var barnesHutTree = this.barnesHutTree; + + // place the nodes one by one recursively + for (var i = 0; i < nodeCount; i++) { + node = nodes[nodeIndices[i]]; + if (node.options.mass > 0) { + // starting with root is irrelevant, it never passes the BarnesHut condition + this._getForceContribution(barnesHutTree.root.children.NW,node); + this._getForceContribution(barnesHutTree.root.children.NE,node); + this._getForceContribution(barnesHutTree.root.children.SW,node); + this._getForceContribution(barnesHutTree.root.children.SE,node); + } + } + } + }; + + + /** + * This function traverses the barnesHutTree. It checks when it can approximate distant nodes with their center of mass. + * If a region contains a single node, we check if it is not itself, then we apply the force. + * + * @param parentBranch + * @param node + * @private + */ + exports._getForceContribution = function(parentBranch,node) { + // we get no force contribution from an empty region + if (parentBranch.childrenCount > 0) { + var dx,dy,distance; + + // get the distance from the center of mass to the node. + dx = parentBranch.centerOfMass.x - node.x; + dy = parentBranch.centerOfMass.y - node.y; + distance = Math.sqrt(dx * dx + dy * dy); + + // BarnesHut condition + // original condition : s/d < thetaInverted = passed === d/s > 1/theta = passed + // calcSize = 1/s --> d * 1/s > 1/theta = passed + if (distance * parentBranch.calcSize > this.constants.physics.barnesHut.thetaInverted) { + // duplicate code to reduce function calls to speed up program + if (distance == 0) { + distance = 0.1*Math.random(); + dx = distance; + } + var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); + var fx = dx * gravityForce; + var fy = dy * gravityForce; + node.fx += fx; + node.fy += fy; + } + else { + // Did not pass the condition, go into children if available + if (parentBranch.childrenCount == 4) { + this._getForceContribution(parentBranch.children.NW,node); + this._getForceContribution(parentBranch.children.NE,node); + this._getForceContribution(parentBranch.children.SW,node); + this._getForceContribution(parentBranch.children.SE,node); + } + else { // parentBranch must have only one node, if it was empty we wouldnt be here + if (parentBranch.children.data.id != node.id) { // if it is not self + // duplicate code to reduce function calls to speed up program + if (distance == 0) { + distance = 0.5*Math.random(); + dx = distance; + } + var gravityForce = this.constants.physics.barnesHut.gravitationalConstant * parentBranch.mass * node.options.mass / (distance * distance * distance); + var fx = dx * gravityForce; + var fy = dy * gravityForce; + node.fx += fx; + node.fy += fy; + } + } + } + } + }; + + /** + * This function constructs the barnesHut tree recursively. It creates the root, splits it and starts placing the nodes. + * + * @param nodes + * @param nodeIndices + * @private + */ + exports._formBarnesHutTree = function(nodes,nodeIndices) { + var node; + var nodeCount = nodeIndices.length; + + var minX = Number.MAX_VALUE, + minY = Number.MAX_VALUE, + maxX =-Number.MAX_VALUE, + maxY =-Number.MAX_VALUE; + + // get the range of the nodes + for (var i = 0; i < nodeCount; i++) { + var x = nodes[nodeIndices[i]].x; + var y = nodes[nodeIndices[i]].y; + if (nodes[nodeIndices[i]].options.mass > 0) { + if (x < minX) { minX = x; } + if (x > maxX) { maxX = x; } + if (y < minY) { minY = y; } + if (y > maxY) { maxY = y; } + } + } + // make the range a square + var sizeDiff = Math.abs(maxX - minX) - Math.abs(maxY - minY); // difference between X and Y + if (sizeDiff > 0) {minY -= 0.5 * sizeDiff; maxY += 0.5 * sizeDiff;} // xSize > ySize + else {minX += 0.5 * sizeDiff; maxX -= 0.5 * sizeDiff;} // xSize < ySize + + + var minimumTreeSize = 1e-5; + var rootSize = Math.max(minimumTreeSize,Math.abs(maxX - minX)); + var halfRootSize = 0.5 * rootSize; + var centerX = 0.5 * (minX + maxX), centerY = 0.5 * (minY + maxY); + + // construct the barnesHutTree + var barnesHutTree = { + root:{ + centerOfMass: {x:0, y:0}, + mass:0, + range: { + minX: centerX-halfRootSize,maxX:centerX+halfRootSize, + minY: centerY-halfRootSize,maxY:centerY+halfRootSize + }, + size: rootSize, + calcSize: 1 / rootSize, + children: { data:null}, + maxWidth: 0, + level: 0, + childrenCount: 4 + } + }; + this._splitBranch(barnesHutTree.root); + + // place the nodes one by one recursively + for (i = 0; i < nodeCount; i++) { + node = nodes[nodeIndices[i]]; + if (node.options.mass > 0) { + this._placeInTree(barnesHutTree.root,node); + } + } + + // make global + this.barnesHutTree = barnesHutTree + }; + + + /** + * this updates the mass of a branch. this is increased by adding a node. + * + * @param parentBranch + * @param node + * @private + */ + exports._updateBranchMass = function(parentBranch, node) { + var totalMass = parentBranch.mass + node.options.mass; + var totalMassInv = 1/totalMass; + + parentBranch.centerOfMass.x = parentBranch.centerOfMass.x * parentBranch.mass + node.x * node.options.mass; + parentBranch.centerOfMass.x *= totalMassInv; + + parentBranch.centerOfMass.y = parentBranch.centerOfMass.y * parentBranch.mass + node.y * node.options.mass; + parentBranch.centerOfMass.y *= totalMassInv; + + parentBranch.mass = totalMass; + var biggestSize = Math.max(Math.max(node.height,node.radius),node.width); + parentBranch.maxWidth = (parentBranch.maxWidth < biggestSize) ? biggestSize : parentBranch.maxWidth; + + }; + + + /** + * determine in which branch the node will be placed. + * + * @param parentBranch + * @param node + * @param skipMassUpdate + * @private + */ + exports._placeInTree = function(parentBranch,node,skipMassUpdate) { + if (skipMassUpdate != true || skipMassUpdate === undefined) { + // update the mass of the branch. + this._updateBranchMass(parentBranch,node); + } + + if (parentBranch.children.NW.range.maxX > node.x) { // in NW or SW + if (parentBranch.children.NW.range.maxY > node.y) { // in NW + this._placeInRegion(parentBranch,node,"NW"); + } + else { // in SW + this._placeInRegion(parentBranch,node,"SW"); + } + } + else { // in NE or SE + if (parentBranch.children.NW.range.maxY > node.y) { // in NE + this._placeInRegion(parentBranch,node,"NE"); + } + else { // in SE + this._placeInRegion(parentBranch,node,"SE"); + } + } + }; + + + /** + * actually place the node in a region (or branch) + * + * @param parentBranch + * @param node + * @param region + * @private + */ + exports._placeInRegion = function(parentBranch,node,region) { + switch (parentBranch.children[region].childrenCount) { + case 0: // place node here + parentBranch.children[region].children.data = node; + parentBranch.children[region].childrenCount = 1; + this._updateBranchMass(parentBranch.children[region],node); + break; + case 1: // convert into children + // if there are two nodes exactly overlapping (on init, on opening of cluster etc.) + // we move one node a pixel and we do not put it in the tree. + if (parentBranch.children[region].children.data.x == node.x && + parentBranch.children[region].children.data.y == node.y) { + node.x += Math.random(); + node.y += Math.random(); + } + else { + this._splitBranch(parentBranch.children[region]); + this._placeInTree(parentBranch.children[region],node); + } + break; + case 4: // place in branch + this._placeInTree(parentBranch.children[region],node); + break; + } + }; + + + /** + * this function splits a branch into 4 sub branches. If the branch contained a node, we place it in the subbranch + * after the split is complete. + * + * @param parentBranch + * @private + */ + exports._splitBranch = function(parentBranch) { + // if the branch is shaded with a node, replace the node in the new subset. + var containedNode = null; + if (parentBranch.childrenCount == 1) { + containedNode = parentBranch.children.data; + parentBranch.mass = 0; parentBranch.centerOfMass.x = 0; parentBranch.centerOfMass.y = 0; + } + parentBranch.childrenCount = 4; + parentBranch.children.data = null; + this._insertRegion(parentBranch,"NW"); + this._insertRegion(parentBranch,"NE"); + this._insertRegion(parentBranch,"SW"); + this._insertRegion(parentBranch,"SE"); + + if (containedNode != null) { + this._placeInTree(parentBranch,containedNode); + } + }; + + + /** + * This function subdivides the region into four new segments. + * Specifically, this inserts a single new segment. + * It fills the children section of the parentBranch + * + * @param parentBranch + * @param region + * @param parentRange + * @private + */ + exports._insertRegion = function(parentBranch, region) { + var minX,maxX,minY,maxY; + var childSize = 0.5 * parentBranch.size; + switch (region) { + case "NW": + minX = parentBranch.range.minX; + maxX = parentBranch.range.minX + childSize; + minY = parentBranch.range.minY; + maxY = parentBranch.range.minY + childSize; + break; + case "NE": + minX = parentBranch.range.minX + childSize; + maxX = parentBranch.range.maxX; + minY = parentBranch.range.minY; + maxY = parentBranch.range.minY + childSize; + break; + case "SW": + minX = parentBranch.range.minX; + maxX = parentBranch.range.minX + childSize; + minY = parentBranch.range.minY + childSize; + maxY = parentBranch.range.maxY; + break; + case "SE": + minX = parentBranch.range.minX + childSize; + maxX = parentBranch.range.maxX; + minY = parentBranch.range.minY + childSize; + maxY = parentBranch.range.maxY; + break; + } + + + parentBranch.children[region] = { + centerOfMass:{x:0,y:0}, + mass:0, + range:{minX:minX,maxX:maxX,minY:minY,maxY:maxY}, + size: 0.5 * parentBranch.size, + calcSize: 2 * parentBranch.calcSize, + children: {data:null}, + maxWidth: 0, + level: parentBranch.level+1, + childrenCount: 0 + }; + }; + + + /** + * This function is for debugging purposed, it draws the tree. + * + * @param ctx + * @param color + * @private + */ + exports._drawTree = function(ctx,color) { + if (this.barnesHutTree !== undefined) { + + ctx.lineWidth = 1; + + this._drawBranch(this.barnesHutTree.root,ctx,color); + } + }; + + + /** + * This function is for debugging purposes. It draws the branches recursively. + * + * @param branch + * @param ctx + * @param color + * @private + */ + exports._drawBranch = function(branch,ctx,color) { + if (color === undefined) { + color = "#FF0000"; + } + + if (branch.childrenCount == 4) { + this._drawBranch(branch.children.NW,ctx); + this._drawBranch(branch.children.NE,ctx); + this._drawBranch(branch.children.SE,ctx); + this._drawBranch(branch.children.SW,ctx); + } + ctx.strokeStyle = color; + ctx.beginPath(); + ctx.moveTo(branch.range.minX,branch.range.minY); + ctx.lineTo(branch.range.maxX,branch.range.minY); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(branch.range.maxX,branch.range.minY); + ctx.lineTo(branch.range.maxX,branch.range.maxY); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(branch.range.maxX,branch.range.maxY); + ctx.lineTo(branch.range.minX,branch.range.maxY); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(branch.range.minX,branch.range.maxY); + ctx.lineTo(branch.range.minX,branch.range.minY); + ctx.stroke(); + + /* + if (branch.mass > 0) { + ctx.circle(branch.centerOfMass.x, branch.centerOfMass.y, 3*branch.mass); + ctx.stroke(); + } + */ + }; + + +/***/ }, +/* 71 */ +/***/ function(module, exports, __webpack_require__) { + + module.exports = function(module) { + if(!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + module.children = []; + module.webpackPolyfill = 1; + } + return module; + } + + +/***/ } +/******/ ]) +}); diff --git a/showcase/projects/bridge/parseData.js b/showcase/projects/bridge/parseData.js new file mode 100644 index 00000000..6722f637 --- /dev/null +++ b/showcase/projects/bridge/parseData.js @@ -0,0 +1,53 @@ +/** + * Created by Alex on 2/2/2015. + */ + +fs = require('fs') + +function writeToFile(data, outputFilename, callback) { + fs.writeFile(outputFilename, JSON.stringify(data), function (err) { + if (err) { + console.log(err); + } else { + console.log("JSON saved to " + outputFilename); + callback(); + //getNewAssignment(); + } + }); +} + +function parse(data, callback) { + var objects = Object.keys(data.things); + var timelineData = []; + + var groups = []; + var groupsObj = {}; + for (var i = 0; i < objects.length; i++) { + var thing = data.things[objects[i]]; + if (thing.properties.description && thing.properties.date) { + timelineData.push({ + id:i, + content: thing.type, + start: new Date(thing.properties.date.value).valueOf(), + group: thing.type + }); + if (groupsObj[thing.type] === undefined) { + groupsObj[thing.type] = true; + groups.push({id:thing.type, content:thing.type}); + } + } + } + console.log("amont of data", timelineData.length, "amount of groups:", groups.length) + var dataToWrite = {data: timelineData, groups:groups}; + + writeToFile(dataToWrite, "timeline.json", function(){}); +} + + +fs.readFile('./data.json', 'utf8', function (err, data) { + if (err) { + return console.log(err); + } + parse(JSON.parse(data)); +}); + diff --git a/showcase/projects/bridge/timeline.json b/showcase/projects/bridge/timeline.json new file mode 100644 index 00000000..ad7b01a6 --- /dev/null +++ b/showcase/projects/bridge/timeline.json @@ -0,0 +1 @@ +{"data":[{"id":0,"content":"tweet:picture","start":1424850541000,"group":"tweet:picture"},{"id":1,"content":"tweet","start":1424851896000,"group":"tweet"},{"id":2,"content":"tweet","start":1424853322000,"group":"tweet"},{"id":3,"content":"tweet:picture","start":1424849938000,"group":"tweet:picture"},{"id":4,"content":"tweet","start":1424853149000,"group":"tweet"},{"id":5,"content":"tweet","start":1424857903000,"group":"tweet"},{"id":6,"content":"tweet","start":1424849189000,"group":"tweet"},{"id":7,"content":"tweet","start":1424857898000,"group":"tweet"},{"id":8,"content":"tweet","start":1424854804000,"group":"tweet"},{"id":9,"content":"tweet:picture","start":1424858059000,"group":"tweet:picture"},{"id":10,"content":"tweet","start":1424855894000,"group":"tweet"},{"id":11,"content":"tweet","start":1424851200000,"group":"tweet"},{"id":12,"content":"tweet","start":1424850559000,"group":"tweet"},{"id":13,"content":"tweet","start":1424849917000,"group":"tweet"},{"id":14,"content":"tweet:picture","start":1424851177000,"group":"tweet:picture"},{"id":15,"content":"tweet:picture","start":1424855672000,"group":"tweet:picture"},{"id":16,"content":"tweet","start":1424851172000,"group":"tweet"},{"id":17,"content":"tweet","start":1424851050000,"group":"tweet"},{"id":20,"content":"tweet:picture","start":1424850539000,"group":"tweet:picture"},{"id":21,"content":"tweet","start":1424849658000,"group":"tweet"},{"id":22,"content":"tweet:picture","start":1424851579000,"group":"tweet:picture"},{"id":23,"content":"tweet","start":1424849518000,"group":"tweet"},{"id":24,"content":"tweet","start":1424855345000,"group":"tweet"},{"id":25,"content":"tweet","start":1424851465000,"group":"tweet"},{"id":26,"content":"tweet","start":1424853753000,"group":"tweet"},{"id":27,"content":"tweet","start":1424851951000,"group":"tweet"},{"id":28,"content":"tweet","start":1424849908000,"group":"tweet"},{"id":29,"content":"tweet:picture","start":1424851451000,"group":"tweet:picture"},{"id":30,"content":"tweet","start":1424853860000,"group":"tweet"},{"id":31,"content":"tweet:picture","start":1424851773000,"group":"tweet:picture"},{"id":32,"content":"tweet","start":1424855671000,"group":"tweet"},{"id":33,"content":"tweet:picture","start":1424855344000,"group":"tweet:picture"},{"id":34,"content":"tweet:picture","start":1424857270000,"group":"tweet:picture"},{"id":35,"content":"tweet:picture","start":1424853776000,"group":"tweet:picture"},{"id":36,"content":"tweet","start":1424851446000,"group":"tweet"},{"id":37,"content":"tweet:picture","start":1424855349000,"group":"tweet:picture"},{"id":38,"content":"tweet","start":1424850909000,"group":"tweet"},{"id":39,"content":"tweet","start":1424855676000,"group":"tweet"},{"id":40,"content":"tweet","start":1424855337000,"group":"tweet"},{"id":41,"content":"tweet","start":1424849470000,"group":"tweet"},{"id":42,"content":"tweet","start":1424857809000,"group":"tweet"},{"id":43,"content":"tweet","start":1424851759000,"group":"tweet"},{"id":44,"content":"tweet","start":1424856803000,"group":"tweet"},{"id":45,"content":"tweet","start":1424853623000,"group":"tweet"},{"id":46,"content":"tweet","start":1424857917000,"group":"tweet"},{"id":47,"content":"tweet","start":1424853438000,"group":"tweet"},{"id":48,"content":"tweet:picture","start":1424857644000,"group":"tweet:picture"},{"id":49,"content":"tweet","start":1424849509000,"group":"tweet"},{"id":50,"content":"tweet:picture","start":1424853771000,"group":"tweet:picture"},{"id":51,"content":"tweet","start":1424849803000,"group":"tweet"},{"id":52,"content":"tweet:picture","start":1424855254000,"group":"tweet:picture"},{"id":53,"content":"tweet","start":1424851303000,"group":"tweet"},{"id":54,"content":"tweet","start":1424855944000,"group":"tweet"},{"id":55,"content":"tweet:picture","start":1424853037000,"group":"tweet:picture"},{"id":56,"content":"tweet","start":1424855988000,"group":"tweet"},{"id":57,"content":"tweet","start":1424855696000,"group":"tweet"},{"id":58,"content":"tweet","start":1424853156000,"group":"tweet"},{"id":59,"content":"tweet","start":1424857884000,"group":"tweet"},{"id":60,"content":"tweet","start":1424858048000,"group":"tweet"},{"id":61,"content":"tweet","start":1424857260000,"group":"tweet"},{"id":62,"content":"tweet","start":1424853361000,"group":"tweet"},{"id":63,"content":"tweet","start":1424851855000,"group":"tweet"},{"id":64,"content":"tweet","start":1424857393000,"group":"tweet"},{"id":65,"content":"tweet","start":1424853345000,"group":"tweet"},{"id":66,"content":"tweet","start":1424855637000,"group":"tweet"},{"id":67,"content":"tweet:picture","start":1424850532000,"group":"tweet:picture"},{"id":68,"content":"tweet","start":1424858027000,"group":"tweet"},{"id":69,"content":"tweet","start":1424856198000,"group":"tweet"},{"id":70,"content":"tweet","start":1424857868000,"group":"tweet"},{"id":71,"content":"tweet","start":1424853333000,"group":"tweet"},{"id":72,"content":"tweet","start":1424851260000,"group":"tweet"},{"id":73,"content":"tweet","start":1424857627000,"group":"tweet"},{"id":74,"content":"tweet","start":1424858029000,"group":"tweet"},{"id":75,"content":"tweet","start":1424850531000,"group":"tweet"},{"id":76,"content":"tweet","start":1424857893000,"group":"tweet"},{"id":77,"content":"tweet","start":1424852223000,"group":"tweet"},{"id":78,"content":"tweet","start":1424850487000,"group":"tweet"},{"id":79,"content":"tweet","start":1424857501000,"group":"tweet"},{"id":80,"content":"tweet","start":1424850999000,"group":"tweet"},{"id":81,"content":"tweet","start":1424853302000,"group":"tweet"},{"id":82,"content":"tweet","start":1424855874000,"group":"tweet"},{"id":83,"content":"tweet","start":1424851727000,"group":"tweet"},{"id":84,"content":"tweet:picture","start":1424857807000,"group":"tweet:picture"},{"id":85,"content":"tweet","start":1424855248000,"group":"tweet"},{"id":86,"content":"tweet","start":1424857780000,"group":"tweet"},{"id":87,"content":"tweet","start":1424857732000,"group":"tweet"},{"id":88,"content":"tweet","start":1424849791000,"group":"tweet"},{"id":89,"content":"tweet","start":1424852856000,"group":"tweet"},{"id":90,"content":"tweet","start":1424853064000,"group":"tweet"},{"id":91,"content":"tweet:picture","start":1424851529000,"group":"tweet:picture"},{"id":92,"content":"tweet:picture","start":1424857615000,"group":"tweet:picture"},{"id":93,"content":"tweet:picture","start":1424853242000,"group":"tweet:picture"},{"id":94,"content":"tweet","start":1424854045000,"group":"tweet"},{"id":95,"content":"tweet","start":1424856161000,"group":"tweet"},{"id":96,"content":"tweet","start":1424853032000,"group":"tweet"},{"id":97,"content":"tweet","start":1424857603000,"group":"tweet"},{"id":98,"content":"tweet:picture","start":1424857603000,"group":"tweet:picture"},{"id":99,"content":"tweet","start":1424855245000,"group":"tweet"},{"id":100,"content":"tweet:picture","start":1424853238000,"group":"tweet:picture"},{"id":101,"content":"tweet","start":1424853622000,"group":"tweet"},{"id":102,"content":"tweet","start":1424851642000,"group":"tweet"},{"id":103,"content":"tweet:picture","start":1424856139000,"group":"tweet:picture"},{"id":104,"content":"tweet:picture","start":1424852928000,"group":"tweet:picture"},{"id":105,"content":"tweet","start":1424853050000,"group":"tweet"},{"id":106,"content":"tweet","start":1424857608000,"group":"tweet"},{"id":107,"content":"tweet","start":1424850958000,"group":"tweet"},{"id":108,"content":"tweet","start":1424855495000,"group":"tweet"},{"id":109,"content":"tweet","start":1424855220000,"group":"tweet"},{"id":110,"content":"tweet","start":1424852905000,"group":"tweet"},{"id":111,"content":"tweet","start":1424849375000,"group":"tweet"},{"id":112,"content":"tweet","start":1424853304000,"group":"tweet"},{"id":113,"content":"tweet","start":1424849728000,"group":"tweet"},{"id":114,"content":"tweet","start":1424852723000,"group":"tweet"},{"id":115,"content":"tweet","start":1424857500000,"group":"tweet"},{"id":116,"content":"tweet:picture","start":1424855455000,"group":"tweet:picture"},{"id":117,"content":"tweet","start":1424851948000,"group":"tweet"},{"id":118,"content":"tweet:picture","start":1424856582000,"group":"tweet:picture"},{"id":119,"content":"tweet:picture","start":1424855870000,"group":"tweet:picture"},{"id":120,"content":"tweet","start":1424853578000,"group":"tweet"},{"id":121,"content":"tweet:picture","start":1424856782000,"group":"tweet:picture"},{"id":122,"content":"tweet:picture","start":1424853279000,"group":"tweet:picture"},{"id":123,"content":"tweet:picture","start":1424856327000,"group":"tweet:picture"},{"id":124,"content":"tweet","start":1424853411000,"group":"tweet"},{"id":125,"content":"tweet","start":1424857487000,"group":"tweet"},{"id":126,"content":"tweet","start":1424857531000,"group":"tweet"},{"id":127,"content":"tweet","start":1424849179000,"group":"tweet"},{"id":128,"content":"tweet","start":1424855364000,"group":"tweet"},{"id":129,"content":"tweet","start":1424855203000,"group":"tweet"},{"id":130,"content":"tweet","start":1424853172000,"group":"tweet"},{"id":131,"content":"tweet","start":1424852687000,"group":"tweet"},{"id":133,"content":"tweet","start":1424854255000,"group":"tweet"},{"id":134,"content":"tweet:picture","start":1424851871000,"group":"tweet:picture"},{"id":135,"content":"tweet:picture","start":1424855463000,"group":"tweet:picture"},{"id":136,"content":"tweet","start":1424851393000,"group":"tweet"},{"id":137,"content":"tweet","start":1424851253000,"group":"tweet"},{"id":138,"content":"tweet","start":1424858028000,"group":"tweet"},{"id":139,"content":"tweet","start":1424855461000,"group":"tweet"},{"id":140,"content":"tweet:picture","start":1424853853000,"group":"tweet:picture"},{"id":141,"content":"tweet","start":1424853557000,"group":"tweet"},{"id":142,"content":"tweet","start":1424853492000,"group":"tweet"},{"id":143,"content":"tweet","start":1424858072000,"group":"tweet"},{"id":144,"content":"tweet","start":1424849360000,"group":"tweet"},{"id":145,"content":"tweet","start":1424858015000,"group":"tweet"},{"id":146,"content":"tweet","start":1424857482000,"group":"tweet"},{"id":147,"content":"tweet","start":1424855457000,"group":"tweet"},{"id":148,"content":"tweet","start":1424852208000,"group":"tweet"},{"id":149,"content":"tweet:picture","start":1424855451000,"group":"tweet:picture"},{"id":150,"content":"tweet","start":1424849727000,"group":"tweet"},{"id":151,"content":"tweet","start":1424857461000,"group":"tweet"},{"id":152,"content":"tweet","start":1424852646000,"group":"tweet"},{"id":153,"content":"tweet","start":1424851970000,"group":"tweet"},{"id":154,"content":"tweet","start":1424853189000,"group":"tweet"},{"id":155,"content":"tweet","start":1424853794000,"group":"tweet"},{"id":157,"content":"tweet","start":1424852810000,"group":"tweet"},{"id":158,"content":"tweet","start":1424855450000,"group":"tweet"},{"id":159,"content":"tweet","start":1424855971000,"group":"tweet"},{"id":160,"content":"tweet","start":1424850889000,"group":"tweet"},{"id":161,"content":"tweet","start":1424850471000,"group":"tweet"},{"id":162,"content":"tweet","start":1424857116000,"group":"tweet"},{"id":163,"content":"tweet","start":1424851518000,"group":"tweet"},{"id":164,"content":"tweet","start":1424854771000,"group":"tweet"},{"id":165,"content":"tweet","start":1424850837000,"group":"tweet"},{"id":166,"content":"tweet","start":1424855199000,"group":"tweet"},{"id":167,"content":"master:utmost:risk","start":1423124915783,"group":"master:utmost:risk"},{"id":168,"content":"tweet","start":1424857978000,"group":"tweet"},{"id":169,"content":"tweet:picture","start":1424849707000,"group":"tweet:picture"},{"id":170,"content":"tweet","start":1424849701000,"group":"tweet"},{"id":171,"content":"tweet","start":1424852898000,"group":"tweet"},{"id":172,"content":"tweet:picture","start":1424851985000,"group":"tweet:picture"},{"id":173,"content":"tweet","start":1424851240000,"group":"tweet"},{"id":174,"content":"tweet","start":1424857961000,"group":"tweet"},{"id":175,"content":"tweet","start":1424853481000,"group":"tweet"},{"id":176,"content":"tweet:picture","start":1424853401000,"group":"tweet:picture"},{"id":177,"content":"tweet","start":1424853391000,"group":"tweet"},{"id":178,"content":"roadrisk:aftenposten","start":1417429516000,"group":"roadrisk:aftenposten"},{"id":179,"content":"roadrisk:aftenposten","start":1417420154000,"group":"roadrisk:aftenposten"},{"id":180,"content":"roadrisk:aftenposten","start":1417419856000,"group":"roadrisk:aftenposten"},{"id":181,"content":"roadrisk:aftenposten","start":1417419435000,"group":"roadrisk:aftenposten"},{"id":182,"content":"roadrisk:aftenposten","start":1417093589000,"group":"roadrisk:aftenposten"},{"id":183,"content":"accident:aftenposten","start":1416570482000,"group":"accident:aftenposten"},{"id":184,"content":"roadrisk:aftenposten","start":1416304925000,"group":"roadrisk:aftenposten"},{"id":185,"content":"roadrisk:aftenposten","start":1416302953000,"group":"roadrisk:aftenposten"},{"id":186,"content":"roadrisk:aftenposten","start":1416243823000,"group":"roadrisk:aftenposten"},{"id":187,"content":"roadrisk:aftenposten","start":1416218811000,"group":"roadrisk:aftenposten"},{"id":188,"content":"roadrisk:aftenposten","start":1416218733000,"group":"roadrisk:aftenposten"},{"id":189,"content":"roadrisk:aftenposten","start":1416218659000,"group":"roadrisk:aftenposten"},{"id":190,"content":"roadrisk:aftenposten","start":1416218447000,"group":"roadrisk:aftenposten"},{"id":191,"content":"roadrisk:aftenposten","start":1416003106000,"group":"roadrisk:aftenposten"},{"id":192,"content":"roadrisk:aftenposten","start":1415958062000,"group":"roadrisk:aftenposten"},{"id":193,"content":"accident:aftenposten","start":1415938981000,"group":"accident:aftenposten"},{"id":194,"content":"accident:aftenposten","start":1415938976000,"group":"accident:aftenposten"},{"id":195,"content":"accident:aftenposten","start":1415938846000,"group":"accident:aftenposten"},{"id":196,"content":"accident:aftenposten","start":1415938607000,"group":"accident:aftenposten"},{"id":197,"content":"roadrisk:aftenposten","start":1415938294000,"group":"roadrisk:aftenposten"},{"id":198,"content":"roadrisk:aftenposten","start":1415938150000,"group":"roadrisk:aftenposten"},{"id":199,"content":"roadrisk:aftenposten","start":1415937929000,"group":"roadrisk:aftenposten"},{"id":200,"content":"roadrisk:aftenposten","start":1415909896000,"group":"roadrisk:aftenposten"},{"id":201,"content":"roadrisk:aftenposten","start":1415652544000,"group":"roadrisk:aftenposten"},{"id":202,"content":"roadrisk:aftenposten","start":1415621404000,"group":"roadrisk:aftenposten"},{"id":203,"content":"roadrisk:aftenposten","start":1415387905000,"group":"roadrisk:aftenposten"},{"id":204,"content":"roadrisk:aftenposten","start":1415346359000,"group":"roadrisk:aftenposten"},{"id":205,"content":"roadrisk:aftenposten","start":1415345887000,"group":"roadrisk:aftenposten"},{"id":206,"content":"roadrisk:aftenposten","start":1415315811000,"group":"roadrisk:aftenposten"},{"id":207,"content":"roadrisk:aftenposten","start":1415276444000,"group":"roadrisk:aftenposten"},{"id":208,"content":"roadrisk:aftenposten","start":1415274237000,"group":"roadrisk:aftenposten"},{"id":209,"content":"roadrisk:aftenposten","start":1415274089000,"group":"roadrisk:aftenposten"},{"id":210,"content":"roadrisk:aftenposten","start":1415271520000,"group":"roadrisk:aftenposten"},{"id":211,"content":"roadrisk:aftenposten","start":1415266921000,"group":"roadrisk:aftenposten"},{"id":212,"content":"roadrisk:aftenposten","start":1415263225000,"group":"roadrisk:aftenposten"},{"id":213,"content":"roadrisk:aftenposten","start":1415263038000,"group":"roadrisk:aftenposten"},{"id":214,"content":"roadrisk:aftenposten","start":1415258793000,"group":"roadrisk:aftenposten"},{"id":215,"content":"roadrisk:aftenposten","start":1415258656000,"group":"roadrisk:aftenposten"},{"id":216,"content":"roadrisk:aftenposten","start":1415250265000,"group":"roadrisk:aftenposten"},{"id":217,"content":"roadrisk:aftenposten","start":1415220714000,"group":"roadrisk:aftenposten"},{"id":218,"content":"roadrisk:aftenposten","start":1415220580000,"group":"roadrisk:aftenposten"},{"id":219,"content":"roadrisk:aftenposten","start":1415220535000,"group":"roadrisk:aftenposten"},{"id":220,"content":"roadrisk:aftenposten","start":1415107611000,"group":"roadrisk:aftenposten"},{"id":221,"content":"roadrisk:aftenposten","start":1415107507000,"group":"roadrisk:aftenposten"},{"id":222,"content":"roadrisk:aftenposten","start":1415107330000,"group":"roadrisk:aftenposten"},{"id":223,"content":"roadrisk:aftenposten","start":1415106917000,"group":"roadrisk:aftenposten"},{"id":224,"content":"roadrisk:aftenposten","start":1415106659000,"group":"roadrisk:aftenposten"},{"id":225,"content":"roadrisk:aftenposten","start":1415093294000,"group":"roadrisk:aftenposten"},{"id":226,"content":"roadrisk:aftenposten","start":1415017697000,"group":"roadrisk:aftenposten"},{"id":227,"content":"roadrisk:aftenposten","start":1415017589000,"group":"roadrisk:aftenposten"},{"id":228,"content":"roadrisk:aftenposten","start":1415017507000,"group":"roadrisk:aftenposten"},{"id":229,"content":"roadrisk:aftenposten","start":1415017389000,"group":"roadrisk:aftenposten"},{"id":230,"content":"roadrisk:aftenposten","start":1415016339000,"group":"roadrisk:aftenposten"},{"id":231,"content":"roadrisk:aftenposten","start":1415009800000,"group":"roadrisk:aftenposten"},{"id":232,"content":"roadrisk:aftenposten","start":1414960293000,"group":"roadrisk:aftenposten"},{"id":233,"content":"roadrisk:aftenposten","start":1414915951000,"group":"roadrisk:aftenposten"},{"id":234,"content":"accident:aftenposten","start":1414778053000,"group":"accident:aftenposten"},{"id":235,"content":"roadrisk:aftenposten","start":1414760887000,"group":"roadrisk:aftenposten"},{"id":236,"content":"roadrisk:aftenposten","start":1414740505000,"group":"roadrisk:aftenposten"},{"id":237,"content":"roadrisk:aftenposten","start":1414739674000,"group":"roadrisk:aftenposten"},{"id":238,"content":"roadrisk:aftenposten","start":1414656078000,"group":"roadrisk:aftenposten"},{"id":239,"content":"accident:aftenposten","start":1414654925000,"group":"accident:aftenposten"},{"id":240,"content":"roadrisk:aftenposten","start":1414651743000,"group":"roadrisk:aftenposten"},{"id":241,"content":"roadrisk:aftenposten","start":1414608697000,"group":"roadrisk:aftenposten"},{"id":242,"content":"roadrisk:aftenposten","start":1414607346000,"group":"roadrisk:aftenposten"},{"id":243,"content":"roadrisk:aftenposten","start":1414606594000,"group":"roadrisk:aftenposten"},{"id":244,"content":"roadrisk:aftenposten","start":1414598531000,"group":"roadrisk:aftenposten"},{"id":245,"content":"roadrisk:aftenposten","start":1414595123000,"group":"roadrisk:aftenposten"},{"id":246,"content":"roadrisk:aftenposten","start":1414319817000,"group":"roadrisk:aftenposten"},{"id":247,"content":"roadrisk:aftenposten","start":1414157330000,"group":"roadrisk:aftenposten"},{"id":248,"content":"roadrisk:aftenposten","start":1414140206000,"group":"roadrisk:aftenposten"},{"id":249,"content":"roadrisk:aftenposten","start":1414094723000,"group":"roadrisk:aftenposten"},{"id":250,"content":"roadrisk:aftenposten","start":1414094463000,"group":"roadrisk:aftenposten"},{"id":251,"content":"roadrisk:aftenposten","start":1414094169000,"group":"roadrisk:aftenposten"},{"id":252,"content":"roadrisk:aftenposten","start":1414093750000,"group":"roadrisk:aftenposten"},{"id":253,"content":"roadrisk:aftenposten","start":1414056052000,"group":"roadrisk:aftenposten"},{"id":254,"content":"roadrisk:aftenposten","start":1414053918000,"group":"roadrisk:aftenposten"},{"id":255,"content":"roadrisk:aftenposten","start":1414004012000,"group":"roadrisk:aftenposten"},{"id":256,"content":"roadrisk:aftenposten","start":1413915345000,"group":"roadrisk:aftenposten"},{"id":257,"content":"roadrisk:aftenposten","start":1413899683000,"group":"roadrisk:aftenposten"},{"id":258,"content":"roadrisk:aftenposten","start":1413880887000,"group":"roadrisk:aftenposten"},{"id":259,"content":"roadrisk:aftenposten","start":1413871255000,"group":"roadrisk:aftenposten"},{"id":260,"content":"accident:aftenposten","start":1413819660000,"group":"accident:aftenposten"},{"id":261,"content":"accident:aftenposten","start":1413818868000,"group":"accident:aftenposten"},{"id":262,"content":"roadrisk:aftenposten","start":1413818533000,"group":"roadrisk:aftenposten"},{"id":263,"content":"accident:aftenposten","start":1413818137000,"group":"accident:aftenposten"},{"id":264,"content":"accident:aftenposten","start":1413817133000,"group":"accident:aftenposten"},{"id":265,"content":"roadrisk:aftenposten","start":1413815445000,"group":"roadrisk:aftenposten"},{"id":266,"content":"roadrisk:aftenposten","start":1413814888000,"group":"roadrisk:aftenposten"},{"id":267,"content":"roadrisk:aftenposten","start":1413794289000,"group":"roadrisk:aftenposten"},{"id":268,"content":"roadrisk:aftenposten","start":1413790399000,"group":"roadrisk:aftenposten"},{"id":269,"content":"roadrisk:aftenposten","start":1413746567000,"group":"roadrisk:aftenposten"},{"id":270,"content":"roadrisk:aftenposten","start":1413745566000,"group":"roadrisk:aftenposten"},{"id":271,"content":"roadrisk:aftenposten","start":1413741564000,"group":"roadrisk:aftenposten"},{"id":272,"content":"roadrisk:aftenposten","start":1413739622000,"group":"roadrisk:aftenposten"},{"id":273,"content":"roadrisk:aftenposten","start":1413737291000,"group":"roadrisk:aftenposten"},{"id":274,"content":"roadrisk:aftenposten","start":1413711903000,"group":"roadrisk:aftenposten"},{"id":275,"content":"accident:aftenposten","start":1413554658000,"group":"accident:aftenposten"},{"id":276,"content":"roadrisk:aftenposten","start":1413553854000,"group":"roadrisk:aftenposten"},{"id":277,"content":"accident:aftenposten","start":1413548542000,"group":"accident:aftenposten"},{"id":278,"content":"roadrisk:aftenposten","start":1413545032000,"group":"roadrisk:aftenposten"},{"id":279,"content":"roadrisk:aftenposten","start":1413544887000,"group":"roadrisk:aftenposten"},{"id":280,"content":"roadrisk:aftenposten","start":1413533531000,"group":"roadrisk:aftenposten"},{"id":281,"content":"roadrisk:aftenposten","start":1413533419000,"group":"roadrisk:aftenposten"},{"id":282,"content":"roadrisk:aftenposten","start":1413533273000,"group":"roadrisk:aftenposten"},{"id":283,"content":"roadrisk:aftenposten","start":1413462260000,"group":"roadrisk:aftenposten"},{"id":284,"content":"roadrisk:aftenposten","start":1413378650000,"group":"roadrisk:aftenposten"},{"id":285,"content":"roadrisk:aftenposten","start":1413377951000,"group":"roadrisk:aftenposten"},{"id":286,"content":"roadrisk:aftenposten","start":1413362502000,"group":"roadrisk:aftenposten"},{"id":287,"content":"roadrisk:aftenposten","start":1413362305000,"group":"roadrisk:aftenposten"},{"id":288,"content":"accident:aftenposten","start":1413362202000,"group":"accident:aftenposten"},{"id":289,"content":"roadrisk:aftenposten","start":1413353962000,"group":"roadrisk:aftenposten"},{"id":290,"content":"roadrisk:aftenposten","start":1413319615000,"group":"roadrisk:aftenposten"},{"id":291,"content":"roadrisk:aftenposten","start":1413318987000,"group":"roadrisk:aftenposten"},{"id":292,"content":"roadrisk:aftenposten","start":1413318770000,"group":"roadrisk:aftenposten"},{"id":293,"content":"roadrisk:aftenposten","start":1413318063000,"group":"roadrisk:aftenposten"},{"id":294,"content":"roadrisk:aftenposten","start":1413317891000,"group":"roadrisk:aftenposten"},{"id":295,"content":"roadrisk:aftenposten","start":1413317437000,"group":"roadrisk:aftenposten"},{"id":296,"content":"roadrisk:aftenposten","start":1413317244000,"group":"roadrisk:aftenposten"},{"id":297,"content":"roadrisk:aftenposten","start":1413316893000,"group":"roadrisk:aftenposten"},{"id":298,"content":"roadrisk:aftenposten","start":1413311783000,"group":"roadrisk:aftenposten"},{"id":299,"content":"roadrisk:aftenposten","start":1413311456000,"group":"roadrisk:aftenposten"},{"id":300,"content":"roadrisk:aftenposten","start":1413311034000,"group":"roadrisk:aftenposten"},{"id":301,"content":"roadrisk:aftenposten","start":1413310362000,"group":"roadrisk:aftenposten"},{"id":302,"content":"roadrisk:aftenposten","start":1413309847000,"group":"roadrisk:aftenposten"},{"id":303,"content":"roadrisk:aftenposten","start":1413305675000,"group":"roadrisk:aftenposten"},{"id":304,"content":"roadrisk:aftenposten","start":1413304024000,"group":"roadrisk:aftenposten"},{"id":305,"content":"roadrisk:aftenposten","start":1413303864000,"group":"roadrisk:aftenposten"},{"id":306,"content":"roadrisk:aftenposten","start":1413296500000,"group":"roadrisk:aftenposten"},{"id":307,"content":"roadrisk:aftenposten","start":1413296017000,"group":"roadrisk:aftenposten"},{"id":308,"content":"roadrisk:aftenposten","start":1413279692000,"group":"roadrisk:aftenposten"},{"id":309,"content":"roadrisk:aftenposten","start":1413279257000,"group":"roadrisk:aftenposten"},{"id":310,"content":"roadrisk:aftenposten","start":1413278656000,"group":"roadrisk:aftenposten"},{"id":311,"content":"roadrisk:aftenposten","start":1413275978000,"group":"roadrisk:aftenposten"},{"id":312,"content":"roadrisk:aftenposten","start":1413275474000,"group":"roadrisk:aftenposten"},{"id":313,"content":"roadrisk:aftenposten","start":1413273938000,"group":"roadrisk:aftenposten"},{"id":314,"content":"roadrisk:aftenposten","start":1413273824000,"group":"roadrisk:aftenposten"},{"id":315,"content":"roadrisk:aftenposten","start":1413273316000,"group":"roadrisk:aftenposten"},{"id":316,"content":"roadrisk:aftenposten","start":1413272345000,"group":"roadrisk:aftenposten"},{"id":317,"content":"roadrisk:aftenposten","start":1413272028000,"group":"roadrisk:aftenposten"},{"id":318,"content":"roadrisk:aftenposten","start":1413265445000,"group":"roadrisk:aftenposten"},{"id":319,"content":"roadrisk:aftenposten","start":1413263014000,"group":"roadrisk:aftenposten"},{"id":320,"content":"roadrisk:aftenposten","start":1413262615000,"group":"roadrisk:aftenposten"},{"id":321,"content":"roadrisk:aftenposten","start":1413259163000,"group":"roadrisk:aftenposten"},{"id":322,"content":"roadrisk:aftenposten","start":1413241149000,"group":"roadrisk:aftenposten"},{"id":323,"content":"roadrisk:aftenposten","start":1413233776000,"group":"roadrisk:aftenposten"},{"id":324,"content":"roadrisk:aftenposten","start":1413230726000,"group":"roadrisk:aftenposten"},{"id":325,"content":"roadrisk:aftenposten","start":1413227613000,"group":"roadrisk:aftenposten"},{"id":326,"content":"accident:aftenposten","start":1413227480000,"group":"accident:aftenposten"},{"id":327,"content":"roadrisk:aftenposten","start":1413227389000,"group":"roadrisk:aftenposten"},{"id":328,"content":"roadrisk:aftenposten","start":1413223491000,"group":"roadrisk:aftenposten"},{"id":329,"content":"roadrisk:aftenposten","start":1413218558000,"group":"roadrisk:aftenposten"},{"id":330,"content":"accident:aftenposten","start":1413218371000,"group":"accident:aftenposten"},{"id":331,"content":"roadrisk:aftenposten","start":1413215582000,"group":"roadrisk:aftenposten"},{"id":332,"content":"accident:aftenposten","start":1413215344000,"group":"accident:aftenposten"},{"id":333,"content":"roadrisk:aftenposten","start":1413212486000,"group":"roadrisk:aftenposten"},{"id":334,"content":"roadrisk:aftenposten","start":1413212434000,"group":"roadrisk:aftenposten"},{"id":335,"content":"roadrisk:aftenposten","start":1413212343000,"group":"roadrisk:aftenposten"},{"id":336,"content":"roadrisk:aftenposten","start":1413212310000,"group":"roadrisk:aftenposten"},{"id":337,"content":"roadrisk:aftenposten","start":1413212270000,"group":"roadrisk:aftenposten"},{"id":338,"content":"roadrisk:aftenposten","start":1413212182000,"group":"roadrisk:aftenposten"},{"id":339,"content":"roadrisk:aftenposten","start":1413212101000,"group":"roadrisk:aftenposten"},{"id":340,"content":"roadrisk:aftenposten","start":1413206948000,"group":"roadrisk:aftenposten"},{"id":341,"content":"roadrisk:aftenposten","start":1413206815000,"group":"roadrisk:aftenposten"},{"id":342,"content":"roadrisk:aftenposten","start":1413206689000,"group":"roadrisk:aftenposten"},{"id":343,"content":"roadrisk:aftenposten","start":1413206556000,"group":"roadrisk:aftenposten"},{"id":344,"content":"roadrisk:aftenposten","start":1412945637000,"group":"roadrisk:aftenposten"},{"id":345,"content":"roadrisk:aftenposten","start":1412945390000,"group":"roadrisk:aftenposten"},{"id":346,"content":"roadrisk:aftenposten","start":1412945157000,"group":"roadrisk:aftenposten"},{"id":347,"content":"accident:aftenposten","start":1412938663000,"group":"accident:aftenposten"},{"id":348,"content":"roadrisk:aftenposten","start":1412935342000,"group":"roadrisk:aftenposten"},{"id":349,"content":"roadrisk:aftenposten","start":1412935195000,"group":"roadrisk:aftenposten"},{"id":350,"content":"accident:aftenposten","start":1412935102000,"group":"accident:aftenposten"},{"id":351,"content":"accident:aftenposten","start":1412925707000,"group":"accident:aftenposten"},{"id":352,"content":"roadrisk:aftenposten","start":1412878199000,"group":"roadrisk:aftenposten"},{"id":353,"content":"roadrisk:aftenposten","start":1412789309000,"group":"roadrisk:aftenposten"},{"id":354,"content":"roadrisk:aftenposten","start":1412788920000,"group":"roadrisk:aftenposten"},{"id":355,"content":"roadrisk:aftenposten","start":1412788694000,"group":"roadrisk:aftenposten"},{"id":356,"content":"roadrisk:aftenposten","start":1412788572000,"group":"roadrisk:aftenposten"},{"id":357,"content":"roadrisk:aftenposten","start":1412786396000,"group":"roadrisk:aftenposten"},{"id":358,"content":"roadrisk:aftenposten","start":1412784597000,"group":"roadrisk:aftenposten"},{"id":359,"content":"roadrisk:aftenposten","start":1412784444000,"group":"roadrisk:aftenposten"},{"id":360,"content":"roadrisk:aftenposten","start":1412612279000,"group":"roadrisk:aftenposten"},{"id":361,"content":"roadrisk:aftenposten","start":1412513425000,"group":"roadrisk:aftenposten"},{"id":362,"content":"accident:aftenposten","start":1412450115000,"group":"accident:aftenposten"},{"id":363,"content":"roadrisk:aftenposten","start":1412449982000,"group":"roadrisk:aftenposten"},{"id":364,"content":"roadrisk:aftenposten","start":1412280012000,"group":"roadrisk:aftenposten"},{"id":365,"content":"roadrisk:aftenposten","start":1412256357000,"group":"roadrisk:aftenposten"},{"id":366,"content":"roadrisk:aftenposten","start":1412244708000,"group":"roadrisk:aftenposten"},{"id":367,"content":"roadrisk:aftenposten","start":1412243630000,"group":"roadrisk:aftenposten"},{"id":368,"content":"roadrisk:aftenposten","start":1412238315000,"group":"roadrisk:aftenposten"},{"id":369,"content":"roadrisk:aftenposten","start":1412238114000,"group":"roadrisk:aftenposten"},{"id":370,"content":"accident:aftenposten","start":1412238015000,"group":"accident:aftenposten"},{"id":371,"content":"roadrisk:aftenposten","start":1412159510000,"group":"roadrisk:aftenposten"},{"id":372,"content":"roadrisk:aftenposten","start":1412154149000,"group":"roadrisk:aftenposten"},{"id":373,"content":"roadrisk:aftenposten","start":1412153366000,"group":"roadrisk:aftenposten"},{"id":374,"content":"roadrisk:aftenposten","start":1412153334000,"group":"roadrisk:aftenposten"},{"id":375,"content":"roadrisk:aftenposten","start":1412153046000,"group":"roadrisk:aftenposten"},{"id":376,"content":"roadrisk:aftenposten","start":1412152787000,"group":"roadrisk:aftenposten"},{"id":377,"content":"roadrisk:aftenposten","start":1412151747000,"group":"roadrisk:aftenposten"},{"id":378,"content":"roadrisk:aftenposten","start":1412151563000,"group":"roadrisk:aftenposten"},{"id":379,"content":"roadrisk:aftenposten","start":1412149949000,"group":"roadrisk:aftenposten"},{"id":380,"content":"roadrisk:aftenposten","start":1412149493000,"group":"roadrisk:aftenposten"},{"id":381,"content":"roadrisk:aftenposten","start":1412148363000,"group":"roadrisk:aftenposten"},{"id":382,"content":"roadrisk:aftenposten","start":1412147294000,"group":"roadrisk:aftenposten"},{"id":383,"content":"roadrisk:aftenposten","start":1412147122000,"group":"roadrisk:aftenposten"},{"id":384,"content":"roadrisk:aftenposten","start":1412146886000,"group":"roadrisk:aftenposten"},{"id":385,"content":"roadrisk:aftenposten","start":1412146793000,"group":"roadrisk:aftenposten"},{"id":386,"content":"roadrisk:aftenposten","start":1412145908000,"group":"roadrisk:aftenposten"},{"id":387,"content":"roadrisk:aftenposten","start":1412143276000,"group":"roadrisk:aftenposten"},{"id":388,"content":"roadrisk:aftenposten","start":1412143141000,"group":"roadrisk:aftenposten"},{"id":389,"content":"roadrisk:aftenposten","start":1412113749000,"group":"roadrisk:aftenposten"},{"id":390,"content":"roadrisk:aftenposten","start":1412111211000,"group":"roadrisk:aftenposten"},{"id":391,"content":"roadrisk:aftenposten","start":1412110662000,"group":"roadrisk:aftenposten"},{"id":392,"content":"roadrisk:aftenposten","start":1412104453000,"group":"roadrisk:aftenposten"},{"id":393,"content":"accident:aftenposten","start":1412104142000,"group":"accident:aftenposten"},{"id":394,"content":"roadrisk:aftenposten","start":1412100807000,"group":"roadrisk:aftenposten"},{"id":395,"content":"roadrisk:aftenposten","start":1412100034000,"group":"roadrisk:aftenposten"},{"id":396,"content":"roadrisk:aftenposten","start":1412081767000,"group":"roadrisk:aftenposten"},{"id":397,"content":"roadrisk:aftenposten","start":1412081132000,"group":"roadrisk:aftenposten"},{"id":398,"content":"roadrisk:aftenposten","start":1412016889000,"group":"roadrisk:aftenposten"},{"id":399,"content":"roadrisk:aftenposten","start":1411991530000,"group":"roadrisk:aftenposten"},{"id":400,"content":"roadrisk:aftenposten","start":1411983080000,"group":"roadrisk:aftenposten"},{"id":401,"content":"roadrisk:aftenposten","start":1411982815000,"group":"roadrisk:aftenposten"},{"id":402,"content":"roadrisk:aftenposten","start":1411982674000,"group":"roadrisk:aftenposten"},{"id":403,"content":"roadrisk:aftenposten","start":1411982527000,"group":"roadrisk:aftenposten"},{"id":404,"content":"roadrisk:aftenposten","start":1411978723000,"group":"roadrisk:aftenposten"},{"id":405,"content":"roadrisk:aftenposten","start":1411977641000,"group":"roadrisk:aftenposten"},{"id":406,"content":"roadrisk:aftenposten","start":1411976296000,"group":"roadrisk:aftenposten"},{"id":407,"content":"roadrisk:aftenposten","start":1411934586000,"group":"roadrisk:aftenposten"},{"id":408,"content":"roadrisk:aftenposten","start":1411934005000,"group":"roadrisk:aftenposten"},{"id":409,"content":"accident:aftenposten","start":1411929267000,"group":"accident:aftenposten"},{"id":410,"content":"accident:aftenposten","start":1411921680000,"group":"accident:aftenposten"},{"id":411,"content":"roadrisk:aftenposten","start":1411917893000,"group":"roadrisk:aftenposten"},{"id":412,"content":"accident:aftenposten","start":1411916788000,"group":"accident:aftenposten"},{"id":413,"content":"roadrisk:aftenposten","start":1411916312000,"group":"roadrisk:aftenposten"},{"id":414,"content":"accident:aftenposten","start":1411898971000,"group":"accident:aftenposten"},{"id":415,"content":"accident:aftenposten","start":1411893846000,"group":"accident:aftenposten"},{"id":416,"content":"roadrisk:aftenposten","start":1411893816000,"group":"roadrisk:aftenposten"},{"id":417,"content":"accident:aftenposten","start":1411893642000,"group":"accident:aftenposten"},{"id":418,"content":"roadrisk:aftenposten","start":1411892494000,"group":"roadrisk:aftenposten"},{"id":419,"content":"roadrisk:aftenposten","start":1411892373000,"group":"roadrisk:aftenposten"},{"id":420,"content":"roadrisk:aftenposten","start":1411844392000,"group":"roadrisk:aftenposten"},{"id":421,"content":"roadrisk:aftenposten","start":1411839851000,"group":"roadrisk:aftenposten"},{"id":422,"content":"roadrisk:aftenposten","start":1411839626000,"group":"roadrisk:aftenposten"},{"id":423,"content":"roadrisk:aftenposten","start":1411839350000,"group":"roadrisk:aftenposten"},{"id":424,"content":"accident:aftenposten","start":1411837200000,"group":"accident:aftenposten"},{"id":425,"content":"roadrisk:aftenposten","start":1411834464000,"group":"roadrisk:aftenposten"},{"id":426,"content":"roadrisk:aftenposten","start":1411833906000,"group":"roadrisk:aftenposten"},{"id":427,"content":"roadrisk:aftenposten","start":1411833736000,"group":"roadrisk:aftenposten"},{"id":428,"content":"roadrisk:aftenposten","start":1411833687000,"group":"roadrisk:aftenposten"},{"id":429,"content":"roadrisk:aftenposten","start":1411833500000,"group":"roadrisk:aftenposten"},{"id":430,"content":"accident:aftenposten","start":1411829090000,"group":"accident:aftenposten"},{"id":431,"content":"roadrisk:aftenposten","start":1411822018000,"group":"roadrisk:aftenposten"},{"id":432,"content":"roadrisk:aftenposten","start":1411821864000,"group":"roadrisk:aftenposten"},{"id":433,"content":"roadrisk:aftenposten","start":1411820908000,"group":"roadrisk:aftenposten"},{"id":434,"content":"roadrisk:aftenposten","start":1411819699000,"group":"roadrisk:aftenposten"},{"id":435,"content":"roadrisk:aftenposten","start":1411819552000,"group":"roadrisk:aftenposten"},{"id":436,"content":"roadrisk:aftenposten","start":1411817768000,"group":"roadrisk:aftenposten"},{"id":437,"content":"roadrisk:aftenposten","start":1411817471000,"group":"roadrisk:aftenposten"},{"id":438,"content":"roadrisk:aftenposten","start":1411816962000,"group":"roadrisk:aftenposten"},{"id":439,"content":"roadrisk:aftenposten","start":1411811979000,"group":"roadrisk:aftenposten"},{"id":440,"content":"roadrisk:aftenposten","start":1411811598000,"group":"roadrisk:aftenposten"},{"id":441,"content":"roadrisk:aftenposten","start":1411770399000,"group":"roadrisk:aftenposten"},{"id":442,"content":"accident:aftenposten","start":1411713182000,"group":"accident:aftenposten"},{"id":443,"content":"roadrisk:aftenposten","start":1411712870000,"group":"roadrisk:aftenposten"},{"id":444,"content":"accident:aftenposten","start":1411712516000,"group":"accident:aftenposten"},{"id":445,"content":"roadrisk:aftenposten","start":1411671650000,"group":"roadrisk:aftenposten"},{"id":446,"content":"roadrisk:aftenposten","start":1411671465000,"group":"roadrisk:aftenposten"},{"id":447,"content":"roadrisk:aftenposten","start":1411652094000,"group":"roadrisk:aftenposten"},{"id":448,"content":"accident:aftenposten","start":1411633510000,"group":"accident:aftenposten"},{"id":449,"content":"roadrisk:aftenposten","start":1411631724000,"group":"roadrisk:aftenposten"},{"id":450,"content":"roadrisk:aftenposten","start":1411631390000,"group":"roadrisk:aftenposten"},{"id":451,"content":"roadrisk:aftenposten","start":1411631307000,"group":"roadrisk:aftenposten"},{"id":452,"content":"roadrisk:aftenposten","start":1411631226000,"group":"roadrisk:aftenposten"},{"id":453,"content":"roadrisk:aftenposten","start":1411631046000,"group":"roadrisk:aftenposten"},{"id":454,"content":"roadrisk:aftenposten","start":1411627394000,"group":"roadrisk:aftenposten"},{"id":455,"content":"accident:aftenposten","start":1411598380000,"group":"accident:aftenposten"},{"id":456,"content":"roadrisk:aftenposten","start":1411589999000,"group":"roadrisk:aftenposten"},{"id":457,"content":"roadrisk:aftenposten","start":1411589719000,"group":"roadrisk:aftenposten"},{"id":458,"content":"accident:aftenposten","start":1411589477000,"group":"accident:aftenposten"},{"id":459,"content":"roadrisk:aftenposten","start":1411589414000,"group":"roadrisk:aftenposten"},{"id":460,"content":"roadrisk:aftenposten","start":1411588396000,"group":"roadrisk:aftenposten"},{"id":461,"content":"roadrisk:aftenposten","start":1411588175000,"group":"roadrisk:aftenposten"},{"id":462,"content":"roadrisk:aftenposten","start":1411565121000,"group":"roadrisk:aftenposten"},{"id":463,"content":"roadrisk:aftenposten","start":1411562916000,"group":"roadrisk:aftenposten"},{"id":464,"content":"roadrisk:aftenposten","start":1411562084000,"group":"roadrisk:aftenposten"},{"id":465,"content":"roadrisk:aftenposten","start":1411561982000,"group":"roadrisk:aftenposten"},{"id":466,"content":"roadrisk:aftenposten","start":1411559179000,"group":"roadrisk:aftenposten"},{"id":467,"content":"roadrisk:aftenposten","start":1411556664000,"group":"roadrisk:aftenposten"},{"id":468,"content":"roadrisk:aftenposten","start":1411547847000,"group":"roadrisk:aftenposten"},{"id":469,"content":"roadrisk:aftenposten","start":1411547720000,"group":"roadrisk:aftenposten"},{"id":470,"content":"accident:aftenposten","start":1411540796000,"group":"accident:aftenposten"},{"id":471,"content":"roadrisk:aftenposten","start":1411539685000,"group":"roadrisk:aftenposten"},{"id":472,"content":"roadrisk:aftenposten","start":1411508441000,"group":"roadrisk:aftenposten"},{"id":473,"content":"roadrisk:aftenposten","start":1411505003000,"group":"roadrisk:aftenposten"},{"id":474,"content":"roadrisk:aftenposten","start":1411504736000,"group":"roadrisk:aftenposten"},{"id":475,"content":"roadrisk:aftenposten","start":1411504536000,"group":"roadrisk:aftenposten"},{"id":476,"content":"roadrisk:aftenposten","start":1411501540000,"group":"roadrisk:aftenposten"},{"id":477,"content":"roadrisk:aftenposten","start":1411501203000,"group":"roadrisk:aftenposten"},{"id":478,"content":"roadrisk:aftenposten","start":1411499348000,"group":"roadrisk:aftenposten"},{"id":479,"content":"roadrisk:aftenposten","start":1411499076000,"group":"roadrisk:aftenposten"},{"id":480,"content":"roadrisk:aftenposten","start":1411498905000,"group":"roadrisk:aftenposten"},{"id":481,"content":"roadrisk:aftenposten","start":1411498756000,"group":"roadrisk:aftenposten"},{"id":482,"content":"roadrisk:aftenposten","start":1411498645000,"group":"roadrisk:aftenposten"},{"id":483,"content":"roadrisk:aftenposten","start":1411498409000,"group":"roadrisk:aftenposten"},{"id":484,"content":"roadrisk:aftenposten","start":1411495128000,"group":"roadrisk:aftenposten"},{"id":485,"content":"roadrisk:aftenposten","start":1411489875000,"group":"roadrisk:aftenposten"},{"id":486,"content":"roadrisk:aftenposten","start":1411478168000,"group":"roadrisk:aftenposten"},{"id":487,"content":"roadrisk:aftenposten","start":1411477800000,"group":"roadrisk:aftenposten"},{"id":488,"content":"accident:aftenposten","start":1411477677000,"group":"accident:aftenposten"},{"id":489,"content":"roadrisk:aftenposten","start":1411471891000,"group":"roadrisk:aftenposten"},{"id":490,"content":"roadrisk:aftenposten","start":1411471873000,"group":"roadrisk:aftenposten"},{"id":491,"content":"roadrisk:aftenposten","start":1411470394000,"group":"roadrisk:aftenposten"},{"id":492,"content":"roadrisk:aftenposten","start":1411461858000,"group":"roadrisk:aftenposten"},{"id":493,"content":"roadrisk:aftenposten","start":1411460062000,"group":"roadrisk:aftenposten"},{"id":494,"content":"roadrisk:aftenposten","start":1411459466000,"group":"roadrisk:aftenposten"},{"id":495,"content":"roadrisk:aftenposten","start":1411459391000,"group":"roadrisk:aftenposten"},{"id":496,"content":"roadrisk:aftenposten","start":1411459278000,"group":"roadrisk:aftenposten"},{"id":497,"content":"roadrisk:aftenposten","start":1411459095000,"group":"roadrisk:aftenposten"},{"id":498,"content":"roadrisk:aftenposten","start":1411458912000,"group":"roadrisk:aftenposten"},{"id":499,"content":"roadrisk:aftenposten","start":1411458868000,"group":"roadrisk:aftenposten"},{"id":500,"content":"roadrisk:aftenposten","start":1411458653000,"group":"roadrisk:aftenposten"},{"id":501,"content":"accident:aftenposten","start":1411458169000,"group":"accident:aftenposten"},{"id":502,"content":"roadrisk:aftenposten","start":1411457623000,"group":"roadrisk:aftenposten"},{"id":503,"content":"roadrisk:aftenposten","start":1411457446000,"group":"roadrisk:aftenposten"},{"id":504,"content":"roadrisk:aftenposten","start":1411457138000,"group":"roadrisk:aftenposten"},{"id":505,"content":"roadrisk:aftenposten","start":1411428988000,"group":"roadrisk:aftenposten"},{"id":506,"content":"roadrisk:aftenposten","start":1411408549000,"group":"roadrisk:aftenposten"},{"id":507,"content":"roadrisk:aftenposten","start":1411405222000,"group":"roadrisk:aftenposten"},{"id":508,"content":"roadrisk:aftenposten","start":1411402921000,"group":"roadrisk:aftenposten"},{"id":509,"content":"roadrisk:aftenposten","start":1411402820000,"group":"roadrisk:aftenposten"},{"id":510,"content":"roadrisk:aftenposten","start":1411402390000,"group":"roadrisk:aftenposten"},{"id":511,"content":"roadrisk:aftenposten","start":1411400059000,"group":"roadrisk:aftenposten"},{"id":512,"content":"roadrisk:aftenposten","start":1411394720000,"group":"roadrisk:aftenposten"},{"id":513,"content":"roadrisk:aftenposten","start":1411394586000,"group":"roadrisk:aftenposten"},{"id":514,"content":"roadrisk:aftenposten","start":1411394466000,"group":"roadrisk:aftenposten"},{"id":515,"content":"roadrisk:aftenposten","start":1411382303000,"group":"roadrisk:aftenposten"},{"id":516,"content":"roadrisk:aftenposten","start":1411380125000,"group":"roadrisk:aftenposten"},{"id":517,"content":"roadrisk:aftenposten","start":1411375287000,"group":"roadrisk:aftenposten"},{"id":518,"content":"roadrisk:aftenposten","start":1411373064000,"group":"roadrisk:aftenposten"},{"id":519,"content":"roadrisk:aftenposten","start":1411372897000,"group":"roadrisk:aftenposten"},{"id":520,"content":"roadrisk:aftenposten","start":1411371721000,"group":"roadrisk:aftenposten"},{"id":521,"content":"roadrisk:aftenposten","start":1411371583000,"group":"roadrisk:aftenposten"},{"id":522,"content":"roadrisk:aftenposten","start":1411371570000,"group":"roadrisk:aftenposten"},{"id":523,"content":"roadrisk:aftenposten","start":1411371361000,"group":"roadrisk:aftenposten"},{"id":524,"content":"roadrisk:aftenposten","start":1411370341000,"group":"roadrisk:aftenposten"},{"id":525,"content":"roadrisk:aftenposten","start":1411336670000,"group":"roadrisk:aftenposten"},{"id":526,"content":"accident:aftenposten","start":1411333883000,"group":"accident:aftenposten"},{"id":527,"content":"accident:aftenposten","start":1411333310000,"group":"accident:aftenposten"},{"id":528,"content":"accident:aftenposten","start":1411332547000,"group":"accident:aftenposten"},{"id":529,"content":"roadrisk:aftenposten","start":1411331960000,"group":"roadrisk:aftenposten"},{"id":530,"content":"roadrisk:aftenposten","start":1411331749000,"group":"roadrisk:aftenposten"},{"id":531,"content":"accident:aftenposten","start":1411331597000,"group":"accident:aftenposten"},{"id":532,"content":"roadrisk:aftenposten","start":1411331320000,"group":"roadrisk:aftenposten"},{"id":533,"content":"roadrisk:aftenposten","start":1411330266000,"group":"roadrisk:aftenposten"},{"id":534,"content":"roadrisk:aftenposten","start":1411327924000,"group":"roadrisk:aftenposten"},{"id":535,"content":"roadrisk:aftenposten","start":1411326377000,"group":"roadrisk:aftenposten"},{"id":536,"content":"roadrisk:aftenposten","start":1411326126000,"group":"roadrisk:aftenposten"},{"id":537,"content":"roadrisk:aftenposten","start":1411325573000,"group":"roadrisk:aftenposten"},{"id":538,"content":"roadrisk:aftenposten","start":1411325512000,"group":"roadrisk:aftenposten"},{"id":539,"content":"roadrisk:aftenposten","start":1411324850000,"group":"roadrisk:aftenposten"},{"id":540,"content":"roadrisk:aftenposten","start":1411318876000,"group":"roadrisk:aftenposten"},{"id":541,"content":"roadrisk:aftenposten","start":1411316636000,"group":"roadrisk:aftenposten"},{"id":542,"content":"roadrisk:aftenposten","start":1411315194000,"group":"roadrisk:aftenposten"},{"id":543,"content":"roadrisk:aftenposten","start":1411312260000,"group":"roadrisk:aftenposten"},{"id":544,"content":"roadrisk:aftenposten","start":1411311745000,"group":"roadrisk:aftenposten"},{"id":545,"content":"roadrisk:aftenposten","start":1411308781000,"group":"roadrisk:aftenposten"},{"id":546,"content":"roadrisk:aftenposten","start":1411307717000,"group":"roadrisk:aftenposten"},{"id":547,"content":"roadrisk:aftenposten","start":1411307335000,"group":"roadrisk:aftenposten"},{"id":548,"content":"roadrisk:aftenposten","start":1411307167000,"group":"roadrisk:aftenposten"},{"id":549,"content":"roadrisk:aftenposten","start":1411307140000,"group":"roadrisk:aftenposten"},{"id":550,"content":"roadrisk:aftenposten","start":1411305140000,"group":"roadrisk:aftenposten"},{"id":551,"content":"accident:aftenposten","start":1411303633000,"group":"accident:aftenposten"},{"id":552,"content":"roadrisk:aftenposten","start":1411301801000,"group":"roadrisk:aftenposten"},{"id":553,"content":"accident:aftenposten","start":1411300813000,"group":"accident:aftenposten"},{"id":554,"content":"roadrisk:aftenposten","start":1411300382000,"group":"roadrisk:aftenposten"},{"id":555,"content":"roadrisk:aftenposten","start":1411300019000,"group":"roadrisk:aftenposten"},{"id":556,"content":"roadrisk:aftenposten","start":1411299856000,"group":"roadrisk:aftenposten"},{"id":557,"content":"roadrisk:aftenposten","start":1411299669000,"group":"roadrisk:aftenposten"},{"id":558,"content":"roadrisk:aftenposten","start":1411299604000,"group":"roadrisk:aftenposten"},{"id":559,"content":"roadrisk:aftenposten","start":1411299490000,"group":"roadrisk:aftenposten"},{"id":560,"content":"roadrisk:aftenposten","start":1411299465000,"group":"roadrisk:aftenposten"},{"id":561,"content":"accident:aftenposten","start":1411299341000,"group":"accident:aftenposten"},{"id":562,"content":"roadrisk:aftenposten","start":1411299300000,"group":"roadrisk:aftenposten"},{"id":563,"content":"accident:aftenposten","start":1411299165000,"group":"accident:aftenposten"},{"id":564,"content":"roadrisk:aftenposten","start":1411298886000,"group":"roadrisk:aftenposten"},{"id":565,"content":"roadrisk:aftenposten","start":1411298582000,"group":"roadrisk:aftenposten"},{"id":566,"content":"roadrisk:aftenposten","start":1411298561000,"group":"roadrisk:aftenposten"},{"id":567,"content":"roadrisk:aftenposten","start":1411298393000,"group":"roadrisk:aftenposten"},{"id":568,"content":"roadrisk:aftenposten","start":1411298352000,"group":"roadrisk:aftenposten"},{"id":569,"content":"roadrisk:aftenposten","start":1411297994000,"group":"roadrisk:aftenposten"},{"id":570,"content":"accident:aftenposten","start":1411297579000,"group":"accident:aftenposten"},{"id":571,"content":"accident:aftenposten","start":1411297097000,"group":"accident:aftenposten"},{"id":572,"content":"accident:aftenposten","start":1411296582000,"group":"accident:aftenposten"},{"id":573,"content":"roadrisk:aftenposten","start":1411296299000,"group":"roadrisk:aftenposten"},{"id":574,"content":"roadrisk:aftenposten","start":1411294831000,"group":"roadrisk:aftenposten"},{"id":575,"content":"accident:aftenposten","start":1411294403000,"group":"accident:aftenposten"},{"id":576,"content":"roadrisk:aftenposten","start":1411292387000,"group":"roadrisk:aftenposten"},{"id":577,"content":"roadrisk:aftenposten","start":1411292274000,"group":"roadrisk:aftenposten"},{"id":578,"content":"accident:aftenposten","start":1411292120000,"group":"accident:aftenposten"},{"id":579,"content":"accident:aftenposten","start":1411291876000,"group":"accident:aftenposten"},{"id":580,"content":"roadrisk:aftenposten","start":1411291802000,"group":"roadrisk:aftenposten"},{"id":581,"content":"roadrisk:aftenposten","start":1411291751000,"group":"roadrisk:aftenposten"},{"id":582,"content":"roadrisk:aftenposten","start":1411291324000,"group":"roadrisk:aftenposten"},{"id":583,"content":"roadrisk:aftenposten","start":1411290865000,"group":"roadrisk:aftenposten"},{"id":584,"content":"roadrisk:aftenposten","start":1411290661000,"group":"roadrisk:aftenposten"},{"id":585,"content":"accident:aftenposten","start":1411290586000,"group":"accident:aftenposten"},{"id":586,"content":"accident:aftenposten","start":1411290509000,"group":"accident:aftenposten"},{"id":587,"content":"roadrisk:aftenposten","start":1411290118000,"group":"roadrisk:aftenposten"},{"id":588,"content":"roadrisk:aftenposten","start":1411290022000,"group":"roadrisk:aftenposten"},{"id":589,"content":"roadrisk:aftenposten","start":1411289865000,"group":"roadrisk:aftenposten"},{"id":590,"content":"roadrisk:aftenposten","start":1411289563000,"group":"roadrisk:aftenposten"},{"id":591,"content":"roadrisk:aftenposten","start":1411289463000,"group":"roadrisk:aftenposten"},{"id":592,"content":"roadrisk:aftenposten","start":1411289280000,"group":"roadrisk:aftenposten"},{"id":593,"content":"accident:aftenposten","start":1411289116000,"group":"accident:aftenposten"},{"id":594,"content":"roadrisk:aftenposten","start":1411289028000,"group":"roadrisk:aftenposten"},{"id":595,"content":"roadrisk:aftenposten","start":1411288851000,"group":"roadrisk:aftenposten"},{"id":596,"content":"roadrisk:aftenposten","start":1411288565000,"group":"roadrisk:aftenposten"},{"id":597,"content":"roadrisk:aftenposten","start":1411288171000,"group":"roadrisk:aftenposten"},{"id":598,"content":"roadrisk:aftenposten","start":1411287923000,"group":"roadrisk:aftenposten"},{"id":599,"content":"roadrisk:aftenposten","start":1411287778000,"group":"roadrisk:aftenposten"},{"id":600,"content":"roadrisk:aftenposten","start":1411287487000,"group":"roadrisk:aftenposten"},{"id":601,"content":"roadrisk:aftenposten","start":1411286488000,"group":"roadrisk:aftenposten"},{"id":602,"content":"roadrisk:aftenposten","start":1411286485000,"group":"roadrisk:aftenposten"},{"id":603,"content":"roadrisk:aftenposten","start":1411286377000,"group":"roadrisk:aftenposten"},{"id":604,"content":"roadrisk:aftenposten","start":1411286198000,"group":"roadrisk:aftenposten"},{"id":605,"content":"roadrisk:aftenposten","start":1411286193000,"group":"roadrisk:aftenposten"},{"id":606,"content":"roadrisk:aftenposten","start":1411286134000,"group":"roadrisk:aftenposten"},{"id":607,"content":"roadrisk:aftenposten","start":1411285971000,"group":"roadrisk:aftenposten"},{"id":608,"content":"roadrisk:aftenposten","start":1411285736000,"group":"roadrisk:aftenposten"},{"id":609,"content":"roadrisk:aftenposten","start":1411285693000,"group":"roadrisk:aftenposten"},{"id":610,"content":"roadrisk:aftenposten","start":1411285516000,"group":"roadrisk:aftenposten"},{"id":611,"content":"roadrisk:aftenposten","start":1411285215000,"group":"roadrisk:aftenposten"},{"id":612,"content":"accident:aftenposten","start":1411284459000,"group":"accident:aftenposten"},{"id":613,"content":"roadrisk:aftenposten","start":1411282925000,"group":"roadrisk:aftenposten"},{"id":614,"content":"accident:aftenposten","start":1411282910000,"group":"accident:aftenposten"},{"id":615,"content":"roadrisk:aftenposten","start":1411282455000,"group":"roadrisk:aftenposten"},{"id":616,"content":"roadrisk:aftenposten","start":1411282088000,"group":"roadrisk:aftenposten"},{"id":617,"content":"roadrisk:aftenposten","start":1411281728000,"group":"roadrisk:aftenposten"},{"id":618,"content":"roadrisk:aftenposten","start":1411281357000,"group":"roadrisk:aftenposten"},{"id":619,"content":"roadrisk:aftenposten","start":1411281207000,"group":"roadrisk:aftenposten"},{"id":620,"content":"roadrisk:aftenposten","start":1411279708000,"group":"roadrisk:aftenposten"},{"id":621,"content":"roadrisk:aftenposten","start":1411254774000,"group":"roadrisk:aftenposten"},{"id":622,"content":"roadrisk:aftenposten","start":1411250973000,"group":"roadrisk:aftenposten"},{"id":623,"content":"roadrisk:aftenposten","start":1411247865000,"group":"roadrisk:aftenposten"},{"id":624,"content":"roadrisk:aftenposten","start":1411238382000,"group":"roadrisk:aftenposten"},{"id":625,"content":"roadrisk:aftenposten","start":1411237104000,"group":"roadrisk:aftenposten"},{"id":626,"content":"roadrisk:aftenposten","start":1411236949000,"group":"roadrisk:aftenposten"},{"id":627,"content":"accident:aftenposten","start":1411227816000,"group":"accident:aftenposten"},{"id":628,"content":"roadrisk:aftenposten","start":1411225594000,"group":"roadrisk:aftenposten"},{"id":629,"content":"roadrisk:aftenposten","start":1411225284000,"group":"roadrisk:aftenposten"},{"id":630,"content":"roadrisk:aftenposten","start":1411223045000,"group":"roadrisk:aftenposten"},{"id":631,"content":"roadrisk:aftenposten","start":1411222457000,"group":"roadrisk:aftenposten"},{"id":632,"content":"roadrisk:aftenposten","start":1411216287000,"group":"roadrisk:aftenposten"},{"id":633,"content":"roadrisk:aftenposten","start":1411215971000,"group":"roadrisk:aftenposten"},{"id":634,"content":"roadrisk:aftenposten","start":1411215948000,"group":"roadrisk:aftenposten"},{"id":635,"content":"roadrisk:aftenposten","start":1411213899000,"group":"roadrisk:aftenposten"},{"id":636,"content":"roadrisk:aftenposten","start":1411209402000,"group":"roadrisk:aftenposten"},{"id":637,"content":"roadrisk:aftenposten","start":1411207519000,"group":"roadrisk:aftenposten"},{"id":638,"content":"accident:aftenposten","start":1411201802000,"group":"accident:aftenposten"},{"id":639,"content":"roadrisk:aftenposten","start":1411197818000,"group":"roadrisk:aftenposten"},{"id":640,"content":"roadrisk:aftenposten","start":1411177331000,"group":"roadrisk:aftenposten"},{"id":641,"content":"roadrisk:aftenposten","start":1411149592000,"group":"roadrisk:aftenposten"},{"id":642,"content":"roadrisk:aftenposten","start":1411149499000,"group":"roadrisk:aftenposten"},{"id":643,"content":"roadrisk:aftenposten","start":1411149392000,"group":"roadrisk:aftenposten"},{"id":644,"content":"roadrisk:aftenposten","start":1411149118000,"group":"roadrisk:aftenposten"},{"id":645,"content":"roadrisk:aftenposten","start":1411148947000,"group":"roadrisk:aftenposten"},{"id":646,"content":"accident:aftenposten","start":1411147391000,"group":"accident:aftenposten"},{"id":647,"content":"roadrisk:aftenposten","start":1411147306000,"group":"roadrisk:aftenposten"},{"id":648,"content":"roadrisk:aftenposten","start":1411147170000,"group":"roadrisk:aftenposten"},{"id":649,"content":"roadrisk:aftenposten","start":1411142311000,"group":"roadrisk:aftenposten"},{"id":650,"content":"roadrisk:aftenposten","start":1411137994000,"group":"roadrisk:aftenposten"},{"id":651,"content":"roadrisk:aftenposten","start":1411137775000,"group":"roadrisk:aftenposten"},{"id":652,"content":"accident:aftenposten","start":1411137579000,"group":"accident:aftenposten"},{"id":653,"content":"roadrisk:aftenposten","start":1411136754000,"group":"roadrisk:aftenposten"},{"id":654,"content":"roadrisk:aftenposten","start":1411136522000,"group":"roadrisk:aftenposten"},{"id":655,"content":"roadrisk:aftenposten","start":1411134165000,"group":"roadrisk:aftenposten"},{"id":656,"content":"roadrisk:aftenposten","start":1411131041000,"group":"roadrisk:aftenposten"},{"id":657,"content":"accident:aftenposten","start":1411130888000,"group":"accident:aftenposten"},{"id":658,"content":"roadrisk:aftenposten","start":1411128309000,"group":"roadrisk:aftenposten"},{"id":659,"content":"roadrisk:aftenposten","start":1411125208000,"group":"roadrisk:aftenposten"},{"id":660,"content":"roadrisk:aftenposten","start":1411124930000,"group":"roadrisk:aftenposten"},{"id":661,"content":"roadrisk:aftenposten","start":1411123168000,"group":"roadrisk:aftenposten"},{"id":662,"content":"accident:aftenposten","start":1411120505000,"group":"accident:aftenposten"},{"id":663,"content":"roadrisk:aftenposten","start":1411120353000,"group":"roadrisk:aftenposten"},{"id":664,"content":"roadrisk:aftenposten","start":1411119256000,"group":"roadrisk:aftenposten"},{"id":665,"content":"roadrisk:aftenposten","start":1411116848000,"group":"roadrisk:aftenposten"},{"id":666,"content":"roadrisk:aftenposten","start":1411115895000,"group":"roadrisk:aftenposten"},{"id":667,"content":"roadrisk:aftenposten","start":1411115546000,"group":"roadrisk:aftenposten"},{"id":668,"content":"roadrisk:aftenposten","start":1411114742000,"group":"roadrisk:aftenposten"},{"id":669,"content":"roadrisk:aftenposten","start":1411113484000,"group":"roadrisk:aftenposten"},{"id":670,"content":"roadrisk:aftenposten","start":1411113298000,"group":"roadrisk:aftenposten"},{"id":671,"content":"roadrisk:aftenposten","start":1411113012000,"group":"roadrisk:aftenposten"},{"id":672,"content":"roadrisk:aftenposten","start":1411112799000,"group":"roadrisk:aftenposten"},{"id":673,"content":"roadrisk:aftenposten","start":1411112201000,"group":"roadrisk:aftenposten"},{"id":674,"content":"roadrisk:aftenposten","start":1411111594000,"group":"roadrisk:aftenposten"},{"id":675,"content":"accident:aftenposten","start":1411110769000,"group":"accident:aftenposten"},{"id":676,"content":"roadrisk:aftenposten","start":1411110724000,"group":"roadrisk:aftenposten"},{"id":677,"content":"accident:aftenposten","start":1411106711000,"group":"accident:aftenposten"},{"id":678,"content":"accident:aftenposten","start":1411080270000,"group":"accident:aftenposten"},{"id":679,"content":"accident:aftenposten","start":1411076661000,"group":"accident:aftenposten"},{"id":680,"content":"roadrisk:aftenposten","start":1411075455000,"group":"roadrisk:aftenposten"},{"id":681,"content":"roadrisk:aftenposten","start":1411074549000,"group":"roadrisk:aftenposten"},{"id":682,"content":"roadrisk:aftenposten","start":1411074334000,"group":"roadrisk:aftenposten"},{"id":683,"content":"roadrisk:aftenposten","start":1411073354000,"group":"roadrisk:aftenposten"},{"id":684,"content":"roadrisk:aftenposten","start":1411072263000,"group":"roadrisk:aftenposten"},{"id":685,"content":"roadrisk:aftenposten","start":1411071793000,"group":"roadrisk:aftenposten"},{"id":686,"content":"roadrisk:aftenposten","start":1411070635000,"group":"roadrisk:aftenposten"},{"id":687,"content":"roadrisk:aftenposten","start":1411069988000,"group":"roadrisk:aftenposten"},{"id":688,"content":"roadrisk:aftenposten","start":1411067916000,"group":"roadrisk:aftenposten"},{"id":689,"content":"roadrisk:aftenposten","start":1411067756000,"group":"roadrisk:aftenposten"},{"id":690,"content":"accident:aftenposten","start":1411067218000,"group":"accident:aftenposten"},{"id":691,"content":"roadrisk:aftenposten","start":1411065537000,"group":"roadrisk:aftenposten"},{"id":692,"content":"roadrisk:aftenposten","start":1411064990000,"group":"roadrisk:aftenposten"},{"id":693,"content":"accident:aftenposten","start":1411064402000,"group":"accident:aftenposten"},{"id":694,"content":"roadrisk:aftenposten","start":1411062217000,"group":"roadrisk:aftenposten"},{"id":695,"content":"roadrisk:aftenposten","start":1411062153000,"group":"roadrisk:aftenposten"},{"id":696,"content":"roadrisk:aftenposten","start":1411061651000,"group":"roadrisk:aftenposten"},{"id":697,"content":"roadrisk:aftenposten","start":1411060845000,"group":"roadrisk:aftenposten"},{"id":698,"content":"roadrisk:aftenposten","start":1411060720000,"group":"roadrisk:aftenposten"},{"id":699,"content":"roadrisk:aftenposten","start":1411060625000,"group":"roadrisk:aftenposten"},{"id":700,"content":"roadrisk:aftenposten","start":1411060500000,"group":"roadrisk:aftenposten"},{"id":701,"content":"roadrisk:aftenposten","start":1411060340000,"group":"roadrisk:aftenposten"},{"id":702,"content":"roadrisk:aftenposten","start":1411057918000,"group":"roadrisk:aftenposten"},{"id":703,"content":"roadrisk:aftenposten","start":1411055471000,"group":"roadrisk:aftenposten"},{"id":704,"content":"roadrisk:aftenposten","start":1411054723000,"group":"roadrisk:aftenposten"},{"id":705,"content":"roadrisk:aftenposten","start":1411054255000,"group":"roadrisk:aftenposten"},{"id":706,"content":"roadrisk:aftenposten","start":1411053661000,"group":"roadrisk:aftenposten"},{"id":707,"content":"roadrisk:aftenposten","start":1411053074000,"group":"roadrisk:aftenposten"},{"id":708,"content":"roadrisk:aftenposten","start":1411052963000,"group":"roadrisk:aftenposten"},{"id":709,"content":"roadrisk:aftenposten","start":1411050147000,"group":"roadrisk:aftenposten"},{"id":710,"content":"roadrisk:aftenposten","start":1411049117000,"group":"roadrisk:aftenposten"},{"id":711,"content":"roadrisk:aftenposten","start":1411047624000,"group":"roadrisk:aftenposten"},{"id":712,"content":"roadrisk:aftenposten","start":1411046535000,"group":"roadrisk:aftenposten"},{"id":713,"content":"roadrisk:aftenposten","start":1411045720000,"group":"roadrisk:aftenposten"},{"id":714,"content":"roadrisk:aftenposten","start":1411045415000,"group":"roadrisk:aftenposten"},{"id":715,"content":"roadrisk:aftenposten","start":1411045255000,"group":"roadrisk:aftenposten"},{"id":716,"content":"roadrisk:aftenposten","start":1411044926000,"group":"roadrisk:aftenposten"},{"id":717,"content":"roadrisk:aftenposten","start":1411044749000,"group":"roadrisk:aftenposten"},{"id":718,"content":"roadrisk:aftenposten","start":1411044736000,"group":"roadrisk:aftenposten"},{"id":719,"content":"roadrisk:aftenposten","start":1411044571000,"group":"roadrisk:aftenposten"},{"id":720,"content":"roadrisk:aftenposten","start":1411044464000,"group":"roadrisk:aftenposten"},{"id":721,"content":"roadrisk:aftenposten","start":1411044413000,"group":"roadrisk:aftenposten"},{"id":722,"content":"roadrisk:aftenposten","start":1411044181000,"group":"roadrisk:aftenposten"},{"id":723,"content":"roadrisk:aftenposten","start":1411044031000,"group":"roadrisk:aftenposten"},{"id":724,"content":"roadrisk:aftenposten","start":1411043801000,"group":"roadrisk:aftenposten"},{"id":725,"content":"roadrisk:aftenposten","start":1411041249000,"group":"roadrisk:aftenposten"},{"id":726,"content":"roadrisk:aftenposten","start":1411039243000,"group":"roadrisk:aftenposten"},{"id":727,"content":"roadrisk:aftenposten","start":1411038957000,"group":"roadrisk:aftenposten"},{"id":728,"content":"roadrisk:aftenposten","start":1411038003000,"group":"roadrisk:aftenposten"},{"id":729,"content":"roadrisk:aftenposten","start":1411028534000,"group":"roadrisk:aftenposten"},{"id":730,"content":"roadrisk:aftenposten","start":1411015367000,"group":"roadrisk:aftenposten"},{"id":731,"content":"roadrisk:aftenposten","start":1410982741000,"group":"roadrisk:aftenposten"},{"id":732,"content":"roadrisk:aftenposten","start":1410982316000,"group":"roadrisk:aftenposten"},{"id":733,"content":"roadrisk:aftenposten","start":1410979022000,"group":"roadrisk:aftenposten"},{"id":734,"content":"roadrisk:aftenposten","start":1410978675000,"group":"roadrisk:aftenposten"},{"id":735,"content":"roadrisk:aftenposten","start":1410976293000,"group":"roadrisk:aftenposten"},{"id":736,"content":"roadrisk:aftenposten","start":1410975486000,"group":"roadrisk:aftenposten"},{"id":737,"content":"roadrisk:aftenposten","start":1410972009000,"group":"roadrisk:aftenposten"},{"id":738,"content":"roadrisk:aftenposten","start":1410968941000,"group":"roadrisk:aftenposten"},{"id":739,"content":"roadrisk:aftenposten","start":1410956246000,"group":"roadrisk:aftenposten"},{"id":740,"content":"roadrisk:aftenposten","start":1410955194000,"group":"roadrisk:aftenposten"},{"id":741,"content":"roadrisk:aftenposten","start":1410954661000,"group":"roadrisk:aftenposten"},{"id":742,"content":"roadrisk:aftenposten","start":1410954527000,"group":"roadrisk:aftenposten"},{"id":743,"content":"roadrisk:aftenposten","start":1410946089000,"group":"roadrisk:aftenposten"},{"id":744,"content":"accident:aftenposten","start":1410944327000,"group":"accident:aftenposten"},{"id":745,"content":"roadrisk:aftenposten","start":1410939176000,"group":"roadrisk:aftenposten"},{"id":746,"content":"roadrisk:aftenposten","start":1410938838000,"group":"roadrisk:aftenposten"},{"id":747,"content":"accident:aftenposten","start":1410937995000,"group":"accident:aftenposten"},{"id":748,"content":"accident:aftenposten","start":1410937804000,"group":"accident:aftenposten"},{"id":749,"content":"roadrisk:aftenposten","start":1410936919000,"group":"roadrisk:aftenposten"},{"id":750,"content":"roadrisk:aftenposten","start":1410936873000,"group":"roadrisk:aftenposten"},{"id":751,"content":"roadrisk:aftenposten","start":1410936527000,"group":"roadrisk:aftenposten"},{"id":752,"content":"roadrisk:aftenposten","start":1410936376000,"group":"roadrisk:aftenposten"},{"id":753,"content":"roadrisk:aftenposten","start":1410903499000,"group":"roadrisk:aftenposten"},{"id":754,"content":"accident:aftenposten","start":1410899375000,"group":"accident:aftenposten"},{"id":755,"content":"accident:aftenposten","start":1410898199000,"group":"accident:aftenposten"},{"id":756,"content":"roadrisk:aftenposten","start":1410898183000,"group":"roadrisk:aftenposten"},{"id":757,"content":"roadrisk:aftenposten","start":1410891883000,"group":"roadrisk:aftenposten"},{"id":758,"content":"roadrisk:aftenposten","start":1410890026000,"group":"roadrisk:aftenposten"},{"id":759,"content":"roadrisk:aftenposten","start":1410888474000,"group":"roadrisk:aftenposten"},{"id":760,"content":"accident:aftenposten","start":1410888370000,"group":"accident:aftenposten"},{"id":761,"content":"roadrisk:aftenposten","start":1410885988000,"group":"roadrisk:aftenposten"},{"id":762,"content":"roadrisk:aftenposten","start":1410885639000,"group":"roadrisk:aftenposten"},{"id":763,"content":"roadrisk:aftenposten","start":1410885563000,"group":"roadrisk:aftenposten"},{"id":764,"content":"roadrisk:aftenposten","start":1410885426000,"group":"roadrisk:aftenposten"},{"id":765,"content":"roadrisk:aftenposten","start":1410885248000,"group":"roadrisk:aftenposten"},{"id":766,"content":"roadrisk:aftenposten","start":1410885219000,"group":"roadrisk:aftenposten"},{"id":767,"content":"roadrisk:aftenposten","start":1410882900000,"group":"roadrisk:aftenposten"},{"id":768,"content":"roadrisk:aftenposten","start":1410879962000,"group":"roadrisk:aftenposten"},{"id":769,"content":"roadrisk:aftenposten","start":1410878831000,"group":"roadrisk:aftenposten"},{"id":770,"content":"roadrisk:aftenposten","start":1410878359000,"group":"roadrisk:aftenposten"},{"id":771,"content":"roadrisk:aftenposten","start":1410877796000,"group":"roadrisk:aftenposten"},{"id":772,"content":"roadrisk:aftenposten","start":1410877746000,"group":"roadrisk:aftenposten"},{"id":773,"content":"roadrisk:aftenposten","start":1410877451000,"group":"roadrisk:aftenposten"},{"id":774,"content":"roadrisk:aftenposten","start":1410876623000,"group":"roadrisk:aftenposten"},{"id":775,"content":"roadrisk:aftenposten","start":1410876144000,"group":"roadrisk:aftenposten"},{"id":776,"content":"roadrisk:aftenposten","start":1410875968000,"group":"roadrisk:aftenposten"},{"id":777,"content":"roadrisk:aftenposten","start":1410875411000,"group":"roadrisk:aftenposten"},{"id":778,"content":"roadrisk:aftenposten","start":1410874656000,"group":"roadrisk:aftenposten"},{"id":779,"content":"roadrisk:aftenposten","start":1410874459000,"group":"roadrisk:aftenposten"},{"id":780,"content":"roadrisk:aftenposten","start":1410873323000,"group":"roadrisk:aftenposten"},{"id":781,"content":"accident:aftenposten","start":1410869939000,"group":"accident:aftenposten"},{"id":782,"content":"roadrisk:aftenposten","start":1410869449000,"group":"roadrisk:aftenposten"},{"id":783,"content":"roadrisk:aftenposten","start":1410868249000,"group":"roadrisk:aftenposten"},{"id":784,"content":"roadrisk:aftenposten","start":1410865952000,"group":"roadrisk:aftenposten"},{"id":785,"content":"roadrisk:aftenposten","start":1410865151000,"group":"roadrisk:aftenposten"},{"id":786,"content":"roadrisk:aftenposten","start":1410865139000,"group":"roadrisk:aftenposten"},{"id":787,"content":"roadrisk:aftenposten","start":1410865062000,"group":"roadrisk:aftenposten"},{"id":788,"content":"roadrisk:aftenposten","start":1410865010000,"group":"roadrisk:aftenposten"},{"id":789,"content":"roadrisk:aftenposten","start":1410864128000,"group":"roadrisk:aftenposten"},{"id":790,"content":"roadrisk:aftenposten","start":1410863808000,"group":"roadrisk:aftenposten"},{"id":791,"content":"roadrisk:aftenposten","start":1410863647000,"group":"roadrisk:aftenposten"},{"id":792,"content":"roadrisk:aftenposten","start":1410863404000,"group":"roadrisk:aftenposten"},{"id":793,"content":"roadrisk:aftenposten","start":1410863247000,"group":"roadrisk:aftenposten"},{"id":794,"content":"roadrisk:aftenposten","start":1410861655000,"group":"roadrisk:aftenposten"},{"id":795,"content":"roadrisk:aftenposten","start":1410861410000,"group":"roadrisk:aftenposten"},{"id":796,"content":"roadrisk:aftenposten","start":1410861370000,"group":"roadrisk:aftenposten"},{"id":797,"content":"roadrisk:aftenposten","start":1410861144000,"group":"roadrisk:aftenposten"},{"id":798,"content":"roadrisk:aftenposten","start":1410860859000,"group":"roadrisk:aftenposten"},{"id":799,"content":"accident:aftenposten","start":1410860812000,"group":"accident:aftenposten"},{"id":800,"content":"roadrisk:aftenposten","start":1410859116000,"group":"roadrisk:aftenposten"},{"id":801,"content":"accident:aftenposten","start":1410856619000,"group":"accident:aftenposten"},{"id":802,"content":"roadrisk:aftenposten","start":1410856090000,"group":"roadrisk:aftenposten"},{"id":803,"content":"roadrisk:aftenposten","start":1410855621000,"group":"roadrisk:aftenposten"},{"id":804,"content":"roadrisk:aftenposten","start":1410854172000,"group":"roadrisk:aftenposten"},{"id":805,"content":"roadrisk:aftenposten","start":1410853888000,"group":"roadrisk:aftenposten"},{"id":806,"content":"roadrisk:aftenposten","start":1410853587000,"group":"roadrisk:aftenposten"},{"id":807,"content":"roadrisk:aftenposten","start":1410853342000,"group":"roadrisk:aftenposten"},{"id":808,"content":"roadrisk:aftenposten","start":1410851095000,"group":"roadrisk:aftenposten"},{"id":809,"content":"roadrisk:aftenposten","start":1410850304000,"group":"roadrisk:aftenposten"},{"id":810,"content":"roadrisk:aftenposten","start":1410849080000,"group":"roadrisk:aftenposten"},{"id":811,"content":"roadrisk:aftenposten","start":1410823331000,"group":"roadrisk:aftenposten"},{"id":812,"content":"roadrisk:aftenposten","start":1410819470000,"group":"roadrisk:aftenposten"},{"id":813,"content":"accident:aftenposten","start":1410818307000,"group":"accident:aftenposten"},{"id":814,"content":"roadrisk:aftenposten","start":1410817450000,"group":"roadrisk:aftenposten"},{"id":815,"content":"roadrisk:aftenposten","start":1410812896000,"group":"roadrisk:aftenposten"},{"id":816,"content":"roadrisk:aftenposten","start":1410808032000,"group":"roadrisk:aftenposten"},{"id":817,"content":"roadrisk:aftenposten","start":1410807826000,"group":"roadrisk:aftenposten"},{"id":818,"content":"roadrisk:aftenposten","start":1410807665000,"group":"roadrisk:aftenposten"},{"id":819,"content":"roadrisk:aftenposten","start":1410807509000,"group":"roadrisk:aftenposten"},{"id":820,"content":"accident:aftenposten","start":1410800347000,"group":"accident:aftenposten"},{"id":821,"content":"roadrisk:aftenposten","start":1410800089000,"group":"roadrisk:aftenposten"},{"id":822,"content":"accident:aftenposten","start":1410799910000,"group":"accident:aftenposten"},{"id":823,"content":"accident:aftenposten","start":1410799639000,"group":"accident:aftenposten"},{"id":824,"content":"roadrisk:aftenposten","start":1410797739000,"group":"roadrisk:aftenposten"},{"id":825,"content":"roadrisk:aftenposten","start":1410797080000,"group":"roadrisk:aftenposten"},{"id":826,"content":"roadrisk:aftenposten","start":1410796453000,"group":"roadrisk:aftenposten"},{"id":827,"content":"roadrisk:aftenposten","start":1410796024000,"group":"roadrisk:aftenposten"},{"id":828,"content":"roadrisk:aftenposten","start":1410795638000,"group":"roadrisk:aftenposten"},{"id":829,"content":"roadrisk:aftenposten","start":1410795348000,"group":"roadrisk:aftenposten"},{"id":830,"content":"roadrisk:aftenposten","start":1410790756000,"group":"roadrisk:aftenposten"},{"id":831,"content":"roadrisk:aftenposten","start":1410790182000,"group":"roadrisk:aftenposten"},{"id":832,"content":"roadrisk:aftenposten","start":1410790085000,"group":"roadrisk:aftenposten"},{"id":833,"content":"roadrisk:aftenposten","start":1410790003000,"group":"roadrisk:aftenposten"},{"id":834,"content":"roadrisk:aftenposten","start":1410789927000,"group":"roadrisk:aftenposten"},{"id":835,"content":"roadrisk:aftenposten","start":1410789591000,"group":"roadrisk:aftenposten"},{"id":836,"content":"roadrisk:aftenposten","start":1410789357000,"group":"roadrisk:aftenposten"},{"id":837,"content":"roadrisk:aftenposten","start":1410788953000,"group":"roadrisk:aftenposten"},{"id":838,"content":"roadrisk:aftenposten","start":1410787079000,"group":"roadrisk:aftenposten"},{"id":839,"content":"roadrisk:aftenposten","start":1410786776000,"group":"roadrisk:aftenposten"},{"id":840,"content":"roadrisk:aftenposten","start":1410786585000,"group":"roadrisk:aftenposten"},{"id":841,"content":"roadrisk:aftenposten","start":1410786312000,"group":"roadrisk:aftenposten"},{"id":842,"content":"roadrisk:aftenposten","start":1410784339000,"group":"roadrisk:aftenposten"},{"id":843,"content":"roadrisk:aftenposten","start":1410782193000,"group":"roadrisk:aftenposten"},{"id":844,"content":"roadrisk:aftenposten","start":1410781509000,"group":"roadrisk:aftenposten"},{"id":845,"content":"roadrisk:aftenposten","start":1410781351000,"group":"roadrisk:aftenposten"},{"id":846,"content":"roadrisk:aftenposten","start":1410780649000,"group":"roadrisk:aftenposten"},{"id":847,"content":"roadrisk:aftenposten","start":1410779563000,"group":"roadrisk:aftenposten"},{"id":848,"content":"accident:aftenposten","start":1410779398000,"group":"accident:aftenposten"},{"id":849,"content":"accident:aftenposten","start":1410779099000,"group":"accident:aftenposten"},{"id":850,"content":"roadrisk:aftenposten","start":1410778391000,"group":"roadrisk:aftenposten"},{"id":851,"content":"roadrisk:aftenposten","start":1410778210000,"group":"roadrisk:aftenposten"},{"id":852,"content":"roadrisk:aftenposten","start":1410776103000,"group":"roadrisk:aftenposten"},{"id":853,"content":"roadrisk:aftenposten","start":1410771620000,"group":"roadrisk:aftenposten"},{"id":854,"content":"roadrisk:aftenposten","start":1410771607000,"group":"roadrisk:aftenposten"},{"id":855,"content":"roadrisk:aftenposten","start":1410771546000,"group":"roadrisk:aftenposten"},{"id":856,"content":"roadrisk:aftenposten","start":1410771341000,"group":"roadrisk:aftenposten"},{"id":857,"content":"roadrisk:aftenposten","start":1410769996000,"group":"roadrisk:aftenposten"},{"id":858,"content":"roadrisk:aftenposten","start":1410768596000,"group":"roadrisk:aftenposten"},{"id":859,"content":"roadrisk:aftenposten","start":1410764902000,"group":"roadrisk:aftenposten"},{"id":860,"content":"roadrisk:aftenposten","start":1410728753000,"group":"roadrisk:aftenposten"},{"id":861,"content":"roadrisk:aftenposten","start":1410728656000,"group":"roadrisk:aftenposten"},{"id":862,"content":"roadrisk:aftenposten","start":1410728456000,"group":"roadrisk:aftenposten"},{"id":863,"content":"roadrisk:aftenposten","start":1410728129000,"group":"roadrisk:aftenposten"},{"id":864,"content":"roadrisk:aftenposten","start":1410723487000,"group":"roadrisk:aftenposten"},{"id":865,"content":"accident:aftenposten","start":1410722261000,"group":"accident:aftenposten"},{"id":866,"content":"roadrisk:aftenposten","start":1410722255000,"group":"roadrisk:aftenposten"},{"id":867,"content":"roadrisk:aftenposten","start":1410720695000,"group":"roadrisk:aftenposten"},{"id":868,"content":"roadrisk:aftenposten","start":1410719664000,"group":"roadrisk:aftenposten"},{"id":869,"content":"accident:aftenposten","start":1410716060000,"group":"accident:aftenposten"},{"id":870,"content":"roadrisk:aftenposten","start":1410713344000,"group":"roadrisk:aftenposten"},{"id":871,"content":"roadrisk:aftenposten","start":1410712412000,"group":"roadrisk:aftenposten"},{"id":872,"content":"roadrisk:aftenposten","start":1410712072000,"group":"roadrisk:aftenposten"},{"id":873,"content":"roadrisk:aftenposten","start":1410711615000,"group":"roadrisk:aftenposten"},{"id":874,"content":"roadrisk:aftenposten","start":1410688653000,"group":"roadrisk:aftenposten"},{"id":875,"content":"roadrisk:aftenposten","start":1410688015000,"group":"roadrisk:aftenposten"},{"id":876,"content":"roadrisk:aftenposten","start":1410686964000,"group":"roadrisk:aftenposten"},{"id":877,"content":"roadrisk:aftenposten","start":1410686791000,"group":"roadrisk:aftenposten"},{"id":878,"content":"roadrisk:aftenposten","start":1410686576000,"group":"roadrisk:aftenposten"},{"id":879,"content":"roadrisk:aftenposten","start":1410686426000,"group":"roadrisk:aftenposten"},{"id":880,"content":"roadrisk:aftenposten","start":1410686224000,"group":"roadrisk:aftenposten"},{"id":881,"content":"roadrisk:aftenposten","start":1410686120000,"group":"roadrisk:aftenposten"},{"id":882,"content":"roadrisk:aftenposten","start":1410686028000,"group":"roadrisk:aftenposten"},{"id":883,"content":"roadrisk:aftenposten","start":1410684216000,"group":"roadrisk:aftenposten"},{"id":884,"content":"roadrisk:aftenposten","start":1410683778000,"group":"roadrisk:aftenposten"},{"id":885,"content":"roadrisk:aftenposten","start":1410683678000,"group":"roadrisk:aftenposten"},{"id":886,"content":"roadrisk:aftenposten","start":1410683456000,"group":"roadrisk:aftenposten"},{"id":887,"content":"roadrisk:aftenposten","start":1410683114000,"group":"roadrisk:aftenposten"},{"id":888,"content":"accident:aftenposten","start":1410679271000,"group":"accident:aftenposten"},{"id":889,"content":"roadrisk:aftenposten","start":1410676067000,"group":"roadrisk:aftenposten"},{"id":890,"content":"roadrisk:aftenposten","start":1410644038000,"group":"roadrisk:aftenposten"},{"id":891,"content":"roadrisk:aftenposten","start":1410643800000,"group":"roadrisk:aftenposten"},{"id":892,"content":"roadrisk:aftenposten","start":1410643423000,"group":"roadrisk:aftenposten"},{"id":893,"content":"roadrisk:aftenposten","start":1410643120000,"group":"roadrisk:aftenposten"},{"id":894,"content":"roadrisk:aftenposten","start":1410643089000,"group":"roadrisk:aftenposten"},{"id":895,"content":"roadrisk:aftenposten","start":1410642688000,"group":"roadrisk:aftenposten"},{"id":896,"content":"roadrisk:aftenposten","start":1410642056000,"group":"roadrisk:aftenposten"},{"id":897,"content":"roadrisk:aftenposten","start":1410641935000,"group":"roadrisk:aftenposten"},{"id":898,"content":"roadrisk:aftenposten","start":1410633969000,"group":"roadrisk:aftenposten"},{"id":899,"content":"roadrisk:aftenposten","start":1410633814000,"group":"roadrisk:aftenposten"},{"id":900,"content":"roadrisk:aftenposten","start":1410633680000,"group":"roadrisk:aftenposten"},{"id":901,"content":"roadrisk:aftenposten","start":1410633528000,"group":"roadrisk:aftenposten"},{"id":902,"content":"roadrisk:aftenposten","start":1410633367000,"group":"roadrisk:aftenposten"},{"id":903,"content":"roadrisk:aftenposten","start":1410631298000,"group":"roadrisk:aftenposten"},{"id":904,"content":"roadrisk:aftenposten","start":1410628086000,"group":"roadrisk:aftenposten"},{"id":905,"content":"roadrisk:aftenposten","start":1410625606000,"group":"roadrisk:aftenposten"},{"id":906,"content":"roadrisk:aftenposten","start":1410621870000,"group":"roadrisk:aftenposten"},{"id":907,"content":"accident:aftenposten","start":1410621597000,"group":"accident:aftenposten"},{"id":908,"content":"accident:aftenposten","start":1410619044000,"group":"accident:aftenposten"},{"id":909,"content":"roadrisk:aftenposten","start":1410618151000,"group":"roadrisk:aftenposten"},{"id":910,"content":"roadrisk:aftenposten","start":1410618102000,"group":"roadrisk:aftenposten"},{"id":911,"content":"roadrisk:aftenposten","start":1410617886000,"group":"roadrisk:aftenposten"},{"id":912,"content":"roadrisk:aftenposten","start":1410617801000,"group":"roadrisk:aftenposten"},{"id":913,"content":"roadrisk:aftenposten","start":1410617450000,"group":"roadrisk:aftenposten"},{"id":914,"content":"roadrisk:aftenposten","start":1410616973000,"group":"roadrisk:aftenposten"},{"id":915,"content":"roadrisk:aftenposten","start":1410607663000,"group":"roadrisk:aftenposten"},{"id":916,"content":"accident:aftenposten","start":1410597369000,"group":"accident:aftenposten"},{"id":917,"content":"roadrisk:aftenposten","start":1410594223000,"group":"roadrisk:aftenposten"},{"id":918,"content":"roadrisk:aftenposten","start":1410591639000,"group":"roadrisk:aftenposten"},{"id":919,"content":"roadrisk:aftenposten","start":1410582367000,"group":"roadrisk:aftenposten"},{"id":920,"content":"roadrisk:aftenposten","start":1410561152000,"group":"roadrisk:aftenposten"},{"id":921,"content":"roadrisk:aftenposten","start":1410560011000,"group":"roadrisk:aftenposten"},{"id":922,"content":"roadrisk:aftenposten","start":1410559786000,"group":"roadrisk:aftenposten"},{"id":923,"content":"roadrisk:aftenposten","start":1410558459000,"group":"roadrisk:aftenposten"},{"id":924,"content":"roadrisk:aftenposten","start":1410555283000,"group":"roadrisk:aftenposten"},{"id":925,"content":"roadrisk:aftenposten","start":1410555113000,"group":"roadrisk:aftenposten"},{"id":926,"content":"roadrisk:aftenposten","start":1410555021000,"group":"roadrisk:aftenposten"},{"id":927,"content":"roadrisk:aftenposten","start":1410554934000,"group":"roadrisk:aftenposten"},{"id":928,"content":"roadrisk:aftenposten","start":1410553349000,"group":"roadrisk:aftenposten"},{"id":929,"content":"roadrisk:aftenposten","start":1410553287000,"group":"roadrisk:aftenposten"},{"id":930,"content":"roadrisk:aftenposten","start":1410553173000,"group":"roadrisk:aftenposten"},{"id":931,"content":"roadrisk:aftenposten","start":1410552937000,"group":"roadrisk:aftenposten"},{"id":932,"content":"roadrisk:aftenposten","start":1410550946000,"group":"roadrisk:aftenposten"},{"id":933,"content":"roadrisk:aftenposten","start":1410550395000,"group":"roadrisk:aftenposten"},{"id":934,"content":"roadrisk:aftenposten","start":1410550274000,"group":"roadrisk:aftenposten"},{"id":935,"content":"roadrisk:aftenposten","start":1410550060000,"group":"roadrisk:aftenposten"},{"id":936,"content":"roadrisk:aftenposten","start":1410549794000,"group":"roadrisk:aftenposten"},{"id":937,"content":"roadrisk:aftenposten","start":1410549626000,"group":"roadrisk:aftenposten"},{"id":938,"content":"roadrisk:aftenposten","start":1410549334000,"group":"roadrisk:aftenposten"},{"id":939,"content":"roadrisk:aftenposten","start":1410549325000,"group":"roadrisk:aftenposten"},{"id":940,"content":"roadrisk:aftenposten","start":1410548752000,"group":"roadrisk:aftenposten"},{"id":941,"content":"roadrisk:aftenposten","start":1410548696000,"group":"roadrisk:aftenposten"},{"id":942,"content":"roadrisk:aftenposten","start":1410548138000,"group":"roadrisk:aftenposten"},{"id":943,"content":"accident:aftenposten","start":1410547729000,"group":"accident:aftenposten"},{"id":944,"content":"roadrisk:aftenposten","start":1410546457000,"group":"roadrisk:aftenposten"},{"id":945,"content":"roadrisk:aftenposten","start":1410544192000,"group":"roadrisk:aftenposten"},{"id":946,"content":"roadrisk:aftenposten","start":1410542469000,"group":"roadrisk:aftenposten"},{"id":947,"content":"roadrisk:aftenposten","start":1410542256000,"group":"roadrisk:aftenposten"},{"id":948,"content":"roadrisk:aftenposten","start":1410542104000,"group":"roadrisk:aftenposten"},{"id":949,"content":"roadrisk:aftenposten","start":1410541894000,"group":"roadrisk:aftenposten"},{"id":950,"content":"roadrisk:aftenposten","start":1410541286000,"group":"roadrisk:aftenposten"},{"id":951,"content":"roadrisk:aftenposten","start":1410541230000,"group":"roadrisk:aftenposten"},{"id":952,"content":"roadrisk:aftenposten","start":1410541152000,"group":"roadrisk:aftenposten"},{"id":953,"content":"roadrisk:aftenposten","start":1410540933000,"group":"roadrisk:aftenposten"},{"id":954,"content":"accident:aftenposten","start":1410540696000,"group":"accident:aftenposten"},{"id":955,"content":"roadrisk:aftenposten","start":1410540182000,"group":"roadrisk:aftenposten"},{"id":956,"content":"roadrisk:aftenposten","start":1410539846000,"group":"roadrisk:aftenposten"},{"id":957,"content":"roadrisk:aftenposten","start":1410539535000,"group":"roadrisk:aftenposten"},{"id":958,"content":"roadrisk:aftenposten","start":1410538841000,"group":"roadrisk:aftenposten"},{"id":959,"content":"roadrisk:aftenposten","start":1410538653000,"group":"roadrisk:aftenposten"},{"id":960,"content":"roadrisk:aftenposten","start":1410538608000,"group":"roadrisk:aftenposten"},{"id":961,"content":"roadrisk:aftenposten","start":1410537094000,"group":"roadrisk:aftenposten"},{"id":962,"content":"roadrisk:aftenposten","start":1410536866000,"group":"roadrisk:aftenposten"},{"id":963,"content":"roadrisk:aftenposten","start":1410535588000,"group":"roadrisk:aftenposten"},{"id":964,"content":"roadrisk:aftenposten","start":1410534692000,"group":"roadrisk:aftenposten"},{"id":965,"content":"accident:aftenposten","start":1410534371000,"group":"accident:aftenposten"},{"id":966,"content":"roadrisk:aftenposten","start":1410533878000,"group":"roadrisk:aftenposten"},{"id":967,"content":"roadrisk:aftenposten","start":1410533798000,"group":"roadrisk:aftenposten"},{"id":968,"content":"roadrisk:aftenposten","start":1410533721000,"group":"roadrisk:aftenposten"},{"id":969,"content":"roadrisk:aftenposten","start":1410533554000,"group":"roadrisk:aftenposten"},{"id":970,"content":"roadrisk:aftenposten","start":1410533391000,"group":"roadrisk:aftenposten"},{"id":971,"content":"roadrisk:aftenposten","start":1410533084000,"group":"roadrisk:aftenposten"},{"id":972,"content":"roadrisk:aftenposten","start":1410532949000,"group":"roadrisk:aftenposten"},{"id":973,"content":"roadrisk:aftenposten","start":1410532750000,"group":"roadrisk:aftenposten"},{"id":974,"content":"roadrisk:aftenposten","start":1410532649000,"group":"roadrisk:aftenposten"},{"id":975,"content":"roadrisk:aftenposten","start":1410532455000,"group":"roadrisk:aftenposten"},{"id":976,"content":"roadrisk:aftenposten","start":1410532435000,"group":"roadrisk:aftenposten"},{"id":977,"content":"roadrisk:aftenposten","start":1410532338000,"group":"roadrisk:aftenposten"},{"id":978,"content":"roadrisk:aftenposten","start":1410532164000,"group":"roadrisk:aftenposten"},{"id":979,"content":"roadrisk:aftenposten","start":1410531670000,"group":"roadrisk:aftenposten"},{"id":980,"content":"roadrisk:aftenposten","start":1410531402000,"group":"roadrisk:aftenposten"},{"id":981,"content":"roadrisk:aftenposten","start":1410531232000,"group":"roadrisk:aftenposten"},{"id":982,"content":"roadrisk:aftenposten","start":1410530830000,"group":"roadrisk:aftenposten"},{"id":983,"content":"roadrisk:aftenposten","start":1410530606000,"group":"roadrisk:aftenposten"},{"id":984,"content":"accident:aftenposten","start":1410529639000,"group":"accident:aftenposten"},{"id":985,"content":"roadrisk:aftenposten","start":1410529359000,"group":"roadrisk:aftenposten"},{"id":986,"content":"roadrisk:aftenposten","start":1410528882000,"group":"roadrisk:aftenposten"},{"id":987,"content":"roadrisk:aftenposten","start":1410528797000,"group":"roadrisk:aftenposten"},{"id":988,"content":"accident:aftenposten","start":1410528145000,"group":"accident:aftenposten"},{"id":989,"content":"accident:aftenposten","start":1410526946000,"group":"accident:aftenposten"},{"id":990,"content":"roadrisk:aftenposten","start":1410526869000,"group":"roadrisk:aftenposten"},{"id":991,"content":"roadrisk:aftenposten","start":1410526690000,"group":"roadrisk:aftenposten"},{"id":992,"content":"roadrisk:aftenposten","start":1410525245000,"group":"roadrisk:aftenposten"},{"id":993,"content":"roadrisk:aftenposten","start":1410524987000,"group":"roadrisk:aftenposten"},{"id":994,"content":"roadrisk:aftenposten","start":1410524899000,"group":"roadrisk:aftenposten"},{"id":995,"content":"roadrisk:aftenposten","start":1410524887000,"group":"roadrisk:aftenposten"},{"id":996,"content":"roadrisk:aftenposten","start":1410524044000,"group":"roadrisk:aftenposten"},{"id":997,"content":"roadrisk:aftenposten","start":1410523652000,"group":"roadrisk:aftenposten"},{"id":998,"content":"roadrisk:aftenposten","start":1410523510000,"group":"roadrisk:aftenposten"},{"id":999,"content":"roadrisk:aftenposten","start":1410523465000,"group":"roadrisk:aftenposten"},{"id":1000,"content":"roadrisk:aftenposten","start":1410523414000,"group":"roadrisk:aftenposten"},{"id":1001,"content":"accident:aftenposten","start":1410523362000,"group":"accident:aftenposten"},{"id":1002,"content":"roadrisk:aftenposten","start":1410523337000,"group":"roadrisk:aftenposten"},{"id":1003,"content":"roadrisk:aftenposten","start":1410523214000,"group":"roadrisk:aftenposten"},{"id":1004,"content":"roadrisk:aftenposten","start":1410523105000,"group":"roadrisk:aftenposten"},{"id":1005,"content":"roadrisk:aftenposten","start":1410522955000,"group":"roadrisk:aftenposten"},{"id":1006,"content":"roadrisk:aftenposten","start":1410522579000,"group":"roadrisk:aftenposten"},{"id":1007,"content":"roadrisk:aftenposten","start":1410522286000,"group":"roadrisk:aftenposten"},{"id":1008,"content":"roadrisk:aftenposten","start":1410521850000,"group":"roadrisk:aftenposten"},{"id":1009,"content":"roadrisk:aftenposten","start":1410521581000,"group":"roadrisk:aftenposten"},{"id":1010,"content":"roadrisk:aftenposten","start":1410521014000,"group":"roadrisk:aftenposten"},{"id":1011,"content":"roadrisk:aftenposten","start":1410520655000,"group":"roadrisk:aftenposten"},{"id":1012,"content":"roadrisk:aftenposten","start":1410520509000,"group":"roadrisk:aftenposten"},{"id":1013,"content":"accident:aftenposten","start":1410520241000,"group":"accident:aftenposten"},{"id":1014,"content":"accident:aftenposten","start":1410520062000,"group":"accident:aftenposten"},{"id":1015,"content":"accident:aftenposten","start":1410519879000,"group":"accident:aftenposten"},{"id":1016,"content":"roadrisk:aftenposten","start":1410519756000,"group":"roadrisk:aftenposten"},{"id":1017,"content":"roadrisk:aftenposten","start":1410519676000,"group":"roadrisk:aftenposten"},{"id":1018,"content":"accident:aftenposten","start":1410519634000,"group":"accident:aftenposten"},{"id":1019,"content":"roadrisk:aftenposten","start":1410519585000,"group":"roadrisk:aftenposten"},{"id":1020,"content":"roadrisk:aftenposten","start":1410519460000,"group":"roadrisk:aftenposten"},{"id":1021,"content":"accident:aftenposten","start":1410519294000,"group":"accident:aftenposten"},{"id":1022,"content":"accident:aftenposten","start":1410518768000,"group":"accident:aftenposten"},{"id":1023,"content":"roadrisk:aftenposten","start":1410518761000,"group":"roadrisk:aftenposten"},{"id":1024,"content":"roadrisk:aftenposten","start":1410518666000,"group":"roadrisk:aftenposten"},{"id":1025,"content":"roadrisk:aftenposten","start":1410518572000,"group":"roadrisk:aftenposten"},{"id":1026,"content":"roadrisk:aftenposten","start":1410518117000,"group":"roadrisk:aftenposten"},{"id":1027,"content":"roadrisk:aftenposten","start":1410516869000,"group":"roadrisk:aftenposten"},{"id":1028,"content":"roadrisk:aftenposten","start":1410516608000,"group":"roadrisk:aftenposten"},{"id":1029,"content":"roadrisk:aftenposten","start":1410516115000,"group":"roadrisk:aftenposten"},{"id":1030,"content":"accident:aftenposten","start":1410515739000,"group":"accident:aftenposten"},{"id":1031,"content":"accident:aftenposten","start":1410515311000,"group":"accident:aftenposten"},{"id":1032,"content":"roadrisk:aftenposten","start":1410515151000,"group":"roadrisk:aftenposten"},{"id":1033,"content":"roadrisk:aftenposten","start":1410514521000,"group":"roadrisk:aftenposten"},{"id":1034,"content":"roadrisk:aftenposten","start":1410514438000,"group":"roadrisk:aftenposten"},{"id":1035,"content":"roadrisk:aftenposten","start":1410514400000,"group":"roadrisk:aftenposten"},{"id":1036,"content":"roadrisk:aftenposten","start":1410514351000,"group":"roadrisk:aftenposten"},{"id":1037,"content":"roadrisk:aftenposten","start":1410514066000,"group":"roadrisk:aftenposten"},{"id":1038,"content":"roadrisk:aftenposten","start":1410513959000,"group":"roadrisk:aftenposten"},{"id":1039,"content":"roadrisk:aftenposten","start":1410513948000,"group":"roadrisk:aftenposten"},{"id":1040,"content":"roadrisk:aftenposten","start":1410513844000,"group":"roadrisk:aftenposten"},{"id":1041,"content":"roadrisk:aftenposten","start":1410513793000,"group":"roadrisk:aftenposten"},{"id":1042,"content":"roadrisk:aftenposten","start":1410513725000,"group":"roadrisk:aftenposten"},{"id":1043,"content":"roadrisk:aftenposten","start":1410513693000,"group":"roadrisk:aftenposten"},{"id":1044,"content":"roadrisk:aftenposten","start":1410513640000,"group":"roadrisk:aftenposten"},{"id":1045,"content":"roadrisk:aftenposten","start":1410513580000,"group":"roadrisk:aftenposten"},{"id":1046,"content":"roadrisk:aftenposten","start":1410513509000,"group":"roadrisk:aftenposten"},{"id":1047,"content":"roadrisk:aftenposten","start":1410513477000,"group":"roadrisk:aftenposten"},{"id":1048,"content":"roadrisk:aftenposten","start":1410513426000,"group":"roadrisk:aftenposten"},{"id":1049,"content":"roadrisk:aftenposten","start":1410513365000,"group":"roadrisk:aftenposten"},{"id":1050,"content":"roadrisk:aftenposten","start":1410513336000,"group":"roadrisk:aftenposten"},{"id":1051,"content":"roadrisk:aftenposten","start":1410513168000,"group":"roadrisk:aftenposten"},{"id":1052,"content":"roadrisk:aftenposten","start":1410512219000,"group":"roadrisk:aftenposten"},{"id":1053,"content":"roadrisk:aftenposten","start":1410511993000,"group":"roadrisk:aftenposten"},{"id":1054,"content":"roadrisk:aftenposten","start":1410511400000,"group":"roadrisk:aftenposten"},{"id":1055,"content":"roadrisk:aftenposten","start":1410511184000,"group":"roadrisk:aftenposten"},{"id":1056,"content":"roadrisk:aftenposten","start":1410511082000,"group":"roadrisk:aftenposten"},{"id":1057,"content":"accident:aftenposten","start":1410510605000,"group":"accident:aftenposten"},{"id":1058,"content":"roadrisk:aftenposten","start":1410509807000,"group":"roadrisk:aftenposten"},{"id":1059,"content":"roadrisk:aftenposten","start":1410509232000,"group":"roadrisk:aftenposten"},{"id":1060,"content":"roadrisk:aftenposten","start":1410508969000,"group":"roadrisk:aftenposten"},{"id":1061,"content":"roadrisk:aftenposten","start":1410508946000,"group":"roadrisk:aftenposten"},{"id":1062,"content":"roadrisk:aftenposten","start":1410508826000,"group":"roadrisk:aftenposten"},{"id":1063,"content":"roadrisk:aftenposten","start":1410508762000,"group":"roadrisk:aftenposten"},{"id":1064,"content":"roadrisk:aftenposten","start":1410508729000,"group":"roadrisk:aftenposten"},{"id":1065,"content":"roadrisk:aftenposten","start":1410508664000,"group":"roadrisk:aftenposten"},{"id":1066,"content":"roadrisk:aftenposten","start":1410508599000,"group":"roadrisk:aftenposten"},{"id":1067,"content":"roadrisk:aftenposten","start":1410508483000,"group":"roadrisk:aftenposten"},{"id":1068,"content":"roadrisk:aftenposten","start":1410508297000,"group":"roadrisk:aftenposten"},{"id":1069,"content":"roadrisk:aftenposten","start":1410508105000,"group":"roadrisk:aftenposten"},{"id":1070,"content":"accident:aftenposten","start":1410507962000,"group":"accident:aftenposten"},{"id":1071,"content":"roadrisk:aftenposten","start":1410507614000,"group":"roadrisk:aftenposten"},{"id":1072,"content":"roadrisk:aftenposten","start":1410507464000,"group":"roadrisk:aftenposten"},{"id":1073,"content":"roadrisk:aftenposten","start":1410507181000,"group":"roadrisk:aftenposten"},{"id":1074,"content":"accident:aftenposten","start":1410506809000,"group":"accident:aftenposten"},{"id":1075,"content":"roadrisk:aftenposten","start":1410506179000,"group":"roadrisk:aftenposten"},{"id":1076,"content":"roadrisk:aftenposten","start":1410506137000,"group":"roadrisk:aftenposten"},{"id":1077,"content":"roadrisk:aftenposten","start":1410506073000,"group":"roadrisk:aftenposten"},{"id":1078,"content":"roadrisk:aftenposten","start":1410505882000,"group":"roadrisk:aftenposten"},{"id":1079,"content":"roadrisk:aftenposten","start":1410505684000,"group":"roadrisk:aftenposten"},{"id":1080,"content":"roadrisk:aftenposten","start":1410505648000,"group":"roadrisk:aftenposten"},{"id":1081,"content":"roadrisk:aftenposten","start":1410505526000,"group":"roadrisk:aftenposten"},{"id":1082,"content":"roadrisk:aftenposten","start":1410505513000,"group":"roadrisk:aftenposten"},{"id":1083,"content":"roadrisk:aftenposten","start":1410505290000,"group":"roadrisk:aftenposten"},{"id":1084,"content":"roadrisk:aftenposten","start":1410505265000,"group":"roadrisk:aftenposten"},{"id":1085,"content":"roadrisk:aftenposten","start":1410505001000,"group":"roadrisk:aftenposten"},{"id":1086,"content":"roadrisk:aftenposten","start":1410504987000,"group":"roadrisk:aftenposten"},{"id":1087,"content":"roadrisk:aftenposten","start":1410504932000,"group":"roadrisk:aftenposten"},{"id":1088,"content":"roadrisk:aftenposten","start":1410504921000,"group":"roadrisk:aftenposten"},{"id":1089,"content":"accident:aftenposten","start":1410504806000,"group":"accident:aftenposten"},{"id":1090,"content":"roadrisk:aftenposten","start":1410504632000,"group":"roadrisk:aftenposten"},{"id":1091,"content":"roadrisk:aftenposten","start":1410504608000,"group":"roadrisk:aftenposten"},{"id":1092,"content":"roadrisk:aftenposten","start":1410504475000,"group":"roadrisk:aftenposten"},{"id":1093,"content":"roadrisk:aftenposten","start":1410503976000,"group":"roadrisk:aftenposten"},{"id":1094,"content":"roadrisk:aftenposten","start":1410502221000,"group":"roadrisk:aftenposten"},{"id":1095,"content":"roadrisk:aftenposten","start":1410502010000,"group":"roadrisk:aftenposten"},{"id":1096,"content":"roadrisk:aftenposten","start":1410501714000,"group":"roadrisk:aftenposten"},{"id":1097,"content":"roadrisk:aftenposten","start":1410501625000,"group":"roadrisk:aftenposten"},{"id":1098,"content":"roadrisk:aftenposten","start":1410501595000,"group":"roadrisk:aftenposten"},{"id":1099,"content":"roadrisk:aftenposten","start":1410501481000,"group":"roadrisk:aftenposten"},{"id":1100,"content":"roadrisk:aftenposten","start":1410500377000,"group":"roadrisk:aftenposten"},{"id":1101,"content":"roadrisk:aftenposten","start":1410497459000,"group":"roadrisk:aftenposten"},{"id":1102,"content":"accident:aftenposten","start":1410495500000,"group":"accident:aftenposten"},{"id":1103,"content":"roadrisk:aftenposten","start":1410486389000,"group":"roadrisk:aftenposten"},{"id":1104,"content":"roadrisk:aftenposten","start":1410476673000,"group":"roadrisk:aftenposten"},{"id":1105,"content":"roadrisk:aftenposten","start":1410475113000,"group":"roadrisk:aftenposten"},{"id":1106,"content":"accident:aftenposten","start":1410474799000,"group":"accident:aftenposten"},{"id":1107,"content":"roadrisk:aftenposten","start":1410474200000,"group":"roadrisk:aftenposten"},{"id":1108,"content":"roadrisk:aftenposten","start":1410473919000,"group":"roadrisk:aftenposten"},{"id":1109,"content":"roadrisk:aftenposten","start":1410473616000,"group":"roadrisk:aftenposten"},{"id":1110,"content":"roadrisk:aftenposten","start":1410473528000,"group":"roadrisk:aftenposten"},{"id":1111,"content":"roadrisk:aftenposten","start":1410473511000,"group":"roadrisk:aftenposten"},{"id":1112,"content":"roadrisk:aftenposten","start":1410473299000,"group":"roadrisk:aftenposten"},{"id":1113,"content":"roadrisk:aftenposten","start":1410472625000,"group":"roadrisk:aftenposten"},{"id":1114,"content":"accident:aftenposten","start":1410471981000,"group":"accident:aftenposten"},{"id":1115,"content":"roadrisk:aftenposten","start":1410471525000,"group":"roadrisk:aftenposten"},{"id":1116,"content":"roadrisk:aftenposten","start":1410471238000,"group":"roadrisk:aftenposten"},{"id":1117,"content":"roadrisk:aftenposten","start":1410470239000,"group":"roadrisk:aftenposten"},{"id":1118,"content":"roadrisk:aftenposten","start":1410469878000,"group":"roadrisk:aftenposten"},{"id":1119,"content":"roadrisk:aftenposten","start":1410469510000,"group":"roadrisk:aftenposten"},{"id":1120,"content":"roadrisk:aftenposten","start":1410469353000,"group":"roadrisk:aftenposten"},{"id":1121,"content":"roadrisk:aftenposten","start":1410468998000,"group":"roadrisk:aftenposten"},{"id":1122,"content":"roadrisk:aftenposten","start":1410468782000,"group":"roadrisk:aftenposten"},{"id":1123,"content":"roadrisk:aftenposten","start":1410468748000,"group":"roadrisk:aftenposten"},{"id":1124,"content":"accident:aftenposten","start":1410468353000,"group":"accident:aftenposten"},{"id":1125,"content":"roadrisk:aftenposten","start":1410468349000,"group":"roadrisk:aftenposten"},{"id":1126,"content":"accident:aftenposten","start":1410468349000,"group":"accident:aftenposten"},{"id":1127,"content":"roadrisk:aftenposten","start":1410468114000,"group":"roadrisk:aftenposten"},{"id":1128,"content":"accident:aftenposten","start":1410467816000,"group":"accident:aftenposten"},{"id":1129,"content":"accident:aftenposten","start":1410467487000,"group":"accident:aftenposten"},{"id":1130,"content":"roadrisk:aftenposten","start":1410467458000,"group":"roadrisk:aftenposten"},{"id":1131,"content":"roadrisk:aftenposten","start":1410467375000,"group":"roadrisk:aftenposten"},{"id":1132,"content":"roadrisk:aftenposten","start":1410467270000,"group":"roadrisk:aftenposten"},{"id":1133,"content":"accident:aftenposten","start":1410467075000,"group":"accident:aftenposten"},{"id":1134,"content":"roadrisk:aftenposten","start":1410466717000,"group":"roadrisk:aftenposten"},{"id":1135,"content":"roadrisk:aftenposten","start":1410466201000,"group":"roadrisk:aftenposten"},{"id":1136,"content":"roadrisk:aftenposten","start":1410466167000,"group":"roadrisk:aftenposten"},{"id":1137,"content":"roadrisk:aftenposten","start":1410466000000,"group":"roadrisk:aftenposten"},{"id":1138,"content":"roadrisk:aftenposten","start":1410465975000,"group":"roadrisk:aftenposten"},{"id":1139,"content":"roadrisk:aftenposten","start":1410465741000,"group":"roadrisk:aftenposten"},{"id":1140,"content":"roadrisk:aftenposten","start":1410465731000,"group":"roadrisk:aftenposten"},{"id":1141,"content":"roadrisk:aftenposten","start":1410465710000,"group":"roadrisk:aftenposten"},{"id":1142,"content":"roadrisk:aftenposten","start":1410465648000,"group":"roadrisk:aftenposten"},{"id":1143,"content":"roadrisk:aftenposten","start":1410465469000,"group":"roadrisk:aftenposten"},{"id":1144,"content":"roadrisk:aftenposten","start":1410465278000,"group":"roadrisk:aftenposten"},{"id":1145,"content":"roadrisk:aftenposten","start":1410465177000,"group":"roadrisk:aftenposten"},{"id":1146,"content":"accident:aftenposten","start":1410465164000,"group":"accident:aftenposten"},{"id":1147,"content":"roadrisk:aftenposten","start":1410465141000,"group":"roadrisk:aftenposten"},{"id":1148,"content":"roadrisk:aftenposten","start":1410465057000,"group":"roadrisk:aftenposten"},{"id":1149,"content":"roadrisk:aftenposten","start":1410464387000,"group":"roadrisk:aftenposten"},{"id":1150,"content":"roadrisk:aftenposten","start":1410464340000,"group":"roadrisk:aftenposten"},{"id":1151,"content":"roadrisk:aftenposten","start":1410464200000,"group":"roadrisk:aftenposten"},{"id":1152,"content":"roadrisk:aftenposten","start":1410464173000,"group":"roadrisk:aftenposten"},{"id":1153,"content":"roadrisk:aftenposten","start":1410464070000,"group":"roadrisk:aftenposten"},{"id":1154,"content":"roadrisk:aftenposten","start":1410463856000,"group":"roadrisk:aftenposten"},{"id":1155,"content":"roadrisk:aftenposten","start":1410463819000,"group":"roadrisk:aftenposten"},{"id":1156,"content":"roadrisk:aftenposten","start":1410463545000,"group":"roadrisk:aftenposten"},{"id":1157,"content":"roadrisk:aftenposten","start":1410463499000,"group":"roadrisk:aftenposten"},{"id":1158,"content":"roadrisk:aftenposten","start":1410463418000,"group":"roadrisk:aftenposten"},{"id":1159,"content":"roadrisk:aftenposten","start":1410463368000,"group":"roadrisk:aftenposten"},{"id":1160,"content":"roadrisk:aftenposten","start":1410463295000,"group":"roadrisk:aftenposten"},{"id":1161,"content":"roadrisk:aftenposten","start":1410463244000,"group":"roadrisk:aftenposten"},{"id":1162,"content":"roadrisk:aftenposten","start":1410463113000,"group":"roadrisk:aftenposten"},{"id":1163,"content":"roadrisk:aftenposten","start":1410463063000,"group":"roadrisk:aftenposten"},{"id":1164,"content":"roadrisk:aftenposten","start":1410462927000,"group":"roadrisk:aftenposten"},{"id":1165,"content":"roadrisk:aftenposten","start":1410462443000,"group":"roadrisk:aftenposten"},{"id":1166,"content":"accident:aftenposten","start":1410462000000,"group":"accident:aftenposten"},{"id":1167,"content":"roadrisk:aftenposten","start":1410461850000,"group":"roadrisk:aftenposten"},{"id":1168,"content":"roadrisk:aftenposten","start":1410461657000,"group":"roadrisk:aftenposten"},{"id":1169,"content":"roadrisk:aftenposten","start":1410461593000,"group":"roadrisk:aftenposten"},{"id":1170,"content":"roadrisk:aftenposten","start":1410461460000,"group":"roadrisk:aftenposten"},{"id":1171,"content":"roadrisk:aftenposten","start":1422453994159,"group":"roadrisk:aftenposten"},{"id":1172,"content":"roadrisk:aftenposten","start":1410461250000,"group":"roadrisk:aftenposten"},{"id":1173,"content":"roadrisk:aftenposten","start":1410461232000,"group":"roadrisk:aftenposten"},{"id":1174,"content":"accident:aftenposten","start":1410461029000,"group":"accident:aftenposten"},{"id":1175,"content":"roadrisk:aftenposten","start":1410460636000,"group":"roadrisk:aftenposten"},{"id":1176,"content":"roadrisk:aftenposten","start":1410460616000,"group":"roadrisk:aftenposten"},{"id":1177,"content":"accident:aftenposten","start":1410460573000,"group":"accident:aftenposten"},{"id":1178,"content":"roadrisk:aftenposten","start":1410460542000,"group":"roadrisk:aftenposten"},{"id":1179,"content":"roadrisk:aftenposten","start":1410460334000,"group":"roadrisk:aftenposten"},{"id":1180,"content":"roadrisk:aftenposten","start":1410460136000,"group":"roadrisk:aftenposten"},{"id":1181,"content":"roadrisk:aftenposten","start":1410460055000,"group":"roadrisk:aftenposten"},{"id":1182,"content":"roadrisk:aftenposten","start":1410459919000,"group":"roadrisk:aftenposten"},{"id":1183,"content":"roadrisk:aftenposten","start":1410459839000,"group":"roadrisk:aftenposten"},{"id":1184,"content":"roadrisk:aftenposten","start":1410459652000,"group":"roadrisk:aftenposten"},{"id":1185,"content":"roadrisk:aftenposten","start":1410459615000,"group":"roadrisk:aftenposten"},{"id":1186,"content":"roadrisk:aftenposten","start":1410459600000,"group":"roadrisk:aftenposten"},{"id":1187,"content":"roadrisk:aftenposten","start":1410459479000,"group":"roadrisk:aftenposten"},{"id":1188,"content":"roadrisk:aftenposten","start":1410459426000,"group":"roadrisk:aftenposten"},{"id":1189,"content":"roadrisk:aftenposten","start":1410458736000,"group":"roadrisk:aftenposten"},{"id":1190,"content":"roadrisk:aftenposten","start":1410458597000,"group":"roadrisk:aftenposten"},{"id":1191,"content":"roadrisk:aftenposten","start":1410458566000,"group":"roadrisk:aftenposten"},{"id":1192,"content":"roadrisk:aftenposten","start":1410458444000,"group":"roadrisk:aftenposten"},{"id":1193,"content":"roadrisk:aftenposten","start":1410458418000,"group":"roadrisk:aftenposten"},{"id":1194,"content":"roadrisk:aftenposten","start":1410458391000,"group":"roadrisk:aftenposten"},{"id":1195,"content":"roadrisk:aftenposten","start":1410458316000,"group":"roadrisk:aftenposten"},{"id":1196,"content":"accident:aftenposten","start":1410458146000,"group":"accident:aftenposten"},{"id":1197,"content":"roadrisk:aftenposten","start":1410457859000,"group":"roadrisk:aftenposten"},{"id":1198,"content":"roadrisk:aftenposten","start":1410457730000,"group":"roadrisk:aftenposten"},{"id":1199,"content":"roadrisk:aftenposten","start":1410457730000,"group":"roadrisk:aftenposten"},{"id":1200,"content":"accident:aftenposten","start":1410457639000,"group":"accident:aftenposten"},{"id":1201,"content":"roadrisk:aftenposten","start":1410457534000,"group":"roadrisk:aftenposten"},{"id":1202,"content":"roadrisk:aftenposten","start":1410457350000,"group":"roadrisk:aftenposten"},{"id":1203,"content":"roadrisk:aftenposten","start":1410457224000,"group":"roadrisk:aftenposten"},{"id":1204,"content":"roadrisk:aftenposten","start":1410456991000,"group":"roadrisk:aftenposten"},{"id":1205,"content":"roadrisk:aftenposten","start":1410456828000,"group":"roadrisk:aftenposten"},{"id":1206,"content":"roadrisk:aftenposten","start":1410456697000,"group":"roadrisk:aftenposten"},{"id":1207,"content":"roadrisk:aftenposten","start":1410456668000,"group":"roadrisk:aftenposten"},{"id":1208,"content":"roadrisk:aftenposten","start":1410456644000,"group":"roadrisk:aftenposten"},{"id":1209,"content":"roadrisk:aftenposten","start":1410456529000,"group":"roadrisk:aftenposten"},{"id":1210,"content":"roadrisk:aftenposten","start":1410456306000,"group":"roadrisk:aftenposten"},{"id":1211,"content":"roadrisk:aftenposten","start":1410456064000,"group":"roadrisk:aftenposten"},{"id":1212,"content":"roadrisk:aftenposten","start":1410455529000,"group":"roadrisk:aftenposten"},{"id":1213,"content":"accident:aftenposten","start":1410455259000,"group":"accident:aftenposten"},{"id":1214,"content":"accident:aftenposten","start":1410455178000,"group":"accident:aftenposten"},{"id":1215,"content":"accident:aftenposten","start":1410455047000,"group":"accident:aftenposten"},{"id":1216,"content":"accident:aftenposten","start":1410454991000,"group":"accident:aftenposten"},{"id":1217,"content":"accident:aftenposten","start":1410454597000,"group":"accident:aftenposten"},{"id":1218,"content":"roadrisk:aftenposten","start":1410454479000,"group":"roadrisk:aftenposten"},{"id":1219,"content":"roadrisk:aftenposten","start":1410454016000,"group":"roadrisk:aftenposten"},{"id":1220,"content":"roadrisk:aftenposten","start":1410452713000,"group":"roadrisk:aftenposten"},{"id":1221,"content":"roadrisk:aftenposten","start":1410452336000,"group":"roadrisk:aftenposten"},{"id":1222,"content":"roadrisk:aftenposten","start":1410451656000,"group":"roadrisk:aftenposten"},{"id":1223,"content":"roadrisk:aftenposten","start":1410451436000,"group":"roadrisk:aftenposten"},{"id":1224,"content":"accident:aftenposten","start":1410450399000,"group":"accident:aftenposten"},{"id":1225,"content":"roadrisk:aftenposten","start":1410450332000,"group":"roadrisk:aftenposten"},{"id":1226,"content":"roadrisk:aftenposten","start":1410449138000,"group":"roadrisk:aftenposten"},{"id":1227,"content":"roadrisk:aftenposten","start":1410448920000,"group":"roadrisk:aftenposten"},{"id":1228,"content":"roadrisk:aftenposten","start":1410448771000,"group":"roadrisk:aftenposten"},{"id":1229,"content":"roadrisk:aftenposten","start":1410448668000,"group":"roadrisk:aftenposten"},{"id":1230,"content":"accident:aftenposten","start":1410448629000,"group":"accident:aftenposten"},{"id":1231,"content":"roadrisk:aftenposten","start":1410448118000,"group":"roadrisk:aftenposten"},{"id":1232,"content":"roadrisk:aftenposten","start":1410448000000,"group":"roadrisk:aftenposten"},{"id":1233,"content":"roadrisk:aftenposten","start":1410447848000,"group":"roadrisk:aftenposten"},{"id":1234,"content":"roadrisk:aftenposten","start":1410447791000,"group":"roadrisk:aftenposten"},{"id":1235,"content":"roadrisk:aftenposten","start":1410447648000,"group":"roadrisk:aftenposten"},{"id":1236,"content":"roadrisk:aftenposten","start":1410447629000,"group":"roadrisk:aftenposten"},{"id":1237,"content":"roadrisk:aftenposten","start":1410447014000,"group":"roadrisk:aftenposten"},{"id":1238,"content":"roadrisk:aftenposten","start":1410446789000,"group":"roadrisk:aftenposten"},{"id":1239,"content":"accident:aftenposten","start":1410446769000,"group":"accident:aftenposten"},{"id":1240,"content":"accident:aftenposten","start":1410446655000,"group":"accident:aftenposten"},{"id":1241,"content":"accident:aftenposten","start":1410446551000,"group":"accident:aftenposten"},{"id":1242,"content":"accident:aftenposten","start":1410446487000,"group":"accident:aftenposten"},{"id":1243,"content":"roadrisk:aftenposten","start":1410445732000,"group":"roadrisk:aftenposten"},{"id":1244,"content":"roadrisk:aftenposten","start":1410445367000,"group":"roadrisk:aftenposten"},{"id":1245,"content":"roadrisk:aftenposten","start":1410445012000,"group":"roadrisk:aftenposten"},{"id":1246,"content":"roadrisk:aftenposten","start":1410444970000,"group":"roadrisk:aftenposten"},{"id":1247,"content":"roadrisk:aftenposten","start":1410444952000,"group":"roadrisk:aftenposten"},{"id":1248,"content":"accident:aftenposten","start":1410444784000,"group":"accident:aftenposten"},{"id":1249,"content":"roadrisk:aftenposten","start":1410444727000,"group":"roadrisk:aftenposten"},{"id":1250,"content":"roadrisk:aftenposten","start":1410444507000,"group":"roadrisk:aftenposten"},{"id":1251,"content":"roadrisk:aftenposten","start":1410444434000,"group":"roadrisk:aftenposten"},{"id":1252,"content":"roadrisk:aftenposten","start":1410444411000,"group":"roadrisk:aftenposten"},{"id":1253,"content":"roadrisk:aftenposten","start":1410444403000,"group":"roadrisk:aftenposten"},{"id":1254,"content":"roadrisk:aftenposten","start":1410444374000,"group":"roadrisk:aftenposten"},{"id":1255,"content":"accident:aftenposten","start":1410443807000,"group":"accident:aftenposten"},{"id":1256,"content":"roadrisk:aftenposten","start":1410443362000,"group":"roadrisk:aftenposten"},{"id":1257,"content":"roadrisk:aftenposten","start":1410443333000,"group":"roadrisk:aftenposten"},{"id":1258,"content":"roadrisk:aftenposten","start":1410443215000,"group":"roadrisk:aftenposten"},{"id":1259,"content":"accident:aftenposten","start":1410443091000,"group":"accident:aftenposten"},{"id":1260,"content":"accident:aftenposten","start":1410443031000,"group":"accident:aftenposten"},{"id":1261,"content":"roadrisk:aftenposten","start":1410442940000,"group":"roadrisk:aftenposten"},{"id":1262,"content":"roadrisk:aftenposten","start":1410442875000,"group":"roadrisk:aftenposten"},{"id":1263,"content":"accident:aftenposten","start":1410442844000,"group":"accident:aftenposten"},{"id":1264,"content":"accident:aftenposten","start":1410442821000,"group":"accident:aftenposten"},{"id":1265,"content":"roadrisk:aftenposten","start":1410442806000,"group":"roadrisk:aftenposten"},{"id":1266,"content":"roadrisk:aftenposten","start":1410442768000,"group":"roadrisk:aftenposten"},{"id":1267,"content":"roadrisk:aftenposten","start":1410442730000,"group":"roadrisk:aftenposten"},{"id":1268,"content":"accident:aftenposten","start":1410442532000,"group":"accident:aftenposten"},{"id":1269,"content":"roadrisk:aftenposten","start":1410442278000,"group":"roadrisk:aftenposten"},{"id":1270,"content":"roadrisk:aftenposten","start":1410442089000,"group":"roadrisk:aftenposten"},{"id":1271,"content":"roadrisk:aftenposten","start":1410441942000,"group":"roadrisk:aftenposten"},{"id":1272,"content":"roadrisk:aftenposten","start":1410441859000,"group":"roadrisk:aftenposten"},{"id":1273,"content":"roadrisk:aftenposten","start":1410441751000,"group":"roadrisk:aftenposten"},{"id":1274,"content":"roadrisk:aftenposten","start":1410441611000,"group":"roadrisk:aftenposten"},{"id":1275,"content":"roadrisk:aftenposten","start":1410441496000,"group":"roadrisk:aftenposten"},{"id":1276,"content":"roadrisk:aftenposten","start":1410441205000,"group":"roadrisk:aftenposten"},{"id":1277,"content":"roadrisk:aftenposten","start":1410441134000,"group":"roadrisk:aftenposten"},{"id":1278,"content":"roadrisk:aftenposten","start":1410440696000,"group":"roadrisk:aftenposten"},{"id":1279,"content":"roadrisk:aftenposten","start":1410440424000,"group":"roadrisk:aftenposten"},{"id":1280,"content":"accident:aftenposten","start":1410440403000,"group":"accident:aftenposten"},{"id":1281,"content":"accident:aftenposten","start":1410440297000,"group":"accident:aftenposten"},{"id":1282,"content":"roadrisk:aftenposten","start":1410439754000,"group":"roadrisk:aftenposten"},{"id":1283,"content":"roadrisk:aftenposten","start":1410439468000,"group":"roadrisk:aftenposten"},{"id":1284,"content":"accident:aftenposten","start":1410439334000,"group":"accident:aftenposten"},{"id":1285,"content":"roadrisk:aftenposten","start":1410439015000,"group":"roadrisk:aftenposten"},{"id":1286,"content":"roadrisk:aftenposten","start":1410438883000,"group":"roadrisk:aftenposten"},{"id":1287,"content":"roadrisk:aftenposten","start":1410438819000,"group":"roadrisk:aftenposten"},{"id":1288,"content":"roadrisk:aftenposten","start":1410438323000,"group":"roadrisk:aftenposten"},{"id":1289,"content":"roadrisk:aftenposten","start":1410438242000,"group":"roadrisk:aftenposten"},{"id":1290,"content":"roadrisk:aftenposten","start":1410438079000,"group":"roadrisk:aftenposten"},{"id":1291,"content":"roadrisk:aftenposten","start":1410437972000,"group":"roadrisk:aftenposten"},{"id":1292,"content":"roadrisk:aftenposten","start":1410437771000,"group":"roadrisk:aftenposten"},{"id":1293,"content":"roadrisk:aftenposten","start":1410437383000,"group":"roadrisk:aftenposten"},{"id":1294,"content":"roadrisk:aftenposten","start":1410437153000,"group":"roadrisk:aftenposten"},{"id":1295,"content":"roadrisk:aftenposten","start":1410437058000,"group":"roadrisk:aftenposten"},{"id":1296,"content":"roadrisk:aftenposten","start":1410437021000,"group":"roadrisk:aftenposten"},{"id":1297,"content":"roadrisk:aftenposten","start":1410436963000,"group":"roadrisk:aftenposten"},{"id":1298,"content":"roadrisk:aftenposten","start":1410436885000,"group":"roadrisk:aftenposten"},{"id":1299,"content":"accident:aftenposten","start":1410436787000,"group":"accident:aftenposten"},{"id":1300,"content":"roadrisk:aftenposten","start":1410436663000,"group":"roadrisk:aftenposten"},{"id":1301,"content":"roadrisk:aftenposten","start":1410436649000,"group":"roadrisk:aftenposten"},{"id":1302,"content":"roadrisk:aftenposten","start":1410436574000,"group":"roadrisk:aftenposten"},{"id":1303,"content":"roadrisk:aftenposten","start":1410436314000,"group":"roadrisk:aftenposten"},{"id":1304,"content":"roadrisk:aftenposten","start":1410436310000,"group":"roadrisk:aftenposten"},{"id":1305,"content":"roadrisk:aftenposten","start":1410436298000,"group":"roadrisk:aftenposten"},{"id":1306,"content":"roadrisk:aftenposten","start":1410435891000,"group":"roadrisk:aftenposten"},{"id":1307,"content":"roadrisk:aftenposten","start":1410435844000,"group":"roadrisk:aftenposten"},{"id":1308,"content":"roadrisk:aftenposten","start":1410435679000,"group":"roadrisk:aftenposten"},{"id":1309,"content":"roadrisk:aftenposten","start":1410435658000,"group":"roadrisk:aftenposten"},{"id":1310,"content":"accident:aftenposten","start":1410435625000,"group":"accident:aftenposten"},{"id":1311,"content":"roadrisk:aftenposten","start":1410435546000,"group":"roadrisk:aftenposten"},{"id":1312,"content":"roadrisk:aftenposten","start":1410435460000,"group":"roadrisk:aftenposten"},{"id":1313,"content":"roadrisk:aftenposten","start":1410435442000,"group":"roadrisk:aftenposten"},{"id":1314,"content":"roadrisk:aftenposten","start":1410435394000,"group":"roadrisk:aftenposten"},{"id":1315,"content":"roadrisk:aftenposten","start":1410435327000,"group":"roadrisk:aftenposten"},{"id":1316,"content":"roadrisk:aftenposten","start":1410435145000,"group":"roadrisk:aftenposten"},{"id":1317,"content":"roadrisk:aftenposten","start":1410434960000,"group":"roadrisk:aftenposten"},{"id":1318,"content":"roadrisk:aftenposten","start":1410434922000,"group":"roadrisk:aftenposten"},{"id":1319,"content":"roadrisk:aftenposten","start":1410434464000,"group":"roadrisk:aftenposten"},{"id":1320,"content":"roadrisk:aftenposten","start":1410434375000,"group":"roadrisk:aftenposten"},{"id":1321,"content":"roadrisk:aftenposten","start":1410434342000,"group":"roadrisk:aftenposten"},{"id":1322,"content":"accident:aftenposten","start":1410434265000,"group":"accident:aftenposten"},{"id":1323,"content":"roadrisk:aftenposten","start":1410434258000,"group":"roadrisk:aftenposten"},{"id":1324,"content":"accident:aftenposten","start":1410434184000,"group":"accident:aftenposten"},{"id":1325,"content":"roadrisk:aftenposten","start":1410434112000,"group":"roadrisk:aftenposten"},{"id":1326,"content":"roadrisk:aftenposten","start":1410434065000,"group":"roadrisk:aftenposten"},{"id":1327,"content":"accident:aftenposten","start":1410434064000,"group":"accident:aftenposten"},{"id":1328,"content":"roadrisk:aftenposten","start":1410434039000,"group":"roadrisk:aftenposten"},{"id":1329,"content":"roadrisk:aftenposten","start":1410434026000,"group":"roadrisk:aftenposten"},{"id":1330,"content":"roadrisk:aftenposten","start":1410434014000,"group":"roadrisk:aftenposten"},{"id":1331,"content":"roadrisk:aftenposten","start":1410433994000,"group":"roadrisk:aftenposten"},{"id":1332,"content":"roadrisk:aftenposten","start":1410433961000,"group":"roadrisk:aftenposten"},{"id":1333,"content":"roadrisk:aftenposten","start":1410433953000,"group":"roadrisk:aftenposten"},{"id":1334,"content":"accident:aftenposten","start":1410433901000,"group":"accident:aftenposten"},{"id":1335,"content":"roadrisk:aftenposten","start":1410433901000,"group":"roadrisk:aftenposten"},{"id":1336,"content":"accident:aftenposten","start":1410433854000,"group":"accident:aftenposten"},{"id":1337,"content":"roadrisk:aftenposten","start":1410433772000,"group":"roadrisk:aftenposten"},{"id":1338,"content":"accident:aftenposten","start":1410433727000,"group":"accident:aftenposten"},{"id":1339,"content":"roadrisk:aftenposten","start":1410433679000,"group":"roadrisk:aftenposten"},{"id":1340,"content":"roadrisk:aftenposten","start":1410433661000,"group":"roadrisk:aftenposten"},{"id":1341,"content":"roadrisk:aftenposten","start":1410433569000,"group":"roadrisk:aftenposten"},{"id":1342,"content":"accident:aftenposten","start":1410433520000,"group":"accident:aftenposten"},{"id":1343,"content":"roadrisk:aftenposten","start":1410433494000,"group":"roadrisk:aftenposten"},{"id":1344,"content":"roadrisk:aftenposten","start":1410433492000,"group":"roadrisk:aftenposten"},{"id":1345,"content":"roadrisk:aftenposten","start":1410433442000,"group":"roadrisk:aftenposten"},{"id":1346,"content":"accident:aftenposten","start":1410433423000,"group":"accident:aftenposten"},{"id":1347,"content":"accident:aftenposten","start":1410433417000,"group":"accident:aftenposten"},{"id":1348,"content":"roadrisk:aftenposten","start":1410433400000,"group":"roadrisk:aftenposten"},{"id":1349,"content":"accident:aftenposten","start":1410433138000,"group":"accident:aftenposten"},{"id":1350,"content":"roadrisk:aftenposten","start":1410433088000,"group":"roadrisk:aftenposten"},{"id":1351,"content":"roadrisk:aftenposten","start":1410433000000,"group":"roadrisk:aftenposten"},{"id":1352,"content":"accident:aftenposten","start":1410432979000,"group":"accident:aftenposten"},{"id":1353,"content":"accident:aftenposten","start":1410432925000,"group":"accident:aftenposten"},{"id":1354,"content":"accident:aftenposten","start":1410432797000,"group":"accident:aftenposten"},{"id":1355,"content":"roadrisk:aftenposten","start":1410432728000,"group":"roadrisk:aftenposten"},{"id":1356,"content":"roadrisk:aftenposten","start":1410432681000,"group":"roadrisk:aftenposten"},{"id":1357,"content":"roadrisk:aftenposten","start":1410432624000,"group":"roadrisk:aftenposten"},{"id":1358,"content":"roadrisk:aftenposten","start":1410432545000,"group":"roadrisk:aftenposten"},{"id":1359,"content":"roadrisk:aftenposten","start":1410432534000,"group":"roadrisk:aftenposten"},{"id":1360,"content":"roadrisk:aftenposten","start":1410432466000,"group":"roadrisk:aftenposten"},{"id":1361,"content":"roadrisk:aftenposten","start":1410432432000,"group":"roadrisk:aftenposten"},{"id":1362,"content":"roadrisk:aftenposten","start":1410432368000,"group":"roadrisk:aftenposten"},{"id":1363,"content":"roadrisk:aftenposten","start":1410432292000,"group":"roadrisk:aftenposten"},{"id":1364,"content":"roadrisk:aftenposten","start":1410432288000,"group":"roadrisk:aftenposten"},{"id":1365,"content":"roadrisk:aftenposten","start":1410432241000,"group":"roadrisk:aftenposten"},{"id":1366,"content":"roadrisk:aftenposten","start":1410432004000,"group":"roadrisk:aftenposten"},{"id":1367,"content":"roadrisk:aftenposten","start":1410431972000,"group":"roadrisk:aftenposten"},{"id":1368,"content":"roadrisk:aftenposten","start":1410431899000,"group":"roadrisk:aftenposten"},{"id":1369,"content":"roadrisk:aftenposten","start":1410431867000,"group":"roadrisk:aftenposten"},{"id":1370,"content":"roadrisk:aftenposten","start":1410431833000,"group":"roadrisk:aftenposten"},{"id":1371,"content":"roadrisk:aftenposten","start":1410431736000,"group":"roadrisk:aftenposten"},{"id":1372,"content":"roadrisk:aftenposten","start":1410431617000,"group":"roadrisk:aftenposten"},{"id":1373,"content":"roadrisk:aftenposten","start":1410431592000,"group":"roadrisk:aftenposten"},{"id":1374,"content":"roadrisk:aftenposten","start":1410431561000,"group":"roadrisk:aftenposten"},{"id":1375,"content":"roadrisk:aftenposten","start":1410431488000,"group":"roadrisk:aftenposten"},{"id":1376,"content":"accident:aftenposten","start":1410431471000,"group":"accident:aftenposten"},{"id":1377,"content":"roadrisk:aftenposten","start":1410431361000,"group":"roadrisk:aftenposten"},{"id":1378,"content":"roadrisk:aftenposten","start":1410431304000,"group":"roadrisk:aftenposten"},{"id":1379,"content":"roadrisk:aftenposten","start":1410431300000,"group":"roadrisk:aftenposten"},{"id":1380,"content":"roadrisk:aftenposten","start":1410431247000,"group":"roadrisk:aftenposten"},{"id":1381,"content":"roadrisk:aftenposten","start":1410431236000,"group":"roadrisk:aftenposten"},{"id":1382,"content":"roadrisk:aftenposten","start":1410431030000,"group":"roadrisk:aftenposten"},{"id":1383,"content":"roadrisk:aftenposten","start":1410430961000,"group":"roadrisk:aftenposten"},{"id":1384,"content":"roadrisk:aftenposten","start":1410430903000,"group":"roadrisk:aftenposten"},{"id":1385,"content":"roadrisk:aftenposten","start":1410430796000,"group":"roadrisk:aftenposten"},{"id":1386,"content":"accident:aftenposten","start":1410430760000,"group":"accident:aftenposten"},{"id":1387,"content":"roadrisk:aftenposten","start":1410430752000,"group":"roadrisk:aftenposten"},{"id":1388,"content":"roadrisk:aftenposten","start":1410430708000,"group":"roadrisk:aftenposten"},{"id":1389,"content":"roadrisk:aftenposten","start":1410430602000,"group":"roadrisk:aftenposten"},{"id":1390,"content":"roadrisk:aftenposten","start":1410430550000,"group":"roadrisk:aftenposten"},{"id":1391,"content":"roadrisk:aftenposten","start":1410430507000,"group":"roadrisk:aftenposten"},{"id":1392,"content":"roadrisk:aftenposten","start":1410430459000,"group":"roadrisk:aftenposten"},{"id":1393,"content":"roadrisk:aftenposten","start":1410430398000,"group":"roadrisk:aftenposten"},{"id":1394,"content":"roadrisk:aftenposten","start":1410430391000,"group":"roadrisk:aftenposten"},{"id":1395,"content":"roadrisk:aftenposten","start":1410430362000,"group":"roadrisk:aftenposten"},{"id":1396,"content":"roadrisk:aftenposten","start":1410430325000,"group":"roadrisk:aftenposten"},{"id":1397,"content":"roadrisk:aftenposten","start":1410430301000,"group":"roadrisk:aftenposten"},{"id":1398,"content":"roadrisk:aftenposten","start":1410430258000,"group":"roadrisk:aftenposten"},{"id":1399,"content":"roadrisk:aftenposten","start":1410430247000,"group":"roadrisk:aftenposten"},{"id":1400,"content":"roadrisk:aftenposten","start":1410430193000,"group":"roadrisk:aftenposten"},{"id":1401,"content":"roadrisk:aftenposten","start":1410430173000,"group":"roadrisk:aftenposten"},{"id":1402,"content":"roadrisk:aftenposten","start":1410430087000,"group":"roadrisk:aftenposten"},{"id":1403,"content":"roadrisk:aftenposten","start":1410430052000,"group":"roadrisk:aftenposten"},{"id":1404,"content":"roadrisk:aftenposten","start":1410430051000,"group":"roadrisk:aftenposten"},{"id":1405,"content":"roadrisk:aftenposten","start":1410430036000,"group":"roadrisk:aftenposten"},{"id":1406,"content":"accident:aftenposten","start":1410430016000,"group":"accident:aftenposten"},{"id":1407,"content":"roadrisk:aftenposten","start":1410430011000,"group":"roadrisk:aftenposten"},{"id":1408,"content":"roadrisk:aftenposten","start":1410430010000,"group":"roadrisk:aftenposten"},{"id":1409,"content":"roadrisk:aftenposten","start":1410429960000,"group":"roadrisk:aftenposten"},{"id":1410,"content":"roadrisk:aftenposten","start":1410429938000,"group":"roadrisk:aftenposten"},{"id":1411,"content":"roadrisk:aftenposten","start":1410429871000,"group":"roadrisk:aftenposten"},{"id":1412,"content":"roadrisk:aftenposten","start":1410429839000,"group":"roadrisk:aftenposten"},{"id":1413,"content":"roadrisk:aftenposten","start":1410429824000,"group":"roadrisk:aftenposten"},{"id":1414,"content":"roadrisk:aftenposten","start":1410429772000,"group":"roadrisk:aftenposten"},{"id":1415,"content":"roadrisk:aftenposten","start":1410429733000,"group":"roadrisk:aftenposten"},{"id":1416,"content":"roadrisk:aftenposten","start":1410429677000,"group":"roadrisk:aftenposten"},{"id":1417,"content":"roadrisk:aftenposten","start":1410429596000,"group":"roadrisk:aftenposten"},{"id":1418,"content":"roadrisk:aftenposten","start":1410429591000,"group":"roadrisk:aftenposten"},{"id":1419,"content":"roadrisk:aftenposten","start":1410429543000,"group":"roadrisk:aftenposten"},{"id":1420,"content":"roadrisk:aftenposten","start":1410429534000,"group":"roadrisk:aftenposten"},{"id":1421,"content":"roadrisk:aftenposten","start":1410429502000,"group":"roadrisk:aftenposten"},{"id":1422,"content":"roadrisk:aftenposten","start":1410429480000,"group":"roadrisk:aftenposten"},{"id":1423,"content":"roadrisk:aftenposten","start":1410429466000,"group":"roadrisk:aftenposten"},{"id":1424,"content":"roadrisk:aftenposten","start":1410429430000,"group":"roadrisk:aftenposten"},{"id":1425,"content":"roadrisk:aftenposten","start":1410429375000,"group":"roadrisk:aftenposten"},{"id":1426,"content":"roadrisk:aftenposten","start":1410429284000,"group":"roadrisk:aftenposten"},{"id":1427,"content":"roadrisk:aftenposten","start":1410429269000,"group":"roadrisk:aftenposten"},{"id":1428,"content":"roadrisk:aftenposten","start":1410429256000,"group":"roadrisk:aftenposten"},{"id":1429,"content":"roadrisk:aftenposten","start":1410429168000,"group":"roadrisk:aftenposten"},{"id":1430,"content":"accident:aftenposten","start":1410429107000,"group":"accident:aftenposten"},{"id":1431,"content":"accident:aftenposten","start":1410429047000,"group":"accident:aftenposten"},{"id":1432,"content":"roadrisk:aftenposten","start":1410428884000,"group":"roadrisk:aftenposten"},{"id":1433,"content":"accident:aftenposten","start":1410428799000,"group":"accident:aftenposten"},{"id":1434,"content":"roadrisk:aftenposten","start":1410428796000,"group":"roadrisk:aftenposten"},{"id":1435,"content":"accident:aftenposten","start":1410428727000,"group":"accident:aftenposten"},{"id":1436,"content":"roadrisk:aftenposten","start":1410428639000,"group":"roadrisk:aftenposten"},{"id":1437,"content":"roadrisk:aftenposten","start":1410428447000,"group":"roadrisk:aftenposten"},{"id":1438,"content":"roadrisk:aftenposten","start":1410428277000,"group":"roadrisk:aftenposten"},{"id":1439,"content":"accident:aftenposten","start":1410428096000,"group":"accident:aftenposten"},{"id":1440,"content":"roadrisk:aftenposten","start":1410427999000,"group":"roadrisk:aftenposten"},{"id":1441,"content":"roadrisk:aftenposten","start":1410427928000,"group":"roadrisk:aftenposten"},{"id":1442,"content":"roadrisk:aftenposten","start":1410427778000,"group":"roadrisk:aftenposten"},{"id":1443,"content":"roadrisk:aftenposten","start":1410427701000,"group":"roadrisk:aftenposten"},{"id":1444,"content":"roadrisk:aftenposten","start":1410427658000,"group":"roadrisk:aftenposten"},{"id":1445,"content":"accident:aftenposten","start":1410427630000,"group":"accident:aftenposten"},{"id":1446,"content":"roadrisk:aftenposten","start":1410427605000,"group":"roadrisk:aftenposten"},{"id":1447,"content":"roadrisk:aftenposten","start":1410427591000,"group":"roadrisk:aftenposten"},{"id":1448,"content":"roadrisk:aftenposten","start":1410427565000,"group":"roadrisk:aftenposten"},{"id":1449,"content":"roadrisk:aftenposten","start":1410427523000,"group":"roadrisk:aftenposten"},{"id":1450,"content":"roadrisk:aftenposten","start":1410427492000,"group":"roadrisk:aftenposten"},{"id":1451,"content":"accident:aftenposten","start":1410427421000,"group":"accident:aftenposten"},{"id":1452,"content":"roadrisk:aftenposten","start":1410427304000,"group":"roadrisk:aftenposten"},{"id":1453,"content":"roadrisk:aftenposten","start":1410427227000,"group":"roadrisk:aftenposten"},{"id":1454,"content":"roadrisk:aftenposten","start":1410426924000,"group":"roadrisk:aftenposten"},{"id":1455,"content":"roadrisk:aftenposten","start":1410426871000,"group":"roadrisk:aftenposten"},{"id":1456,"content":"roadrisk:aftenposten","start":1410426846000,"group":"roadrisk:aftenposten"},{"id":1457,"content":"roadrisk:aftenposten","start":1410426750000,"group":"roadrisk:aftenposten"},{"id":1458,"content":"roadrisk:aftenposten","start":1410426696000,"group":"roadrisk:aftenposten"},{"id":1459,"content":"roadrisk:aftenposten","start":1410426672000,"group":"roadrisk:aftenposten"},{"id":1460,"content":"roadrisk:aftenposten","start":1410426642000,"group":"roadrisk:aftenposten"},{"id":1461,"content":"roadrisk:aftenposten","start":1410426629000,"group":"roadrisk:aftenposten"},{"id":1462,"content":"roadrisk:aftenposten","start":1410426620000,"group":"roadrisk:aftenposten"},{"id":1463,"content":"roadrisk:aftenposten","start":1410426531000,"group":"roadrisk:aftenposten"},{"id":1464,"content":"roadrisk:aftenposten","start":1410426521000,"group":"roadrisk:aftenposten"},{"id":1465,"content":"roadrisk:aftenposten","start":1410426421000,"group":"roadrisk:aftenposten"},{"id":1466,"content":"roadrisk:aftenposten","start":1410426380000,"group":"roadrisk:aftenposten"},{"id":1467,"content":"roadrisk:aftenposten","start":1410426277000,"group":"roadrisk:aftenposten"},{"id":1468,"content":"roadrisk:aftenposten","start":1410425955000,"group":"roadrisk:aftenposten"},{"id":1469,"content":"roadrisk:aftenposten","start":1410425744000,"group":"roadrisk:aftenposten"},{"id":1470,"content":"roadrisk:aftenposten","start":1410425649000,"group":"roadrisk:aftenposten"},{"id":1471,"content":"accident:aftenposten","start":1410425630000,"group":"accident:aftenposten"},{"id":1472,"content":"roadrisk:aftenposten","start":1410425573000,"group":"roadrisk:aftenposten"},{"id":1473,"content":"roadrisk:aftenposten","start":1410425553000,"group":"roadrisk:aftenposten"},{"id":1474,"content":"roadrisk:aftenposten","start":1410425493000,"group":"roadrisk:aftenposten"},{"id":1475,"content":"roadrisk:aftenposten","start":1410425434000,"group":"roadrisk:aftenposten"},{"id":1476,"content":"roadrisk:aftenposten","start":1410425360000,"group":"roadrisk:aftenposten"},{"id":1477,"content":"roadrisk:aftenposten","start":1410425302000,"group":"roadrisk:aftenposten"},{"id":1478,"content":"roadrisk:aftenposten","start":1410425256000,"group":"roadrisk:aftenposten"},{"id":1479,"content":"roadrisk:aftenposten","start":1410425236000,"group":"roadrisk:aftenposten"},{"id":1480,"content":"roadrisk:aftenposten","start":1410425235000,"group":"roadrisk:aftenposten"},{"id":1481,"content":"roadrisk:aftenposten","start":1410425203000,"group":"roadrisk:aftenposten"},{"id":1482,"content":"roadrisk:aftenposten","start":1410425136000,"group":"roadrisk:aftenposten"},{"id":1483,"content":"accident:aftenposten","start":1410425094000,"group":"accident:aftenposten"},{"id":1484,"content":"accident:aftenposten","start":1410425080000,"group":"accident:aftenposten"},{"id":1485,"content":"roadrisk:aftenposten","start":1410425031000,"group":"roadrisk:aftenposten"},{"id":1486,"content":"roadrisk:aftenposten","start":1410424940000,"group":"roadrisk:aftenposten"},{"id":1487,"content":"roadrisk:aftenposten","start":1410424898000,"group":"roadrisk:aftenposten"},{"id":1488,"content":"roadrisk:aftenposten","start":1410424831000,"group":"roadrisk:aftenposten"},{"id":1489,"content":"roadrisk:aftenposten","start":1410424736000,"group":"roadrisk:aftenposten"},{"id":1490,"content":"roadrisk:aftenposten","start":1410424670000,"group":"roadrisk:aftenposten"},{"id":1491,"content":"roadrisk:aftenposten","start":1410424599000,"group":"roadrisk:aftenposten"},{"id":1492,"content":"roadrisk:aftenposten","start":1410424310000,"group":"roadrisk:aftenposten"},{"id":1493,"content":"roadrisk:aftenposten","start":1410424131000,"group":"roadrisk:aftenposten"},{"id":1494,"content":"roadrisk:aftenposten","start":1410424025000,"group":"roadrisk:aftenposten"},{"id":1495,"content":"roadrisk:aftenposten","start":1410423890000,"group":"roadrisk:aftenposten"},{"id":1496,"content":"roadrisk:aftenposten","start":1410423736000,"group":"roadrisk:aftenposten"},{"id":1497,"content":"roadrisk:aftenposten","start":1410423722000,"group":"roadrisk:aftenposten"},{"id":1498,"content":"roadrisk:aftenposten","start":1410423679000,"group":"roadrisk:aftenposten"},{"id":1499,"content":"roadrisk:aftenposten","start":1410423671000,"group":"roadrisk:aftenposten"},{"id":1500,"content":"roadrisk:aftenposten","start":1410423441000,"group":"roadrisk:aftenposten"},{"id":1501,"content":"accident:aftenposten","start":1410423197000,"group":"accident:aftenposten"},{"id":1502,"content":"roadrisk:aftenposten","start":1410422936000,"group":"roadrisk:aftenposten"},{"id":1503,"content":"roadrisk:aftenposten","start":1410422742000,"group":"roadrisk:aftenposten"},{"id":1504,"content":"roadrisk:aftenposten","start":1410422589000,"group":"roadrisk:aftenposten"},{"id":1505,"content":"roadrisk:aftenposten","start":1410422184000,"group":"roadrisk:aftenposten"},{"id":1506,"content":"roadrisk:aftenposten","start":1410422006000,"group":"roadrisk:aftenposten"},{"id":1507,"content":"roadrisk:aftenposten","start":1410421969000,"group":"roadrisk:aftenposten"},{"id":1508,"content":"roadrisk:aftenposten","start":1410421966000,"group":"roadrisk:aftenposten"},{"id":1509,"content":"roadrisk:aftenposten","start":1410421960000,"group":"roadrisk:aftenposten"},{"id":1510,"content":"roadrisk:aftenposten","start":1410421854000,"group":"roadrisk:aftenposten"},{"id":1511,"content":"roadrisk:aftenposten","start":1410421838000,"group":"roadrisk:aftenposten"},{"id":1512,"content":"roadrisk:aftenposten","start":1410421752000,"group":"roadrisk:aftenposten"},{"id":1513,"content":"roadrisk:aftenposten","start":1410421741000,"group":"roadrisk:aftenposten"},{"id":1514,"content":"accident:aftenposten","start":1410421690000,"group":"accident:aftenposten"},{"id":1515,"content":"roadrisk:aftenposten","start":1410421662000,"group":"roadrisk:aftenposten"},{"id":1516,"content":"roadrisk:aftenposten","start":1410421630000,"group":"roadrisk:aftenposten"},{"id":1517,"content":"roadrisk:aftenposten","start":1410421578000,"group":"roadrisk:aftenposten"},{"id":1518,"content":"roadrisk:aftenposten","start":1410421562000,"group":"roadrisk:aftenposten"},{"id":1519,"content":"roadrisk:aftenposten","start":1410421387000,"group":"roadrisk:aftenposten"},{"id":1520,"content":"roadrisk:aftenposten","start":1410421296000,"group":"roadrisk:aftenposten"},{"id":1521,"content":"roadrisk:aftenposten","start":1410421237000,"group":"roadrisk:aftenposten"},{"id":1522,"content":"roadrisk:aftenposten","start":1410421121000,"group":"roadrisk:aftenposten"},{"id":1523,"content":"roadrisk:aftenposten","start":1410420678000,"group":"roadrisk:aftenposten"},{"id":1524,"content":"roadrisk:aftenposten","start":1410420541000,"group":"roadrisk:aftenposten"},{"id":1525,"content":"roadrisk:aftenposten","start":1410420506000,"group":"roadrisk:aftenposten"},{"id":1526,"content":"roadrisk:aftenposten","start":1410420428000,"group":"roadrisk:aftenposten"},{"id":1527,"content":"roadrisk:aftenposten","start":1410420370000,"group":"roadrisk:aftenposten"},{"id":1528,"content":"accident:aftenposten","start":1410420347000,"group":"accident:aftenposten"},{"id":1529,"content":"roadrisk:aftenposten","start":1410420174000,"group":"roadrisk:aftenposten"},{"id":1530,"content":"accident:aftenposten","start":1410420152000,"group":"accident:aftenposten"},{"id":1531,"content":"roadrisk:aftenposten","start":1410419961000,"group":"roadrisk:aftenposten"},{"id":1532,"content":"roadrisk:aftenposten","start":1410419841000,"group":"roadrisk:aftenposten"},{"id":1533,"content":"roadrisk:aftenposten","start":1410419714000,"group":"roadrisk:aftenposten"},{"id":1534,"content":"roadrisk:aftenposten","start":1410419455000,"group":"roadrisk:aftenposten"},{"id":1535,"content":"roadrisk:aftenposten","start":1410419410000,"group":"roadrisk:aftenposten"},{"id":1536,"content":"accident:aftenposten","start":1410419400000,"group":"accident:aftenposten"},{"id":1537,"content":"roadrisk:aftenposten","start":1410419268000,"group":"roadrisk:aftenposten"},{"id":1538,"content":"roadrisk:aftenposten","start":1410419156000,"group":"roadrisk:aftenposten"},{"id":1539,"content":"roadrisk:aftenposten","start":1410419069000,"group":"roadrisk:aftenposten"},{"id":1540,"content":"roadrisk:aftenposten","start":1410418911000,"group":"roadrisk:aftenposten"},{"id":1541,"content":"roadrisk:aftenposten","start":1410418898000,"group":"roadrisk:aftenposten"},{"id":1542,"content":"roadrisk:aftenposten","start":1410418817000,"group":"roadrisk:aftenposten"},{"id":1543,"content":"roadrisk:aftenposten","start":1410418797000,"group":"roadrisk:aftenposten"},{"id":1544,"content":"accident:aftenposten","start":1410418555000,"group":"accident:aftenposten"},{"id":1545,"content":"accident:aftenposten","start":1410418106000,"group":"accident:aftenposten"},{"id":1546,"content":"roadrisk:aftenposten","start":1410418103000,"group":"roadrisk:aftenposten"},{"id":1547,"content":"roadrisk:aftenposten","start":1410417851000,"group":"roadrisk:aftenposten"},{"id":1548,"content":"roadrisk:aftenposten","start":1410417258000,"group":"roadrisk:aftenposten"},{"id":1549,"content":"roadrisk:aftenposten","start":1410416743000,"group":"roadrisk:aftenposten"},{"id":1550,"content":"roadrisk:aftenposten","start":1410416500000,"group":"roadrisk:aftenposten"},{"id":1551,"content":"accident:aftenposten","start":1410416305000,"group":"accident:aftenposten"},{"id":1552,"content":"roadrisk:aftenposten","start":1410416287000,"group":"roadrisk:aftenposten"},{"id":1553,"content":"accident:aftenposten","start":1410416101000,"group":"accident:aftenposten"},{"id":1554,"content":"roadrisk:aftenposten","start":1410414999000,"group":"roadrisk:aftenposten"},{"id":1555,"content":"roadrisk:aftenposten","start":1410414719000,"group":"roadrisk:aftenposten"},{"id":1556,"content":"roadrisk:aftenposten","start":1410413973000,"group":"roadrisk:aftenposten"},{"id":1557,"content":"roadrisk:aftenposten","start":1410413966000,"group":"roadrisk:aftenposten"},{"id":1558,"content":"roadrisk:aftenposten","start":1410413925000,"group":"roadrisk:aftenposten"},{"id":1559,"content":"accident:aftenposten","start":1410413802000,"group":"accident:aftenposten"},{"id":1560,"content":"roadrisk:aftenposten","start":1410413751000,"group":"roadrisk:aftenposten"},{"id":1561,"content":"accident:aftenposten","start":1410413751000,"group":"accident:aftenposten"},{"id":1562,"content":"roadrisk:aftenposten","start":1410413642000,"group":"roadrisk:aftenposten"},{"id":1563,"content":"roadrisk:aftenposten","start":1410413587000,"group":"roadrisk:aftenposten"},{"id":1564,"content":"roadrisk:aftenposten","start":1410413538000,"group":"roadrisk:aftenposten"},{"id":1565,"content":"roadrisk:aftenposten","start":1410413444000,"group":"roadrisk:aftenposten"},{"id":1566,"content":"roadrisk:aftenposten","start":1410413189000,"group":"roadrisk:aftenposten"},{"id":1567,"content":"roadrisk:aftenposten","start":1410409997000,"group":"roadrisk:aftenposten"},{"id":1568,"content":"roadrisk:aftenposten","start":1410407072000,"group":"roadrisk:aftenposten"},{"id":1569,"content":"roadrisk:aftenposten","start":1410405239000,"group":"roadrisk:aftenposten"},{"id":1570,"content":"roadrisk:aftenposten","start":1410400556000,"group":"roadrisk:aftenposten"},{"id":1571,"content":"roadrisk:aftenposten","start":1410398069000,"group":"roadrisk:aftenposten"},{"id":1572,"content":"roadrisk:aftenposten","start":1410395043000,"group":"roadrisk:aftenposten"},{"id":1573,"content":"roadrisk:aftenposten","start":1410394351000,"group":"roadrisk:aftenposten"},{"id":1574,"content":"roadrisk:aftenposten","start":1410391498000,"group":"roadrisk:aftenposten"},{"id":1575,"content":"roadrisk:aftenposten","start":1410391308000,"group":"roadrisk:aftenposten"},{"id":1576,"content":"roadrisk:aftenposten","start":1410391256000,"group":"roadrisk:aftenposten"},{"id":1577,"content":"accident:aftenposten","start":1410386810000,"group":"accident:aftenposten"},{"id":1578,"content":"roadrisk:aftenposten","start":1410386610000,"group":"roadrisk:aftenposten"},{"id":1579,"content":"roadrisk:aftenposten","start":1410386453000,"group":"roadrisk:aftenposten"},{"id":1580,"content":"roadrisk:aftenposten","start":1410386391000,"group":"roadrisk:aftenposten"},{"id":1581,"content":"roadrisk:aftenposten","start":1410386148000,"group":"roadrisk:aftenposten"},{"id":1582,"content":"roadrisk:aftenposten","start":1410386064000,"group":"roadrisk:aftenposten"},{"id":1583,"content":"roadrisk:aftenposten","start":1410386056000,"group":"roadrisk:aftenposten"},{"id":1584,"content":"roadrisk:aftenposten","start":1410385845000,"group":"roadrisk:aftenposten"},{"id":1585,"content":"roadrisk:aftenposten","start":1410385683000,"group":"roadrisk:aftenposten"},{"id":1586,"content":"roadrisk:aftenposten","start":1410385506000,"group":"roadrisk:aftenposten"},{"id":1587,"content":"roadrisk:aftenposten","start":1410385439000,"group":"roadrisk:aftenposten"},{"id":1588,"content":"roadrisk:aftenposten","start":1410385371000,"group":"roadrisk:aftenposten"},{"id":1589,"content":"roadrisk:aftenposten","start":1410385103000,"group":"roadrisk:aftenposten"},{"id":1590,"content":"roadrisk:aftenposten","start":1410385040000,"group":"roadrisk:aftenposten"},{"id":1591,"content":"roadrisk:aftenposten","start":1410384986000,"group":"roadrisk:aftenposten"},{"id":1592,"content":"roadrisk:aftenposten","start":1410384766000,"group":"roadrisk:aftenposten"},{"id":1593,"content":"roadrisk:aftenposten","start":1410384760000,"group":"roadrisk:aftenposten"},{"id":1594,"content":"accident:aftenposten","start":1410384756000,"group":"accident:aftenposten"},{"id":1595,"content":"accident:aftenposten","start":1410384689000,"group":"accident:aftenposten"},{"id":1596,"content":"roadrisk:aftenposten","start":1410384645000,"group":"roadrisk:aftenposten"},{"id":1597,"content":"accident:aftenposten","start":1410384551000,"group":"accident:aftenposten"},{"id":1598,"content":"roadrisk:aftenposten","start":1410384531000,"group":"roadrisk:aftenposten"},{"id":1599,"content":"roadrisk:aftenposten","start":1410384530000,"group":"roadrisk:aftenposten"},{"id":1600,"content":"roadrisk:aftenposten","start":1410384413000,"group":"roadrisk:aftenposten"},{"id":1601,"content":"roadrisk:aftenposten","start":1410384395000,"group":"roadrisk:aftenposten"},{"id":1602,"content":"roadrisk:aftenposten","start":1410384031000,"group":"roadrisk:aftenposten"},{"id":1603,"content":"roadrisk:aftenposten","start":1410383977000,"group":"roadrisk:aftenposten"},{"id":1604,"content":"accident:aftenposten","start":1410383892000,"group":"accident:aftenposten"},{"id":1605,"content":"roadrisk:aftenposten","start":1410383823000,"group":"roadrisk:aftenposten"},{"id":1606,"content":"roadrisk:aftenposten","start":1410383820000,"group":"roadrisk:aftenposten"},{"id":1607,"content":"accident:aftenposten","start":1410383732000,"group":"accident:aftenposten"},{"id":1608,"content":"accident:aftenposten","start":1410383667000,"group":"accident:aftenposten"},{"id":1609,"content":"roadrisk:aftenposten","start":1410383550000,"group":"roadrisk:aftenposten"},{"id":1610,"content":"roadrisk:aftenposten","start":1410383454000,"group":"roadrisk:aftenposten"},{"id":1611,"content":"roadrisk:aftenposten","start":1410383324000,"group":"roadrisk:aftenposten"},{"id":1612,"content":"roadrisk:aftenposten","start":1410383300000,"group":"roadrisk:aftenposten"},{"id":1613,"content":"roadrisk:aftenposten","start":1410383293000,"group":"roadrisk:aftenposten"},{"id":1614,"content":"roadrisk:aftenposten","start":1410381411000,"group":"roadrisk:aftenposten"},{"id":1615,"content":"roadrisk:aftenposten","start":1422453993870,"group":"roadrisk:aftenposten"},{"id":1616,"content":"roadrisk:aftenposten","start":1410380022000,"group":"roadrisk:aftenposten"},{"id":1617,"content":"roadrisk:aftenposten","start":1410379826000,"group":"roadrisk:aftenposten"},{"id":1618,"content":"roadrisk:aftenposten","start":1410379820000,"group":"roadrisk:aftenposten"},{"id":1619,"content":"roadrisk:aftenposten","start":1410379783000,"group":"roadrisk:aftenposten"},{"id":1620,"content":"roadrisk:aftenposten","start":1410379692000,"group":"roadrisk:aftenposten"},{"id":1621,"content":"roadrisk:aftenposten","start":1410379669000,"group":"roadrisk:aftenposten"},{"id":1622,"content":"roadrisk:aftenposten","start":1410379586000,"group":"roadrisk:aftenposten"},{"id":1623,"content":"roadrisk:aftenposten","start":1410379566000,"group":"roadrisk:aftenposten"},{"id":1624,"content":"accident:aftenposten","start":1410379553000,"group":"accident:aftenposten"},{"id":1625,"content":"roadrisk:aftenposten","start":1410379526000,"group":"roadrisk:aftenposten"},{"id":1626,"content":"roadrisk:aftenposten","start":1410379493000,"group":"roadrisk:aftenposten"},{"id":1627,"content":"accident:aftenposten","start":1410379447000,"group":"accident:aftenposten"},{"id":1628,"content":"accident:aftenposten","start":1410379444000,"group":"accident:aftenposten"},{"id":1629,"content":"roadrisk:aftenposten","start":1410379432000,"group":"roadrisk:aftenposten"},{"id":1630,"content":"roadrisk:aftenposten","start":1410379383000,"group":"roadrisk:aftenposten"},{"id":1631,"content":"roadrisk:aftenposten","start":1410379299000,"group":"roadrisk:aftenposten"},{"id":1632,"content":"roadrisk:aftenposten","start":1410379291000,"group":"roadrisk:aftenposten"},{"id":1633,"content":"tweet","start":1424851226000,"group":"tweet"},{"id":1634,"content":"tweet","start":1424849696000,"group":"tweet"},{"id":1636,"content":"tweet","start":1424855414000,"group":"tweet"},{"id":1637,"content":"tweet","start":1424854782000,"group":"tweet"},{"id":1638,"content":"tweet","start":1424857432000,"group":"tweet"},{"id":1639,"content":"tweet","start":1424857484000,"group":"tweet"},{"id":1640,"content":"roadrisk:aftenposten","start":1410327436000,"group":"roadrisk:aftenposten"},{"id":1641,"content":"roadrisk:aftenposten","start":1410328748000,"group":"roadrisk:aftenposten"},{"id":1642,"content":"roadrisk:aftenposten","start":1410328575000,"group":"roadrisk:aftenposten"},{"id":1643,"content":"roadrisk:aftenposten","start":1410328572000,"group":"roadrisk:aftenposten"},{"id":1644,"content":"roadrisk:aftenposten","start":1410328438000,"group":"roadrisk:aftenposten"},{"id":1645,"content":"roadrisk:aftenposten","start":1410328291000,"group":"roadrisk:aftenposten"},{"id":1646,"content":"roadrisk:aftenposten","start":1410329860000,"group":"roadrisk:aftenposten"},{"id":1647,"content":"roadrisk:aftenposten","start":1410329776000,"group":"roadrisk:aftenposten"},{"id":1648,"content":"roadrisk:aftenposten","start":1410329762000,"group":"roadrisk:aftenposten"},{"id":1649,"content":"roadrisk:aftenposten","start":1410329697000,"group":"roadrisk:aftenposten"},{"id":1650,"content":"roadrisk:aftenposten","start":1410332135000,"group":"roadrisk:aftenposten"},{"id":1651,"content":"accident:aftenposten","start":1410332070000,"group":"accident:aftenposten"},{"id":1652,"content":"roadrisk:aftenposten","start":1410332063000,"group":"roadrisk:aftenposten"},{"id":1653,"content":"roadrisk:aftenposten","start":1410332053000,"group":"roadrisk:aftenposten"},{"id":1654,"content":"roadrisk:aftenposten","start":1410332035000,"group":"roadrisk:aftenposten"},{"id":1655,"content":"roadrisk:aftenposten","start":1410331936000,"group":"roadrisk:aftenposten"},{"id":1656,"content":"roadrisk:aftenposten","start":1410331930000,"group":"roadrisk:aftenposten"},{"id":1657,"content":"roadrisk:aftenposten","start":1410331898000,"group":"roadrisk:aftenposten"},{"id":1658,"content":"roadrisk:aftenposten","start":1410331884000,"group":"roadrisk:aftenposten"},{"id":1659,"content":"roadrisk:aftenposten","start":1410331858000,"group":"roadrisk:aftenposten"},{"id":1660,"content":"roadrisk:aftenposten","start":1410331855000,"group":"roadrisk:aftenposten"},{"id":1661,"content":"roadrisk:aftenposten","start":1410331853000,"group":"roadrisk:aftenposten"},{"id":1662,"content":"roadrisk:aftenposten","start":1410331829000,"group":"roadrisk:aftenposten"},{"id":1663,"content":"accident:aftenposten","start":1410331783000,"group":"accident:aftenposten"},{"id":1664,"content":"roadrisk:aftenposten","start":1410331744000,"group":"roadrisk:aftenposten"},{"id":1665,"content":"roadrisk:aftenposten","start":1410331738000,"group":"roadrisk:aftenposten"},{"id":1666,"content":"roadrisk:aftenposten","start":1410331707000,"group":"roadrisk:aftenposten"},{"id":1667,"content":"roadrisk:aftenposten","start":1410331692000,"group":"roadrisk:aftenposten"},{"id":1668,"content":"roadrisk:aftenposten","start":1410331675000,"group":"roadrisk:aftenposten"},{"id":1669,"content":"roadrisk:aftenposten","start":1410332296000,"group":"roadrisk:aftenposten"},{"id":1670,"content":"roadrisk:aftenposten","start":1410332292000,"group":"roadrisk:aftenposten"},{"id":1671,"content":"roadrisk:aftenposten","start":1410332279000,"group":"roadrisk:aftenposten"},{"id":1672,"content":"roadrisk:aftenposten","start":1410332274000,"group":"roadrisk:aftenposten"},{"id":1673,"content":"roadrisk:aftenposten","start":1410332257000,"group":"roadrisk:aftenposten"},{"id":1674,"content":"roadrisk:aftenposten","start":1410332544000,"group":"roadrisk:aftenposten"},{"id":1675,"content":"roadrisk:aftenposten","start":1410332541000,"group":"roadrisk:aftenposten"},{"id":1676,"content":"roadrisk:aftenposten","start":1410332534000,"group":"roadrisk:aftenposten"},{"id":1677,"content":"roadrisk:aftenposten","start":1410332467000,"group":"roadrisk:aftenposten"},{"id":1678,"content":"roadrisk:aftenposten","start":1410332465000,"group":"roadrisk:aftenposten"},{"id":1679,"content":"roadrisk:aftenposten","start":1410332380000,"group":"roadrisk:aftenposten"},{"id":1680,"content":"roadrisk:aftenposten","start":1410332375000,"group":"roadrisk:aftenposten"},{"id":1681,"content":"roadrisk:aftenposten","start":1410332368000,"group":"roadrisk:aftenposten"},{"id":1682,"content":"roadrisk:aftenposten","start":1410332319000,"group":"roadrisk:aftenposten"},{"id":1683,"content":"tweet","start":1424850458000,"group":"tweet"},{"id":1684,"content":"roadrisk:aftenposten","start":1410332963000,"group":"roadrisk:aftenposten"},{"id":1685,"content":"accident:aftenposten","start":1410332946000,"group":"accident:aftenposten"},{"id":1686,"content":"roadrisk:aftenposten","start":1410332858000,"group":"roadrisk:aftenposten"},{"id":1687,"content":"roadrisk:aftenposten","start":1410332854000,"group":"roadrisk:aftenposten"},{"id":1688,"content":"roadrisk:aftenposten","start":1410332832000,"group":"roadrisk:aftenposten"},{"id":1689,"content":"roadrisk:aftenposten","start":1410333627000,"group":"roadrisk:aftenposten"},{"id":1690,"content":"roadrisk:aftenposten","start":1410333614000,"group":"roadrisk:aftenposten"},{"id":1691,"content":"roadrisk:aftenposten","start":1410333592000,"group":"roadrisk:aftenposten"},{"id":1692,"content":"roadrisk:aftenposten","start":1410333551000,"group":"roadrisk:aftenposten"},{"id":1693,"content":"roadrisk:aftenposten","start":1410333532000,"group":"roadrisk:aftenposten"},{"id":1694,"content":"roadrisk:aftenposten","start":1410333521000,"group":"roadrisk:aftenposten"},{"id":1695,"content":"roadrisk:aftenposten","start":1410333505000,"group":"roadrisk:aftenposten"},{"id":1696,"content":"roadrisk:aftenposten","start":1410333493000,"group":"roadrisk:aftenposten"},{"id":1697,"content":"roadrisk:aftenposten","start":1410333472000,"group":"roadrisk:aftenposten"},{"id":1698,"content":"roadrisk:aftenposten","start":1410333435000,"group":"roadrisk:aftenposten"},{"id":1699,"content":"roadrisk:aftenposten","start":1410333395000,"group":"roadrisk:aftenposten"},{"id":1700,"content":"roadrisk:aftenposten","start":1410333385000,"group":"roadrisk:aftenposten"},{"id":1701,"content":"roadrisk:aftenposten","start":1410333371000,"group":"roadrisk:aftenposten"},{"id":1702,"content":"roadrisk:aftenposten","start":1410333334000,"group":"roadrisk:aftenposten"},{"id":1703,"content":"roadrisk:aftenposten","start":1410333320000,"group":"roadrisk:aftenposten"},{"id":1704,"content":"roadrisk:aftenposten","start":1410334126000,"group":"roadrisk:aftenposten"},{"id":1705,"content":"roadrisk:aftenposten","start":1410334070000,"group":"roadrisk:aftenposten"},{"id":1706,"content":"roadrisk:aftenposten","start":1410334039000,"group":"roadrisk:aftenposten"},{"id":1707,"content":"roadrisk:aftenposten","start":1410334035000,"group":"roadrisk:aftenposten"},{"id":1708,"content":"roadrisk:aftenposten","start":1410333994000,"group":"roadrisk:aftenposten"},{"id":1709,"content":"roadrisk:aftenposten","start":1410333956000,"group":"roadrisk:aftenposten"},{"id":1710,"content":"roadrisk:aftenposten","start":1410334142000,"group":"roadrisk:aftenposten"},{"id":1711,"content":"roadrisk:aftenposten","start":1410334379000,"group":"roadrisk:aftenposten"},{"id":1712,"content":"roadrisk:aftenposten","start":1410334370000,"group":"roadrisk:aftenposten"},{"id":1713,"content":"roadrisk:aftenposten","start":1410334253000,"group":"roadrisk:aftenposten"},{"id":1714,"content":"roadrisk:aftenposten","start":1410335683000,"group":"roadrisk:aftenposten"},{"id":1715,"content":"roadrisk:aftenposten","start":1410335679000,"group":"roadrisk:aftenposten"},{"id":1716,"content":"roadrisk:aftenposten","start":1410335650000,"group":"roadrisk:aftenposten"},{"id":1717,"content":"roadrisk:aftenposten","start":1410335635000,"group":"roadrisk:aftenposten"},{"id":1718,"content":"roadrisk:aftenposten","start":1410335634000,"group":"roadrisk:aftenposten"},{"id":1719,"content":"roadrisk:aftenposten","start":1410335605000,"group":"roadrisk:aftenposten"},{"id":1720,"content":"roadrisk:aftenposten","start":1410335600000,"group":"roadrisk:aftenposten"},{"id":1721,"content":"roadrisk:aftenposten","start":1410335592000,"group":"roadrisk:aftenposten"},{"id":1722,"content":"roadrisk:aftenposten","start":1410335563000,"group":"roadrisk:aftenposten"},{"id":1723,"content":"roadrisk:aftenposten","start":1410335540000,"group":"roadrisk:aftenposten"},{"id":1724,"content":"roadrisk:aftenposten","start":1410335504000,"group":"roadrisk:aftenposten"},{"id":1725,"content":"roadrisk:aftenposten","start":1410335458000,"group":"roadrisk:aftenposten"},{"id":1726,"content":"roadrisk:aftenposten","start":1410335425000,"group":"roadrisk:aftenposten"},{"id":1727,"content":"roadrisk:aftenposten","start":1410335416000,"group":"roadrisk:aftenposten"},{"id":1728,"content":"roadrisk:aftenposten","start":1410335399000,"group":"roadrisk:aftenposten"},{"id":1729,"content":"roadrisk:aftenposten","start":1410335372000,"group":"roadrisk:aftenposten"},{"id":1730,"content":"roadrisk:aftenposten","start":1410335362000,"group":"roadrisk:aftenposten"},{"id":1731,"content":"roadrisk:aftenposten","start":1410335361000,"group":"roadrisk:aftenposten"},{"id":1732,"content":"roadrisk:aftenposten","start":1410336358000,"group":"roadrisk:aftenposten"},{"id":1733,"content":"roadrisk:aftenposten","start":1410336345000,"group":"roadrisk:aftenposten"},{"id":1734,"content":"roadrisk:aftenposten","start":1410336345000,"group":"roadrisk:aftenposten"},{"id":1735,"content":"roadrisk:aftenposten","start":1410336321000,"group":"roadrisk:aftenposten"},{"id":1736,"content":"roadrisk:aftenposten","start":1410336299000,"group":"roadrisk:aftenposten"},{"id":1737,"content":"roadrisk:aftenposten","start":1410336268000,"group":"roadrisk:aftenposten"},{"id":1738,"content":"roadrisk:aftenposten","start":1410336266000,"group":"roadrisk:aftenposten"},{"id":1739,"content":"roadrisk:aftenposten","start":1410336236000,"group":"roadrisk:aftenposten"},{"id":1740,"content":"roadrisk:aftenposten","start":1410336180000,"group":"roadrisk:aftenposten"},{"id":1741,"content":"roadrisk:aftenposten","start":1410336179000,"group":"roadrisk:aftenposten"},{"id":1742,"content":"roadrisk:aftenposten","start":1410336121000,"group":"roadrisk:aftenposten"},{"id":1743,"content":"roadrisk:aftenposten","start":1410336102000,"group":"roadrisk:aftenposten"},{"id":1744,"content":"roadrisk:aftenposten","start":1410336080000,"group":"roadrisk:aftenposten"},{"id":1745,"content":"roadrisk:aftenposten","start":1410336044000,"group":"roadrisk:aftenposten"},{"id":1746,"content":"accident:aftenposten","start":1410336412000,"group":"accident:aftenposten"},{"id":1747,"content":"roadrisk:aftenposten","start":1410336408000,"group":"roadrisk:aftenposten"},{"id":1748,"content":"accident:aftenposten","start":1410336405000,"group":"accident:aftenposten"},{"id":1749,"content":"roadrisk:aftenposten","start":1410336554000,"group":"roadrisk:aftenposten"},{"id":1750,"content":"roadrisk:aftenposten","start":1410336515000,"group":"roadrisk:aftenposten"},{"id":1751,"content":"roadrisk:aftenposten","start":1410336614000,"group":"roadrisk:aftenposten"},{"id":1752,"content":"roadrisk:aftenposten","start":1410336613000,"group":"roadrisk:aftenposten"},{"id":1753,"content":"roadrisk:aftenposten","start":1410336559000,"group":"roadrisk:aftenposten"},{"id":1754,"content":"roadrisk:aftenposten","start":1410336825000,"group":"roadrisk:aftenposten"},{"id":1755,"content":"roadrisk:aftenposten","start":1410336777000,"group":"roadrisk:aftenposten"},{"id":1756,"content":"roadrisk:aftenposten","start":1410336751000,"group":"roadrisk:aftenposten"},{"id":1757,"content":"roadrisk:aftenposten","start":1410336748000,"group":"roadrisk:aftenposten"},{"id":1758,"content":"roadrisk:aftenposten","start":1410336893000,"group":"roadrisk:aftenposten"},{"id":1759,"content":"roadrisk:aftenposten","start":1410336889000,"group":"roadrisk:aftenposten"},{"id":1760,"content":"roadrisk:aftenposten","start":1410336881000,"group":"roadrisk:aftenposten"},{"id":1761,"content":"roadrisk:aftenposten","start":1410336873000,"group":"roadrisk:aftenposten"},{"id":1762,"content":"roadrisk:aftenposten","start":1410337005000,"group":"roadrisk:aftenposten"},{"id":1763,"content":"roadrisk:aftenposten","start":1410337000000,"group":"roadrisk:aftenposten"},{"id":1764,"content":"roadrisk:aftenposten","start":1410337013000,"group":"roadrisk:aftenposten"},{"id":1765,"content":"roadrisk:aftenposten","start":1410337269000,"group":"roadrisk:aftenposten"},{"id":1766,"content":"roadrisk:aftenposten","start":1410337195000,"group":"roadrisk:aftenposten"},{"id":1767,"content":"roadrisk:aftenposten","start":1410337573000,"group":"roadrisk:aftenposten"},{"id":1768,"content":"roadrisk:aftenposten","start":1410337571000,"group":"roadrisk:aftenposten"},{"id":1769,"content":"roadrisk:aftenposten","start":1410337537000,"group":"roadrisk:aftenposten"},{"id":1770,"content":"roadrisk:aftenposten","start":1410337533000,"group":"roadrisk:aftenposten"},{"id":1771,"content":"accident:aftenposten","start":1410337512000,"group":"accident:aftenposten"},{"id":1772,"content":"roadrisk:aftenposten","start":1410337474000,"group":"roadrisk:aftenposten"},{"id":1773,"content":"roadrisk:aftenposten","start":1410337470000,"group":"roadrisk:aftenposten"},{"id":1774,"content":"roadrisk:aftenposten","start":1410337464000,"group":"roadrisk:aftenposten"},{"id":1775,"content":"roadrisk:aftenposten","start":1410337463000,"group":"roadrisk:aftenposten"},{"id":1776,"content":"accident:aftenposten","start":1410337426000,"group":"accident:aftenposten"},{"id":1777,"content":"roadrisk:aftenposten","start":1410338024000,"group":"roadrisk:aftenposten"},{"id":1778,"content":"roadrisk:aftenposten","start":1410337974000,"group":"roadrisk:aftenposten"},{"id":1779,"content":"roadrisk:aftenposten","start":1410337860000,"group":"roadrisk:aftenposten"},{"id":1780,"content":"roadrisk:aftenposten","start":1410337840000,"group":"roadrisk:aftenposten"},{"id":1781,"content":"roadrisk:aftenposten","start":1410338261000,"group":"roadrisk:aftenposten"},{"id":1782,"content":"roadrisk:aftenposten","start":1410338229000,"group":"roadrisk:aftenposten"},{"id":1783,"content":"accident:aftenposten","start":1410338579000,"group":"accident:aftenposten"},{"id":1784,"content":"roadrisk:aftenposten","start":1410338547000,"group":"roadrisk:aftenposten"},{"id":1785,"content":"roadrisk:aftenposten","start":1410338546000,"group":"roadrisk:aftenposten"},{"id":1786,"content":"roadrisk:aftenposten","start":1410338545000,"group":"roadrisk:aftenposten"},{"id":1787,"content":"roadrisk:aftenposten","start":1410338528000,"group":"roadrisk:aftenposten"},{"id":1788,"content":"roadrisk:aftenposten","start":1410338507000,"group":"roadrisk:aftenposten"},{"id":1789,"content":"roadrisk:aftenposten","start":1410338667000,"group":"roadrisk:aftenposten"},{"id":1790,"content":"roadrisk:aftenposten","start":1410339030000,"group":"roadrisk:aftenposten"},{"id":1791,"content":"roadrisk:aftenposten","start":1410339398000,"group":"roadrisk:aftenposten"},{"id":1792,"content":"roadrisk:aftenposten","start":1410339358000,"group":"roadrisk:aftenposten"},{"id":1793,"content":"roadrisk:aftenposten","start":1410339326000,"group":"roadrisk:aftenposten"},{"id":1794,"content":"roadrisk:aftenposten","start":1410339321000,"group":"roadrisk:aftenposten"},{"id":1795,"content":"roadrisk:aftenposten","start":1410339321000,"group":"roadrisk:aftenposten"},{"id":1796,"content":"accident:aftenposten","start":1410339187000,"group":"accident:aftenposten"},{"id":1797,"content":"roadrisk:aftenposten","start":1410339162000,"group":"roadrisk:aftenposten"},{"id":1798,"content":"roadrisk:aftenposten","start":1410339891000,"group":"roadrisk:aftenposten"},{"id":1799,"content":"roadrisk:aftenposten","start":1410339863000,"group":"roadrisk:aftenposten"},{"id":1800,"content":"roadrisk:aftenposten","start":1410339835000,"group":"roadrisk:aftenposten"},{"id":1801,"content":"roadrisk:aftenposten","start":1410339816000,"group":"roadrisk:aftenposten"},{"id":1802,"content":"roadrisk:aftenposten","start":1410339816000,"group":"roadrisk:aftenposten"},{"id":1803,"content":"roadrisk:aftenposten","start":1410339795000,"group":"roadrisk:aftenposten"},{"id":1804,"content":"roadrisk:aftenposten","start":1410339718000,"group":"roadrisk:aftenposten"},{"id":1805,"content":"roadrisk:aftenposten","start":1410339698000,"group":"roadrisk:aftenposten"},{"id":1806,"content":"roadrisk:aftenposten","start":1410339684000,"group":"roadrisk:aftenposten"},{"id":1807,"content":"roadrisk:aftenposten","start":1410339652000,"group":"roadrisk:aftenposten"},{"id":1808,"content":"roadrisk:aftenposten","start":1410339642000,"group":"roadrisk:aftenposten"},{"id":1809,"content":"accident:aftenposten","start":1410339547000,"group":"accident:aftenposten"},{"id":1810,"content":"roadrisk:aftenposten","start":1410339493000,"group":"roadrisk:aftenposten"},{"id":1811,"content":"roadrisk:aftenposten","start":1410340028000,"group":"roadrisk:aftenposten"},{"id":1812,"content":"roadrisk:aftenposten","start":1410340021000,"group":"roadrisk:aftenposten"},{"id":1813,"content":"roadrisk:aftenposten","start":1410340009000,"group":"roadrisk:aftenposten"},{"id":1814,"content":"accident:aftenposten","start":1410339973000,"group":"accident:aftenposten"},{"id":1815,"content":"accident:aftenposten","start":1410340277000,"group":"accident:aftenposten"},{"id":1816,"content":"roadrisk:aftenposten","start":1410340203000,"group":"roadrisk:aftenposten"},{"id":1817,"content":"roadrisk:aftenposten","start":1410340163000,"group":"roadrisk:aftenposten"},{"id":1818,"content":"roadrisk:aftenposten","start":1410340148000,"group":"roadrisk:aftenposten"},{"id":1819,"content":"roadrisk:aftenposten","start":1410340089000,"group":"roadrisk:aftenposten"},{"id":1820,"content":"tweet:picture","start":1424852624000,"group":"tweet:picture"},{"id":1821,"content":"roadrisk:aftenposten","start":1410340310000,"group":"roadrisk:aftenposten"},{"id":1822,"content":"roadrisk:aftenposten","start":1410340334000,"group":"roadrisk:aftenposten"},{"id":1823,"content":"roadrisk:aftenposten","start":1410340311000,"group":"roadrisk:aftenposten"},{"id":1824,"content":"roadrisk:aftenposten","start":1410340516000,"group":"roadrisk:aftenposten"},{"id":1825,"content":"roadrisk:aftenposten","start":1410340808000,"group":"roadrisk:aftenposten"},{"id":1826,"content":"roadrisk:aftenposten","start":1410340646000,"group":"roadrisk:aftenposten"},{"id":1827,"content":"roadrisk:aftenposten","start":1410340596000,"group":"roadrisk:aftenposten"},{"id":1828,"content":"roadrisk:aftenposten","start":1410340866000,"group":"roadrisk:aftenposten"},{"id":1829,"content":"tweet","start":1424853549000,"group":"tweet"},{"id":1830,"content":"roadrisk:aftenposten","start":1410340869000,"group":"roadrisk:aftenposten"},{"id":1831,"content":"roadrisk:aftenposten","start":1410341019000,"group":"roadrisk:aftenposten"},{"id":1832,"content":"roadrisk:aftenposten","start":1410340945000,"group":"roadrisk:aftenposten"},{"id":1833,"content":"accident:aftenposten","start":1410341514000,"group":"accident:aftenposten"},{"id":1834,"content":"roadrisk:aftenposten","start":1410341444000,"group":"roadrisk:aftenposten"},{"id":1835,"content":"roadrisk:aftenposten","start":1410341399000,"group":"roadrisk:aftenposten"},{"id":1836,"content":"roadrisk:aftenposten","start":1410341267000,"group":"roadrisk:aftenposten"},{"id":1837,"content":"accident:aftenposten","start":1410341230000,"group":"accident:aftenposten"},{"id":1838,"content":"roadrisk:aftenposten","start":1410341723000,"group":"roadrisk:aftenposten"},{"id":1839,"content":"roadrisk:aftenposten","start":1410341574000,"group":"roadrisk:aftenposten"},{"id":1840,"content":"tweet","start":1424852450000,"group":"tweet"},{"id":1841,"content":"roadrisk:aftenposten","start":1410342243000,"group":"roadrisk:aftenposten"},{"id":1842,"content":"roadrisk:aftenposten","start":1410342207000,"group":"roadrisk:aftenposten"},{"id":1843,"content":"roadrisk:aftenposten","start":1410342132000,"group":"roadrisk:aftenposten"},{"id":1844,"content":"roadrisk:aftenposten","start":1410342124000,"group":"roadrisk:aftenposten"},{"id":1845,"content":"roadrisk:aftenposten","start":1410342494000,"group":"roadrisk:aftenposten"},{"id":1846,"content":"accident:aftenposten","start":1410342574000,"group":"accident:aftenposten"},{"id":1847,"content":"roadrisk:aftenposten","start":1410342506000,"group":"roadrisk:aftenposten"},{"id":1848,"content":"roadrisk:aftenposten","start":1410342505000,"group":"roadrisk:aftenposten"},{"id":1849,"content":"roadrisk:aftenposten","start":1410342670000,"group":"roadrisk:aftenposten"},{"id":1850,"content":"roadrisk:aftenposten","start":1410342848000,"group":"roadrisk:aftenposten"},{"id":1851,"content":"roadrisk:aftenposten","start":1410342830000,"group":"roadrisk:aftenposten"},{"id":1852,"content":"tweet","start":1424856729000,"group":"tweet"},{"id":1853,"content":"roadrisk:aftenposten","start":1410342854000,"group":"roadrisk:aftenposten"},{"id":1854,"content":"roadrisk:aftenposten","start":1410343221000,"group":"roadrisk:aftenposten"},{"id":1855,"content":"roadrisk:aftenposten","start":1410343157000,"group":"roadrisk:aftenposten"},{"id":1856,"content":"roadrisk:aftenposten","start":1410343119000,"group":"roadrisk:aftenposten"},{"id":1857,"content":"accident:aftenposten","start":1410343009000,"group":"accident:aftenposten"},{"id":1858,"content":"roadrisk:aftenposten","start":1410342962000,"group":"roadrisk:aftenposten"},{"id":1859,"content":"roadrisk:aftenposten","start":1410343224000,"group":"roadrisk:aftenposten"},{"id":1860,"content":"roadrisk:aftenposten","start":1410343477000,"group":"roadrisk:aftenposten"},{"id":1861,"content":"roadrisk:aftenposten","start":1410343409000,"group":"roadrisk:aftenposten"},{"id":1862,"content":"roadrisk:aftenposten","start":1410343396000,"group":"roadrisk:aftenposten"},{"id":1863,"content":"roadrisk:aftenposten","start":1410343338000,"group":"roadrisk:aftenposten"},{"id":1864,"content":"roadrisk:aftenposten","start":1410343608000,"group":"roadrisk:aftenposten"},{"id":1865,"content":"roadrisk:aftenposten","start":1410343574000,"group":"roadrisk:aftenposten"},{"id":1866,"content":"roadrisk:aftenposten","start":1410343849000,"group":"roadrisk:aftenposten"},{"id":1867,"content":"roadrisk:aftenposten","start":1410343802000,"group":"roadrisk:aftenposten"},{"id":1868,"content":"roadrisk:aftenposten","start":1410343741000,"group":"roadrisk:aftenposten"},{"id":1869,"content":"roadrisk:aftenposten","start":1410343730000,"group":"roadrisk:aftenposten"},{"id":1870,"content":"roadrisk:aftenposten","start":1410343725000,"group":"roadrisk:aftenposten"},{"id":1871,"content":"roadrisk:aftenposten","start":1410343639000,"group":"roadrisk:aftenposten"},{"id":1872,"content":"roadrisk:aftenposten","start":1410343616000,"group":"roadrisk:aftenposten"},{"id":1873,"content":"roadrisk:aftenposten","start":1410343893000,"group":"roadrisk:aftenposten"},{"id":1874,"content":"roadrisk:aftenposten","start":1410344534000,"group":"roadrisk:aftenposten"},{"id":1875,"content":"accident:aftenposten","start":1410344586000,"group":"accident:aftenposten"},{"id":1876,"content":"roadrisk:aftenposten","start":1410344542000,"group":"roadrisk:aftenposten"},{"id":1877,"content":"roadrisk:aftenposten","start":1410344719000,"group":"roadrisk:aftenposten"},{"id":1878,"content":"tweet","start":1424851224000,"group":"tweet"},{"id":1879,"content":"roadrisk:aftenposten","start":1410344759000,"group":"roadrisk:aftenposten"},{"id":1880,"content":"roadrisk:aftenposten","start":1410344730000,"group":"roadrisk:aftenposten"},{"id":1881,"content":"roadrisk:aftenposten","start":1410344791000,"group":"roadrisk:aftenposten"},{"id":1882,"content":"tweet","start":1424850328000,"group":"tweet"},{"id":1883,"content":"accident:aftenposten","start":1410344976000,"group":"accident:aftenposten"},{"id":1884,"content":"roadrisk:aftenposten","start":1410344943000,"group":"roadrisk:aftenposten"},{"id":1885,"content":"accident:aftenposten","start":1410344939000,"group":"accident:aftenposten"},{"id":1886,"content":"roadrisk:aftenposten","start":1410345685000,"group":"roadrisk:aftenposten"},{"id":1887,"content":"roadrisk:aftenposten","start":1410345596000,"group":"roadrisk:aftenposten"},{"id":1888,"content":"accident:aftenposten","start":1410345571000,"group":"accident:aftenposten"},{"id":1889,"content":"roadrisk:aftenposten","start":1410345516000,"group":"roadrisk:aftenposten"},{"id":1890,"content":"roadrisk:aftenposten","start":1410345458000,"group":"roadrisk:aftenposten"},{"id":1891,"content":"roadrisk:aftenposten","start":1410345441000,"group":"roadrisk:aftenposten"},{"id":1892,"content":"accident:aftenposten","start":1410345395000,"group":"accident:aftenposten"},{"id":1893,"content":"roadrisk:aftenposten","start":1410345304000,"group":"roadrisk:aftenposten"},{"id":1894,"content":"roadrisk:aftenposten","start":1410345266000,"group":"roadrisk:aftenposten"},{"id":1895,"content":"accident:aftenposten","start":1410346279000,"group":"accident:aftenposten"},{"id":1896,"content":"roadrisk:aftenposten","start":1410346232000,"group":"roadrisk:aftenposten"},{"id":1897,"content":"roadrisk:aftenposten","start":1410346187000,"group":"roadrisk:aftenposten"},{"id":1898,"content":"roadrisk:aftenposten","start":1410346172000,"group":"roadrisk:aftenposten"},{"id":1899,"content":"accident:aftenposten","start":1410346125000,"group":"accident:aftenposten"},{"id":1900,"content":"roadrisk:aftenposten","start":1410346039000,"group":"roadrisk:aftenposten"},{"id":1901,"content":"roadrisk:aftenposten","start":1410345956000,"group":"roadrisk:aftenposten"},{"id":1902,"content":"roadrisk:aftenposten","start":1410347773000,"group":"roadrisk:aftenposten"},{"id":1903,"content":"tweet","start":1424851493000,"group":"tweet"},{"id":1904,"content":"tweet","start":1424850282000,"group":"tweet"},{"id":1905,"content":"tweet:picture","start":1424855575000,"group":"tweet:picture"},{"id":1906,"content":"roadrisk:aftenposten","start":1410348844000,"group":"roadrisk:aftenposten"},{"id":1907,"content":"roadrisk:aftenposten","start":1410349000000,"group":"roadrisk:aftenposten"},{"id":1908,"content":"roadrisk:aftenposten","start":1410348982000,"group":"roadrisk:aftenposten"},{"id":1909,"content":"roadrisk:aftenposten","start":1410348872000,"group":"roadrisk:aftenposten"},{"id":1910,"content":"roadrisk:aftenposten","start":1410349008000,"group":"roadrisk:aftenposten"},{"id":1911,"content":"tweet","start":1424855228000,"group":"tweet"},{"id":1912,"content":"roadrisk:aftenposten","start":1410349069000,"group":"roadrisk:aftenposten"},{"id":1913,"content":"roadrisk:aftenposten","start":1410349092000,"group":"roadrisk:aftenposten"},{"id":1914,"content":"roadrisk:aftenposten","start":1410349230000,"group":"roadrisk:aftenposten"},{"id":1915,"content":"roadrisk:aftenposten","start":1410349554000,"group":"roadrisk:aftenposten"},{"id":1916,"content":"roadrisk:aftenposten","start":1410349427000,"group":"roadrisk:aftenposten"},{"id":1917,"content":"roadrisk:aftenposten","start":1410349397000,"group":"roadrisk:aftenposten"},{"id":1918,"content":"roadrisk:aftenposten","start":1410349370000,"group":"roadrisk:aftenposten"},{"id":1919,"content":"accident:aftenposten","start":1410349299000,"group":"accident:aftenposten"},{"id":1920,"content":"roadrisk:aftenposten","start":1410349279000,"group":"roadrisk:aftenposten"},{"id":1921,"content":"roadrisk:aftenposten","start":1410349716000,"group":"roadrisk:aftenposten"},{"id":1922,"content":"roadrisk:aftenposten","start":1410349689000,"group":"roadrisk:aftenposten"},{"id":1923,"content":"accident:aftenposten","start":1410349668000,"group":"accident:aftenposten"},{"id":1924,"content":"roadrisk:aftenposten","start":1410349574000,"group":"roadrisk:aftenposten"},{"id":1925,"content":"roadrisk:aftenposten","start":1410349768000,"group":"roadrisk:aftenposten"},{"id":1926,"content":"roadrisk:aftenposten","start":1410349724000,"group":"roadrisk:aftenposten"},{"id":1927,"content":"master:utmost:red","start":1423044536615,"group":"master:utmost:red"},{"id":1928,"content":"roadrisk:aftenposten","start":1410349814000,"group":"roadrisk:aftenposten"},{"id":1929,"content":"roadrisk:aftenposten","start":1410350277000,"group":"roadrisk:aftenposten"},{"id":1930,"content":"roadrisk:aftenposten","start":1410350197000,"group":"roadrisk:aftenposten"},{"id":1931,"content":"roadrisk:aftenposten","start":1410255817000,"group":"roadrisk:aftenposten"},{"id":1932,"content":"roadrisk:aftenposten","start":1410350363000,"group":"roadrisk:aftenposten"},{"id":1933,"content":"tweet","start":1424855719000,"group":"tweet"},{"id":1934,"content":"roadrisk:aftenposten","start":1410350870000,"group":"roadrisk:aftenposten"},{"id":1935,"content":"roadrisk:aftenposten","start":1410350817000,"group":"roadrisk:aftenposten"},{"id":1936,"content":"roadrisk:aftenposten","start":1410350803000,"group":"roadrisk:aftenposten"},{"id":1937,"content":"roadrisk:aftenposten","start":1410350607000,"group":"roadrisk:aftenposten"},{"id":1938,"content":"roadrisk:aftenposten","start":1410350450000,"group":"roadrisk:aftenposten"},{"id":1939,"content":"roadrisk:aftenposten","start":1410350433000,"group":"roadrisk:aftenposten"},{"id":1940,"content":"tweet:picture","start":1424852902000,"group":"tweet:picture"},{"id":1941,"content":"roadrisk:aftenposten","start":1410351703000,"group":"roadrisk:aftenposten"},{"id":1942,"content":"roadrisk:aftenposten","start":1410377893000,"group":"roadrisk:aftenposten"},{"id":1943,"content":"roadrisk:aftenposten","start":1410331661000,"group":"roadrisk:aftenposten"},{"id":1944,"content":"tweet","start":1424856310000,"group":"tweet"},{"id":1945,"content":"roadrisk:aftenposten","start":1410333130000,"group":"roadrisk:aftenposten"},{"id":1946,"content":"roadrisk:aftenposten","start":1410378254000,"group":"roadrisk:aftenposten"},{"id":1947,"content":"roadrisk:aftenposten","start":1410371967000,"group":"roadrisk:aftenposten"},{"id":1948,"content":"roadrisk:aftenposten","start":1410364647000,"group":"roadrisk:aftenposten"},{"id":1949,"content":"roadrisk:aftenposten","start":1410374308000,"group":"roadrisk:aftenposten"},{"id":1950,"content":"roadrisk:aftenposten","start":1410353497000,"group":"roadrisk:aftenposten"},{"id":1951,"content":"accident:aftenposten","start":1410333120000,"group":"accident:aftenposten"},{"id":1952,"content":"roadrisk:aftenposten","start":1410375023000,"group":"roadrisk:aftenposten"},{"id":1953,"content":"roadrisk:aftenposten","start":1410375769000,"group":"roadrisk:aftenposten"},{"id":1954,"content":"roadrisk:aftenposten","start":1410378932000,"group":"roadrisk:aftenposten"},{"id":1955,"content":"roadrisk:aftenposten","start":1410362298000,"group":"roadrisk:aftenposten"},{"id":1956,"content":"roadrisk:aftenposten","start":1410351886000,"group":"roadrisk:aftenposten"},{"id":1957,"content":"roadrisk:aftenposten","start":1410331620000,"group":"roadrisk:aftenposten"},{"id":1958,"content":"roadrisk:aftenposten","start":1410375758000,"group":"roadrisk:aftenposten"},{"id":1959,"content":"tweet","start":1424851554000,"group":"tweet"},{"id":1960,"content":"tweet:picture","start":1424856118000,"group":"tweet:picture"},{"id":1961,"content":"roadrisk:aftenposten","start":1410367289000,"group":"roadrisk:aftenposten"},{"id":1962,"content":"roadrisk:aftenposten","start":1410370995000,"group":"roadrisk:aftenposten"},{"id":1963,"content":"roadrisk:aftenposten","start":1410337817000,"group":"roadrisk:aftenposten"},{"id":1964,"content":"roadrisk:aftenposten","start":1410374083000,"group":"roadrisk:aftenposten"},{"id":1965,"content":"roadrisk:aftenposten","start":1410352282000,"group":"roadrisk:aftenposten"},{"id":1966,"content":"roadrisk:aftenposten","start":1410337814000,"group":"roadrisk:aftenposten"},{"id":1967,"content":"roadrisk:aftenposten","start":1410335329000,"group":"roadrisk:aftenposten"},{"id":1968,"content":"roadrisk:aftenposten","start":1410327366000,"group":"roadrisk:aftenposten"},{"id":1969,"content":"roadrisk:aftenposten","start":1410375519000,"group":"roadrisk:aftenposten"},{"id":1970,"content":"roadrisk:aftenposten","start":1410328987000,"group":"roadrisk:aftenposten"},{"id":1971,"content":"accident:aftenposten","start":1410338472000,"group":"accident:aftenposten"},{"id":1972,"content":"tweet","start":1424857433000,"group":"tweet"},{"id":1973,"content":"tweet","start":1424849459000,"group":"tweet"},{"id":1974,"content":"tweet","start":1424850556000,"group":"tweet"},{"id":1975,"content":"roadrisk:aftenposten","start":1410364885000,"group":"roadrisk:aftenposten"},{"id":1976,"content":"roadrisk:aftenposten","start":1410364218000,"group":"roadrisk:aftenposten"},{"id":1977,"content":"roadrisk:aftenposten","start":1410351749000,"group":"roadrisk:aftenposten"},{"id":1978,"content":"roadrisk:aftenposten","start":1410327329000,"group":"roadrisk:aftenposten"},{"id":1979,"content":"roadrisk:aftenposten","start":1410261204000,"group":"roadrisk:aftenposten"},{"id":1980,"content":"roadrisk:aftenposten","start":1410378930000,"group":"roadrisk:aftenposten"},{"id":1981,"content":"roadrisk:aftenposten","start":1410261029000,"group":"roadrisk:aftenposten"},{"id":1982,"content":"roadrisk:aftenposten","start":1410377482000,"group":"roadrisk:aftenposten"},{"id":1983,"content":"roadrisk:aftenposten","start":1410354234000,"group":"roadrisk:aftenposten"},{"id":1984,"content":"roadrisk:aftenposten","start":1410373656000,"group":"roadrisk:aftenposten"},{"id":1985,"content":"roadrisk:aftenposten","start":1410373615000,"group":"roadrisk:aftenposten"},{"id":1986,"content":"tweet","start":1424850883000,"group":"tweet"},{"id":1987,"content":"roadrisk:aftenposten","start":1410352193000,"group":"roadrisk:aftenposten"},{"id":1988,"content":"roadrisk:aftenposten","start":1410379153000,"group":"roadrisk:aftenposten"},{"id":1989,"content":"roadrisk:aftenposten","start":1410327225000,"group":"roadrisk:aftenposten"},{"id":1990,"content":"accident:aftenposten","start":1410259376000,"group":"accident:aftenposten"},{"id":1991,"content":"roadrisk:aftenposten","start":1410333956000,"group":"roadrisk:aftenposten"},{"id":1992,"content":"roadrisk:aftenposten","start":1410367177000,"group":"roadrisk:aftenposten"},{"id":1993,"content":"roadrisk:aftenposten","start":1410372242000,"group":"roadrisk:aftenposten"},{"id":1994,"content":"roadrisk:aftenposten","start":1410338629000,"group":"roadrisk:aftenposten"},{"id":1995,"content":"roadrisk:aftenposten","start":1410258623000,"group":"roadrisk:aftenposten"},{"id":1996,"content":"roadrisk:aftenposten","start":1410328902000,"group":"roadrisk:aftenposten"},{"id":1997,"content":"roadrisk:aftenposten","start":1410374162000,"group":"roadrisk:aftenposten"},{"id":1998,"content":"tweet","start":1424852336000,"group":"tweet"},{"id":1999,"content":"roadrisk:aftenposten","start":1410373990000,"group":"roadrisk:aftenposten"},{"id":2000,"content":"roadrisk:aftenposten","start":1410373577000,"group":"roadrisk:aftenposten"},{"id":2001,"content":"roadrisk:aftenposten","start":1410362549000,"group":"roadrisk:aftenposten"},{"id":2002,"content":"tweet","start":1424857994000,"group":"tweet"},{"id":2003,"content":"roadrisk:aftenposten","start":1410372793000,"group":"roadrisk:aftenposten"},{"id":2004,"content":"roadrisk:aftenposten","start":1410370946000,"group":"roadrisk:aftenposten"},{"id":2005,"content":"roadrisk:aftenposten","start":1410333938000,"group":"roadrisk:aftenposten"},{"id":2006,"content":"roadrisk:aftenposten","start":1410352180000,"group":"roadrisk:aftenposten"},{"id":2007,"content":"roadrisk:aftenposten","start":1410355350000,"group":"roadrisk:aftenposten"},{"id":2008,"content":"roadrisk:aftenposten","start":1410370400000,"group":"roadrisk:aftenposten"},{"id":2009,"content":"tweet","start":1424853512000,"group":"tweet"},{"id":2010,"content":"roadrisk:aftenposten","start":1410376043000,"group":"roadrisk:aftenposten"},{"id":2011,"content":"roadrisk:aftenposten","start":1410333933000,"group":"roadrisk:aftenposten"},{"id":2012,"content":"tweet","start":1424850193000,"group":"tweet"},{"id":2013,"content":"roadrisk:aftenposten","start":1410328247000,"group":"roadrisk:aftenposten"},{"id":2014,"content":"roadrisk:aftenposten","start":1410376122000,"group":"roadrisk:aftenposten"},{"id":2015,"content":"roadrisk:aftenposten","start":1410359955000,"group":"roadrisk:aftenposten"},{"id":2016,"content":"roadrisk:aftenposten","start":1410328891000,"group":"roadrisk:aftenposten"},{"id":2017,"content":"roadrisk:aftenposten","start":1410331612000,"group":"roadrisk:aftenposten"},{"id":2018,"content":"roadrisk:aftenposten","start":1410336025000,"group":"roadrisk:aftenposten"},{"id":2019,"content":"roadrisk:aftenposten","start":1410330204000,"group":"roadrisk:aftenposten"},{"id":2020,"content":"roadrisk:aftenposten","start":1410362978000,"group":"roadrisk:aftenposten"},{"id":2021,"content":"tweet","start":1424853465000,"group":"tweet"},{"id":2022,"content":"roadrisk:aftenposten","start":1410357049000,"group":"roadrisk:aftenposten"},{"id":2023,"content":"roadrisk:aftenposten","start":1410362481000,"group":"roadrisk:aftenposten"},{"id":2024,"content":"roadrisk:aftenposten","start":1410362668000,"group":"roadrisk:aftenposten"},{"id":2025,"content":"roadrisk:aftenposten","start":1410358415000,"group":"roadrisk:aftenposten"},{"id":2026,"content":"accident:aftenposten","start":1410335295000,"group":"accident:aftenposten"},{"id":2027,"content":"accident:aftenposten","start":1410370346000,"group":"accident:aftenposten"},{"id":2028,"content":"roadrisk:aftenposten","start":1410359783000,"group":"roadrisk:aftenposten"},{"id":2029,"content":"roadrisk:aftenposten","start":1410360233000,"group":"roadrisk:aftenposten"},{"id":2030,"content":"roadrisk:aftenposten","start":1410366917000,"group":"roadrisk:aftenposten"},{"id":2031,"content":"roadrisk:aftenposten","start":1410376017000,"group":"roadrisk:aftenposten"},{"id":2032,"content":"roadrisk:aftenposten","start":1410353747000,"group":"roadrisk:aftenposten"},{"id":2033,"content":"roadrisk:aftenposten","start":1410358298000,"group":"roadrisk:aftenposten"},{"id":2034,"content":"roadrisk:aftenposten","start":1410375424000,"group":"roadrisk:aftenposten"},{"id":2036,"content":"roadrisk:aftenposten","start":1410360496000,"group":"roadrisk:aftenposten"},{"id":2037,"content":"roadrisk:aftenposten","start":1410373211000,"group":"roadrisk:aftenposten"},{"id":2038,"content":"roadrisk:aftenposten","start":1410333707000,"group":"roadrisk:aftenposten"},{"id":2039,"content":"roadrisk:aftenposten","start":1410361395000,"group":"roadrisk:aftenposten"},{"id":2040,"content":"roadrisk:aftenposten","start":1410361181000,"group":"roadrisk:aftenposten"},{"id":2041,"content":"tweet","start":1424856372000,"group":"tweet"},{"id":2042,"content":"accident:aftenposten","start":1410331566000,"group":"accident:aftenposten"},{"id":2043,"content":"roadrisk:aftenposten","start":1410362263000,"group":"roadrisk:aftenposten"},{"id":2044,"content":"tweet","start":1424852322000,"group":"tweet"},{"id":2045,"content":"tweet","start":1424855195000,"group":"tweet"},{"id":2046,"content":"roadrisk:aftenposten","start":1410353564000,"group":"roadrisk:aftenposten"},{"id":2047,"content":"accident:aftenposten","start":1410344501000,"group":"accident:aftenposten"},{"id":2048,"content":"roadrisk:aftenposten","start":1410377778000,"group":"roadrisk:aftenposten"},{"id":2049,"content":"roadrisk:aftenposten","start":1410345257000,"group":"roadrisk:aftenposten"},{"id":2050,"content":"accident:aftenposten","start":1410339003000,"group":"accident:aftenposten"},{"id":2051,"content":"roadrisk:aftenposten","start":1410333066000,"group":"roadrisk:aftenposten"},{"id":2052,"content":"roadrisk:aftenposten","start":1410377414000,"group":"roadrisk:aftenposten"},{"id":2053,"content":"roadrisk:aftenposten","start":1410329673000,"group":"roadrisk:aftenposten"},{"id":2054,"content":"roadrisk:aftenposten","start":1410372848000,"group":"roadrisk:aftenposten"},{"id":2055,"content":"tweet","start":1424853915000,"group":"tweet"},{"id":2056,"content":"roadrisk:aftenposten","start":1410352152000,"group":"roadrisk:aftenposten"},{"id":2057,"content":"roadrisk:aftenposten","start":1410353452000,"group":"roadrisk:aftenposten"},{"id":2058,"content":"tweet:picture","start":1424855197000,"group":"tweet:picture"},{"id":2059,"content":"accident:aftenposten","start":1410367694000,"group":"accident:aftenposten"},{"id":2060,"content":"roadrisk:aftenposten","start":1410353441000,"group":"roadrisk:aftenposten"},{"id":2061,"content":"roadrisk:aftenposten","start":1410352357000,"group":"roadrisk:aftenposten"},{"id":2062,"content":"roadrisk:aftenposten","start":1410333927000,"group":"roadrisk:aftenposten"},{"id":2063,"content":"roadrisk:aftenposten","start":1410373525000,"group":"roadrisk:aftenposten"},{"id":2064,"content":"roadrisk:aftenposten","start":1410354477000,"group":"roadrisk:aftenposten"},{"id":2065,"content":"roadrisk:aftenposten","start":1410336018000,"group":"roadrisk:aftenposten"},{"id":2066,"content":"tweet","start":1424857917000,"group":"tweet"},{"id":2067,"content":"roadrisk:aftenposten","start":1410348081000,"group":"roadrisk:aftenposten"},{"id":2068,"content":"tweet","start":1424855811000,"group":"tweet"},{"id":2069,"content":"roadrisk:aftenposten","start":1410362848000,"group":"roadrisk:aftenposten"},{"id":2070,"content":"roadrisk:aftenposten","start":1410327191000,"group":"roadrisk:aftenposten"},{"id":2071,"content":"roadrisk:aftenposten","start":1410364980000,"group":"roadrisk:aftenposten"},{"id":2072,"content":"roadrisk:aftenposten","start":1410364084000,"group":"roadrisk:aftenposten"},{"id":2073,"content":"accident:aftenposten","start":1410328092000,"group":"accident:aftenposten"},{"id":2074,"content":"accident:aftenposten","start":1410335291000,"group":"accident:aftenposten"},{"id":2075,"content":"roadrisk:aftenposten","start":1410344353000,"group":"roadrisk:aftenposten"},{"id":2076,"content":"tweet","start":1424853092000,"group":"tweet"},{"id":2077,"content":"roadrisk:aftenposten","start":1410329076000,"group":"roadrisk:aftenposten"},{"id":2078,"content":"roadrisk:aftenposten","start":1410333909000,"group":"roadrisk:aftenposten"},{"id":2079,"content":"roadrisk:aftenposten","start":1410361956000,"group":"roadrisk:aftenposten"},{"id":2080,"content":"tweet","start":1424853218000,"group":"tweet"},{"id":2081,"content":"roadrisk:aftenposten","start":1410333687000,"group":"roadrisk:aftenposten"},{"id":2082,"content":"roadrisk:aftenposten","start":1410327732000,"group":"roadrisk:aftenposten"},{"id":2083,"content":"roadrisk:aftenposten","start":1410378785000,"group":"roadrisk:aftenposten"},{"id":2084,"content":"roadrisk:aftenposten","start":1410354416000,"group":"roadrisk:aftenposten"},{"id":2085,"content":"tweet","start":1424850830000,"group":"tweet"},{"id":2086,"content":"roadrisk:aftenposten","start":1410366402000,"group":"roadrisk:aftenposten"},{"id":2087,"content":"roadrisk:aftenposten","start":1410338405000,"group":"roadrisk:aftenposten"},{"id":2088,"content":"roadrisk:aftenposten","start":1410366361000,"group":"roadrisk:aftenposten"},{"id":2089,"content":"accident:aftenposten","start":1410379130000,"group":"accident:aftenposten"},{"id":2090,"content":"tweet","start":1424850939000,"group":"tweet"},{"id":2091,"content":"roadrisk:aftenposten","start":1410352942000,"group":"roadrisk:aftenposten"},{"id":2092,"content":"tweet","start":1424852265000,"group":"tweet"},{"id":2093,"content":"roadrisk:aftenposten","start":1410375284000,"group":"roadrisk:aftenposten"},{"id":2094,"content":"roadrisk:aftenposten","start":1410379050000,"group":"roadrisk:aftenposten"},{"id":2095,"content":"tweet","start":1424849338000,"group":"tweet"},{"id":2096,"content":"accident:aftenposten","start":1410349229000,"group":"accident:aftenposten"},{"id":2097,"content":"roadrisk:aftenposten","start":1410374685000,"group":"roadrisk:aftenposten"},{"id":2098,"content":"roadrisk:aftenposten","start":1410361495000,"group":"roadrisk:aftenposten"},{"id":2099,"content":"roadrisk:aftenposten","start":1410366104000,"group":"roadrisk:aftenposten"},{"id":2100,"content":"roadrisk:aftenposten","start":1410353733000,"group":"roadrisk:aftenposten"},{"id":2101,"content":"roadrisk:aftenposten","start":1410362812000,"group":"roadrisk:aftenposten"},{"id":2102,"content":"roadrisk:aftenposten","start":1410373323000,"group":"roadrisk:aftenposten"},{"id":2103,"content":"tweet","start":1424849519000,"group":"tweet"},{"id":2104,"content":"roadrisk:aftenposten","start":1410335174000,"group":"roadrisk:aftenposten"},{"id":2105,"content":"roadrisk:aftenposten","start":1410333098000,"group":"roadrisk:aftenposten"},{"id":2106,"content":"roadrisk:aftenposten","start":1410353545000,"group":"roadrisk:aftenposten"},{"id":2107,"content":"roadrisk:aftenposten","start":1410354275000,"group":"roadrisk:aftenposten"},{"id":2108,"content":"roadrisk:aftenposten","start":1410334126000,"group":"roadrisk:aftenposten"},{"id":2109,"content":"tweet","start":1424852067000,"group":"tweet"},{"id":2110,"content":"roadrisk:aftenposten","start":1410364419000,"group":"roadrisk:aftenposten"},{"id":2111,"content":"accident:aftenposten","start":1410353401000,"group":"accident:aftenposten"},{"id":2112,"content":"roadrisk:aftenposten","start":1410327995000,"group":"roadrisk:aftenposten"},{"id":2113,"content":"roadrisk:aftenposten","start":1410330174000,"group":"roadrisk:aftenposten"},{"id":2114,"content":"tweet:picture","start":1424857382000,"group":"tweet:picture"},{"id":2115,"content":"roadrisk:aftenposten","start":1410353391000,"group":"roadrisk:aftenposten"},{"id":2116,"content":"roadrisk:aftenposten","start":1410378572000,"group":"roadrisk:aftenposten"},{"id":2117,"content":"roadrisk:aftenposten","start":1410337781000,"group":"roadrisk:aftenposten"},{"id":2118,"content":"roadrisk:aftenposten","start":1410340536000,"group":"roadrisk:aftenposten"},{"id":2119,"content":"accident:aftenposten","start":1410339003000,"group":"accident:aftenposten"},{"id":2120,"content":"roadrisk:aftenposten","start":1410335978000,"group":"roadrisk:aftenposten"},{"id":2121,"content":"tweet","start":1424850186000,"group":"tweet"},{"id":2122,"content":"roadrisk:aftenposten","start":1410345229000,"group":"roadrisk:aftenposten"},{"id":2123,"content":"roadrisk:aftenposten","start":1410258029000,"group":"roadrisk:aftenposten"},{"id":2124,"content":"roadrisk:aftenposten","start":1410333012000,"group":"roadrisk:aftenposten"},{"id":2125,"content":"roadrisk:aftenposten","start":1410333073000,"group":"roadrisk:aftenposten"},{"id":2126,"content":"accident:aftenposten","start":1410347553000,"group":"accident:aftenposten"},{"id":2127,"content":"accident:aftenposten","start":1410379000000,"group":"accident:aftenposten"},{"id":2128,"content":"roadrisk:aftenposten","start":1410353367000,"group":"roadrisk:aftenposten"},{"id":2129,"content":"roadrisk:aftenposten","start":1410333308000,"group":"roadrisk:aftenposten"},{"id":2130,"content":"accident:aftenposten","start":1410347396000,"group":"accident:aftenposten"},{"id":2131,"content":"roadrisk:aftenposten","start":1410333904000,"group":"roadrisk:aftenposten"},{"id":2132,"content":"roadrisk:aftenposten","start":1410342046000,"group":"roadrisk:aftenposten"},{"id":2133,"content":"roadrisk:aftenposten","start":1410345822000,"group":"roadrisk:aftenposten"},{"id":2134,"content":"tweet","start":1424855147000,"group":"tweet"},{"id":2135,"content":"tweet:picture","start":1424850146000,"group":"tweet:picture"},{"id":2136,"content":"roadrisk:aftenposten","start":1410347376000,"group":"roadrisk:aftenposten"},{"id":2137,"content":"roadrisk:aftenposten","start":1410333665000,"group":"roadrisk:aftenposten"},{"id":2138,"content":"roadrisk:aftenposten","start":1410331529000,"group":"roadrisk:aftenposten"},{"id":2139,"content":"tweet","start":1424849325000,"group":"tweet"},{"id":2140,"content":"roadrisk:aftenposten","start":1410332666000,"group":"roadrisk:aftenposten"},{"id":2141,"content":"tweet","start":1424853483000,"group":"tweet"},{"id":2142,"content":"roadrisk:aftenposten","start":1410345942000,"group":"roadrisk:aftenposten"},{"id":2143,"content":"roadrisk:aftenposten","start":1410331439000,"group":"roadrisk:aftenposten"},{"id":2144,"content":"roadrisk:aftenposten","start":1410352013000,"group":"roadrisk:aftenposten"},{"id":2145,"content":"roadrisk:aftenposten","start":1410362774000,"group":"roadrisk:aftenposten"},{"id":2146,"content":"accident:aftenposten","start":1410335103000,"group":"accident:aftenposten"},{"id":2147,"content":"roadrisk:aftenposten","start":1410333895000,"group":"roadrisk:aftenposten"},{"id":2148,"content":"accident:aftenposten","start":1410335970000,"group":"accident:aftenposten"},{"id":2149,"content":"tweet","start":1424854958000,"group":"tweet"},{"id":2150,"content":"roadrisk:aftenposten","start":1410334967000,"group":"roadrisk:aftenposten"},{"id":2151,"content":"roadrisk:aftenposten","start":1410353351000,"group":"roadrisk:aftenposten"},{"id":2152,"content":"accident:aftenposten","start":1410353121000,"group":"accident:aftenposten"},{"id":2153,"content":"tweet","start":1424849604000,"group":"tweet"},{"id":2154,"content":"tweet","start":1424850791000,"group":"tweet"},{"id":2155,"content":"roadrisk:aftenposten","start":1410327723000,"group":"roadrisk:aftenposten"},{"id":2156,"content":"roadrisk:aftenposten","start":1410365968000,"group":"roadrisk:aftenposten"},{"id":2157,"content":"roadrisk:aftenposten","start":1410337767000,"group":"roadrisk:aftenposten"},{"id":2158,"content":"tweet","start":1424857355000,"group":"tweet"},{"id":2159,"content":"tweet:picture","start":1424856109000,"group":"tweet:picture"},{"id":2160,"content":"roadrisk:aftenposten","start":1410367073000,"group":"roadrisk:aftenposten"},{"id":2161,"content":"tweet","start":1424857222000,"group":"tweet"},{"id":2162,"content":"roadrisk:aftenposten","start":1410366907000,"group":"roadrisk:aftenposten"},{"id":2163,"content":"roadrisk:aftenposten","start":1410330163000,"group":"roadrisk:aftenposten"},{"id":2164,"content":"roadrisk:aftenposten","start":1410366834000,"group":"roadrisk:aftenposten"},{"id":2165,"content":"accident:aftenposten","start":1410373416000,"group":"accident:aftenposten"},{"id":2166,"content":"roadrisk:aftenposten","start":1410367888000,"group":"roadrisk:aftenposten"},{"id":2167,"content":"roadrisk:aftenposten","start":1410370338000,"group":"roadrisk:aftenposten"},{"id":2168,"content":"roadrisk:aftenposten","start":1410370168000,"group":"roadrisk:aftenposten"},{"id":2169,"content":"roadrisk:aftenposten","start":1410368350000,"group":"roadrisk:aftenposten"},{"id":2170,"content":"roadrisk:aftenposten","start":1410372418000,"group":"roadrisk:aftenposten"},{"id":2171,"content":"roadrisk:aftenposten","start":1410370548000,"group":"roadrisk:aftenposten"},{"id":2172,"content":"roadrisk:aftenposten","start":1410370165000,"group":"roadrisk:aftenposten"},{"id":2173,"content":"roadrisk:aftenposten","start":1410370020000,"group":"roadrisk:aftenposten"},{"id":2174,"content":"tweet","start":1424851791000,"group":"tweet"},{"id":2175,"content":"accident:aftenposten","start":1410370413000,"group":"accident:aftenposten"},{"id":2176,"content":"tweet","start":1424857217000,"group":"tweet"},{"id":2177,"content":"roadrisk:aftenposten","start":1410365518000,"group":"roadrisk:aftenposten"},{"id":2178,"content":"roadrisk:aftenposten","start":1410347966000,"group":"roadrisk:aftenposten"},{"id":2179,"content":"roadrisk:aftenposten","start":1410329562000,"group":"roadrisk:aftenposten"},{"id":2180,"content":"roadrisk:aftenposten","start":1410341888000,"group":"roadrisk:aftenposten"},{"id":2181,"content":"roadrisk:aftenposten","start":1410378731000,"group":"roadrisk:aftenposten"},{"id":2182,"content":"roadrisk:aftenposten","start":1410327126000,"group":"roadrisk:aftenposten"},{"id":2183,"content":"roadrisk:aftenposten","start":1410344338000,"group":"roadrisk:aftenposten"},{"id":2184,"content":"roadrisk:aftenposten","start":1410371896000,"group":"roadrisk:aftenposten"},{"id":2185,"content":"roadrisk:aftenposten","start":1410334753000,"group":"roadrisk:aftenposten"},{"id":2186,"content":"roadrisk:aftenposten","start":1410334181000,"group":"roadrisk:aftenposten"},{"id":2187,"content":"roadrisk:aftenposten","start":1410337742000,"group":"roadrisk:aftenposten"},{"id":2188,"content":"roadrisk:aftenposten","start":1410338944000,"group":"roadrisk:aftenposten"},{"id":2189,"content":"roadrisk:aftenposten","start":1410354232000,"group":"roadrisk:aftenposten"},{"id":2190,"content":"roadrisk:aftenposten","start":1410327714000,"group":"roadrisk:aftenposten"},{"id":2191,"content":"accident:aftenposten","start":1410340437000,"group":"accident:aftenposten"},{"id":2192,"content":"roadrisk:aftenposten","start":1410361484000,"group":"roadrisk:aftenposten"},{"id":2193,"content":"roadrisk:aftenposten","start":1410327947000,"group":"roadrisk:aftenposten"},{"id":2194,"content":"roadrisk:aftenposten","start":1410361605000,"group":"roadrisk:aftenposten"},{"id":2195,"content":"tweet","start":1424855752000,"group":"tweet"},{"id":2196,"content":"accident:aftenposten","start":1410335951000,"group":"accident:aftenposten"},{"id":2197,"content":"roadrisk:aftenposten","start":1410356241000,"group":"roadrisk:aftenposten"},{"id":2198,"content":"roadrisk:aftenposten","start":1410337402000,"group":"roadrisk:aftenposten"},{"id":2199,"content":"roadrisk:aftenposten","start":1410371788000,"group":"roadrisk:aftenposten"},{"id":2200,"content":"roadrisk:aftenposten","start":1410331415000,"group":"roadrisk:aftenposten"},{"id":2201,"content":"roadrisk:aftenposten","start":1410373386000,"group":"roadrisk:aftenposten"},{"id":2202,"content":"roadrisk:aftenposten","start":1410352805000,"group":"roadrisk:aftenposten"},{"id":2203,"content":"tweet","start":1424856103000,"group":"tweet"},{"id":2204,"content":"accident:aftenposten","start":1410368261000,"group":"accident:aftenposten"},{"id":2205,"content":"roadrisk:aftenposten","start":1410358282000,"group":"roadrisk:aftenposten"},{"id":2206,"content":"roadrisk:aftenposten","start":1410365470000,"group":"roadrisk:aftenposten"},{"id":2207,"content":"roadrisk:aftenposten","start":1410347211000,"group":"roadrisk:aftenposten"},{"id":2208,"content":"roadrisk:aftenposten","start":1410340462000,"group":"roadrisk:aftenposten"},{"id":2209,"content":"roadrisk:aftenposten","start":1410348781000,"group":"roadrisk:aftenposten"},{"id":2210,"content":"roadrisk:aftenposten","start":1410342946000,"group":"roadrisk:aftenposten"},{"id":2211,"content":"roadrisk:aftenposten","start":1410345223000,"group":"roadrisk:aftenposten"},{"id":2212,"content":"roadrisk:aftenposten","start":1410340522000,"group":"roadrisk:aftenposten"},{"id":2213,"content":"roadrisk:aftenposten","start":1410334616000,"group":"roadrisk:aftenposten"},{"id":2214,"content":"roadrisk:aftenposten","start":1410364773000,"group":"roadrisk:aftenposten"},{"id":2215,"content":"tweet","start":1424856409000,"group":"tweet"},{"id":2216,"content":"tweet","start":1424856728000,"group":"tweet"},{"id":2217,"content":"roadrisk:aftenposten","start":1410354893000,"group":"roadrisk:aftenposten"},{"id":2218,"content":"tweet","start":1424851513000,"group":"tweet"},{"id":2219,"content":"tweet","start":1424853440000,"group":"tweet"},{"id":2220,"content":"roadrisk:aftenposten","start":1410356157000,"group":"roadrisk:aftenposten"},{"id":2221,"content":"roadrisk:aftenposten","start":1410353266000,"group":"roadrisk:aftenposten"},{"id":2222,"content":"roadrisk:aftenposten","start":1410338612000,"group":"roadrisk:aftenposten"},{"id":2223,"content":"roadrisk:aftenposten","start":1410327919000,"group":"roadrisk:aftenposten"},{"id":2224,"content":"roadrisk:aftenposten","start":1410334565000,"group":"roadrisk:aftenposten"},{"id":2225,"content":"roadrisk:aftenposten","start":1410329558000,"group":"roadrisk:aftenposten"},{"id":2226,"content":"tweet","start":1424851747000,"group":"tweet"},{"id":2227,"content":"tweet","start":1424856460000,"group":"tweet"},{"id":2228,"content":"tweet","start":1424857174000,"group":"tweet"},{"id":2229,"content":"roadrisk:aftenposten","start":1410331375000,"group":"roadrisk:aftenposten"},{"id":2230,"content":"roadrisk:aftenposten","start":1410331332000,"group":"roadrisk:aftenposten"},{"id":2231,"content":"roadrisk:aftenposten","start":1410331307000,"group":"roadrisk:aftenposten"},{"id":2232,"content":"tweet","start":1424851428000,"group":"tweet"},{"id":2233,"content":"roadrisk:aftenposten","start":1410378676000,"group":"roadrisk:aftenposten"},{"id":2234,"content":"tweet","start":1424855094000,"group":"tweet"},{"id":2235,"content":"tweet","start":1424852042000,"group":"tweet"},{"id":2236,"content":"roadrisk:aftenposten","start":1410327120000,"group":"roadrisk:aftenposten"},{"id":2237,"content":"roadrisk:aftenposten","start":1410372513000,"group":"roadrisk:aftenposten"},{"id":2238,"content":"roadrisk:aftenposten","start":1410354348000,"group":"roadrisk:aftenposten"},{"id":2239,"content":"roadrisk:aftenposten","start":1410338201000,"group":"roadrisk:aftenposten"},{"id":2240,"content":"roadrisk:aftenposten","start":1410333278000,"group":"roadrisk:aftenposten"},{"id":2241,"content":"roadrisk:aftenposten","start":1410331289000,"group":"roadrisk:aftenposten"},{"id":2242,"content":"roadrisk:aftenposten","start":1410377407000,"group":"roadrisk:aftenposten"},{"id":2243,"content":"tweet","start":1424849632000,"group":"tweet"},{"id":2244,"content":"roadrisk:aftenposten","start":1410257342000,"group":"roadrisk:aftenposten"},{"id":2245,"content":"roadrisk:aftenposten","start":1410371705000,"group":"roadrisk:aftenposten"},{"id":2246,"content":"accident:aftenposten","start":1410356950000,"group":"accident:aftenposten"},{"id":2247,"content":"roadrisk:aftenposten","start":1410361099000,"group":"roadrisk:aftenposten"},{"id":2248,"content":"roadrisk:aftenposten","start":1410331135000,"group":"roadrisk:aftenposten"},{"id":2249,"content":"tweet","start":1424850630000,"group":"tweet"},{"id":2250,"content":"roadrisk:aftenposten","start":1410358251000,"group":"roadrisk:aftenposten"},{"id":2251,"content":"tweet","start":1424850784000,"group":"tweet"},{"id":2252,"content":"roadrisk:aftenposten","start":1410347032000,"group":"roadrisk:aftenposten"},{"id":2253,"content":"roadrisk:aftenposten","start":1410359305000,"group":"roadrisk:aftenposten"},{"id":2254,"content":"roadrisk:aftenposten","start":1410331118000,"group":"roadrisk:aftenposten"},{"id":2255,"content":"roadrisk:aftenposten","start":1410334544000,"group":"roadrisk:aftenposten"},{"id":2256,"content":"roadrisk:aftenposten","start":1410359194000,"group":"roadrisk:aftenposten"},{"id":2257,"content":"roadrisk:aftenposten","start":1410358974000,"group":"roadrisk:aftenposten"},{"id":2258,"content":"roadrisk:aftenposten","start":1410329165000,"group":"roadrisk:aftenposten"},{"id":2259,"content":"roadrisk:aftenposten","start":1410366750000,"group":"roadrisk:aftenposten"},{"id":2260,"content":"tweet","start":1424856829000,"group":"tweet"},{"id":2261,"content":"roadrisk:aftenposten","start":1410358619000,"group":"roadrisk:aftenposten"},{"id":2262,"content":"tweet:picture","start":1424855572000,"group":"tweet:picture"},{"id":2263,"content":"tweet","start":1424852040000,"group":"tweet"},{"id":2264,"content":"roadrisk:aftenposten","start":1410365474000,"group":"roadrisk:aftenposten"},{"id":2265,"content":"accident:aftenposten","start":1410378458000,"group":"accident:aftenposten"},{"id":2266,"content":"roadrisk:aftenposten","start":1410374553000,"group":"roadrisk:aftenposten"},{"id":2267,"content":"tweet","start":1424852601000,"group":"tweet"},{"id":2268,"content":"roadrisk:aftenposten","start":1410331083000,"group":"roadrisk:aftenposten"},{"id":2269,"content":"roadrisk:aftenposten","start":1410338849000,"group":"roadrisk:aftenposten"},{"id":2270,"content":"roadrisk:aftenposten","start":1410354755000,"group":"roadrisk:aftenposten"},{"id":2271,"content":"roadrisk:aftenposten","start":1410358556000,"group":"roadrisk:aftenposten"},{"id":2272,"content":"roadrisk:aftenposten","start":1410333873000,"group":"roadrisk:aftenposten"},{"id":2273,"content":"roadrisk:aftenposten","start":1410347821000,"group":"roadrisk:aftenposten"},{"id":2274,"content":"roadrisk:aftenposten","start":1410340285000,"group":"roadrisk:aftenposten"},{"id":2275,"content":"tweet","start":1424853959000,"group":"tweet"},{"id":2276,"content":"roadrisk:aftenposten","start":1410362632000,"group":"roadrisk:aftenposten"},{"id":2277,"content":"tweet","start":1424855018000,"group":"tweet"},{"id":2278,"content":"roadrisk:aftenposten","start":1410356805000,"group":"roadrisk:aftenposten"},{"id":2279,"content":"roadrisk:aftenposten","start":1410341210000,"group":"roadrisk:aftenposten"},{"id":2280,"content":"roadrisk:aftenposten","start":1410332970000,"group":"roadrisk:aftenposten"},{"id":2281,"content":"roadrisk:aftenposten","start":1410374262000,"group":"roadrisk:aftenposten"},{"id":2282,"content":"tweet:picture","start":1424849309000,"group":"tweet:picture"},{"id":2283,"content":"roadrisk:aftenposten","start":1410331081000,"group":"roadrisk:aftenposten"},{"id":2284,"content":"tweet","start":1424849289000,"group":"tweet"},{"id":2285,"content":"tweet","start":1424857165000,"group":"tweet"},{"id":2286,"content":"roadrisk:aftenposten","start":1410353257000,"group":"roadrisk:aftenposten"},{"id":2287,"content":"roadrisk:aftenposten","start":1410377741000,"group":"roadrisk:aftenposten"},{"id":2288,"content":"tweet","start":1424856364000,"group":"tweet"},{"id":2289,"content":"roadrisk:aftenposten","start":1410354892000,"group":"roadrisk:aftenposten"},{"id":2290,"content":"roadrisk:aftenposten","start":1410346892000,"group":"roadrisk:aftenposten"},{"id":2291,"content":"tweet","start":1424856140000,"group":"tweet"},{"id":2292,"content":"tweet","start":1424855852000,"group":"tweet"},{"id":2293,"content":"roadrisk:aftenposten","start":1410348345000,"group":"roadrisk:aftenposten"},{"id":2294,"content":"roadrisk:aftenposten","start":1410360999000,"group":"roadrisk:aftenposten"},{"id":2295,"content":"roadrisk:aftenposten","start":1410332182000,"group":"roadrisk:aftenposten"},{"id":2296,"content":"roadrisk:aftenposten","start":1410371608000,"group":"roadrisk:aftenposten"},{"id":2297,"content":"roadrisk:aftenposten","start":1410377322000,"group":"roadrisk:aftenposten"},{"id":2298,"content":"accident:aftenposten","start":1410331039000,"group":"accident:aftenposten"},{"id":2299,"content":"roadrisk:aftenposten","start":1410327909000,"group":"roadrisk:aftenposten"},{"id":2300,"content":"roadrisk:aftenposten","start":1410336740000,"group":"roadrisk:aftenposten"},{"id":2301,"content":"roadrisk:aftenposten","start":1410257257000,"group":"roadrisk:aftenposten"},{"id":2302,"content":"roadrisk:aftenposten","start":1410352038000,"group":"roadrisk:aftenposten"},{"id":2303,"content":"roadrisk:aftenposten","start":1410372365000,"group":"roadrisk:aftenposten"},{"id":2304,"content":"tweet:picture","start":1424854974000,"group":"tweet:picture"},{"id":2305,"content":"tweet","start":1424857238000,"group":"tweet"},{"id":2306,"content":"roadrisk:aftenposten","start":1410370631000,"group":"roadrisk:aftenposten"},{"id":2307,"content":"roadrisk:aftenposten","start":1410340869000,"group":"roadrisk:aftenposten"},{"id":2308,"content":"roadrisk:aftenposten","start":1410377272000,"group":"roadrisk:aftenposten"},{"id":2309,"content":"roadrisk:aftenposten","start":1410372239000,"group":"roadrisk:aftenposten"},{"id":2310,"content":"roadrisk:aftenposten","start":1410372066000,"group":"roadrisk:aftenposten"},{"id":2311,"content":"accident:aftenposten","start":1410353192000,"group":"accident:aftenposten"},{"id":2312,"content":"tweet","start":1424853362000,"group":"tweet"},{"id":2313,"content":"roadrisk:aftenposten","start":1410354313000,"group":"roadrisk:aftenposten"},{"id":2314,"content":"roadrisk:aftenposten","start":1410331034000,"group":"roadrisk:aftenposten"},{"id":2315,"content":"roadrisk:aftenposten","start":1410255905000,"group":"roadrisk:aftenposten"},{"id":2316,"content":"tweet:picture","start":1424852585000,"group":"tweet:picture"},{"id":2317,"content":"roadrisk:aftenposten","start":1410342746000,"group":"roadrisk:aftenposten"},{"id":2318,"content":"tweet","start":1424850415000,"group":"tweet"},{"id":2319,"content":"tweet","start":1424855751000,"group":"tweet"},{"id":2320,"content":"roadrisk:aftenposten","start":1410341820000,"group":"roadrisk:aftenposten"},{"id":2321,"content":"roadrisk:aftenposten","start":1410354159000,"group":"roadrisk:aftenposten"},{"id":2322,"content":"roadrisk:aftenposten","start":1410346774000,"group":"roadrisk:aftenposten"},{"id":2323,"content":"roadrisk:aftenposten","start":1410337361000,"group":"roadrisk:aftenposten"},{"id":2324,"content":"roadrisk:aftenposten","start":1410371009000,"group":"roadrisk:aftenposten"},{"id":2325,"content":"roadrisk:aftenposten","start":1410361922000,"group":"roadrisk:aftenposten"},{"id":2326,"content":"roadrisk:aftenposten","start":1410352558000,"group":"roadrisk:aftenposten"},{"id":2327,"content":"roadrisk:aftenposten","start":1410369350000,"group":"roadrisk:aftenposten"},{"id":2328,"content":"roadrisk:aftenposten","start":1410367003000,"group":"roadrisk:aftenposten"},{"id":2329,"content":"tweet:picture","start":1424849370000,"group":"tweet:picture"},{"id":2330,"content":"tweet:picture","start":1424856817000,"group":"tweet:picture"},{"id":2331,"content":"roadrisk:aftenposten","start":1410353002000,"group":"roadrisk:aftenposten"},{"id":2332,"content":"roadrisk:aftenposten","start":1410337741000,"group":"roadrisk:aftenposten"},{"id":2333,"content":"roadrisk:aftenposten","start":1410342697000,"group":"roadrisk:aftenposten"},{"id":2334,"content":"roadrisk:aftenposten","start":1410331033000,"group":"roadrisk:aftenposten"},{"id":2335,"content":"roadrisk:aftenposten","start":1410367940000,"group":"roadrisk:aftenposten"},{"id":2336,"content":"tweet","start":1424849904000,"group":"tweet"},{"id":2337,"content":"tweet","start":1424851223000,"group":"tweet"},{"id":2338,"content":"roadrisk:aftenposten","start":1410338812000,"group":"roadrisk:aftenposten"},{"id":2339,"content":"roadrisk:aftenposten","start":1410358456000,"group":"roadrisk:aftenposten"},{"id":2340,"content":"roadrisk:aftenposten","start":1410335906000,"group":"roadrisk:aftenposten"},{"id":2341,"content":"accident:aftenposten","start":1410370860000,"group":"accident:aftenposten"},{"id":2342,"content":"roadrisk:aftenposten","start":1410338798000,"group":"roadrisk:aftenposten"},{"id":2343,"content":"roadrisk:aftenposten","start":1410362717000,"group":"roadrisk:aftenposten"},{"id":2344,"content":"roadrisk:aftenposten","start":1410371606000,"group":"roadrisk:aftenposten"},{"id":2345,"content":"roadrisk:aftenposten","start":1410364636000,"group":"roadrisk:aftenposten"},{"id":2346,"content":"roadrisk:aftenposten","start":1410341737000,"group":"roadrisk:aftenposten"},{"id":2347,"content":"tweet","start":1424853959000,"group":"tweet"},{"id":2348,"content":"roadrisk:aftenposten","start":1410335903000,"group":"roadrisk:aftenposten"},{"id":2349,"content":"roadrisk:aftenposten","start":1410333640000,"group":"roadrisk:aftenposten"},{"id":2350,"content":"roadrisk:aftenposten","start":1410329518000,"group":"roadrisk:aftenposten"},{"id":2351,"content":"roadrisk:aftenposten","start":1410338796000,"group":"roadrisk:aftenposten"},{"id":2352,"content":"roadrisk:aftenposten","start":1410330146000,"group":"roadrisk:aftenposten"},{"id":2353,"content":"accident:aftenposten","start":1410337193000,"group":"accident:aftenposten"},{"id":2354,"content":"roadrisk:aftenposten","start":1410377720000,"group":"roadrisk:aftenposten"},{"id":2355,"content":"roadrisk:aftenposten","start":1410329478000,"group":"roadrisk:aftenposten"},{"id":2356,"content":"tweet","start":1424852511000,"group":"tweet"},{"id":2357,"content":"roadrisk:aftenposten","start":1410378550000,"group":"roadrisk:aftenposten"},{"id":2358,"content":"roadrisk:aftenposten","start":1410365297000,"group":"roadrisk:aftenposten"},{"id":2359,"content":"roadrisk:aftenposten","start":1410333275000,"group":"roadrisk:aftenposten"},{"id":2360,"content":"roadrisk:aftenposten","start":1410350075000,"group":"roadrisk:aftenposten"},{"id":2361,"content":"tweet","start":1424852445000,"group":"tweet"},{"id":2362,"content":"tweet","start":1424854857000,"group":"tweet"},{"id":2363,"content":"tweet","start":1424855164000,"group":"tweet"},{"id":2364,"content":"roadrisk:aftenposten","start":1410373537000,"group":"roadrisk:aftenposten"},{"id":2365,"content":"roadrisk:aftenposten","start":1410352412000,"group":"roadrisk:aftenposten"},{"id":2366,"content":"roadrisk:aftenposten","start":1410372447000,"group":"roadrisk:aftenposten"},{"id":2367,"content":"roadrisk:aftenposten","start":1410333870000,"group":"roadrisk:aftenposten"},{"id":2368,"content":"roadrisk:aftenposten","start":1410373047000,"group":"roadrisk:aftenposten"},{"id":2369,"content":"roadrisk:aftenposten","start":1410363866000,"group":"roadrisk:aftenposten"},{"id":2370,"content":"roadrisk:aftenposten","start":1410360830000,"group":"roadrisk:aftenposten"},{"id":2371,"content":"accident:aftenposten","start":1410343328000,"group":"accident:aftenposten"},{"id":2372,"content":"roadrisk:aftenposten","start":1410342401000,"group":"roadrisk:aftenposten"},{"id":2373,"content":"roadrisk:aftenposten","start":1410372599000,"group":"roadrisk:aftenposten"},{"id":2374,"content":"tweet:picture","start":1424850935000,"group":"tweet:picture"},{"id":2375,"content":"accident:aftenposten","start":1410356762000,"group":"accident:aftenposten"},{"id":2376,"content":"roadrisk:aftenposten","start":1410377691000,"group":"roadrisk:aftenposten"},{"id":2377,"content":"tweet:picture","start":1424854355000,"group":"tweet:picture"},{"id":2378,"content":"roadrisk:aftenposten","start":1410357606000,"group":"roadrisk:aftenposten"},{"id":2379,"content":"roadrisk:aftenposten","start":1410373831000,"group":"roadrisk:aftenposten"},{"id":2380,"content":"tweet","start":1424852148000,"group":"tweet"},{"id":2381,"content":"roadrisk:aftenposten","start":1410379275000,"group":"roadrisk:aftenposten"},{"id":2382,"content":"roadrisk:aftenposten","start":1410357361000,"group":"roadrisk:aftenposten"},{"id":2383,"content":"roadrisk:aftenposten","start":1410339150000,"group":"roadrisk:aftenposten"},{"id":2384,"content":"tweet","start":1424856131000,"group":"tweet"},{"id":2385,"content":"roadrisk:aftenposten","start":1410361913000,"group":"roadrisk:aftenposten"},{"id":2386,"content":"roadrisk:aftenposten","start":1410331026000,"group":"roadrisk:aftenposten"},{"id":2387,"content":"roadrisk:aftenposten","start":1410355898000,"group":"roadrisk:aftenposten"},{"id":2389,"content":"tweet","start":1424853351000,"group":"tweet"},{"id":2390,"content":"tweet","start":1424857136000,"group":"tweet"},{"id":2391,"content":"roadrisk:aftenposten","start":1410363756000,"group":"roadrisk:aftenposten"},{"id":2392,"content":"roadrisk:aftenposten","start":1410372575000,"group":"roadrisk:aftenposten"},{"id":2393,"content":"roadrisk:aftenposten","start":1410337351000,"group":"roadrisk:aftenposten"},{"id":2394,"content":"roadrisk:aftenposten","start":1410343486000,"group":"roadrisk:aftenposten"},{"id":2395,"content":"roadrisk:aftenposten","start":1410344292000,"group":"roadrisk:aftenposten"},{"id":2396,"content":"roadrisk:aftenposten","start":1410336461000,"group":"roadrisk:aftenposten"},{"id":2397,"content":"roadrisk:aftenposten","start":1410326994000,"group":"roadrisk:aftenposten"},{"id":2398,"content":"roadrisk:aftenposten","start":1410326980000,"group":"roadrisk:aftenposten"},{"id":2399,"content":"roadrisk:aftenposten","start":1410363538000,"group":"roadrisk:aftenposten"},{"id":2400,"content":"roadrisk:aftenposten","start":1410333238000,"group":"roadrisk:aftenposten"},{"id":2401,"content":"roadrisk:aftenposten","start":1410349241000,"group":"roadrisk:aftenposten"},{"id":2402,"content":"tweet","start":1424854647000,"group":"tweet"},{"id":2403,"content":"accident:aftenposten","start":1410333225000,"group":"accident:aftenposten"},{"id":2404,"content":"roadrisk:aftenposten","start":1410326940000,"group":"roadrisk:aftenposten"},{"id":2405,"content":"accident:aftenposten","start":1410358235000,"group":"accident:aftenposten"},{"id":2406,"content":"tweet","start":1424856774000,"group":"tweet"},{"id":2407,"content":"roadrisk:aftenposten","start":1410365165000,"group":"roadrisk:aftenposten"},{"id":2408,"content":"roadrisk:aftenposten","start":1410373022000,"group":"roadrisk:aftenposten"},{"id":2409,"content":"roadrisk:aftenposten","start":1410360738000,"group":"roadrisk:aftenposten"},{"id":2410,"content":"roadrisk:aftenposten","start":1410337708000,"group":"roadrisk:aftenposten"},{"id":2411,"content":"tweet","start":1424857430000,"group":"tweet"},{"id":2412,"content":"roadrisk:aftenposten","start":1410329462000,"group":"roadrisk:aftenposten"},{"id":2413,"content":"tweet","start":1424856023000,"group":"tweet"},{"id":2414,"content":"roadrisk:aftenposten","start":1410337672000,"group":"roadrisk:aftenposten"},{"id":2415,"content":"roadrisk:aftenposten","start":1410360185000,"group":"roadrisk:aftenposten"},{"id":2416,"content":"tweet","start":1424857931000,"group":"tweet"},{"id":2417,"content":"tweet","start":1424849136000,"group":"tweet"},{"id":2418,"content":"roadrisk:aftenposten","start":1410355839000,"group":"roadrisk:aftenposten"},{"id":2419,"content":"roadrisk:aftenposten","start":1410362222000,"group":"roadrisk:aftenposten"},{"id":2420,"content":"roadrisk:aftenposten","start":1410362209000,"group":"roadrisk:aftenposten"},{"id":2421,"content":"roadrisk:aftenposten","start":1410366402000,"group":"roadrisk:aftenposten"},{"id":2422,"content":"tweet:picture","start":1424851079000,"group":"tweet:picture"},{"id":2423,"content":"accident:aftenposten","start":1410356647000,"group":"accident:aftenposten"},{"id":2425,"content":"roadrisk:aftenposten","start":1410339148000,"group":"roadrisk:aftenposten"},{"id":2426,"content":"roadrisk:aftenposten","start":1410337185000,"group":"roadrisk:aftenposten"},{"id":2427,"content":"roadrisk:aftenposten","start":1410376096000,"group":"roadrisk:aftenposten"},{"id":2428,"content":"tweet:picture","start":1424856330000,"group":"tweet:picture"},{"id":2429,"content":"tweet","start":1424856200000,"group":"tweet"},{"id":2431,"content":"roadrisk:aftenposten","start":1410346590000,"group":"roadrisk:aftenposten"},{"id":2432,"content":"roadrisk:aftenposten","start":1410346585000,"group":"roadrisk:aftenposten"},{"id":2433,"content":"roadrisk:aftenposten","start":1410344869000,"group":"roadrisk:aftenposten"},{"id":2434,"content":"roadrisk:aftenposten","start":1410355693000,"group":"roadrisk:aftenposten"},{"id":2435,"content":"accident:aftenposten","start":1410330970000,"group":"accident:aftenposten"},{"id":2436,"content":"roadrisk:aftenposten","start":1410377145000,"group":"roadrisk:aftenposten"},{"id":2437,"content":"tweet","start":1424855560000,"group":"tweet"},{"id":2438,"content":"tweet","start":1424852475000,"group":"tweet"},{"id":2439,"content":"roadrisk:aftenposten","start":1410338096000,"group":"roadrisk:aftenposten"},{"id":2440,"content":"roadrisk:aftenposten","start":1410363507000,"group":"roadrisk:aftenposten"},{"id":2441,"content":"tweet","start":1424851907000,"group":"tweet"},{"id":2442,"content":"roadrisk:aftenposten","start":1410354131000,"group":"roadrisk:aftenposten"},{"id":2443,"content":"tweet","start":1424855523000,"group":"tweet"},{"id":2444,"content":"tweet","start":1424853268000,"group":"tweet"},{"id":2445,"content":"roadrisk:aftenposten","start":1410327859000,"group":"roadrisk:aftenposten"},{"id":2446,"content":"roadrisk:aftenposten","start":1410358170000,"group":"roadrisk:aftenposten"},{"id":2447,"content":"roadrisk:aftenposten","start":1410360596000,"group":"roadrisk:aftenposten"},{"id":2448,"content":"roadrisk:aftenposten","start":1410354755000,"group":"roadrisk:aftenposten"},{"id":2449,"content":"roadrisk:aftenposten","start":1410339148000,"group":"roadrisk:aftenposten"},{"id":2450,"content":"accident:aftenposten","start":1410376978000,"group":"accident:aftenposten"},{"id":2451,"content":"roadrisk:aftenposten","start":1410327538000,"group":"roadrisk:aftenposten"},{"id":2452,"content":"tweet","start":1424856737000,"group":"tweet"},{"id":2453,"content":"roadrisk:aftenposten","start":1410359619000,"group":"roadrisk:aftenposten"},{"id":2454,"content":"roadrisk:aftenposten","start":1410355501000,"group":"roadrisk:aftenposten"},{"id":2455,"content":"roadrisk:aftenposten","start":1410330955000,"group":"roadrisk:aftenposten"},{"id":2456,"content":"roadrisk:aftenposten","start":1410328835000,"group":"roadrisk:aftenposten"},{"id":2457,"content":"roadrisk:aftenposten","start":1410346428000,"group":"roadrisk:aftenposten"},{"id":2458,"content":"roadrisk:aftenposten","start":1410358022000,"group":"roadrisk:aftenposten"},{"id":2459,"content":"roadrisk:aftenposten","start":1410330942000,"group":"roadrisk:aftenposten"},{"id":2460,"content":"roadrisk:aftenposten","start":1410330925000,"group":"roadrisk:aftenposten"},{"id":2461,"content":"roadrisk:aftenposten","start":1410356945000,"group":"roadrisk:aftenposten"},{"id":2462,"content":"tweet","start":1424849762000,"group":"tweet"},{"id":2463,"content":"accident:aftenposten","start":1410332180000,"group":"accident:aftenposten"},{"id":2464,"content":"roadrisk:aftenposten","start":1410333869000,"group":"roadrisk:aftenposten"},{"id":2465,"content":"roadrisk:aftenposten","start":1410338089000,"group":"roadrisk:aftenposten"},{"id":2466,"content":"tweet","start":1424857123000,"group":"tweet"},{"id":2467,"content":"roadrisk:aftenposten","start":1410342825000,"group":"roadrisk:aftenposten"},{"id":2468,"content":"tweet","start":1424853880000,"group":"tweet"},{"id":2469,"content":"roadrisk:aftenposten","start":1410339117000,"group":"roadrisk:aftenposten"},{"id":2470,"content":"roadrisk:aftenposten","start":1410346390000,"group":"roadrisk:aftenposten"},{"id":2471,"content":"roadrisk:aftenposten","start":1410329431000,"group":"roadrisk:aftenposten"},{"id":2472,"content":"tweet","start":1424853979000,"group":"tweet"},{"id":2473,"content":"roadrisk:aftenposten","start":1410327859000,"group":"roadrisk:aftenposten"},{"id":2474,"content":"tweet","start":1424854628000,"group":"tweet"},{"id":2475,"content":"roadrisk:aftenposten","start":1410351594000,"group":"roadrisk:aftenposten"},{"id":2476,"content":"accident:aftenposten","start":1410327444000,"group":"accident:aftenposten"},{"id":2477,"content":"roadrisk:aftenposten","start":1410339079000,"group":"roadrisk:aftenposten"},{"id":2478,"content":"roadrisk:aftenposten","start":1410377611000,"group":"roadrisk:aftenposten"},{"id":2479,"content":"roadrisk:aftenposten","start":1410363216000,"group":"roadrisk:aftenposten"},{"id":2480,"content":"roadrisk:aftenposten","start":1410340406000,"group":"roadrisk:aftenposten"},{"id":2481,"content":"roadrisk:aftenposten","start":1410363132000,"group":"roadrisk:aftenposten"},{"id":2482,"content":"tweet:picture","start":1424857028000,"group":"tweet:picture"},{"id":2483,"content":"tweet","start":1424855960000,"group":"tweet"},{"id":2484,"content":"roadrisk:aftenposten","start":1410353579000,"group":"roadrisk:aftenposten"},{"id":2485,"content":"roadrisk:aftenposten","start":1410357955000,"group":"roadrisk:aftenposten"},{"id":2486,"content":"roadrisk:aftenposten","start":1410330915000,"group":"roadrisk:aftenposten"},{"id":2487,"content":"tweet:picture","start":1424850124000,"group":"tweet:picture"},{"id":2488,"content":"roadrisk:aftenposten","start":1410336738000,"group":"roadrisk:aftenposten"},{"id":2489,"content":"tweet","start":1424857011000,"group":"tweet"},{"id":2490,"content":"roadrisk:aftenposten","start":1410334543000,"group":"roadrisk:aftenposten"},{"id":2491,"content":"roadrisk:aftenposten","start":1410378065000,"group":"roadrisk:aftenposten"},{"id":2492,"content":"roadrisk:aftenposten","start":1410359402000,"group":"roadrisk:aftenposten"},{"id":2493,"content":"accident:aftenposten","start":1410339032000,"group":"accident:aftenposten"},{"id":2494,"content":"roadrisk:aftenposten","start":1410352971000,"group":"roadrisk:aftenposten"},{"id":2495,"content":"accident:aftenposten","start":1410353990000,"group":"accident:aftenposten"},{"id":2496,"content":"roadrisk:aftenposten","start":1410354292000,"group":"roadrisk:aftenposten"},{"id":2497,"content":"tweet","start":1424849560000,"group":"tweet"},{"id":2498,"content":"roadrisk:aftenposten","start":1410376733000,"group":"roadrisk:aftenposten"},{"id":2499,"content":"accident:aftenposten","start":1410345788000,"group":"accident:aftenposten"},{"id":2500,"content":"tweet","start":1424855296000,"group":"tweet"},{"id":2501,"content":"roadrisk:aftenposten","start":1410373005000,"group":"roadrisk:aftenposten"},{"id":2502,"content":"tweet","start":1424852037000,"group":"tweet"},{"id":2503,"content":"tweet:picture","start":1424854693000,"group":"tweet:picture"},{"id":2504,"content":"roadrisk:aftenposten","start":1410355188000,"group":"roadrisk:aftenposten"},{"id":2505,"content":"accident:aftenposten","start":1410330874000,"group":"accident:aftenposten"},{"id":2506,"content":"roadrisk:aftenposten","start":1410255785000,"group":"roadrisk:aftenposten"},{"id":2507,"content":"roadrisk:aftenposten","start":1410349094000,"group":"roadrisk:aftenposten"},{"id":2508,"content":"roadrisk:aftenposten","start":1410376254000,"group":"roadrisk:aftenposten"},{"id":2509,"content":"roadrisk:aftenposten","start":1410342880000,"group":"roadrisk:aftenposten"},{"id":2510,"content":"roadrisk:aftenposten","start":1410335892000,"group":"roadrisk:aftenposten"},{"id":2511,"content":"roadrisk:aftenposten","start":1410355151000,"group":"roadrisk:aftenposten"},{"id":2512,"content":"roadrisk:aftenposten","start":1410342768000,"group":"roadrisk:aftenposten"},{"id":2513,"content":"roadrisk:aftenposten","start":1410373812000,"group":"roadrisk:aftenposten"},{"id":2514,"content":"roadrisk:aftenposten","start":1410347899000,"group":"roadrisk:aftenposten"},{"id":2515,"content":"roadrisk:aftenposten","start":1410329242000,"group":"roadrisk:aftenposten"},{"id":2516,"content":"roadrisk:aftenposten","start":1410353707000,"group":"roadrisk:aftenposten"},{"id":2517,"content":"roadrisk:aftenposten","start":1410335874000,"group":"roadrisk:aftenposten"},{"id":2518,"content":"tweet","start":1424853637000,"group":"tweet"},{"id":2519,"content":"accident:aftenposten","start":1410356826000,"group":"accident:aftenposten"},{"id":2520,"content":"tweet","start":1424851477000,"group":"tweet"},{"id":2521,"content":"roadrisk:aftenposten","start":1410330821000,"group":"roadrisk:aftenposten"},{"id":2522,"content":"roadrisk:aftenposten","start":1410352027000,"group":"roadrisk:aftenposten"},{"id":2523,"content":"roadrisk:aftenposten","start":1410362435000,"group":"roadrisk:aftenposten"},{"id":2524,"content":"tweet","start":1424850092000,"group":"tweet"},{"id":2525,"content":"roadrisk:aftenposten","start":1410337155000,"group":"roadrisk:aftenposten"},{"id":2526,"content":"roadrisk:aftenposten","start":1410329278000,"group":"roadrisk:aftenposten"},{"id":2527,"content":"roadrisk:aftenposten","start":1410356549000,"group":"roadrisk:aftenposten"},{"id":2528,"content":"roadrisk:aftenposten","start":1410375941000,"group":"roadrisk:aftenposten"},{"id":2529,"content":"tweet","start":1424856697000,"group":"tweet"},{"id":2530,"content":"roadrisk:aftenposten","start":1410330791000,"group":"roadrisk:aftenposten"},{"id":2531,"content":"tweet","start":1424852031000,"group":"tweet"},{"id":2532,"content":"roadrisk:aftenposten","start":1410333845000,"group":"roadrisk:aftenposten"},{"id":2533,"content":"roadrisk:aftenposten","start":1410342628000,"group":"roadrisk:aftenposten"},{"id":2534,"content":"roadrisk:aftenposten","start":1410353771000,"group":"roadrisk:aftenposten"},{"id":2535,"content":"roadrisk:aftenposten","start":1410351490000,"group":"roadrisk:aftenposten"},{"id":2536,"content":"roadrisk:aftenposten","start":1410330771000,"group":"roadrisk:aftenposten"},{"id":2537,"content":"roadrisk:aftenposten","start":1410326842000,"group":"roadrisk:aftenposten"},{"id":2538,"content":"accident:aftenposten","start":1410347897000,"group":"accident:aftenposten"},{"id":2539,"content":"roadrisk:aftenposten","start":1410357335000,"group":"roadrisk:aftenposten"},{"id":2540,"content":"tweet","start":1424850909000,"group":"tweet"},{"id":2541,"content":"accident:aftenposten","start":1410368958000,"group":"accident:aftenposten"},{"id":2542,"content":"roadrisk:aftenposten","start":1410371496000,"group":"roadrisk:aftenposten"},{"id":2543,"content":"roadrisk:aftenposten","start":1410333831000,"group":"roadrisk:aftenposten"},{"id":2544,"content":"accident:aftenposten","start":1410373785000,"group":"accident:aftenposten"},{"id":2545,"content":"roadrisk:aftenposten","start":1410336393000,"group":"roadrisk:aftenposten"},{"id":2546,"content":"tweet","start":1424853974000,"group":"tweet"},{"id":2547,"content":"tweet","start":1424850048000,"group":"tweet"},{"id":2548,"content":"roadrisk:aftenposten","start":1410355135000,"group":"roadrisk:aftenposten"},{"id":2549,"content":"roadrisk:aftenposten","start":1410354649000,"group":"roadrisk:aftenposten"},{"id":2550,"content":"accident:aftenposten","start":1410378249000,"group":"accident:aftenposten"},{"id":2551,"content":"roadrisk:aftenposten","start":1410345759000,"group":"roadrisk:aftenposten"},{"id":2552,"content":"roadrisk:aftenposten","start":1410339452000,"group":"roadrisk:aftenposten"},{"id":2553,"content":"tweet","start":1424850024000,"group":"tweet"},{"id":2554,"content":"roadrisk:aftenposten","start":1410371225000,"group":"roadrisk:aftenposten"},{"id":2555,"content":"roadrisk:aftenposten","start":1410334230000,"group":"roadrisk:aftenposten"},{"id":2556,"content":"roadrisk:aftenposten","start":1410372953000,"group":"roadrisk:aftenposten"},{"id":2557,"content":"roadrisk:aftenposten","start":1410337670000,"group":"roadrisk:aftenposten"},{"id":2558,"content":"roadrisk:aftenposten","start":1410362459000,"group":"roadrisk:aftenposten"},{"id":2559,"content":"tweet","start":1424855024000,"group":"tweet"},{"id":2560,"content":"roadrisk:aftenposten","start":1410372533000,"group":"roadrisk:aftenposten"},{"id":2562,"content":"tweet","start":1424853751000,"group":"tweet"},{"id":2563,"content":"roadrisk:aftenposten","start":1410329175000,"group":"roadrisk:aftenposten"},{"id":2564,"content":"tweet","start":1424856040000,"group":"tweet"},{"id":2565,"content":"accident:aftenposten","start":1410344232000,"group":"accident:aftenposten"},{"id":2566,"content":"roadrisk:aftenposten","start":1410362191000,"group":"roadrisk:aftenposten"},{"id":2567,"content":"roadrisk:aftenposten","start":1410329968000,"group":"roadrisk:aftenposten"},{"id":2568,"content":"tweet","start":1424849954000,"group":"tweet"},{"id":2569,"content":"tweet:picture","start":1424852913000,"group":"tweet:picture"},{"id":2570,"content":"tweet","start":1424851470000,"group":"tweet"},{"id":2571,"content":"roadrisk:aftenposten","start":1410330739000,"group":"roadrisk:aftenposten"},{"id":2572,"content":"accident:aftenposten","start":1410330732000,"group":"accident:aftenposten"},{"id":2573,"content":"roadrisk:aftenposten","start":1410371130000,"group":"roadrisk:aftenposten"},{"id":2574,"content":"roadrisk:aftenposten","start":1410340440000,"group":"roadrisk:aftenposten"},{"id":2575,"content":"tweet:picture","start":1424852439000,"group":"tweet:picture"},{"id":2576,"content":"roadrisk:aftenposten","start":1410330696000,"group":"roadrisk:aftenposten"},{"id":2577,"content":"accident:aftenposten","start":1410326821000,"group":"accident:aftenposten"},{"id":2578,"content":"roadrisk:aftenposten","start":1410175624000,"group":"roadrisk:aftenposten"},{"id":2579,"content":"roadrisk:aftenposten","start":1410353696000,"group":"roadrisk:aftenposten"},{"id":2580,"content":"roadrisk:aftenposten","start":1410338781000,"group":"roadrisk:aftenposten"},{"id":2581,"content":"roadrisk:aftenposten","start":1422453993857,"group":"roadrisk:aftenposten"},{"id":2582,"content":"tweet","start":1424854479000,"group":"tweet"},{"id":2583,"content":"roadrisk:aftenposten","start":1410344190000,"group":"roadrisk:aftenposten"},{"id":2584,"content":"tweet","start":1424856593000,"group":"tweet"},{"id":2585,"content":"roadrisk:aftenposten","start":1410327793000,"group":"roadrisk:aftenposten"},{"id":2586,"content":"roadrisk:aftenposten","start":1410361538000,"group":"roadrisk:aftenposten"},{"id":2587,"content":"tweet","start":1424858119000,"group":"tweet"},{"id":2588,"content":"roadrisk:aftenposten","start":1410339952000,"group":"roadrisk:aftenposten"},{"id":2589,"content":"tweet","start":1424854823000,"group":"tweet"},{"id":2590,"content":"roadrisk:aftenposten","start":1410334197000,"group":"roadrisk:aftenposten"},{"id":2591,"content":"tweet","start":1424852167000,"group":"tweet"},{"id":2592,"content":"tweet","start":1424857221000,"group":"tweet"},{"id":2593,"content":"tweet","start":1424850023000,"group":"tweet"},{"id":2594,"content":"tweet","start":1424852402000,"group":"tweet"},{"id":2595,"content":"tweet:picture","start":1424852303000,"group":"tweet:picture"},{"id":2596,"content":"tweet","start":1424854907000,"group":"tweet"},{"id":2597,"content":"roadrisk:aftenposten","start":1410375924000,"group":"roadrisk:aftenposten"},{"id":2598,"content":"roadrisk:aftenposten","start":1410330648000,"group":"roadrisk:aftenposten"},{"id":2599,"content":"tweet","start":1424857102000,"group":"tweet"},{"id":2600,"content":"roadrisk:aftenposten","start":1410372888000,"group":"roadrisk:aftenposten"},{"id":2601,"content":"roadrisk:aftenposten","start":1410327775000,"group":"roadrisk:aftenposten"},{"id":2602,"content":"roadrisk:aftenposten","start":1410342314000,"group":"roadrisk:aftenposten"},{"id":2603,"content":"roadrisk:aftenposten","start":1410375887000,"group":"roadrisk:aftenposten"},{"id":2604,"content":"tweet","start":1424854000000,"group":"tweet"},{"id":2605,"content":"tweet","start":1424853898000,"group":"tweet"},{"id":2606,"content":"roadrisk:aftenposten","start":1410336968000,"group":"roadrisk:aftenposten"},{"id":2607,"content":"tweet","start":1424857889000,"group":"tweet"},{"id":2608,"content":"roadrisk:aftenposten","start":1410333816000,"group":"roadrisk:aftenposten"},{"id":2609,"content":"roadrisk:aftenposten","start":1410345910000,"group":"roadrisk:aftenposten"},{"id":2610,"content":"roadrisk:aftenposten","start":1410333778000,"group":"roadrisk:aftenposten"},{"id":2611,"content":"roadrisk:aftenposten","start":1410327745000,"group":"roadrisk:aftenposten"},{"id":2612,"content":"roadrisk:aftenposten","start":1410330630000,"group":"roadrisk:aftenposten"},{"id":2613,"content":"master:utmost:green","start":1423044303969,"group":"master:utmost:green"},{"id":2614,"content":"tweet:picture","start":1424849509000,"group":"tweet:picture"},{"id":2615,"content":"roadrisk:aftenposten","start":1410326705000,"group":"roadrisk:aftenposten"},{"id":2616,"content":"tweet","start":1424851591000,"group":"tweet"},{"id":2617,"content":"tweet","start":1424857084000,"group":"tweet"},{"id":2618,"content":"roadrisk:aftenposten","start":1410329952000,"group":"roadrisk:aftenposten"},{"id":2619,"content":"tweet","start":1424854578000,"group":"tweet"},{"id":2620,"content":"tweet","start":1424853996000,"group":"tweet"},{"id":2621,"content":"roadrisk:aftenposten","start":1410338067000,"group":"roadrisk:aftenposten"},{"id":2622,"content":"roadrisk:aftenposten","start":1410371493000,"group":"roadrisk:aftenposten"},{"id":2623,"content":"roadrisk:aftenposten","start":1410330565000,"group":"roadrisk:aftenposten"},{"id":2624,"content":"roadrisk:aftenposten","start":1410334519000,"group":"roadrisk:aftenposten"},{"id":2625,"content":"tweet","start":1424857688000,"group":"tweet"},{"id":2626,"content":"roadrisk:aftenposten","start":1410363058000,"group":"roadrisk:aftenposten"},{"id":2627,"content":"roadrisk:aftenposten","start":1410334443000,"group":"roadrisk:aftenposten"},{"id":2628,"content":"roadrisk:aftenposten","start":1410337332000,"group":"roadrisk:aftenposten"},{"id":2629,"content":"roadrisk:aftenposten","start":1410340559000,"group":"roadrisk:aftenposten"},{"id":2630,"content":"roadrisk:aftenposten","start":1410373765000,"group":"roadrisk:aftenposten"},{"id":2631,"content":"accident:aftenposten","start":1410344159000,"group":"accident:aftenposten"},{"id":2632,"content":"roadrisk:aftenposten","start":1410334435000,"group":"roadrisk:aftenposten"},{"id":2633,"content":"roadrisk:aftenposten","start":1410333727000,"group":"roadrisk:aftenposten"},{"id":2634,"content":"roadrisk:aftenposten","start":1410335790000,"group":"roadrisk:aftenposten"},{"id":2635,"content":"tweet","start":1424856022000,"group":"tweet"},{"id":2636,"content":"roadrisk:aftenposten","start":1410330542000,"group":"roadrisk:aftenposten"},{"id":2637,"content":"tweet:picture","start":1424854406000,"group":"tweet:picture"},{"id":2638,"content":"roadrisk:aftenposten","start":1410368386000,"group":"roadrisk:aftenposten"},{"id":2639,"content":"roadrisk:aftenposten","start":1410377950000,"group":"roadrisk:aftenposten"},{"id":2640,"content":"tweet:picture","start":1424856852000,"group":"tweet:picture"},{"id":2641,"content":"tweet","start":1424857072000,"group":"tweet"},{"id":2642,"content":"tweet","start":1424852344000,"group":"tweet"},{"id":2643,"content":"roadrisk:aftenposten","start":1410341132000,"group":"roadrisk:aftenposten"},{"id":2644,"content":"tweet","start":1424852022000,"group":"tweet"},{"id":2645,"content":"roadrisk:aftenposten","start":1410374250000,"group":"roadrisk:aftenposten"},{"id":2646,"content":"tweet","start":1424853540000,"group":"tweet"},{"id":2647,"content":"accident:aftenposten","start":1410337093000,"group":"accident:aftenposten"},{"id":2648,"content":"tweet","start":1424851215000,"group":"tweet"},{"id":2649,"content":"tweet","start":1424857547000,"group":"tweet"},{"id":2650,"content":"accident:aftenposten","start":1410337013000,"group":"accident:aftenposten"},{"id":2651,"content":"roadrisk:aftenposten","start":1410351343000,"group":"roadrisk:aftenposten"},{"id":2652,"content":"tweet","start":1424855936000,"group":"tweet"},{"id":2653,"content":"roadrisk:aftenposten","start":1410351176000,"group":"roadrisk:aftenposten"},{"id":2654,"content":"tweet","start":1424852408000,"group":"tweet"},{"id":2655,"content":"tweet","start":1424858057000,"group":"tweet"},{"id":2656,"content":"roadrisk:aftenposten","start":1410330530000,"group":"roadrisk:aftenposten"},{"id":2657,"content":"roadrisk:aftenposten","start":1410336413000,"group":"roadrisk:aftenposten"},{"id":2658,"content":"tweet","start":1424856728000,"group":"tweet"},{"id":2659,"content":"tweet","start":1424853679000,"group":"tweet"},{"id":2660,"content":"roadrisk:aftenposten","start":1410334425000,"group":"roadrisk:aftenposten"},{"id":2661,"content":"accident:aftenposten","start":1410350050000,"group":"accident:aftenposten"},{"id":2662,"content":"tweet","start":1424854355000,"group":"tweet"},{"id":2663,"content":"accident:aftenposten","start":1410350081000,"group":"accident:aftenposten"},{"id":2664,"content":"tweet","start":1424857050000,"group":"tweet"},{"id":2665,"content":"roadrisk:aftenposten","start":1410330494000,"group":"roadrisk:aftenposten"},{"id":2666,"content":"roadrisk:aftenposten","start":1410338037000,"group":"roadrisk:aftenposten"},{"id":2667,"content":"roadrisk:aftenposten","start":1410357806000,"group":"roadrisk:aftenposten"},{"id":2669,"content":"tweet","start":1424857314000,"group":"tweet"},{"id":2670,"content":"roadrisk:aftenposten","start":1410373546000,"group":"roadrisk:aftenposten"},{"id":2671,"content":"accident:aftenposten","start":1410330488000,"group":"accident:aftenposten"},{"id":2672,"content":"roadrisk:aftenposten","start":1410357117000,"group":"roadrisk:aftenposten"},{"id":2673,"content":"tweet","start":1424855497000,"group":"tweet"},{"id":2674,"content":"roadrisk:aftenposten","start":1410336680000,"group":"roadrisk:aftenposten"},{"id":2675,"content":"accident:aftenposten","start":1410353890000,"group":"accident:aftenposten"},{"id":2676,"content":"roadrisk:aftenposten","start":1410357805000,"group":"roadrisk:aftenposten"},{"id":2677,"content":"roadrisk:aftenposten","start":1410355112000,"group":"roadrisk:aftenposten"},{"id":2678,"content":"tweet:picture","start":1424856578000,"group":"tweet:picture"},{"id":2679,"content":"tweet","start":1424854716000,"group":"tweet"},{"id":2680,"content":"roadrisk:aftenposten","start":1410375881000,"group":"roadrisk:aftenposten"},{"id":2681,"content":"roadrisk:aftenposten","start":1410335772000,"group":"roadrisk:aftenposten"},{"id":2682,"content":"tweet","start":1424858034000,"group":"tweet"},{"id":2683,"content":"roadrisk:aftenposten","start":1410333178000,"group":"roadrisk:aftenposten"},{"id":2684,"content":"tweet","start":1424857336000,"group":"tweet"},{"id":2685,"content":"roadrisk:aftenposten","start":1410350970000,"group":"roadrisk:aftenposten"},{"id":2686,"content":"tweet:picture","start":1424853989000,"group":"tweet:picture"},{"id":2687,"content":"roadrisk:aftenposten","start":1410345711000,"group":"roadrisk:aftenposten"},{"id":2688,"content":"tweet","start":1424853656000,"group":"tweet"},{"id":2689,"content":"tweet","start":1424851213000,"group":"tweet"},{"id":2690,"content":"tweet","start":1424856646000,"group":"tweet"},{"id":2691,"content":"tweet","start":1424850784000,"group":"tweet"},{"id":2692,"content":"tweet","start":1424857048000,"group":"tweet"},{"id":2693,"content":"roadrisk:aftenposten","start":1410354821000,"group":"roadrisk:aftenposten"},{"id":2694,"content":"roadrisk:aftenposten","start":1410353609000,"group":"roadrisk:aftenposten"},{"id":2695,"content":"roadrisk:aftenposten","start":1410361808000,"group":"roadrisk:aftenposten"},{"id":2696,"content":"roadrisk:aftenposten","start":1410333720000,"group":"roadrisk:aftenposten"},{"id":2697,"content":"tweet","start":1424849692000,"group":"tweet"},{"id":2698,"content":"roadrisk:aftenposten","start":1410356396000,"group":"roadrisk:aftenposten"},{"id":2699,"content":"roadrisk:aftenposten","start":1410333159000,"group":"roadrisk:aftenposten"},{"id":2700,"content":"tweet","start":1424857462000,"group":"tweet"},{"id":2701,"content":"tweet:picture","start":1424856974000,"group":"tweet:picture"},{"id":2702,"content":"tweet","start":1424854823000,"group":"tweet"},{"id":2703,"content":"tweet:picture","start":1424852481000,"group":"tweet:picture"},{"id":2704,"content":"roadrisk:aftenposten","start":1410302757000,"group":"roadrisk:aftenposten"},{"id":2705,"content":"tweet","start":1424855750000,"group":"tweet"},{"id":2706,"content":"roadrisk:aftenposten","start":1410330479000,"group":"roadrisk:aftenposten"},{"id":2707,"content":"tweet","start":1424850725000,"group":"tweet"},{"id":2708,"content":"roadrisk:aftenposten","start":1410341124000,"group":"roadrisk:aftenposten"},{"id":2709,"content":"roadrisk:aftenposten","start":1410329951000,"group":"roadrisk:aftenposten"},{"id":2710,"content":"roadrisk:aftenposten","start":1410349882000,"group":"roadrisk:aftenposten"},{"id":2711,"content":"tweet","start":1424850854000,"group":"tweet"},{"id":2712,"content":"roadrisk:aftenposten","start":1410337664000,"group":"roadrisk:aftenposten"},{"id":2713,"content":"roadrisk:aftenposten","start":1410372817000,"group":"roadrisk:aftenposten"},{"id":2714,"content":"roadrisk:aftenposten","start":1410354856000,"group":"roadrisk:aftenposten"},{"id":2715,"content":"tweet:picture","start":1424856031000,"group":"tweet:picture"},{"id":2716,"content":"roadrisk:aftenposten","start":1410330471000,"group":"roadrisk:aftenposten"},{"id":2717,"content":"roadrisk:aftenposten","start":1410350937000,"group":"roadrisk:aftenposten"},{"id":2718,"content":"accident:aftenposten","start":1410377601000,"group":"accident:aftenposten"},{"id":2719,"content":"roadrisk:aftenposten","start":1410330378000,"group":"roadrisk:aftenposten"},{"id":2720,"content":"tweet","start":1424855416000,"group":"tweet"},{"id":2721,"content":"roadrisk:aftenposten","start":1410371258000,"group":"roadrisk:aftenposten"},{"id":2722,"content":"roadrisk:aftenposten","start":1410354826000,"group":"roadrisk:aftenposten"},{"id":2723,"content":"roadrisk:aftenposten","start":1410302689000,"group":"roadrisk:aftenposten"},{"id":2724,"content":"tweet","start":1424855726000,"group":"tweet"},{"id":2725,"content":"roadrisk:aftenposten","start":1410372184000,"group":"roadrisk:aftenposten"},{"id":2726,"content":"tweet:picture","start":1424854343000,"group":"tweet:picture"},{"id":2727,"content":"tweet","start":1424852971000,"group":"tweet"},{"id":2728,"content":"roadrisk:aftenposten","start":1410262441000,"group":"roadrisk:aftenposten"},{"id":2729,"content":"tweet","start":1424854043000,"group":"tweet"},{"id":2730,"content":"roadrisk:aftenposten","start":1410338768000,"group":"roadrisk:aftenposten"},{"id":2731,"content":"tweet:picture","start":1424855725000,"group":"tweet:picture"},{"id":2732,"content":"roadrisk:aftenposten","start":1410329881000,"group":"roadrisk:aftenposten"},{"id":2733,"content":"accident:aftenposten","start":1410338747000,"group":"accident:aftenposten"},{"id":2734,"content":"tweet","start":1424853219000,"group":"tweet"},{"id":2735,"content":"roadrisk:aftenposten","start":1410374176000,"group":"roadrisk:aftenposten"},{"id":2736,"content":"roadrisk:aftenposten","start":1410374483000,"group":"roadrisk:aftenposten"},{"id":2737,"content":"roadrisk:aftenposten","start":1410337310000,"group":"roadrisk:aftenposten"},{"id":2738,"content":"roadrisk:aftenposten","start":1410337627000,"group":"roadrisk:aftenposten"},{"id":2739,"content":"roadrisk:aftenposten","start":1410378073000,"group":"roadrisk:aftenposten"},{"id":2740,"content":"roadrisk:aftenposten","start":1410377576000,"group":"roadrisk:aftenposten"},{"id":2741,"content":"tweet","start":1424855627000,"group":"tweet"},{"id":2742,"content":"roadrisk:aftenposten","start":1410335763000,"group":"roadrisk:aftenposten"},{"id":2743,"content":"tweet","start":1424849159000,"group":"tweet"},{"id":2744,"content":"tweet","start":1424854322000,"group":"tweet"},{"id":2745,"content":"tweet","start":1424853725000,"group":"tweet"},{"id":2746,"content":"roadrisk:aftenposten","start":1410377522000,"group":"roadrisk:aftenposten"},{"id":2747,"content":"tweet","start":1424850772000,"group":"tweet"},{"id":2748,"content":"tweet","start":1424854172000,"group":"tweet"},{"id":2749,"content":"tweet","start":1424851692000,"group":"tweet"},{"id":2750,"content":"roadrisk:aftenposten","start":1410333157000,"group":"roadrisk:aftenposten"},{"id":2751,"content":"tweet","start":1424857851000,"group":"tweet"},{"id":2752,"content":"tweet","start":1424854743000,"group":"tweet"},{"id":2753,"content":"roadrisk:aftenposten","start":1410345844000,"group":"roadrisk:aftenposten"},{"id":2754,"content":"tweet","start":1424856154000,"group":"tweet"},{"id":2755,"content":"tweet","start":1424855946000,"group":"tweet"},{"id":2756,"content":"tweet","start":1424851089000,"group":"tweet"},{"id":2757,"content":"roadrisk:aftenposten","start":1410262099000,"group":"roadrisk:aftenposten"},{"id":2758,"content":"tweet","start":1424855592000,"group":"tweet"},{"id":2759,"content":"tweet","start":1424853838000,"group":"tweet"},{"id":2760,"content":"tweet","start":1424856064000,"group":"tweet"},{"id":2761,"content":"tweet","start":1424854254000,"group":"tweet"},{"id":2762,"content":"roadrisk:aftenposten","start":1410339919000,"group":"roadrisk:aftenposten"},{"id":2763,"content":"tweet","start":1424852927000,"group":"tweet"},{"id":2764,"content":"tweet","start":1424851204000,"group":"tweet"},{"id":2765,"content":"accident:aftenposten","start":1410355037000,"group":"accident:aftenposten"},{"id":2766,"content":"roadrisk:aftenposten","start":1410337293000,"group":"roadrisk:aftenposten"},{"id":2767,"content":"tweet","start":1424852011000,"group":"tweet"},{"id":2768,"content":"tweet","start":1424854530000,"group":"tweet"},{"id":2769,"content":"tweet","start":1424854144000,"group":"tweet"},{"id":2770,"content":"roadrisk:aftenposten","start":1410262019000,"group":"roadrisk:aftenposten"},{"id":2771,"content":"roadrisk:aftenposten","start":1410354530000,"group":"roadrisk:aftenposten"},{"id":2772,"content":"accident:aftenposten","start":1410338684000,"group":"accident:aftenposten"},{"id":2773,"content":"roadrisk:aftenposten","start":1410354509000,"group":"roadrisk:aftenposten"},{"id":2774,"content":"tweet","start":1424854305000,"group":"tweet"},{"id":2775,"content":"roadrisk:aftenposten","start":1410362985000,"group":"roadrisk:aftenposten"},{"id":2776,"content":"tweet:picture","start":1424852884000,"group":"tweet:picture"},{"id":2777,"content":"roadrisk:aftenposten","start":1410332164000,"group":"roadrisk:aftenposten"},{"id":2778,"content":"roadrisk:aftenposten","start":1410360018000,"group":"roadrisk:aftenposten"},{"id":2779,"content":"accident:aftenposten","start":1410344087000,"group":"accident:aftenposten"},{"id":2780,"content":"roadrisk:aftenposten","start":1410333145000,"group":"roadrisk:aftenposten"},{"id":2781,"content":"roadrisk:aftenposten","start":1410353801000,"group":"roadrisk:aftenposten"},{"id":2782,"content":"tweet","start":1424854296000,"group":"tweet"},{"id":2783,"content":"tweet","start":1424854267000,"group":"tweet"},{"id":2784,"content":"roadrisk:aftenposten","start":1410261967000,"group":"roadrisk:aftenposten"},{"id":2785,"content":"tweet:picture","start":1424852109000,"group":"tweet:picture"},{"id":2786,"content":"roadrisk:aftenposten","start":1410372264000,"group":"roadrisk:aftenposten"},{"id":2787,"content":"roadrisk:aftenposten","start":1410261917000,"group":"roadrisk:aftenposten"},{"id":2788,"content":"tweet","start":1424850233000,"group":"tweet"},{"id":2789,"content":"roadrisk:aftenposten","start":1410337586000,"group":"roadrisk:aftenposten"},{"id":2790,"content":"roadrisk:aftenposten","start":1410335722000,"group":"roadrisk:aftenposten"},{"id":2791,"content":"tweet","start":1424851143000,"group":"tweet"},{"id":2792,"content":"tweet","start":1424854250000,"group":"tweet"},{"id":2793,"content":"tweet","start":1424849764000,"group":"tweet"},{"id":2794,"content":"tweet","start":1424849967000,"group":"tweet"},{"id":2795,"content":"roadrisk:aftenposten","start":1410345838000,"group":"roadrisk:aftenposten"},{"id":2796,"content":"tweet","start":1424851810000,"group":"tweet"},{"id":2797,"content":"tweet","start":1424856566000,"group":"tweet"},{"id":2798,"content":"tweet","start":1424850184000,"group":"tweet"},{"id":2799,"content":"roadrisk:aftenposten","start":1410333134000,"group":"roadrisk:aftenposten"},{"id":2800,"content":"roadrisk:aftenposten","start":1410330354000,"group":"roadrisk:aftenposten"},{"id":2801,"content":"roadrisk:aftenposten","start":1410330349000,"group":"roadrisk:aftenposten"},{"id":2802,"content":"tweet","start":1424857400000,"group":"tweet"},{"id":2803,"content":"tweet","start":1424854241000,"group":"tweet"},{"id":2804,"content":"roadrisk:aftenposten","start":1410378606000,"group":"roadrisk:aftenposten"},{"id":2805,"content":"accident:aftenposten","start":1410344076000,"group":"accident:aftenposten"},{"id":2806,"content":"tweet","start":1424855127000,"group":"tweet"},{"id":2807,"content":"roadrisk:aftenposten","start":1410344794000,"group":"roadrisk:aftenposten"},{"id":2808,"content":"roadrisk:aftenposten","start":1410329275000,"group":"roadrisk:aftenposten"},{"id":2809,"content":"tweet","start":1424856467000,"group":"tweet"},{"id":2811,"content":"roadrisk:aftenposten","start":1410342761000,"group":"roadrisk:aftenposten"},{"id":2812,"content":"roadrisk:aftenposten","start":1410343936000,"group":"roadrisk:aftenposten"},{"id":2813,"content":"tweet","start":1424850581000,"group":"tweet"},{"id":2814,"content":"roadrisk:aftenposten","start":1410336677000,"group":"roadrisk:aftenposten"},{"id":2815,"content":"tweet","start":1424850524000,"group":"tweet"},{"id":2816,"content":"tweet","start":1424849231000,"group":"tweet"},{"id":2817,"content":"tweet","start":1424858108000,"group":"tweet"},{"id":2818,"content":"tweet","start":1424853969000,"group":"tweet"},{"id":2819,"content":"tweet","start":1424853330000,"group":"tweet"},{"id":2820,"content":"tweet:picture","start":1424851643000,"group":"tweet:picture"},{"id":2821,"content":"tweet","start":1424856951000,"group":"tweet"},{"id":2822,"content":"tweet","start":1424857000000,"group":"tweet"},{"id":2823,"content":"tweet:picture","start":1424852071000,"group":"tweet:picture"},{"id":2824,"content":"roadrisk:aftenposten","start":1410335708000,"group":"roadrisk:aftenposten"},{"id":2825,"content":"tweet","start":1424856099000,"group":"tweet"},{"id":2826,"content":"tweet","start":1424854386000,"group":"tweet"},{"id":2827,"content":"tweet","start":1424857686000,"group":"tweet"},{"id":2828,"content":"tweet","start":1424856145000,"group":"tweet"},{"id":2829,"content":"tweet:picture","start":1424858069000,"group":"tweet:picture"},{"id":2830,"content":"tweet","start":1424856860000,"group":"tweet"},{"id":2831,"content":"accident:aftenposten","start":1410332143000,"group":"accident:aftenposten"},{"id":2832,"content":"tweet:picture","start":1424852059000,"group":"tweet:picture"},{"id":2833,"content":"accident:aftenposten","start":1410329275000,"group":"accident:aftenposten"},{"id":2834,"content":"roadrisk:aftenposten","start":1410261469000,"group":"roadrisk:aftenposten"},{"id":2835,"content":"tweet","start":1424852715000,"group":"tweet"},{"id":2836,"content":"roadrisk:aftenposten","start":1410330341000,"group":"roadrisk:aftenposten"},{"id":2837,"content":"roadrisk:aftenposten","start":1410353788000,"group":"roadrisk:aftenposten"},{"id":2838,"content":"tweet","start":1424851809000,"group":"tweet"},{"id":2839,"content":"tweet","start":1424852663000,"group":"tweet"},{"id":2840,"content":"tweet","start":1424856430000,"group":"tweet"},{"id":2841,"content":"tweet","start":1424854188000,"group":"tweet"},{"id":2842,"content":"roadrisk:aftenposten","start":1410330276000,"group":"roadrisk:aftenposten"},{"id":2843,"content":"tweet","start":1424852408000,"group":"tweet"},{"id":2844,"content":"roadrisk:aftenposten","start":1410353782000,"group":"roadrisk:aftenposten"},{"id":2845,"content":"tweet","start":1424857953000,"group":"tweet"},{"id":2846,"content":"roadrisk:aftenposten","start":1410332605000,"group":"roadrisk:aftenposten"},{"id":2847,"content":"tweet","start":1424851363000,"group":"tweet"},{"id":2848,"content":"roadrisk:aftenposten","start":1410377940000,"group":"roadrisk:aftenposten"},{"id":2849,"content":"accident:aftenposten","start":1410357767000,"group":"accident:aftenposten"},{"id":2850,"content":"tweet","start":1424854131000,"group":"tweet"},{"id":2851,"content":"tweet:picture","start":1424856042000,"group":"tweet:picture"},{"id":2852,"content":"roadrisk:aftenposten","start":1410330249000,"group":"roadrisk:aftenposten"},{"id":2853,"content":"tweet","start":1424854134000,"group":"tweet"},{"id":2854,"content":"roadrisk:aftenposten","start":1410330218000,"group":"roadrisk:aftenposten"},{"id":2855,"content":"roadrisk:aftenposten","start":1410343900000,"group":"roadrisk:aftenposten"},{"id":2856,"content":"tweet","start":1424852661000,"group":"tweet"},{"id":2857,"content":"tweet","start":1424849494000,"group":"tweet"},{"id":2858,"content":"tweet","start":1424849501000,"group":"tweet"},{"id":2859,"content":"tweet","start":1424851510000,"group":"tweet"},{"id":2860,"content":"tweet","start":1424854060000,"group":"tweet"},{"id":2861,"content":"tweet","start":1424850017000,"group":"tweet"},{"id":2862,"content":"tweet:picture","start":1424852583000,"group":"tweet:picture"},{"id":2863,"content":"roadrisk:aftenposten","start":1410338261000,"group":"roadrisk:aftenposten"},{"id":2864,"content":"tweet","start":1424856387000,"group":"tweet"},{"id":2865,"content":"roadrisk:aftenposten","start":1410375830000,"group":"roadrisk:aftenposten"},{"id":2866,"content":"tweet","start":1424854089000,"group":"tweet"},{"id":2867,"content":"tweet","start":1424852001000,"group":"tweet"},{"id":2868,"content":"tweet","start":1424852212000,"group":"tweet"},{"id":2869,"content":"tweet","start":1424853943000,"group":"tweet"},{"id":2870,"content":"tweet:picture","start":1424851653000,"group":"tweet:picture"},{"id":2871,"content":"roadrisk:aftenposten","start":1410337284000,"group":"roadrisk:aftenposten"},{"id":2872,"content":"tweet","start":1424856505000,"group":"tweet"},{"id":2873,"content":"roadrisk:aftenposten","start":1410379171000,"group":"roadrisk:aftenposten"},{"id":2874,"content":"tweet","start":1424854710000,"group":"tweet"},{"id":2875,"content":"tweet:picture","start":1424850184000,"group":"tweet:picture"},{"id":2876,"content":"tweet","start":1424851657000,"group":"tweet"},{"id":2877,"content":"tweet","start":1424851475000,"group":"tweet"},{"id":2878,"content":"tweet","start":1424850634000,"group":"tweet"},{"id":2879,"content":"roadrisk:aftenposten","start":1410357204000,"group":"roadrisk:aftenposten"},{"id":2880,"content":"tweet","start":1424849276000,"group":"tweet"},{"id":2881,"content":"tweet","start":1424854228000,"group":"tweet"},{"id":2882,"content":"tweet","start":1424851547000,"group":"tweet"},{"id":2883,"content":"tweet","start":1424849229000,"group":"tweet"},{"id":2884,"content":"tweet","start":1424850993000,"group":"tweet"},{"id":2885,"content":"roadrisk:aftenposten","start":1410343239000,"group":"roadrisk:aftenposten"},{"id":2886,"content":"tweet:picture","start":1424853934000,"group":"tweet:picture"}],"groups":[{"id":"tweet:picture","content":"tweet:picture"},{"id":"tweet","content":"tweet"},{"id":"master:utmost:risk","content":"master:utmost:risk"},{"id":"roadrisk:aftenposten","content":"roadrisk:aftenposten"},{"id":"accident:aftenposten","content":"accident:aftenposten"},{"id":"master:utmost:red","content":"master:utmost:red"},{"id":"master:utmost:green","content":"master:utmost:green"}]} \ No newline at end of file From 0fae104420acd4a3962b37fceb5fda2b8e62a8d6 Mon Sep 17 00:00:00 2001 From: Alex de Mulder Date: Thu, 5 Mar 2015 10:46:17 +0100 Subject: [PATCH 2/2] updated feature reqs --- featureRequests.html | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/featureRequests.html b/featureRequests.html index a38a3b17..6685051d 100644 --- a/featureRequests.html +++ b/featureRequests.html @@ -124,7 +124,7 @@ Legend:
  • Not likely to be picked up by us soon but would be great if the community would add this.
  • Feature needing major overhauling of the current framework, not planned soon and unlikely to be picked up by community.
  • Feature that would be easier to create after a large (and planned) refactor.
  • -
  • Implemented and in develop or master.
  • +
  • Implemented and in develop or master. Will be removed after a while.

  • @@ -135,21 +135,21 @@ Legend:

    Network

      -
    • (602) Add hoverEdge and blurEge events.
    • +
    • (685) New type of node: Supernode. The supernode could have multiple connection subnodes.
    • +
    • (602) Add hoverEdge and blurEdge events.
    • (548) Allow labels to be images too.
    • -
    • (530, 475, 300) Improve option structure for the behaviour of the network. This will solve multiple issues if done correctly.
    • -
    • (528) Allow the inserting of a custom sorting function for the hierarchical layout.
    • +
    • (530, 475, 300) Improve option structure for the behaviour of the network. This will solve multiple issues if done correctly.
    • +
    • (528) Allow the inserting of a custom sorting function for the hierarchical layout.
    • (507) Add animations to the edges, like circles travelling over them or icons.
    • -
    • (426) Label stroke ref: http://www.html5canvastutorials.com/tutorials/html5-canvas-text-stroke/
    • -
    • (430) Add fix/unfix functions for nodes. This can be done with allowToMoveX and Y but native options would be better ('node.disableMove' and 'node.disableDrag').
    • -
    • (351) Improve the options for arrows, backarrows and linetypes. Possibly receiving a function as input for custom nodes & edges.
    • -
    • (335) Set smooth curves per edge.
    • +
    • (430) Add fix/unfix functions for nodes. This can be done with allowToMoveX and Y but native options would be better ('node.disableMove' and 'node.disableDrag').
    • +
    • (351) Improve the options for arrows, backarrows and linetypes. Possibly receiving a function as input for custom nodes & edges.
    • +
    • (335) Set smooth curves per edge.
    • (323) GIF support.
    • -
    • (247) Allow the font-size of a label to depend on the value (thereby the node-size).
    • -
    • (247) Set thresholds for displaying of labels based on the value. As you zoom out, only the most noteworthy labels will be shown.
    • +
    • (247) Allow the font-size of a label to depend on the value (thereby the node-size).
    • +
    • (247) Set thresholds for displaying of labels based on the value. As you zoom out, only the most noteworthy labels will be shown.
    • (246) Add a fontAlignment option. This option should control where the label is drawn with respect to the node (ie. above, midde, under, left, right etc).
    • (211) Create styling groups for edges, as they already exist for nodes.
    • -
    • (203) Improve the click/doubleClick event with options how these should be fired.
    • +
    • (203) Improve the click/doubleClick event with options how these should be fired.

    Timeline

      @@ -167,7 +167,6 @@ Legend:
    • (283) Adapt zoom functionality to horizontal/vertical pinch on touchscreens.
    • (363, 275) Support for making individual items editable or readonly.
    • (273) Show vertical scrollbar when contents do not fit vertically. This could be a custom, stylable scrollbar.
    • -
    • (504, 427, 261, 151) Set time/date format. Could support AM/PM, Quarters, weekdays, military etc.
    • (257) Toggle the visiblity of groups and subgroups (could be a predecessor for clustering).
    • (240) Introduce a new event that fires when an item is being moved.
    • (239) Create a new option to disable timeline zoom/drag with mouse in the group column.
    • @@ -182,15 +181,15 @@ Legend:
      • (455, 92) Numeric range for the x-axis.
      • (384) Fast horizontal scrolling.
      • -
      • (309) Add an extra property to the event parameters (for dragging and zooming) describing whether it's origin is programmatic or by the user.

      Graph2d

        +
      • (681) Clickable datapoints, bars etc.
      • (516) Stacking of line graphs similar to how the bar charts can be stacked.
      • (500) Adding a group visibility in legends.
      • (388, 311, 282) ToolTips: this should give a stylable tooltip with the value at the position of the cursor. Options should include:
        • snapToDatapoint (only show tooltips on datapoints, if off, show interpolated value at position)
        • alwaysOn (always show tooltips on datapoints, perhaps with an optional tag that you can specify here?)
      • (354) Add uncertainty plot styles (box, candle, shaded area, etc.)
      • -
      • (314) Logarithmic scale (y-axis initially, if numeric range for x-axis is implemented, could be ported over to x-axis as well).
      • +
      • (314) Logarithmic scale (y-axis initially, if numeric range for x-axis is implemented, could be ported over to x-axis as well).

      Graph3d