From 0d51c6121de62313e145775571be4a8f930aff77 Mon Sep 17 00:00:00 2001 From: Dimitris Date: Sat, 7 Feb 2026 12:56:45 +0100 Subject: [PATCH] TomTom Routing --- CLAUDE.md | 200 + app/build.gradle.kts | 10 +- .../kouros/navigation/model/MockLocation.kt | 8 +- .../navigation/ui/DisplayScreenSettings.kt | 162 + .../com/kouros/navigation/ui/MainActivity.kt | 99 +- .../navigation/ui/NavigationScreenSettings.kt | 162 + .../kouros/navigation/ui/NavigationSheet.kt | 11 +- .../kouros/navigation/ui/SettingsScreen.kt | 86 + .../com/kouros/navigation/ui/theme/Color.kt | 77 +- .../com/kouros/navigation/ui/theme/Shapes.kt | 29 + .../com/kouros/navigation/ui/theme/Theme.kt | 120 +- .../com/kouros/navigation/ui/theme/Type.kt | 39 +- .../kouros/navigation/car/SurfaceRenderer.kt | 2 +- .../com/kouros/navigation/car/map/MapView.kt | 100 +- .../car/navigation/RouteCarModel.kt | 267 +- .../navigation/car/screen/NavigationScreen.kt | 9 +- .../navigation/car/screen/SearchScreen.kt | 2 +- .../com/kouros/navigation/car/UnitTest.kt | 26 +- common/data/build.gradle.kts | 2 +- .../navigation/data/NavigationRepository.kt | 19 +- .../java/com/kouros/navigation/data/Route.kt | 24 +- .../com/kouros/navigation/data/osrm/Legs.kt | 2 +- .../kouros/navigation/data/osrm/OsrmRoute.kt | 7 +- .../navigation/data/route/Intersection.kt | 2 +- .../com/kouros/navigation/data/route/Leg.kt | 3 +- .../kouros/navigation/data/tomtom/Cause.kt | 5 + .../kouros/navigation/data/tomtom/Guidance.kt | 6 + .../navigation/data/tomtom/Instruction.kt | 21 + .../data/tomtom/InstructionGroup.kt | 8 + .../com/kouros/navigation/data/tomtom/Lane.kt | 6 + .../com/kouros/navigation/data/tomtom/Leg.kt | 7 + .../kouros/navigation/data/tomtom/Point.kt | 6 + .../kouros/navigation/data/tomtom/Report.kt | 5 - .../kouros/navigation/data/tomtom/Route.kt | 8 + .../kouros/navigation/data/tomtom/Section.kt | 16 + .../kouros/navigation/data/tomtom/SummaryX.kt | 10 + .../data/tomtom/TomTomRepository.kt | 36 + .../navigation/data/tomtom/TomTomResponse.kt | 6 + .../navigation/data/tomtom/TomTomRoute.kt | 193 +- .../navigation/data/valhalla/ValhallaRoute.kt | 8 +- .../com/kouros/navigation/model/RouteModel.kt | 225 +- .../com/kouros/navigation/model/ViewModel.kt | 24 +- .../com/kouros/navigation/utils/GeoUtils.kt | 1 + .../src/main/res/drawable/arrow_back_24px.xml | 11 + .../data/src/main/res/drawable/menu_24px.xml | 10 + .../data/src/main/res/raw/tomom_routing.json | 144 +- .../data/src/main/res/raw/tomtom_traffic.json | 11771 ++++++++++------ .../data/src/main/res/values-de/strings.xml | 5 +- common/data/src/main/res/values/strings.xml | 5 +- gradle/libs.versions.toml | 2 + 50 files changed, 8923 insertions(+), 5084 deletions(-) create mode 100644 CLAUDE.md create mode 100644 app/src/main/java/com/kouros/navigation/ui/DisplayScreenSettings.kt create mode 100644 app/src/main/java/com/kouros/navigation/ui/NavigationScreenSettings.kt create mode 100644 app/src/main/java/com/kouros/navigation/ui/SettingsScreen.kt create mode 100644 app/src/main/java/com/kouros/navigation/ui/theme/Shapes.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/Cause.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/Guidance.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/Instruction.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/InstructionGroup.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/Lane.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/Leg.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/Point.kt delete mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/Report.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/Route.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/Section.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/SummaryX.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt create mode 100644 common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomResponse.kt create mode 100644 common/data/src/main/res/drawable/arrow_back_24px.xml create mode 100644 common/data/src/main/res/drawable/menu_24px.xml diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..9dc7667 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,200 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This is an Android navigation app built with Jetpack Compose that supports multiple routing providers (OSRM, Valhalla, TomTom) and includes Android Auto/Automotive OS integration. The app uses MapLibre for rendering, ObjectBox for local persistence, and Koin for dependency injection. + +## Build Commands + +```bash +# Build the app (from repository root) +./gradlew :app:assembleDebug + +# Build specific flavor +./gradlew :app:assembleDemoDebug +./gradlew :app:assembleFullDebug + +# Run tests +./gradlew test + +# Run tests for specific module +./gradlew :common:data:test +./gradlew :common:car:test + +# Install on device +./gradlew :app:installDebug + +# Clean build +./gradlew clean +``` + +## Module Structure + +The project uses a multi-module architecture: + +- **app/** - Main Android app with Jetpack Compose UI for phone +- **common/data/** - Core data layer with routing logic, repositories, and data models (shared by all modules) +- **common/car/** - Android Auto/Automotive OS UI implementation +- **automotive/** - Placeholder for future native Automotive OS app + +Dependencies flow: `app` → `common:car` → `common:data` + +## Architecture + +### Routing Providers (Pluggable System) + +The app supports three routing engines that implement the `NavigationRepository` abstract class: + +1. **OsrmRepository** - OSRM routing engine +2. **ValhallaRepository** - Valhalla routing engine +3. **TomTomRepository** - TomTom routing engine + +Each provider has a corresponding mapper class (`OsrmRoute`, `ValhallaRoute`, `TomTomRoute`) that converts provider-specific JSON responses to the universal `Route` data model. + +**Adding a new routing provider:** +1. Create `NewProviderRepository` extending `NavigationRepository` in `common/data/src/main/java/com/kouros/navigation/data/` +2. Implement `getRoute()` method +3. Create `NewProviderRoute.kt` with `mapToRoute()` function +4. Add provider detection logic in `Route.Builder.route()` +5. Update `NavigationUtils.getViewModel()` to return appropriate ViewModel + +### Data Flow + +``` +User Action (search/select destination) + ↓ +ViewModel.loadRoute() [LiveData] + ↓ +NavigationRepository.getRoute() [Selected provider] + ↓ +*Route.mapToRoute() [Convert to universal Route model] + ↓ +RouteModel.startNavigation() + ↓ +RouteModel.updateLocation() [On each location update] + ↓ +UI observes LiveData and displays current step +``` + +### Key Classes + +**Navigation Logic:** +- `RouteModel.kt` - Core navigation engine (tracks position, calculates distances, manages steps) +- `RouteCarModel.kt` - Extends RouteModel with Android Auto-specific formatting +- `ViewModel.kt` - androidx.ViewModel with LiveData for route, traffic, places, etc. + +**Data Models:** +- `Route.kt` - Universal route structure used by all providers +- `Place.kt` - ObjectBox entity for favorites/recent locations +- `StepData.kt` - Display data for current navigation instruction + +**Repositories:** +- `NavigationRepository.kt` - Abstract base class for all routing providers +- Also handles Nominatim geocoding search and TomTom traffic incidents + +**Android Auto:** +- `NavigationCarAppService.kt` - Entry point for Android Auto/Automotive OS +- `NavigationSession.kt` - Session management +- `NavigationScreen.kt` - Car screen templates with NavigationType state machine +- `SurfaceRenderer.kt` - Handles virtual display and map rendering + +### External APIs + +| Service | Purpose | Base URL | +|---------|---------|----------| +| OSRM | Routing | `https://kouros-online.de/osrm/route/v1/driving/` | +| Valhalla | Routing | `https://kouros-online.de/valhalla/route` | +| TomTom | Traffic incidents | `https://api.tomtom.com/traffic/services/5/incidentDetails` | +| Nominatim | Geocoding search | `https://kouros-online.de/nominatim/` | +| Overpass | POI & speed limits | OpenStreetMap Overpass API | + +## Important Constants + +Located in `Constants.kt` (`common/data`): + +```kotlin +NEXT_STEP_THRESHOLD = 120.0 m // Distance to show next maneuver +DESTINATION_ARRIVAL_DISTANCE = 40.0 m // Distance to trigger arrival +MAXIMAL_SNAP_CORRECTION = 50.0 m // Max distance to snap to route +MAXIMAL_ROUTE_DEVIATION = 80.0 m // Max deviation before reroute +``` + +SharedPreferences keys: +- `ROUTING_ENGINE` - Selected provider (0=Valhalla, 1=OSRM, 2=TomTom) +- `DARK_MODE_SETTINGS` - Theme preference +- `AVOID_MOTORWAY`, `AVOID_TOLLWAY` - Route preferences + +## Navigation Flow + +1. **Route Loading**: User searches via Nominatim → selects place → ViewModel.loadRoute() calls selected repository +2. **Route Parsing**: Provider JSON → mapper converts to universal Route → RouteModel.startNavigation() +3. **Location Tracking**: FusedLocationProviderClient provides updates → RouteModel.updateLocation() +4. **Step Calculation**: findStep() snaps location to nearest waypoint → updates current step +5. **UI Updates**: currentStep() and nextStep() provide display data (instruction, distance, icon, lanes) +6. **Arrival**: When distance < DESTINATION_ARRIVAL_DISTANCE, navigation ends + +## Testing Navigation + +The app includes mock location support for testing: + +- Set `useMock = true` in MainActivity +- Enable "Mock location app" in Android Developer Options +- Choose test mode: + - `type = 1` - Simulate movement along entire route + - `type = 2` - Test specific step range + - `type = 3` - Replay GPX track file + +## ObjectBox Database + +ObjectBox is configured in `common/data/build.gradle.kts` with the kapt plugin. The database stores: + +- Recent destinations (category: "Recent") +- Favorite places (category: "Favorites") +- Imported contacts (category: "Contacts") + +Queries use ObjectBox query builder pattern with generated `Place_` property accessors. + +## Compose UI Structure + +**Phone App:** +- `MainActivity.kt` - Main entry with permission handling and Navigation Compose +- `NavigationScreen.kt` - Turn-by-turn navigation display +- `SearchSheet.kt` / `NavigationSheet.kt` - Bottom sheet content +- `MapView.kt` - MapLibre rendering with camera state management + +**Android Auto:** +- Uses CarAppService Screen templates (NavigationTemplate, MessageTemplate, MapWithContentTemplate) +- NavigationType enum controls which template to display (VIEW, NAVIGATION, REROUTE, RECENT, ARRIVAL) + +## Build Flavors + +Two product flavors with dimension "version": +- **demo** - applicationId: `com.kouros.navigation.demo` +- **full** - applicationId: `com.kouros.navigation.full` + +## Common Patterns + +**Dependency Injection (Koin):** +```kotlin +single { OsrmRepository() } +viewModel { ViewModel(get()) } +``` + +**LiveData Observation:** +```kotlin +viewModel.route.observe(this) { routeJson -> + routeModel.startNavigation(routeJson, context) +} +``` + +**Step Finding Algorithm:** +RouteModel iterates through all step waypoints, calculates distance to current location, and snaps to the nearest waypoint to determine current step index. + +## Known Limitations + +- Valhalla route mapping is incomplete (search for TODO comments in ValhallaRoute.kt) +- Rerouting logic exists but needs more testing +- Speed limit queries via Overpass API could be optimized for performance +- TomTom implementation uses local JSON file (R.raw.tomom_routing) instead of live API diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 94a4cbc..f4a3a22 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,8 +14,8 @@ android { applicationId = "com.kouros.navigation" minSdk = 33 targetSdk = 36 - versionCode = 32 - versionName = "0.1.3.32" + versionCode = 36 + versionName = "0.2.0.36" base.archivesName = "navi-$versionName" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -95,6 +95,12 @@ dependencies { implementation(libs.androidx.window) implementation(libs.androidx.compose.foundation.layout) implementation("com.github.ticofab:android-gpx-parser:2.3.1") + implementation(libs.androidx.navigation.compose) + implementation(libs.kotlinx.serialization.json) + implementation("com.github.alorma.compose-settings:ui-tiles:2.25.0") + implementation("com.github.alorma.compose-settings:ui-tiles-extended:2.25.0") + implementation("com.github.alorma.compose-settings:ui-tiles-expressive:2.25.0") + implementation(libs.androidx.foundation.layout) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/java/com/kouros/navigation/model/MockLocation.kt b/app/src/main/java/com/kouros/navigation/model/MockLocation.kt index 1211e96..610281c 100644 --- a/app/src/main/java/com/kouros/navigation/model/MockLocation.kt +++ b/app/src/main/java/com/kouros/navigation/model/MockLocation.kt @@ -48,8 +48,8 @@ class MockLocation (private var locationManager: LocationManager) { this.latitude = latitude this.longitude = longitude this.altitude = 0.0 - this.accuracy = 1.0f - this.speed = 10f + this.accuracy = 0f + this.speed = 0f this.time = System.currentTimeMillis() this.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos() @@ -71,8 +71,8 @@ class MockLocation (private var locationManager: LocationManager) { this.latitude = latitude this.longitude = longitude this.altitude = 0.0 - this.accuracy = 1.0f - this.speed = 10f + this.accuracy = 0f + this.speed = 0f this.time = System.currentTimeMillis() this.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos() diff --git a/app/src/main/java/com/kouros/navigation/ui/DisplayScreenSettings.kt b/app/src/main/java/com/kouros/navigation/ui/DisplayScreenSettings.kt new file mode 100644 index 0000000..7aaa75f --- /dev/null +++ b/app/src/main/java/com/kouros/navigation/ui/DisplayScreenSettings.kt @@ -0,0 +1,162 @@ +package com.kouros.navigation.ui + +import android.content.Context +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.alorma.compose.settings.ui.SettingsCheckbox +import com.alorma.compose.settings.ui.SettingsGroup +import com.alorma.compose.settings.ui.SettingsRadioButton +import com.alorma.compose.settings.ui.base.internal.LocalSettingsTileColors +import com.alorma.compose.settings.ui.base.internal.SettingsTileDefaults +import com.kouros.data.R +import com.kouros.navigation.data.Constants.DARK_MODE_SETTINGS +import com.kouros.navigation.data.Constants.SHOW_THREED_BUILDING +import com.kouros.navigation.utils.NavigationUtils + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DisplayScreenSettings(context: Context, navigateBack: () -> Unit) { + Scaffold( + topBar = { + CenterAlignedTopAppBar( + title = { + Text( + stringResource(id = R.string.display_settings), + ) + }, + navigationIcon = { + IconButton(onClick = navigateBack) { + Icon( + painter = painterResource(R.drawable.arrow_back_24px), + contentDescription = stringResource(id = R.string.accept_action_title), + modifier = Modifier.size(48.dp, 48.dp), + ) + } + }, + ) + }, + ) { padding -> + val scrollState = rememberScrollState() + Column( + modifier = + Modifier + .consumeWindowInsets(padding) + .verticalScroll(scrollState) + .padding(top = padding.calculateTopPadding()), + ) { + DisplaySettings(context) + } + } +} + + +@Composable +private fun DisplaySettings(context: Context) { + Section(title = "Anzeige") { + val state = remember { + mutableStateOf( + NavigationUtils.getBooleanKeyValue( + context, + SHOW_THREED_BUILDING + ) + ) + } + SettingsCheckbox( + state = state.value, + title = { Text(text = stringResource(R.string.threed_building)) }, + onCheckedChange = { + state.value = it + NavigationUtils.setBooleanKeyValue(context, it, SHOW_THREED_BUILDING) + }, + ) + } + Section(title = "Dunkles Design") { + val state = remember { + mutableIntStateOf( + NavigationUtils.getIntKeyValue( + context, + DARK_MODE_SETTINGS + ) + ) + } + DarkModeData(context).darkDesign.forEach { sampleItem -> + SettingsRadioButton( + state = state.intValue == sampleItem.key, + title = { Text(text = sampleItem.title) }, + onClick = { + state.intValue = sampleItem.key + NavigationUtils.setIntKeyValue(context, state.intValue, DARK_MODE_SETTINGS) + }, + ) + } + } +} + +@Composable +internal fun Section( + title: String, + enabled: Boolean = true, + verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(4.dp), + content: @Composable ColumnScope.() -> Unit, +) { + SettingsGroup( + contentPadding = PaddingValues(0.dp), + verticalArrangement = verticalArrangement, + enabled = enabled, + title = { Text(text = title) }, + ) { + Card( + colors = CardDefaults.cardColors( + containerColor = (LocalSettingsTileColors.current + ?: SettingsTileDefaults.colors()).containerColor + ), + ) { + content() + } + } +} +internal class DarkModeData(context: Context) { + val darkDesign = + listOf( + Item( + key = 0, + title = context.getString(R.string.off_action_title), + ), + Item( + key = 1, + title = context.getString(R.string.on_action_title), + ), + Item( + key = 2, + title = context.getString(R.string.use_telephon_settings), + ), + ) +} + +internal data class Item( + val key: Int, + val title: String, +) diff --git a/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt b/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt index f7fe85e..7f12a3d 100644 --- a/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt +++ b/app/src/main/java/com/kouros/navigation/ui/MainActivity.kt @@ -15,9 +15,13 @@ import androidx.activity.enableEdgeToEdge import androidx.annotation.RequiresPermission import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material3.BottomSheetScaffold import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text @@ -33,17 +37,23 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer +import androidx.navigation.NavController +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices import com.kouros.data.R import com.kouros.navigation.MainApplication.Companion.navigationViewModel import com.kouros.navigation.data.Constants import com.kouros.navigation.data.Constants.DESTINATION_ARRIVAL_DISTANCE -import com.kouros.navigation.data.Constants.homeHohenwaldeck import com.kouros.navigation.data.Constants.homeVogelhart import com.kouros.navigation.data.StepData import com.kouros.navigation.model.BaseStyleModel @@ -78,6 +88,7 @@ class MainActivity : ComponentActivity() { val routeModel = RouteModel() var tilt = 50.0 val useMock = false + val type = 1 // simulate 2 test 3 gpx var currentIndex = 0 val stepData: MutableLiveData by lazy { @@ -92,9 +103,13 @@ class MainActivity : ComponentActivity() { routeModel.startNavigation(newRoute, applicationContext) routeData.value = routeModel.curRoute.routeGeoJson if (useMock) { - simulate() - //test() - ///gpx(applicationContext) + when (type) { + 1 -> simulate() + 2 -> test() + 3 -> gpx( + context = applicationContext + ) + } } } } @@ -114,9 +129,6 @@ class MainActivity : ComponentActivity() { lateinit var baseStyle: BaseStyle.Json - init { - - } @RequiresPermission(allOf = [Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION]) override fun onCreate(savedInstanceState: Bundle?) { @@ -156,24 +168,28 @@ class MainActivity : ComponentActivity() { permissions = permissions, requiredPermissions = listOf(permissions.first()), onGranted = { - Content() + App() // auto navigate if (useMock) { - navigationViewModel.loadRoute( - applicationContext, - homeVogelhart, - homeHohenwaldeck, - 0F - ) +// navigationViewModel.loadRoute( +// applicationContext, +// homeVogelhart, +// homeHohenwaldeck, +// 0F +// ) } }, ) } - @SuppressLint("AutoboxingStateCreation") + @OptIn(ExperimentalMaterial3Api::class) @Composable - fun Content() { + fun StartScreen( + navController: NavHostController + + ) { + val scaffoldState = rememberBottomSheetScaffoldState() val snackbarHostState = remember { SnackbarHostState() } val scope = rememberCoroutineScope() @@ -226,6 +242,42 @@ class MainActivity : ComponentActivity() { baseStyle ) } + if (!routeModel.isNavigating()) { + Settings(navController, modifier = Modifier.fillMaxWidth()) + } + } + } + } + + @Composable + fun App() { + val navController = rememberNavController() + NavHost(navController = navController, startDestination = "startScreen") { + composable("startScreen") { StartScreen(navController) } + composable("settings") { SettingsScreen(navController) { navController.popBackStack() } } + composable("display_settings") { DisplayScreenSettings(applicationContext) { navController.popBackStack() } } + composable("nav_settings") { NavigationScreenSettings(applicationContext) { navController.popBackStack() } } + } + } + + @Composable + fun Settings(navController: NavController, modifier: Modifier = Modifier) { + Box( + modifier = Modifier + .fillMaxSize() + ) { + FloatingActionButton( + modifier = Modifier + .padding(start = 10.dp, top = 40.dp), + onClick = { + navController.navigate("settings") + }, + ) { + Icon( + painter = painterResource(R.drawable.menu_24px), + contentDescription = stringResource(id = R.string.accept_action_title), + modifier = Modifier.size(24.dp, 24.dp), + ) } } } @@ -265,7 +317,7 @@ class MainActivity : ComponentActivity() { if (isNavigating()) { updateLocation(currentLocation, navigationViewModel) stepData.value = currentStep() - if (route.currentStep + 1 <= curLeg.steps.size) { + if (route.currentStepIndex + 1 <= curLeg.steps.size) { nextStepData.value = nextStep() } if (maneuverType in 39..42 @@ -302,7 +354,7 @@ class MainActivity : ComponentActivity() { mock.setMockLocation(latitude, longitude) } routeData.value = "" - stepData.value = StepData("", 0.0, 0, 0, 0, 0.0) + stepData.value = StepData("", 0.0, 0, 0, 0, 0.0) } fun simulateNavigation() { @@ -338,8 +390,8 @@ class MainActivity : ComponentActivity() { for ((index, waypoint) in routeModel.curRoute.waypoints.withIndex()) { if (routeModel.isNavigating()) { val deviation = 0.0 - if (index in 0..routeModel.curRoute.waypoints.size) { - mock.setMockLocation(waypoint[1] + deviation, waypoint[0]) + if (index in 300..routeModel.curRoute.waypoints.size) { + mock.setMockLocation(waypoint[1], waypoint[0]) delay(500L) // } } @@ -349,13 +401,14 @@ class MainActivity : ComponentActivity() { fun test() { for ((index, step) in routeModel.curLeg.steps.withIndex()) { - if (index in 3..3) { + //if (index in 3..3) { for ((windex, waypoint) in step.maneuver.waypoints.withIndex()) { routeModel.updateLocation( location(waypoint[0], waypoint[1]), navigationViewModel ) val step = routeModel.currentStep() + println("Step: ${step}") if (step.leftStepDistance == 70.0) { println("") } @@ -363,7 +416,7 @@ class MainActivity : ComponentActivity() { //nextStepData.value = routeModel.nextStep() } } - } + //} } } @@ -377,7 +430,7 @@ class MainActivity : ComponentActivity() { fun gpx(context: Context) { CoroutineScope(Dispatchers.IO).launch { val parser = GPXParser() - val input = context.resources.openRawResource(R.raw.hv) + val input = context.resources.openRawResource(R.raw.vh) val parsedGpx: Gpx? = parser.parse(input) // consider using a background thread parsedGpx?.let { val tracks = parsedGpx.tracks diff --git a/app/src/main/java/com/kouros/navigation/ui/NavigationScreenSettings.kt b/app/src/main/java/com/kouros/navigation/ui/NavigationScreenSettings.kt new file mode 100644 index 0000000..f2ec4cb --- /dev/null +++ b/app/src/main/java/com/kouros/navigation/ui/NavigationScreenSettings.kt @@ -0,0 +1,162 @@ +package com.kouros.navigation.ui + +import android.content.Context +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.alorma.compose.settings.ui.SettingsCheckbox +import com.alorma.compose.settings.ui.SettingsRadioButton +import com.kouros.data.R +import com.kouros.navigation.data.Constants +import com.kouros.navigation.data.Constants.DARK_MODE_SETTINGS +import com.kouros.navigation.data.Constants.ROUTING_ENGINE +import com.kouros.navigation.data.RouteEngine +import com.kouros.navigation.utils.NavigationUtils + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun NavigationScreenSettings(context: Context, navigateBack: () -> Unit) { + Scaffold( + topBar = { + CenterAlignedTopAppBar( + title = { + Text( + stringResource(id = R.string.navigation_settings), + ) + }, + navigationIcon = { + IconButton(onClick = navigateBack) { + Icon( + painter = painterResource(R.drawable.arrow_back_24px), + contentDescription = stringResource(id = R.string.accept_action_title), + modifier = Modifier.size(48.dp, 48.dp), + ) + } + }, + ) + }, + ) { padding -> + val scrollState = rememberScrollState() + Column( + modifier = + Modifier + .consumeWindowInsets(padding) + .verticalScroll(scrollState) + .padding(top = padding.calculateTopPadding()), + ) { + NavigationSettings(context) + } + } +} + +@Composable +private fun NavigationSettings(context: Context) { + Section(title = stringResource(id = R.string.options)) { + val avoidMotorwayState = remember { + mutableStateOf( + NavigationUtils.getBooleanKeyValue( + context, + Constants.AVOID_MOTORWAY + ) + ) + } + SettingsCheckbox( + state = avoidMotorwayState.value, + title = { Text(text = stringResource(id = R.string.avoid_highways_row_title)) }, + onCheckedChange = { + avoidMotorwayState.value = it + NavigationUtils.setBooleanKeyValue(context, it, Constants.AVOID_MOTORWAY) + }, + ) + + val avoidTollwayState = remember { + mutableStateOf( + NavigationUtils.getBooleanKeyValue( + context, + Constants.AVOID_TOLLWAY + ) + ) + } + SettingsCheckbox( + state = avoidTollwayState.value, + title = { Text(text = stringResource(id = R.string.avoid_tolls_row_title)) }, + onCheckedChange = { + avoidTollwayState.value = it + NavigationUtils.setBooleanKeyValue(context, it, Constants.AVOID_TOLLWAY) + }, + ) + + val carLocationState = remember { + mutableStateOf( + NavigationUtils.getBooleanKeyValue( + context, + Constants.CAR_LOCATION + ) + ) + } + SettingsCheckbox( + state = carLocationState.value, + title = { Text(text = stringResource(id = R.string.use_car_location)) }, + onCheckedChange = { + carLocationState.value = it + NavigationUtils.setBooleanKeyValue(context, it, Constants.CAR_LOCATION) + }, + ) + } + + Section(title = stringResource(id = R.string.routing_engine)) { + val state = remember { + mutableIntStateOf( + NavigationUtils.getIntKeyValue( + context, + ROUTING_ENGINE + ) + ) + } + RoutingEngineData.engines.forEach { sampleItem -> + SettingsRadioButton( + state = state.intValue == sampleItem.key, + title = { Text(text = sampleItem.title) }, + onClick = { + state.intValue = sampleItem.key + NavigationUtils.setIntKeyValue(context, state.intValue, ROUTING_ENGINE) + }, + ) + } + } +} + +internal object RoutingEngineData { + val engines = + listOf( + Item( + key = 0, + title = RouteEngine.VALHALLA.toString(), + ), + Item( + key = 1, + title = RouteEngine.OSRM.toString(), + ), + Item( + key = 2, + title = RouteEngine.TOMTOM.toString(), + ), + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/kouros/navigation/ui/NavigationSheet.kt b/app/src/main/java/com/kouros/navigation/ui/NavigationSheet.kt index 6469ec1..77c7a2d 100755 --- a/app/src/main/java/com/kouros/navigation/ui/NavigationSheet.kt +++ b/app/src/main/java/com/kouros/navigation/ui/NavigationSheet.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.core.graphics.drawable.IconCompat import com.kouros.data.R import com.kouros.navigation.data.Constants.NEXT_STEP_THRESHOLD import com.kouros.navigation.data.StepData @@ -30,21 +31,19 @@ fun NavigationSheet( stopNavigation: () -> Unit, simulateNavigation: () -> Unit, ) { - val distance = step.leftDistance.round(1) + val distance = (step.leftDistance / 1000).round(1) - step.lane.forEach { - if (it.indications.isNotEmpty()) { - routeModel.createLaneIcon(applicationContext, step) - } + if (step.lane.isNotEmpty()) { + routeModel.addLanes( step) } - Column { FlowRow(horizontalArrangement = Arrangement.SpaceEvenly) { Text(formatDateTime(step.arrivalTime), fontSize = 22.sp) Spacer(Modifier.size(30.dp)) Text("$distance km", fontSize = 22.sp) } + HorizontalDivider() FlowRow(horizontalArrangement = Arrangement.SpaceEvenly) { if (routeModel.isNavigating()) { diff --git a/app/src/main/java/com/kouros/navigation/ui/SettingsScreen.kt b/app/src/main/java/com/kouros/navigation/ui/SettingsScreen.kt new file mode 100644 index 0000000..33b151c --- /dev/null +++ b/app/src/main/java/com/kouros/navigation/ui/SettingsScreen.kt @@ -0,0 +1,86 @@ +package com.kouros.navigation.ui + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import com.alorma.compose.settings.ui.SettingsMenuLink +import com.kouros.data.R + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) +@Composable +fun SettingsScreen(navController: NavHostController, navigateBack: () -> Unit) { + Scaffold( + topBar = { + CenterAlignedTopAppBar( + title = { + Text( + stringResource(id = R.string.settings_action_title), + ) + }, + navigationIcon = { + IconButton(onClick = navigateBack) { + Icon( + painter = painterResource(R.drawable.arrow_back_24px), + contentDescription = stringResource(id = R.string.accept_action_title), + modifier = Modifier.size(48.dp, 48.dp), + ) + } + }, + ) + }, + ) { padding -> + val scrollState = rememberScrollState() + Column( + modifier = + Modifier + .consumeWindowInsets(padding) + .verticalScroll(scrollState) + .padding(top = padding.calculateTopPadding()), + ) { + SettingsMenuLink( + title = { Text(text = stringResource(R.string.display_settings)) }, + modifier = Modifier, + enabled = true, + onClick = { navController.navigate("display_settings")}, + icon = { + Icon( + painter = painterResource(R.drawable.ic_place_white_24dp), + contentDescription = stringResource(id = R.string.display_settings), + modifier = Modifier.size(48.dp, 48.dp), + ) + } + ) + SettingsMenuLink( + title = { Text(text = stringResource(R.string.navigation_settings)) }, + modifier = Modifier, + enabled = true, + onClick = { navController.navigate("nav_settings")}, + icon = { + Icon( + painter = painterResource(R.drawable.navigation_24px), + contentDescription = stringResource(id = R.string.navigation_settings), + modifier = Modifier.size(48.dp, 48.dp), + ) + } + ) + } + } +} + + diff --git a/app/src/main/java/com/kouros/navigation/ui/theme/Color.kt b/app/src/main/java/com/kouros/navigation/ui/theme/Color.kt index 7e0434b..0dbc89c 100644 --- a/app/src/main/java/com/kouros/navigation/ui/theme/Color.kt +++ b/app/src/main/java/com/kouros/navigation/ui/theme/Color.kt @@ -2,10 +2,75 @@ package com.kouros.navigation.ui.theme import androidx.compose.ui.graphics.Color -val Purple80 = Color(0xFFD0BCFF) -val PurpleGrey80 = Color(0xFFCCC2DC) -val Pink80 = Color(0xFFEFB8C8) +//val Purple80 = Color(0xFFD0BCFF) +//val PurpleGrey80 = Color(0xFFCCC2DC) +//val Pink80 = Color(0xFFEFB8C8) +// +//val Purple40 = Color(0xFF6650a4) +//val PurpleGrey40 = Color(0xFF625b71) +//val Pink40 = Color(0xFF7D5260) -val Purple40 = Color(0xFF6650a4) -val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val md_theme_light_primary = Color(0xFF825500) +val md_theme_light_onPrimary = Color(0xFFFFFFFF) +val md_theme_light_primaryContainer = Color(0xFFFFDDB3) +val md_theme_light_onPrimaryContainer = Color(0xFF291800) +val md_theme_light_secondary = Color(0xFF6F5B40) +val md_theme_light_onSecondary = Color(0xFFFFFFFF) +val md_theme_light_secondaryContainer = Color(0xFFFBDEBC) +val md_theme_light_onSecondaryContainer = Color(0xFF271904) +val md_theme_light_tertiary = Color(0xFF51643F) +val md_theme_light_onTertiary = Color(0xFFFFFFFF) +val md_theme_light_tertiaryContainer = Color(0xFFD4EABB) +val md_theme_light_onTertiaryContainer = Color(0xFF102004) +val md_theme_light_error = Color(0xFFBA1A1A) +val md_theme_light_errorContainer = Color(0xFFFFDAD6) +val md_theme_light_onError = Color(0xFFFFFFFF) +val md_theme_light_onErrorContainer = Color(0xFF410002) +val md_theme_light_background = Color(0xFFFFFBFF) +val md_theme_light_onBackground = Color(0xFF1F1B16) +val md_theme_light_surface = Color(0xFFFFFBFF) +val md_theme_light_onSurface = Color(0xFF1F1B16) +val md_theme_light_surfaceVariant = Color(0xFFF0E0CF) +val md_theme_light_onSurfaceVariant = Color(0xFF4F4539) +val md_theme_light_outline = Color(0xFF817567) +val md_theme_light_inverseOnSurface = Color(0xFFF9EFE7) +val md_theme_light_inverseSurface = Color(0xFF34302A) +val md_theme_light_inversePrimary = Color(0xFFFFB951) +val md_theme_light_shadow = Color(0xFF000000) +val md_theme_light_surfaceTint = Color(0xFF825500) +val md_theme_light_outlineVariant = Color(0xFFD3C4B4) +val md_theme_light_scrim = Color(0xFF000000) + +val md_theme_dark_primary = Color(0xFFFFB951) +val md_theme_dark_onPrimary = Color(0xFF452B00) +val md_theme_dark_primaryContainer = Color(0xFF633F00) +val md_theme_dark_onPrimaryContainer = Color(0xFFFFDDB3) +val md_theme_dark_secondary = Color(0xFFDDC2A1) +val md_theme_dark_onSecondary = Color(0xFF3E2D16) +val md_theme_dark_secondaryContainer = Color(0xFF56442A) +val md_theme_dark_onSecondaryContainer = Color(0xFFFBDEBC) +val md_theme_dark_tertiary = Color(0xFFB8CEA1) +val md_theme_dark_onTertiary = Color(0xFF243515) +val md_theme_dark_tertiaryContainer = Color(0xFF3A4C2A) +val md_theme_dark_onTertiaryContainer = Color(0xFFD4EABB) +val md_theme_dark_error = Color(0xFFFFB4AB) +val md_theme_dark_errorContainer = Color(0xFF93000A) +val md_theme_dark_onError = Color(0xFF690005) +val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6) +val md_theme_dark_background = Color(0xFF1F1B16) +val md_theme_dark_onBackground = Color(0xFFEAE1D9) +val md_theme_dark_surface = Color(0xFF1F1B16) +val md_theme_dark_onSurface = Color(0xFFEAE1D9) +val md_theme_dark_surfaceVariant = Color(0xFF4F4539) +val md_theme_dark_onSurfaceVariant = Color(0xFFD3C4B4) +val md_theme_dark_outline = Color(0xFF9C8F80) +val md_theme_dark_inverseOnSurface = Color(0xFF1F1B16) +val md_theme_dark_inverseSurface = Color(0xFFEAE1D9) +val md_theme_dark_inversePrimary = Color(0xFF825500) +val md_theme_dark_shadow = Color(0xFF000000) +val md_theme_dark_surfaceTint = Color(0xFFFFB951) +val md_theme_dark_outlineVariant = Color(0xFF4F4539) +val md_theme_dark_scrim = Color(0xFF000000) + + +val seed = Color(0xFF825500) diff --git a/app/src/main/java/com/kouros/navigation/ui/theme/Shapes.kt b/app/src/main/java/com/kouros/navigation/ui/theme/Shapes.kt new file mode 100644 index 0000000..fb76940 --- /dev/null +++ b/app/src/main/java/com/kouros/navigation/ui/theme/Shapes.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.kouros.navigation.ui.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Shapes +import androidx.compose.ui.unit.dp + +val shapes = Shapes( + extraSmall = RoundedCornerShape(4.dp), + small = RoundedCornerShape(8.dp), + medium = RoundedCornerShape(16.dp), + large = RoundedCornerShape(24.dp), + extraLarge = RoundedCornerShape(32.dp) +) diff --git a/app/src/main/java/com/kouros/navigation/ui/theme/Theme.kt b/app/src/main/java/com/kouros/navigation/ui/theme/Theme.kt index 662a949..20a2cfe 100644 --- a/app/src/main/java/com/kouros/navigation/ui/theme/Theme.kt +++ b/app/src/main/java/com/kouros/navigation/ui/theme/Theme.kt @@ -1,57 +1,111 @@ package com.kouros.navigation.ui.theme +import android.app.Activity import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat -private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 +private val LightColors = lightColorScheme( + primary = md_theme_light_primary, + onPrimary = md_theme_light_onPrimary, + primaryContainer = md_theme_light_primaryContainer, + onPrimaryContainer = md_theme_light_onPrimaryContainer, + secondary = md_theme_light_secondary, + onSecondary = md_theme_light_onSecondary, + secondaryContainer = md_theme_light_secondaryContainer, + onSecondaryContainer = md_theme_light_onSecondaryContainer, + tertiary = md_theme_light_tertiary, + onTertiary = md_theme_light_onTertiary, + tertiaryContainer = md_theme_light_tertiaryContainer, + onTertiaryContainer = md_theme_light_onTertiaryContainer, + error = md_theme_light_error, + errorContainer = md_theme_light_errorContainer, + onError = md_theme_light_onError, + onErrorContainer = md_theme_light_onErrorContainer, + background = md_theme_light_background, + onBackground = md_theme_light_onBackground, + surface = md_theme_light_surface, + onSurface = md_theme_light_onSurface, + surfaceVariant = md_theme_light_surfaceVariant, + onSurfaceVariant = md_theme_light_onSurfaceVariant, + outline = md_theme_light_outline, + inverseOnSurface = md_theme_light_inverseOnSurface, + inverseSurface = md_theme_light_inverseSurface, + inversePrimary = md_theme_light_inversePrimary, + surfaceTint = md_theme_light_surfaceTint, + outlineVariant = md_theme_light_outlineVariant, + scrim = md_theme_light_scrim, ) -private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 - /* Other default colors to override - background = Color(0xFFFFFBFE), - surface = Color(0xFFFFFBFE), - onPrimary = Color.White, - onSecondary = Color.White, - onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), - onSurface = Color(0xFF1C1B1F), - */ +private val DarkColors = darkColorScheme( + primary = md_theme_dark_primary, + onPrimary = md_theme_dark_onPrimary, + primaryContainer = md_theme_dark_primaryContainer, + onPrimaryContainer = md_theme_dark_onPrimaryContainer, + secondary = md_theme_dark_secondary, + onSecondary = md_theme_dark_onSecondary, + secondaryContainer = md_theme_dark_secondaryContainer, + onSecondaryContainer = md_theme_dark_onSecondaryContainer, + tertiary = md_theme_dark_tertiary, + onTertiary = md_theme_dark_onTertiary, + tertiaryContainer = md_theme_dark_tertiaryContainer, + onTertiaryContainer = md_theme_dark_onTertiaryContainer, + error = md_theme_dark_error, + errorContainer = md_theme_dark_errorContainer, + onError = md_theme_dark_onError, + onErrorContainer = md_theme_dark_onErrorContainer, + background = md_theme_dark_background, + onBackground = md_theme_dark_onBackground, + surface = md_theme_dark_surface, + onSurface = md_theme_dark_onSurface, + surfaceVariant = md_theme_dark_surfaceVariant, + onSurfaceVariant = md_theme_dark_onSurfaceVariant, + outline = md_theme_dark_outline, + inverseOnSurface = md_theme_dark_inverseOnSurface, + inverseSurface = md_theme_dark_inverseSurface, + inversePrimary = md_theme_dark_inversePrimary, + surfaceTint = md_theme_dark_surfaceTint, + outlineVariant = md_theme_dark_outlineVariant, + scrim = md_theme_dark_scrim, ) @Composable fun NavigationTheme( - darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, + useDarkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { - val colorScheme = when { - dynamicColor -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } - - darkTheme -> DarkColorScheme - else -> LightColorScheme + val context = LocalContext.current + val colors = run { + if (useDarkTheme) dynamicDarkColorScheme(context) + else dynamicLightColorScheme(context) } - MaterialTheme( - colorScheme = colorScheme, - typography = Typography, - content = content - ) + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = colors.primary.toArgb() + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = + useDarkTheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = typography, + content = content, + shapes = shapes, + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/kouros/navigation/ui/theme/Type.kt b/app/src/main/java/com/kouros/navigation/ui/theme/Type.kt index 19a44e9..7254fb0 100644 --- a/app/src/main/java/com/kouros/navigation/ui/theme/Type.kt +++ b/app/src/main/java/com/kouros/navigation/ui/theme/Type.kt @@ -7,28 +7,35 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp // Set of Material typography styles to start with -val Typography = Typography( +val typography = Typography( + headlineSmall = TextStyle( + fontWeight = FontWeight.SemiBold, + fontSize = 24.sp, + lineHeight = 32.sp, + letterSpacing = 0.sp + ), + titleLarge = TextStyle( + fontWeight = FontWeight.SemiBold, + fontSize = 18.sp, + lineHeight = 32.sp, + letterSpacing = 0.sp + ), bodyLarge = TextStyle( - fontFamily = FontFamily.Default, fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 24.sp, - letterSpacing = 0.5.sp - ) - /* Other default text styles to override - titleLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 22.sp, - lineHeight = 28.sp, - letterSpacing = 0.sp + letterSpacing = 0.15.sp ), - labelSmall = TextStyle( - fontFamily = FontFamily.Default, + bodyMedium = TextStyle( fontWeight = FontWeight.Medium, - fontSize = 11.sp, + fontSize = 14.sp, + lineHeight = 20.sp, + letterSpacing = 0.25.sp + ), + labelMedium = TextStyle( + fontWeight = FontWeight.SemiBold, + fontSize = 12.sp, lineHeight = 16.sp, letterSpacing = 0.5.sp ) - */ -) \ No newline at end of file +) diff --git a/common/car/src/main/java/com/kouros/navigation/car/SurfaceRenderer.kt b/common/car/src/main/java/com/kouros/navigation/car/SurfaceRenderer.kt index dde81fc..2210e1f 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/SurfaceRenderer.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/SurfaceRenderer.kt @@ -213,7 +213,7 @@ class SurfaceRenderer( DrawNavigationImages( paddingValues, currentSpeed, - routeModel.maxSpeed, + routeModel, width, height ) diff --git a/common/car/src/main/java/com/kouros/navigation/car/map/MapView.kt b/common/car/src/main/java/com/kouros/navigation/car/map/MapView.kt index 4cd9093..2b82f83 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/map/MapView.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/map/MapView.kt @@ -2,7 +2,6 @@ package com.kouros.navigation.car.map import android.content.Context import android.location.Location -import androidx.car.app.connection.CarConnection import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues @@ -32,10 +31,9 @@ import com.kouros.navigation.car.ViewStyle import com.kouros.navigation.data.Constants import com.kouros.navigation.data.Constants.SHOW_THREED_BUILDING import com.kouros.navigation.data.NavigationColor -import com.kouros.navigation.data.ObjectBox import com.kouros.navigation.data.RouteColor import com.kouros.navigation.data.SpeedColor -import com.kouros.navigation.data.tomtom.TrafficData +import com.kouros.navigation.model.RouteModel import com.kouros.navigation.utils.NavigationUtils.getBooleanKeyValue import org.maplibre.compose.camera.CameraPosition import org.maplibre.compose.camera.CameraState @@ -92,7 +90,7 @@ fun MapLibre( cameraState: CameraState, baseStyle: BaseStyle.Json, route: String?, - traffic: Map ?, + traffic: Map?, viewStyle: ViewStyle, speedCameras: String? = "" ) { @@ -112,6 +110,7 @@ fun MapLibre( AmenityLayer(route) } else { RouteLayer(route, traffic!!) + //RouteLayerPoint(route ) } SpeedCameraLayer(speedCameras) } @@ -164,9 +163,9 @@ fun RouteLayer(routeData: String?, trafficData: Map) { type = exponential(1.2f), input = zoom(), 5 to const(0.4.dp), - 6 to const(0.8.dp), - 7 to const(2.0.dp), - 20 to const(24.dp), + 6 to const(0.6.dp), + 7 to const(1.8.dp), + 20 to const(20.dp), ), ) LineLayer( @@ -178,18 +177,44 @@ fun RouteLayer(routeData: String?, trafficData: Map) { type = exponential(1.2f), input = zoom(), 5 to const(0.4.dp), - 6 to const(0.7.dp), - 7 to const(1.75.dp), - 20 to const(22.dp), + 6 to const(0.5.dp), + 7 to const(1.6.dp), + 20 to const(18.dp), ), ) } } + +@Composable +fun RouteLayerPoint(routeData: String?) { + if (routeData != null && routeData.isNotEmpty()) { + val routes = rememberGeoJsonSource(GeoJsonData.JsonString(routeData)) + val img = image(painterResource(R.drawable.ic_favorite_filled_white_24dp), drawAsSdf = true) + SymbolLayer( + id = "point-layer", + source = routes, + iconOpacity = const(2.0f), + iconColor = const(Color.Red), + iconImage = img, + iconSize = + interpolate( + type = exponential(1.2f), + input = zoom(), + 5 to const(0.4f), + 6 to const(0.6f), + 7 to const(0.8f), + 20 to const(1.0f), + ), + ) + } + +} + fun trafficColor(key: String): Expression { when (key) { - "queuing" -> return const(Color(0xFFD24417)) + "queuing" -> return const(Color(0xFFD24417)) "stationary" -> return const(Color(0xFFFF0000)) "heavy" -> return const(Color(0xFF6B0404)) "slow" -> return const(Color(0xFFC41F1F)) @@ -206,7 +231,7 @@ fun AmenityLayer(routeData: String?) { if (routeData.contains(Constants.CHARGING_STATION)) { color = const(Color.Green) img = image(painterResource(R.drawable.ev_station_48px), drawAsSdf = true) - } else if (routeData.contains(Constants.FUEL_STATION)){ + } else if (routeData.contains(Constants.FUEL_STATION)) { color = const(Color.Black) img = image(painterResource(R.drawable.local_gas_station_48px), drawAsSdf = true) } @@ -269,17 +294,18 @@ fun BuildingLayer(tiles: Source) { fun DrawNavigationImages( padding: PaddingValues, speed: Float?, - maxSpeed: Int, + routeModel: RouteModel, width: Int, height: Int ) { NavigationImage(padding, width, height) if (speed != null) { - CurrentSpeed(width, height, speed, maxSpeed) + CurrentSpeed(width, height, speed, routeModel.maxSpeed) } - if (speed != null && maxSpeed > 0 && (speed * 3.6) > maxSpeed) { - MaxSpeed(width, height, maxSpeed) + if (speed != null && routeModel.maxSpeed > 0 && (speed * 3.6) > routeModel.maxSpeed) { + MaxSpeed(width, height, routeModel.maxSpeed) } + //DebugInfo(width, height, routeModel) } @Composable @@ -429,14 +455,52 @@ private fun MaxSpeed( } @Composable -fun rememberBaseStyle( baseStyle : BaseStyle.Json): BaseStyle.Json { +fun DebugInfo( + width: Int, + height: Int, + routeModel: RouteModel, + + ) { + Box( + modifier = Modifier + .padding( + start = 20.dp, + top = 0.dp + ), + contentAlignment = Alignment.CenterStart + ) { + val textMeasurerLocation = rememberTextMeasurer() + val location = routeModel.location.latitude.toString() + val styleSpeed = TextStyle( + fontSize = 26.sp, + fontWeight = FontWeight.Bold, + color = Color.Black, + ) + val textLayoutLocation = remember(location) { + textMeasurerLocation.measure(location, styleSpeed) + } + Canvas(modifier = Modifier.fillMaxSize()) { + drawText( + textMeasurer = textMeasurerLocation, + text = location, + style = styleSpeed, + topLeft = Offset( + x = center.x - textLayoutLocation.size.width / 2, + y = center.y - textLayoutLocation.size.height / 2, + ) + ) + } + } +} + +@Composable +fun rememberBaseStyle(baseStyle: BaseStyle.Json): BaseStyle.Json { val rememberBaseStyle by remember() { mutableStateOf(baseStyle) } return rememberBaseStyle } - fun getPaddingValues(height: Int, viewStyle: ViewStyle): PaddingValues { return when (viewStyle) { ViewStyle.VIEW, ViewStyle.PAN_VIEW -> PaddingValues( diff --git a/common/car/src/main/java/com/kouros/navigation/car/navigation/RouteCarModel.kt b/common/car/src/main/java/com/kouros/navigation/car/navigation/RouteCarModel.kt index 41349db..1f3d191 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/navigation/RouteCarModel.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/navigation/RouteCarModel.kt @@ -16,7 +16,6 @@ package com.kouros.navigation.car.navigation import android.text.SpannableString -import android.text.Spanned import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.car.app.AppManager @@ -27,7 +26,6 @@ import androidx.car.app.model.Alert import androidx.car.app.model.AlertCallback import androidx.car.app.model.CarColor import androidx.car.app.model.CarIcon -import androidx.car.app.model.CarIconSpan import androidx.car.app.model.CarText import androidx.car.app.model.DateTimeWithZone import androidx.car.app.model.Distance @@ -42,8 +40,9 @@ import androidx.core.graphics.drawable.IconCompat import com.kouros.data.R import com.kouros.navigation.data.StepData import com.kouros.navigation.model.RouteModel -import org.maplibre.compose.expressions.dsl.step +import com.kouros.navigation.utils.location import java.util.Collections +import java.util.Locale import java.util.TimeZone import java.util.concurrent.TimeUnit @@ -54,18 +53,19 @@ class RouteCarModel() : RouteModel() { fun currentStep(carContext: CarContext): Step { val stepData = currentStep() val currentStepCueWithImage: SpannableString = - createString(stepData.instruction) + createString(stepData.instruction) val maneuver = Maneuver.Builder(stepData.currentManeuverType) .setIcon(createCarIcon(carContext, stepData.icon)) if (stepData.currentManeuverType == TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW - || stepData.currentManeuverType == TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW) { + || stepData.currentManeuverType == TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW + ) { maneuver.setRoundaboutExitNumber(stepData.exitNumber) } val step = Step.Builder(currentStepCueWithImage) .setManeuver( - maneuver.build() + maneuver.build() ) if (destination.street != null) { step.setRoad(destination.street!!) @@ -81,16 +81,17 @@ class RouteCarModel() : RouteModel() { val stepData = nextStep() val currentStepCueWithImage: SpannableString = createString(stepData.instruction) - val maneuver = Maneuver.Builder(stepData.currentManeuverType) + val maneuver = Maneuver.Builder(stepData.currentManeuverType) .setIcon(createCarIcon(carContext, stepData.icon)) if (stepData.currentManeuverType == TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW - || stepData.currentManeuverType == TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW) { + || stepData.currentManeuverType == TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW + ) { maneuver.setRoundaboutExitNumber(stepData.exitNumber) } val step = Step.Builder(currentStepCueWithImage) .setManeuver( - maneuver.build() + maneuver.build() ) .build() return step @@ -100,13 +101,13 @@ class RouteCarModel() : RouteModel() { val timeLeft = travelLeftTime() val timeToDestinationMillis = TimeUnit.SECONDS.toMillis(timeLeft.toLong()) - val leftDistance = travelLeftDistance() + val leftDistance = travelLeftDistance() / 1000 val displayUnit = if (leftDistance > 1.0) { Distance.UNIT_KILOMETERS } else { Distance.UNIT_METERS } - val arivalTime = DateTimeWithZone.create( + val arrivalTime = DateTimeWithZone.create( arrivalTime(), TimeZone.getTimeZone("Europe/Berlin") ) @@ -115,7 +116,7 @@ class RouteCarModel() : RouteModel() { leftDistance, displayUnit ), // Arrival time at the destination with the destination time zone. - arivalTime + arrivalTime ) .setRemainingTimeSeconds( TimeUnit.MILLISECONDS.toSeconds( @@ -132,161 +133,99 @@ class RouteCarModel() : RouteModel() { return travelBuilder.build() } - fun addLanes(carContext: CarContext, step: Step.Builder, stepData: StepData) { - var laneImageAdded = false - stepData.lane.forEach { - if (it.indications.isNotEmpty() && it.valid) { - Collections.sort(it.indications) - var direction = "" - it.indications.forEach { it2 -> - direction = if (direction.isEmpty()) { - it2.trim() - } else { - "${direction}_${it2.trim()}" - } +fun addLanes(carContext: CarContext, step: Step.Builder, stepData: StepData) { + var laneImageAdded = false + stepData.lane.forEach { + if (it.indications.isNotEmpty() && it.valid) { + Collections.sort(it.indications) + var direction = "" + it.indications.forEach { it2 -> + direction = if (direction.isEmpty()) { + it2.trim() + } else { + "${direction}_${it2.trim()}" } - val laneDirection = when (direction) { - "left_straight" -> { - when (stepData.currentManeuverType) { - Maneuver.TYPE_TURN_NORMAL_LEFT -> LaneDirection.SHAPE_NORMAL_LEFT - Maneuver.TYPE_STRAIGHT -> LaneDirection.SHAPE_STRAIGHT - else - -> LaneDirection.SHAPE_UNKNOWN - } - } - "left" -> { - when (stepData.currentManeuverType) { - Maneuver.TYPE_TURN_NORMAL_LEFT -> LaneDirection.SHAPE_NORMAL_LEFT - else - -> LaneDirection.SHAPE_UNKNOWN - } - } - "straight" -> { - when (stepData.currentManeuverType) { - Maneuver.TYPE_STRAIGHT -> LaneDirection.SHAPE_STRAIGHT - else - -> LaneDirection.SHAPE_UNKNOWN - } - } - "right" -> { - when (stepData.currentManeuverType) { - Maneuver.TYPE_TURN_NORMAL_RIGHT -> LaneDirection.SHAPE_NORMAL_RIGHT - else - -> LaneDirection.SHAPE_UNKNOWN - } - } - "right_straight" -> { - when (stepData.currentManeuverType) { - Maneuver.TYPE_TURN_NORMAL_RIGHT -> LaneDirection.SHAPE_NORMAL_RIGHT - Maneuver.TYPE_STRAIGHT -> LaneDirection.SHAPE_STRAIGHT - else - -> LaneDirection.SHAPE_UNKNOWN - } - } - "left_slight" -> { - when (stepData.currentManeuverType) { - Maneuver.TYPE_TURN_SLIGHT_LEFT -> LaneDirection.SHAPE_SLIGHT_LEFT - else - -> LaneDirection.SHAPE_UNKNOWN - } - } - "right_slight" -> { - when (stepData.currentManeuverType) { - Maneuver.TYPE_TURN_SLIGHT_RIGHT-> LaneDirection.SHAPE_NORMAL_RIGHT - else - -> LaneDirection.SHAPE_UNKNOWN - } - } - else -> { - LaneDirection.SHAPE_UNKNOWN - } - } - if (laneDirection != LaneDirection.SHAPE_UNKNOWN) { - if (!laneImageAdded) { - step.setLanesImage(createCarIcon(createLaneIcon(carContext, stepData))) - laneImageAdded = true - } - val laneType = - Lane.Builder() - .addDirection(LaneDirection.create(laneDirection, false)) - .build() - step.addLane(laneType) + } + val laneDirection = addLanes(direction, stepData) + if (laneDirection != LaneDirection.SHAPE_UNKNOWN) { + if (!laneImageAdded) { + step.setLanesImage(createCarIcon(createLaneIcon(carContext, stepData))) + laneImageAdded = true } + val laneType = + Lane.Builder() + .addDirection(LaneDirection.create(laneDirection, false)) + .build() + step.addLane(laneType) } } } - - private fun createStringWithIcon( - carContext: CarContext, - text: String, - @DrawableRes iconRes: Int - ): SpannableString { - val start = 0 - val end = text.length - val span = CarIconSpan.create(createCarIcon(carContext, iconRes), CarIconSpan.ALIGN_CENTER) - val spannableString = SpannableString(text) - spannableString.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - return spannableString - } - fun createString( - text: String - ): SpannableString { - val spannableString = SpannableString(text) - return spannableString - } - - fun createCarText(carContext: CarContext, @StringRes stringRes: Int): CarText { - return CarText.create(carContext.getString(stringRes)) - } - - fun createCarIcon(carContext: CarContext, @DrawableRes iconRes: Int): CarIcon { - return CarIcon.Builder(IconCompat.createWithResource(carContext, iconRes)).build() - } - - fun createCarIcon(iconCompat: IconCompat): CarIcon { - return CarIcon.Builder(iconCompat).build() - } - - fun showSpeedCamera(carContext: CarContext, distance: Double, maxSpeed: String) { - carContext.getCarService(AppManager::class.java) - .showAlert(createAlert(carContext, distance, maxSpeed, createCarIcon(carContext, R.drawable.speed_camera_24px))) - } - - fun createAlert( - carContext: CarContext, - distance: Double, - maxSpeed: String?, - icon: CarIcon - ): Alert { - val title = createCarText(carContext, R.string.speed_camera) - val subtitle = CarText.create(maxSpeed!!) - - val dismissAction: Action = createToastAction( - carContext, - R.string.exit_action_title, R.string.exit_action_title, - FLAG_DEFAULT - ) - return Alert.Builder( /* alertId: */0, title, /* durationMillis: */5000) - .setSubtitle(subtitle) - .setIcon(icon) - .addAction(dismissAction).setCallback(object : AlertCallback { - override fun onCancel(reason: Int) { - } - - override fun onDismiss() { - } - }).build() - } - - private fun createToastAction( - carContext: CarContext, - @StringRes titleRes: Int, @StringRes toastStringRes: Int, - flags: Int - ): Action { - return Action.Builder() - .setOnClickListener { } - .setTitle(createCarText(carContext, titleRes)) - .setFlags(flags) - .build() - } +} + +fun createString( + text: String +): SpannableString { + val spannableString = SpannableString(text) + return spannableString +} + +fun createCarText(carContext: CarContext, @StringRes stringRes: Int): CarText { + return CarText.create(carContext.getString(stringRes)) +} + +fun createCarIcon(carContext: CarContext, @DrawableRes iconRes: Int): CarIcon { + return CarIcon.Builder(IconCompat.createWithResource(carContext, iconRes)).build() +} + +// fun createCarIcon(iconCompat: IconCompat): CarIcon { +// return CarIcon.Builder(iconCompat).build() +// } + +fun showSpeedCamera(carContext: CarContext, distance: Double, maxSpeed: String) { + carContext.getCarService(AppManager::class.java) + .showAlert( + createAlert( + carContext, + maxSpeed, + createCarIcon(carContext, R.drawable.speed_camera_24px) + ) + ) +} + +fun createAlert( + carContext: CarContext, + maxSpeed: String?, + icon: CarIcon +): Alert { + val title = createCarText(carContext, R.string.speed_camera) + val subtitle = CarText.create(maxSpeed!!) + + val dismissAction: Action = createToastAction( + carContext, + R.string.exit_action_title, R.string.exit_action_title, + FLAG_DEFAULT + ) + return Alert.Builder( /* alertId: */0, title, /* durationMillis: */5000) + .setSubtitle(subtitle) + .setIcon(icon) + .addAction(dismissAction).setCallback(object : AlertCallback { + override fun onCancel(reason: Int) { + } + + override fun onDismiss() { + } + }).build() +} + +private fun createToastAction( + carContext: CarContext, + @StringRes titleRes: Int, @StringRes toastStringRes: Int, + flags: Int +): Action { + return Action.Builder() + .setOnClickListener { } + .setTitle(createCarText(carContext, titleRes)) + .setFlags(flags) + .build() +} } diff --git a/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt b/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt index baae38b..10a76de 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/screen/NavigationScreen.kt @@ -489,7 +489,6 @@ class NavigationScreen( lastTrafficDate = current viewModel.loadTraffic(carContext, location, surfaceRenderer.carOrientation) } - //updateTraffic(location) updateSpeedCamera(location) with(routeModel) { updateLocation(location, viewModel) @@ -524,7 +523,7 @@ class NavigationScreen( val updatedCameras = mutableListOf() speedCameras.forEach { val plLocation = - location(longitude = it.lon!!, latitude = it.lat!!) + location(longitude = it.lon, latitude = it.lat) val distance = plLocation.distanceTo(location) it.distance = distance.toDouble() updatedCameras.add(it) @@ -533,7 +532,11 @@ class NavigationScreen( val camera = sortedList.first() val bearingRoute = surfaceRenderer.lastLocation.bearingTo(location) val bearingSpeedCamera = if (camera.tags.direction != null) { - camera.tags.direction!!.toFloat() + try { + camera.tags.direction!!.toFloat() + } catch ( e: Exception) { + 0F + } } else { location.bearingTo(location(camera.lon, camera.lat)).absoluteValue } diff --git a/common/car/src/main/java/com/kouros/navigation/car/screen/SearchScreen.kt b/common/car/src/main/java/com/kouros/navigation/car/screen/SearchScreen.kt index 43e30b7..4b6ffc9 100644 --- a/common/car/src/main/java/com/kouros/navigation/car/screen/SearchScreen.kt +++ b/common/car/src/main/java/com/kouros/navigation/car/screen/SearchScreen.kt @@ -34,7 +34,7 @@ class SearchScreen( var categories: List = listOf( Category(id = Constants.RECENT, name = carContext.getString(R.string.recent_destinations)), - Category(id = Constants.CONTACTS, name = carContext.getString(R.string.contacts)), + // Category(id = Constants.CONTACTS, name = carContext.getString(R.string.contacts)), Category(id = Constants.CATEGORIES, name = carContext.getString(R.string.category_title)), Category(id = Constants.FAVORITES, name = carContext.getString(R.string.favorites)) ) diff --git a/common/car/src/test/java/com/kouros/navigation/car/UnitTest.kt b/common/car/src/test/java/com/kouros/navigation/car/UnitTest.kt index 8290448..0775d3f 100644 --- a/common/car/src/test/java/com/kouros/navigation/car/UnitTest.kt +++ b/common/car/src/test/java/com/kouros/navigation/car/UnitTest.kt @@ -1,11 +1,5 @@ package com.kouros.navigation.car -import android.location.Location -import android.location.LocationManager -import com.kouros.navigation.data.Constants.home2Location -import com.kouros.navigation.data.Constants.homeLocation -import com.kouros.navigation.data.NavigationRepository -import com.kouros.navigation.data.SearchFilter import com.kouros.navigation.data.valhalla.ValhallaRepository import com.kouros.navigation.model.RouteModel import com.kouros.navigation.model.ViewModel @@ -24,16 +18,16 @@ class ViewModelTest { @Test fun routeViewModelTest() { - val fromLocation = Location(LocationManager.GPS_PROVIDER) - fromLocation.isMock = true - fromLocation.latitude = homeLocation.latitude - fromLocation.longitude = homeLocation.longitude - val toLocation = Location(LocationManager.GPS_PROVIDER) - toLocation.isMock = true - toLocation.latitude = home2Location.latitude - toLocation.longitude = home2Location.longitude - - val route = repo.getRoute(fromLocation, toLocation, SearchFilter()) +// val fromLocation = Location(LocationManager.GPS_PROVIDER) +// fromLocation.isMock = true +// fromLocation.latitude = homeLocation.latitude +// fromLocation.longitude = homeLocation.longitude +// val toLocation = Location(LocationManager.GPS_PROVIDER) +// toLocation.isMock = true +// toLocation.latitude = home2Location.latitude +// toLocation.longitude = home2Location.longitude +// +// val route = repo.getRoute(fromLocation, toLocation, SearchFilter()) //model.startNavigation(route) } } diff --git a/common/data/build.gradle.kts b/common/data/build.gradle.kts index d7c493e..0954e5b 100644 --- a/common/data/build.gradle.kts +++ b/common/data/build.gradle.kts @@ -58,7 +58,7 @@ dependencies { implementation(libs.kotlinx.serialization.json) implementation(libs.maplibre.compose) - + implementation("androidx.compose.material:material-icons-extended:1.7.8") testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt b/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt index 41dea58..d477045 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/NavigationRepository.kt @@ -29,11 +29,11 @@ import java.net.URL abstract class NavigationRepository { - //private val nominatimUrl = "https://nominatim.openstreetmap.org/" + private val nominatimUrl = "https://nominatim.openstreetmap.org/" - private val nominatimUrl = "https://kouros-online.de/nominatim/" + //private val nominatimUrl = "https://kouros-online.de/nominatim/" - private val tomtomApiKey = "678k5v6940cSXXIS5oD92qIrDgW3RBZ3" + val tomtomApiKey = "678k5v6940cSXXIS5oD92qIrDgW3RBZ3" private val tomtomUrl = "https://api.tomtom.com/traffic/services/5/incidentDetails" @@ -55,18 +55,19 @@ abstract class NavigationRepository { searchFilter: SearchFilter, context: Context ): Double { - val route = getRoute(context, currentLocation, location, carOrientation, searchFilter) - val routeModel = RouteModel() - routeModel.startNavigation(route, context) - return routeModel.curRoute.summary.distance + //val route = getRoute(context, currentLocation, location, carOrientation, searchFilter) + //val routeModel = RouteModel() + //routeModel.startNavigation(route, context) + // return routeModel.curRoute.summary.distance + return 0.0 } fun searchPlaces(search: String, location: Location): String { - val box = calculateSquareRadius(location.latitude, location.longitude, 20.0) + val box = calculateSquareRadius(location.latitude, location.longitude, 100.0) val viewbox = "&bounded=1&viewbox=${box}" return fetchUrl( "${nominatimUrl}search?q=$search&format=jsonv2&addressdetails=true$viewbox", - false + true ) } diff --git a/common/data/src/main/java/com/kouros/navigation/data/Route.kt b/common/data/src/main/java/com/kouros/navigation/data/Route.kt index 75693a6..b1281a3 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/Route.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/Route.kt @@ -22,7 +22,7 @@ data class Route( val routeEngine: Int, val routes: List, - var currentStep: Int = 0, + var currentStepIndex: Int = 0, ) { data class Builder( @@ -51,15 +51,15 @@ data class Route( jsonObject["trip"].toString(), ValhallaResponse::class.java ) - ValhallaRoute().mapJsonToValhalla(routeJson, this) + ValhallaRoute().mapToRoute(routeJson, this) } RouteEngine.OSRM.ordinal -> { val osrmJson = gson.fromJson(route, OsrmResponse::class.java) - OsrmRoute().mapToOsrm(osrmJson, this) + OsrmRoute().mapToRoute(osrmJson, this) } else -> { val tomtomJson = gson.fromJson(route, TomTomResponse::class.java) - TomTomRoute().mapToOsrm(tomtomJson, this) + TomTomRoute().mapToRoute(tomtomJson, this) } } } @@ -91,21 +91,23 @@ data class Route( } } + fun isRouteValid(): Boolean { + return routes.isNotEmpty() && legs().isNotEmpty() + } fun currentStep(): Step { - - return if (routes.isNotEmpty() && legs().isNotEmpty()) { - legs().first().steps[currentStep] + return if (isRouteValid()) { + legs().first().steps[currentStepIndex] } else { Step(maneuver = Maneuver(waypoints = emptyList(), location = location(0.0, 0.0))) } } - fun nextStep(): Step { - val nextIndex = currentStep + 1 - return if (nextIndex < legs().first().steps.size) { + fun nextStep(steps : Int): Step { + val nextIndex = currentStepIndex + steps + return if (isRouteValid() && nextIndex < legs().first().steps.size) { legs().first().steps[nextIndex] } else { - throw IndexOutOfBoundsException("No next maneuver available.") + currentStep() } } diff --git a/common/data/src/main/java/com/kouros/navigation/data/osrm/Legs.kt b/common/data/src/main/java/com/kouros/navigation/data/osrm/Legs.kt index 84713ac..4531625 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/osrm/Legs.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/osrm/Legs.kt @@ -5,7 +5,7 @@ import com.google.gson.annotations.SerializedName data class Legs ( - @SerializedName("steps" ) var steps : ArrayList = arrayListOf(), + @SerializedName("steps" ) var steps : List = listOf(), @SerializedName("weight" ) var weight : Double = 0.0, @SerializedName("summary" ) var summary : String = "", @SerializedName("duration" ) var duration : Double = 0.0, diff --git a/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRoute.kt b/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRoute.kt index a11dff6..4d1b4ca 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRoute.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/osrm/OsrmRoute.kt @@ -1,6 +1,7 @@ package com.kouros.navigation.data.osrm import com.kouros.navigation.data.Route +import com.kouros.navigation.data.RouteEngine import com.kouros.navigation.data.route.Intersection import com.kouros.navigation.data.route.Lane import com.kouros.navigation.data.route.Leg @@ -14,7 +15,7 @@ import com.kouros.navigation.utils.location class OsrmRoute { - fun mapToOsrm(routeJson: OsrmResponse, builder: Route.Builder) { + fun mapToRoute(routeJson: OsrmResponse, builder: Route.Builder) { val routes = mutableListOf() var stepIndex = 0 @@ -61,7 +62,7 @@ class OsrmRoute { distance = step.distance / 1000, duration = step.duration, maneuver = maneuver, - intersection = intersections + //intersection = intersections ) steps.add(step) stepIndex += 1 @@ -80,7 +81,7 @@ class OsrmRoute { routes.add(newRoute) } builder - .routeType(1) + .routeType(RouteEngine.OSRM.ordinal) .routes(routes) } diff --git a/common/data/src/main/java/com/kouros/navigation/data/route/Intersection.kt b/common/data/src/main/java/com/kouros/navigation/data/route/Intersection.kt index fd3ea2b..25b12fb 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/route/Intersection.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/route/Intersection.kt @@ -3,6 +3,6 @@ package com.kouros.navigation.data.route import java.util.Collections data class Intersection( - val location: ArrayList = arrayListOf(0.0, 0.0), + val location: List = listOf(0.0, 0.0), val lane : List = Collections.emptyList(), ) diff --git a/common/data/src/main/java/com/kouros/navigation/data/route/Leg.kt b/common/data/src/main/java/com/kouros/navigation/data/route/Leg.kt index 80d5283..f01462e 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/route/Leg.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/route/Leg.kt @@ -1,5 +1,6 @@ package com.kouros.navigation.data.route data class Leg( - var steps : List = arrayListOf() + var steps : List = arrayListOf(), + var intersection: List = arrayListOf() ) diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Cause.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Cause.kt new file mode 100644 index 0000000..d4230a0 --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Cause.kt @@ -0,0 +1,5 @@ +package com.kouros.navigation.data.tomtom + +data class Cause( + val mainCauseCode: Int +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Guidance.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Guidance.kt new file mode 100644 index 0000000..a66e77a --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Guidance.kt @@ -0,0 +1,6 @@ +package com.kouros.navigation.data.tomtom + +data class Guidance( + val instructionGroups: List, + val instructions: List +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Instruction.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Instruction.kt new file mode 100644 index 0000000..01afaa7 --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Instruction.kt @@ -0,0 +1,21 @@ +package com.kouros.navigation.data.tomtom + +data class Instruction( + val combinedMessage: String, + val countryCode: String, + val drivingSide: String, + val instructionType: String, + val junctionType: String, + val maneuver: String, + val message: String, + val point: Point, + val pointIndex: Int, + val possibleCombineWithNext: Boolean, + val roadNumbers: List, + val routeOffsetInMeters: Int, + val signpostText: String, + val street: String = "", + val travelTimeInSeconds: Int, + val turnAngleInDecimalDegrees: Int, + val exitNumber: String? = "0", +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/InstructionGroup.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/InstructionGroup.kt new file mode 100644 index 0000000..502117e --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/InstructionGroup.kt @@ -0,0 +1,8 @@ +package com.kouros.navigation.data.tomtom + +data class InstructionGroup( + val firstInstructionIndex: Int, + val groupLengthInMeters: Int, + val groupMessage: String, + val lastInstructionIndex: Int +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Lane.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Lane.kt new file mode 100644 index 0000000..6fcf7d5 --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Lane.kt @@ -0,0 +1,6 @@ +package com.kouros.navigation.data.tomtom + +data class Lane( + val directions: List, + val follow: String +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Leg.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Leg.kt new file mode 100644 index 0000000..861b14c --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Leg.kt @@ -0,0 +1,7 @@ +package com.kouros.navigation.data.tomtom + +data class Leg( + val encodedPolyline: String, + val encodedPolylinePrecision: Int, + val summary: SummaryX +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Point.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Point.kt new file mode 100644 index 0000000..7e6549a --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Point.kt @@ -0,0 +1,6 @@ +package com.kouros.navigation.data.tomtom + +data class Point( + val latitude: Double, + val longitude: Double +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Report.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Report.kt deleted file mode 100644 index 777120d..0000000 --- a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Report.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.kouros.navigation.data.tomtom - -data class Report( - val effectiveSettings: List -) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Route.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Route.kt new file mode 100644 index 0000000..f83f4d9 --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Route.kt @@ -0,0 +1,8 @@ +package com.kouros.navigation.data.tomtom + +data class Route( + val guidance: Guidance, + val legs: List, + val sections: List
, + val summary: SummaryX +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/Section.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Section.kt new file mode 100644 index 0000000..e1a786c --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/Section.kt @@ -0,0 +1,16 @@ +package com.kouros.navigation.data.tomtom + +import java.util.Collections + +data class Section( + val delayInSeconds: Int, + val effectiveSpeedInKmh: Int, + val endPointIndex: Int, + val eventId: String, + val laneSeparators: List, + val lanes: List? = Collections.emptyList(), + val magnitudeOfDelay: Int, + val sectionType: String, + val simpleCategory: String, + val startPointIndex: Int, +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/SummaryX.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/SummaryX.kt new file mode 100644 index 0000000..b15bcdf --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/SummaryX.kt @@ -0,0 +1,10 @@ +package com.kouros.navigation.data.tomtom + +data class SummaryX( + val arrivalTime: String, + val departureTime: String, + val lengthInMeters: Int, + val trafficDelayInSeconds: Int, + val trafficLengthInMeters: Int, + val travelTimeInSeconds: Int +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt new file mode 100644 index 0000000..d8ce84b --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRepository.kt @@ -0,0 +1,36 @@ +package com.kouros.navigation.data.tomtom + +import android.content.Context +import android.location.Location +import com.kouros.data.R +import com.kouros.navigation.data.NavigationRepository +import com.kouros.navigation.data.SearchFilter + + +private const val routeUrl = "https://api.tomtom.com/routing/1/calculateRoute/" + +class TomTomRepository : NavigationRepository() { + override fun getRoute( + context: Context, + currentLocation: Location, + location: Location, + carOrientation: Float, + searchFilter: SearchFilter + ): String { + //val routeJson = context.resources.openRawResource(R.raw.tomom_routing) + //val routeJsonString = routeJson.bufferedReader().use { it.readText() } + //return routeJsonString + val url = + routeUrl + "${currentLocation.latitude},${currentLocation.longitude}:${location.latitude},${location.longitude}" + + "/json?vehicleHeading=90§ionType=traffic&report=effectiveSettings&routeType=eco" + + "&traffic=true&avoid=unpavedRoads&travelMode=car" + + "&vehicleMaxSpeed=120&vehicleCommercial=false" + + "&instructionsType=text&language=en-GB§ionType=lanes" + + "&routeRepresentation=encodedPolyline" + + "&vehicleEngineType=combustion&key=$tomtomApiKey" + return fetchUrl( + url, + false + ) + } +} \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomResponse.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomResponse.kt new file mode 100644 index 0000000..badbe8e --- /dev/null +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomResponse.kt @@ -0,0 +1,6 @@ +package com.kouros.navigation.data.tomtom + +data class TomTomResponse( + val formatVersion: String, + val routes: List +) \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRoute.kt b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRoute.kt index 138f6a2..020fbfb 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRoute.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/tomtom/TomTomRoute.kt @@ -1,63 +1,120 @@ package com.kouros.navigation.data.tomtom import com.kouros.navigation.data.Route -import com.kouros.navigation.data.osrm.OsrmResponse -import com.kouros.navigation.data.osrm.OsrmRoute.ManeuverType +import com.kouros.navigation.data.RouteEngine +import com.kouros.navigation.data.route.Intersection +import com.kouros.navigation.data.route.Lane import com.kouros.navigation.data.route.Leg -import com.kouros.navigation.data.route.Maneuver import com.kouros.navigation.data.route.Step import com.kouros.navigation.data.route.Summary +import com.kouros.navigation.utils.GeoUtils.createCenterLocation +import com.kouros.navigation.utils.GeoUtils.createLineStringCollection import com.kouros.navigation.utils.GeoUtils.decodePolyline import com.kouros.navigation.utils.location import com.kouros.navigation.data.route.Maneuver as RouteManeuver -/** -curl -X GET "https://api.tomtom.com/routing/1/calculateRoute/\ -48.1856548,11.57928:48.1183,11.59485/json?\ -vehicleHeading=90§ionType=traffic\ -&report=effectiveSettings&routeType=eco\ -&traffic=true&avoid=unpavedRoadimport com.kouros.navigation.data.route.Maneuver as RouteManeuvers&travelMode=car\ -&vehicleMaxSpeed=120&vehicleCommercial=false\ -&instructionsType=text&language=en-GB§ionType=lanes\ -&routeRepresentation=encodedPolyline\ -&vehicleEngineType=combustion&key=678k5v6940cSXXIS5oD92qIrDgW3RBZ3" - */ class TomTomRoute { - fun mapToOsrm(routeJson: TomTomResponse, builder: Route.Builder) { + fun mapToRoute(routeJson: TomTomResponse, builder: Route.Builder) { + val routes = mutableListOf() routeJson.routes.forEach { route -> - val legs = mutableListOf() val waypoints = mutableListOf>() + val legs = mutableListOf() + var stepIndex = 0 var points = listOf>() val summary = Summary( route.summary.travelTimeInSeconds.toDouble(), - route.summary.lengthInMeters.toDouble() / 1000 + route.summary.lengthInMeters.toDouble() ) route.legs.forEach { leg -> points = decodePolyline(leg.encodedPolyline, leg.encodedPolylinePrecision) waypoints.addAll(points) } - route.guidance.instructions.forEach { instruction -> - instruction.exitNumber -// val maneuver = RouteManeuver( -// // bearingBefore = step.maneuver.bearingBefore, -// //bearingAfter = step.maneuver.bearingAfter, -// type = convertType(instruction.maneuver), -// waypoints = points.subList(section.startPointIndex, section.endPointIndex + 1), -// exit = instruction.exitNumber.toInt(), -// location = location( -// instruction.point.longitude, instruction.point.latitude -// ) -// ) + var stepDistance = 0.0 + var stepDuration = 0.0 + val allIntersections = mutableListOf() + val steps = mutableListOf() + for (index in 0..< route.guidance.instructions.size) { + val instruction = route.guidance.instructions[index] + val nextPointIndex = nextPointIndex(index, route) + val maneuver = RouteManeuver( + bearingBefore = 0, + bearingAfter = 0, + type = convertType(instruction.maneuver), + waypoints = points.subList( + instruction.pointIndex, + route.guidance.instructions[nextPointIndex].pointIndex + ), + exit = exitNumber(instruction), + location = location( + instruction.point.longitude, instruction.point.latitude + ), + ) + + val intersections = mutableListOf() + route.sections.forEach { section -> + val lanes = mutableListOf() + var startIndex = 0 + if (section.startPointIndex <= instruction.pointIndex - 3 + && instruction.pointIndex <= section.endPointIndex + ) { + section.lanes?.forEach { itLane -> + val lane = Lane( + location( + waypoints[section.startPointIndex][0], + waypoints[section.startPointIndex][1] + ), + itLane.directions.first() == itLane.follow, + itLane.directions + ) + startIndex = section.startPointIndex + lanes.add(lane) + } + intersections.add(Intersection(waypoints[startIndex], lanes)) + } + } + allIntersections.addAll(intersections) + stepDistance = route.guidance.instructions[nextPointIndex].routeOffsetInMeters - stepDistance + stepDuration = route.guidance.instructions[nextPointIndex].travelTimeInSeconds - stepDuration + val name = instruction.street + val step = Step( + index = stepIndex, + name = name, + distance = stepDistance, + duration = stepDuration, + maneuver = maneuver, + intersection = intersections + ) + stepDistance = route.guidance.instructions[nextPointIndex].routeOffsetInMeters.toDouble() + stepDuration = route.guidance.instructions[nextPointIndex].travelTimeInSeconds.toDouble() + steps.add(step) + stepIndex += 1 } - route.sections.forEach { section -> - - - } - + legs.add(Leg(steps, allIntersections)) + val routeGeoJson = createLineStringCollection(waypoints) + val centerLocation = createCenterLocation(createLineStringCollection(waypoints)) + val newRoute = com.kouros.navigation.data.route.Routes( + legs, + summary, + routeGeoJson, + centerLocation = centerLocation, + waypoints = waypoints + ) + routes.add(newRoute) } - println(routeJson) + builder + .routeType(RouteEngine.TOMTOM.ordinal) + .routes(routes) + } + + private fun nextPointIndex(index: Int, route: com.kouros.navigation.data.tomtom.Route): Int { + val nextPointIndex = if (index < route.guidance.instructions.size - 1) { + index + 1 + } else { + index + 0 + } + return nextPointIndex } fun convertType(type: String): Int { @@ -66,7 +123,73 @@ class TomTomRoute { "DEPART" -> { newType = androidx.car.app.navigation.model.Maneuver.TYPE_DEPART } + + "ARRIVE" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_DESTINATION + } + + "ARRIVE_LEFT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_DESTINATION_LEFT + } + + "ARRIVE_RIGHT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_DESTINATION_RIGHT + } + + "STRAIGHT", "FOLLOW" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_STRAIGHT + } + + "KEEP_RIGHT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_KEEP_RIGHT + } + + "BEAR_RIGHT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_TURN_SLIGHT_RIGHT + } + "BEAR_LEFT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_TURN_SLIGHT_LEFT + } + + "KEEP_LEFT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_KEEP_LEFT + } + + "TURN_LEFT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_TURN_NORMAL_LEFT + } + + "TURN_RIGHT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_TURN_NORMAL_RIGHT + } + + "SHARP_LEFT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_TURN_SHARP_LEFT + } + + "SHARP_RIGHT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_TURN_SHARP_RIGHT + } + + "ROUNDABOUT_RIGHT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_ROUNDABOUT_ENTER_CCW + } + + "ROUNDABOUT_LEFT" -> { + newType = androidx.car.app.navigation.model.Maneuver.TYPE_ROUNDABOUT_ENTER_CW + } } return newType } +} + +private fun exitNumber( + instruction: Instruction +): Int { + return if ( instruction.exitNumber == null + || instruction.exitNumber.isEmpty()) { + 0 + } else { + instruction.exitNumber.toInt() + } } \ No newline at end of file diff --git a/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaRoute.kt b/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaRoute.kt index 1169f69..0701739 100644 --- a/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaRoute.kt +++ b/common/data/src/main/java/com/kouros/navigation/data/valhalla/ValhallaRoute.kt @@ -3,6 +3,7 @@ package com.kouros.navigation.data.valhalla import androidx.car.app.navigation.model.Maneuver import com.kouros.data.R import com.kouros.navigation.data.Route +import com.kouros.navigation.data.RouteEngine import com.kouros.navigation.data.route.Leg import com.kouros.navigation.data.route.Maneuver as RouteManeuver import com.kouros.navigation.data.route.Step @@ -13,7 +14,7 @@ import com.kouros.navigation.utils.location class ValhallaRoute { - fun mapJsonToValhalla(routeJson: ValhallaResponse, builder: Route.Builder) { + fun mapToRoute(routeJson: ValhallaResponse, builder: Route.Builder) { val waypoints = decodePolyline(routeJson.legs[0].shape) val summary = Summary(routeJson.summaryValhalla.time, routeJson.summaryValhalla.length) val steps = mutableListOf() @@ -38,12 +39,9 @@ class ValhallaRoute { stepIndex += 1 } builder - .routeType(1) + .routeType(RouteEngine.VALHALLA.ordinal) // TODO .routes(emptyList()) - //.summary(summary) - //.routeGeoJson(createLineStringCollection(waypoints)) - //.waypoints(waypoints) } fun convertType(maneuver: Maneuvers): Int { diff --git a/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt b/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt index 5d51c9d..a6d1a09 100644 --- a/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt +++ b/common/data/src/main/java/com/kouros/navigation/model/RouteModel.kt @@ -6,6 +6,10 @@ import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Matrix import android.location.Location +import androidx.annotation.DrawableRes +import androidx.car.app.CarContext +import androidx.car.app.model.CarIcon +import androidx.car.app.navigation.model.LaneDirection import androidx.car.app.navigation.model.Maneuver import androidx.car.app.navigation.model.Step import androidx.core.graphics.createBitmap @@ -15,6 +19,7 @@ import com.kouros.navigation.data.Constants.NEXT_STEP_THRESHOLD import com.kouros.navigation.data.Constants.ROUTING_ENGINE import com.kouros.navigation.data.Place import com.kouros.navigation.data.Route +import com.kouros.navigation.data.RouteEngine import com.kouros.navigation.data.StepData import com.kouros.navigation.data.route.Intersection import com.kouros.navigation.data.route.Lane @@ -30,6 +35,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import java.util.Collections +import java.util.Locale import java.util.concurrent.TimeUnit import kotlin.math.absoluteValue import kotlin.math.roundToInt @@ -45,9 +51,10 @@ open class RouteModel() { var lastSpeedLocation: Location = location(0.0, 0.0) var lastSpeedIndex: Int = 0 var maxSpeed: Int = 0 + var location: Location = location(0.0, 0.0) var lastLocation: Location = location(0.0, 0.0) - var bearing: Float = 0F + var routeBearing: Float = 0F var currentRouteIndex = 0 val curRoute: Routes @@ -62,7 +69,13 @@ open class RouteModel() { .routeEngine(routeEngine) .route(routeString) .build() - navigating = true + if (hasLegs()) { + navigating = true + } + } + + private fun hasLegs(): Boolean { + return route.routes.isNotEmpty() && route.routes[0].legs.isNotEmpty() } fun stopNavigation() { @@ -76,24 +89,24 @@ open class RouteModel() { @OptIn(DelicateCoroutinesApi::class) fun updateLocation(curLocation: Location, viewModel: ViewModel) { location = curLocation - findStep(location) - updateSpeedLimit(location, viewModel) + findStep(curLocation) + updateSpeedLimit(curLocation, viewModel) + lastLocation = location } private fun findStep(location: Location) { - var nearestDistance = 100000.0f + var nearestDistance = 100000f for ((index, step) in curLeg.steps.withIndex()) { - if (index >= route.currentStep) { + if (index >= route.currentStepIndex) { for ((wayIndex, waypoint) in step.maneuver.waypoints.withIndex()) { if (wayIndex >= step.waypointIndex) { val distance = location.distanceTo(location(waypoint[0], waypoint[1])) if (distance < nearestDistance) { nearestDistance = distance - route.currentStep = step.index + route.currentStepIndex = step.index step.waypointIndex = wayIndex step.wayPointLocation = location(waypoint[0], waypoint[1]) - lastLocation = location - bearing = lastLocation.bearingTo(location) + routeBearing = lastLocation.bearingTo(location) } } if (nearestDistance == 0F) { @@ -108,6 +121,21 @@ open class RouteModel() { } private fun currentLanes(location: Location): List { + var lanes = emptyList() + if (route.legs().isNotEmpty()) { + route.legs().first().intersection.forEach { it -> + if (it.lane.isNotEmpty()) { + val distance = lastLocation.distanceTo(location(it.location[0], it.location[1])) + val sectionBearing = + lastLocation.bearingTo(location(it.location[0], it.location[1])) + if (distance < 500 && (routeBearing.absoluteValue - sectionBearing.absoluteValue).absoluteValue < 10) { + lanes = it.lane + } + } + } + } + return lanes + var inter = Intersection() var nearestDistance = 100000.0f route.currentStep().intersection.forEach { @@ -117,7 +145,9 @@ open class RouteModel() { if (distance < nearestDistance) { nearestDistance = distance if (distance <= NEXT_STEP_THRESHOLD * 3) { - if ((interBearing.absoluteValue - route.currentStep().maneuver.bearingAfter.absoluteValue).absoluteValue < 20) { + if (route.routeEngine == RouteEngine.TOMTOM.ordinal + || (interBearing.absoluteValue - route.currentStep().maneuver.bearingAfter.absoluteValue).absoluteValue < 20 + ) { inter = it } } @@ -129,22 +159,24 @@ open class RouteModel() { fun updateSpeedLimit(location: Location, viewModel: ViewModel) = runBlocking { CoroutineScope(Dispatchers.IO).launch { - val instruction = currentStep().instruction - val levenshtein = Levenshtein() - // speed limit - val distance = lastSpeedLocation.distanceTo(location) - if (distance > 500 || lastSpeedIndex < route.currentStep) { - lastSpeedIndex = route.currentStep - val elements = viewModel.getMaxSpeed(location) - elements.forEach { - if (it.tags.name != null) { - if (isNavigating()) { - val distance = - levenshtein.distance(it.tags.name!!, instruction) - if (distance < 5) { - val speed = it.tags.maxspeed.toInt() - maxSpeed = speed - lastSpeedLocation = location + if (isNavigating()) { + val instruction = currentStep().instruction + val levenshtein = Levenshtein() + // speed limit + val distance = lastSpeedLocation.distanceTo(location) + if (distance > 500 || lastSpeedIndex < route.currentStepIndex) { + lastSpeedIndex = route.currentStepIndex + val elements = viewModel.getMaxSpeed(location) + elements.forEach { + if (it.tags.name != null) { + if (isNavigating()) { + val distance = + levenshtein.distance(it.tags.name!!, instruction) + if (distance < 5) { + val speed = it.tags.maxspeed.toInt() + maxSpeed = speed + lastSpeedLocation = location + } } } } @@ -154,32 +186,13 @@ open class RouteModel() { } fun currentStep(): StepData { - val currentStep = route.currentStep() - // Determine if we should display the current or the next maneuver val distanceToNextStep = leftStepDistance() - val isNearNextManeuver = distanceToNextStep in 0.0..NEXT_STEP_THRESHOLD - val shouldAdvance = - isNearNextManeuver && route.currentStep < (route.legs().first().steps.size) - // Determine the maneuver type and corresponding icon - var curManeuverType = if (hasArrived(currentStep.maneuver.type)) { - currentStep.maneuver.type - } else { - Maneuver.TYPE_STRAIGHT - } - // Get the single, correct maneuver for this state - val relevantStep = if (shouldAdvance) { - route.nextStep() // This advances the route's state - } else { - route.currentStep() - } + val currentStep = route.nextStep(1) // This advances the route's state // Safely get the street name from the maneuver - val streetName = relevantStep.name - var exitNumber = currentStep.maneuver.exit - if (shouldAdvance) { - curManeuverType = relevantStep.maneuver.type - exitNumber = relevantStep.maneuver.exit - } + val streetName = currentStep.name + val curManeuverType = currentStep.maneuver.type + val exitNumber = currentStep.maneuver.exit val maneuverIcon = maneuverIcon(curManeuverType) maneuverType = curManeuverType @@ -198,9 +211,8 @@ open class RouteModel() { ) } - fun nextStep(): StepData { - val step = route.nextStep() + val step = route.nextStep(2) val maneuverType = step.maneuver.type val distanceLeft = leftStepDistance() var text = "" @@ -226,14 +238,13 @@ open class RouteModel() { travelLeftDistance(), listOf(Lane(location(0.0, 0.0), valid = false, indications = emptyList())), step.maneuver.exit - ) } fun travelLeftTime(): Double { var timeLeft = 0.0 // time for next step until end step - for (i in route.currentStep + 1..(it.indications) + var direction = "" + it.indications.forEach { it2 -> + direction = if (direction.isEmpty()) { + it2.trim() + } else { + "${direction}_${it2.trim()}" + } + } + val laneDirection = addLanes(direction, stepData) + println(laneDirection) + // TODO: + } + } + } + + fun addLanes(direction: String, stepData: StepData): Int { + + val laneDirection = when (direction.lowercase(Locale.getDefault())) { + "left_straight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_LEFT -> LaneDirection.SHAPE_NORMAL_LEFT + Maneuver.TYPE_STRAIGHT -> LaneDirection.SHAPE_STRAIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + + "left", "slight_left" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_LEFT -> LaneDirection.SHAPE_NORMAL_LEFT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + + "straight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_STRAIGHT -> LaneDirection.SHAPE_STRAIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + + "right" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_RIGHT -> LaneDirection.SHAPE_NORMAL_RIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + + "right_straight" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_NORMAL_RIGHT -> LaneDirection.SHAPE_NORMAL_RIGHT + Maneuver.TYPE_STRAIGHT -> LaneDirection.SHAPE_STRAIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + + "left_slight", "slight_left" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_SLIGHT_LEFT -> LaneDirection.SHAPE_SLIGHT_LEFT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + + "right_slight", "slight_right" -> { + when (stepData.currentManeuverType) { + Maneuver.TYPE_TURN_SLIGHT_RIGHT -> LaneDirection.SHAPE_NORMAL_RIGHT + else + -> LaneDirection.SHAPE_UNKNOWN + } + } + + else -> { + LaneDirection.SHAPE_UNKNOWN + } + } + return laneDirection + } + + fun createCarIcon(iconCompat: IconCompat): CarIcon { + return CarIcon.Builder(iconCompat).build() + } + + fun createCarIconx(carContext: Context, @DrawableRes iconRes: Int): CarIcon { + return CarIcon.Builder(IconCompat.createWithResource(carContext, iconRes)).build() + } fun createLaneIcon(context: Context, stepData: StepData): IconCompat { val bitmaps = mutableListOf() @@ -396,6 +501,7 @@ open class RouteModel() { "${direction}_${it.trim()}" } } + direction = direction.lowercase() return when (direction) { "left_straight" -> { when (stepData.currentManeuverType) { @@ -419,8 +525,8 @@ open class RouteModel() { "right" -> if (stepData.currentManeuverType == Maneuver.TYPE_TURN_NORMAL_RIGHT) "${direction}_o" else "${direction}_x" "left" -> if (stepData.currentManeuverType == Maneuver.TYPE_TURN_NORMAL_LEFT) "${direction}_o" else "${direction}_x" "straight" -> if (stepData.currentManeuverType == Maneuver.TYPE_STRAIGHT) "${direction}_o" else "${direction}_x" - "right_slight" -> if (stepData.currentManeuverType == Maneuver.TYPE_TURN_SLIGHT_RIGHT) "${direction}_o" else "${direction}_x" - "left_slight" -> if (stepData.currentManeuverType == Maneuver.TYPE_TURN_SLIGHT_LEFT) "${direction}_o" else "${direction}_x" + "right_slight", "slight_right" -> if (stepData.currentManeuverType == Maneuver.TYPE_TURN_SLIGHT_RIGHT) "${direction}_o" else "${direction}_x" + "left_slight", "slight_left" -> if (stepData.currentManeuverType == Maneuver.TYPE_TURN_SLIGHT_LEFT) "${direction}_o" else "${direction}_x" else -> { "" } @@ -438,6 +544,7 @@ open class RouteModel() { "right_o" -> R.drawable.right_o "slight_right_x" -> R.drawable.slight_right_x "slight_right_o" -> R.drawable.slight_right_o + "slight_left_x" -> R.drawable.left_x "straight_x" -> R.drawable.straight_x "right_o_straight_x" -> R.drawable.right_o_straight_x "right_x_straight_x" -> R.drawable.right_x_straight_x @@ -446,7 +553,7 @@ open class RouteModel() { "left_o_straight_x" -> R.drawable.left_o_straight_x "left_x_straight_o" -> R.drawable.left_x_straight_o else -> { - R.drawable.ic_close_white_24dp + R.drawable.left_x } } } diff --git a/common/data/src/main/java/com/kouros/navigation/model/ViewModel.kt b/common/data/src/main/java/com/kouros/navigation/model/ViewModel.kt index 28318b2..e08e9cb 100644 --- a/common/data/src/main/java/com/kouros/navigation/model/ViewModel.kt +++ b/common/data/src/main/java/com/kouros/navigation/model/ViewModel.kt @@ -280,18 +280,20 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() { fun searchPlaces(search: String, location: Location) { viewModelScope.launch(Dispatchers.IO) { val placesJson = repository.searchPlaces(search, location) - val gson = GsonBuilder().serializeNulls().create() - val places = gson.fromJson(placesJson, Search::class.java) - val distPlaces = mutableListOf() - places.forEach { - val plLocation = - location(longitude = it.lon.toDouble(), latitude = it.lat.toDouble()) - val distance = plLocation.distanceTo(location) - it.distance = distance - distPlaces.add(it) + if (placesJson.isNotEmpty()) { + val gson = GsonBuilder().serializeNulls().create() + val places = gson.fromJson(placesJson, Search::class.java) + val distPlaces = mutableListOf() + places.forEach { + val plLocation = + location(longitude = it.lon.toDouble(), latitude = it.lat.toDouble()) + val distance = plLocation.distanceTo(location) + it.distance = distance + distPlaces.add(it) + } + val sortedList = distPlaces.sortedWith(compareBy { it.distance }) + searchPlaces.postValue(sortedList) } - val sortedList = distPlaces.sortedWith(compareBy { it.distance }) - searchPlaces.postValue(sortedList) } } diff --git a/common/data/src/main/java/com/kouros/navigation/utils/GeoUtils.kt b/common/data/src/main/java/com/kouros/navigation/utils/GeoUtils.kt index 5e4c5f1..bdc0cfc 100644 --- a/common/data/src/main/java/com/kouros/navigation/utils/GeoUtils.kt +++ b/common/data/src/main/java/com/kouros/navigation/utils/GeoUtils.kt @@ -90,6 +90,7 @@ object GeoUtils { } fun createLineStringCollection(lineCoordinates: List>): String { + // return createPointCollection(lineCoordinates, "Route") val lineString = buildLineString { lineCoordinates.forEach { add(org.maplibre.spatialk.geojson.Point( diff --git a/common/data/src/main/res/drawable/arrow_back_24px.xml b/common/data/src/main/res/drawable/arrow_back_24px.xml new file mode 100644 index 0000000..0e2e863 --- /dev/null +++ b/common/data/src/main/res/drawable/arrow_back_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/common/data/src/main/res/drawable/menu_24px.xml b/common/data/src/main/res/drawable/menu_24px.xml new file mode 100644 index 0000000..538d1cf --- /dev/null +++ b/common/data/src/main/res/drawable/menu_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/common/data/src/main/res/raw/tomom_routing.json b/common/data/src/main/res/raw/tomom_routing.json index 57cd872..cae2b56 100644 --- a/common/data/src/main/res/raw/tomom_routing.json +++ b/common/data/src/main/res/raw/tomom_routing.json @@ -24,7 +24,7 @@ }, { "key": "departAt", - "value": "2026-01-29T08:43:35.397Z" + "value": "2026-02-06T09:09:59.054Z" }, { "key": "guidanceVersion", @@ -44,7 +44,7 @@ }, { "key": "locations", - "value": "48.18565,11.57928:48.11830,11.59485" + "value": "48.18575,11.57939:48.11654,11.59449" }, { "key": "maxAlternatives", @@ -60,11 +60,11 @@ }, { "key": "sectionType", - "value": "lanes" + "value": "traffic" }, { "key": "sectionType", - "value": "traffic" + "value": "lanes" }, { "key": "traffic", @@ -119,46 +119,28 @@ "routes": [ { "summary": { - "lengthInMeters": 10879, - "travelTimeInSeconds": 1170, - "trafficDelayInSeconds": 76, - "trafficLengthInMeters": 1727, - "departureTime": "2026-01-29T09:43:35+01:00", - "arrivalTime": "2026-01-29T10:03:05+01:00" + "lengthInMeters": 11116, + "travelTimeInSeconds": 1148, + "trafficDelayInSeconds": 0, + "trafficLengthInMeters": 0, + "departureTime": "2026-02-06T10:09:59+01:00", + "arrivalTime": "2026-02-06T10:29:07+01:00" }, "legs": [ { "summary": { - "lengthInMeters": 10879, - "travelTimeInSeconds": 1170, - "trafficDelayInSeconds": 76, - "trafficLengthInMeters": 1727, - "departureTime": "2026-01-29T09:43:35+01:00", - "arrivalTime": "2026-01-29T10:03:05+01:00" + "lengthInMeters": 11116, + "travelTimeInSeconds": 1148, + "trafficDelayInSeconds": 0, + "trafficLengthInMeters": 0, + "departureTime": "2026-02-06T10:09:59+01:00", + "arrivalTime": "2026-02-06T10:29:07+01:00" }, - "encodedPolyline": "sfbeHmqteAEjDQEy@GQ?wDQFkEH{G?M?sA@kB?_FAeC?o@?[@_@\\Ab@CVAz@CJA@?dBGhAGjAExAGlBEvBKdCKTAfCKLAv@ELA|AGnAGt@ClCKjDQpBIf@BXDPDPBF@ZB?S@SAYAUKi@Go@Cc@BgBBs@Bg@JyAJiAXqBDWNs@TaA\\mAFa@Po@`BwF?YL]FSFSl@iB^kALc@L]Ro@f@yAf@{AFQNe@dAoCdBgEx@qBTi@BITe@L[L_@^}@HSXu@pB}El@eAb@e@f@[h@QZCRAL?j@HRFh@Vf@XLJhAn@lAv@TLtAz@r@`@bAn@pAv@f@X~@j@z@h@vBpA`@VHDFFJFf@X`CzApAh@f@L`@Fz@@f@AXEVEVEhA[h@Yn@e@PQFEJKRWV[PW`@w@t@}AHQN]~BiFP]`AoBh@aADGTa@t@aAt@{@PQJKJGFG@Cd@]XSxDmCf@a@n@o@TY\\g@LQHMJSLUP[f@iAPg@b@yAFODMNi@FS|@qCVaAHUHUn@wBHYh@eBpAkEjBiGfAeDj@yADMFQd@sAf@kAJUh@qAf@eAt@sAn@iALSN[p@kAVc@JOLSj@w@z@}@x@q@pAu@p@_@j@Sl@MLCRCb@E`@?^?L@`ABz@?N@~AFdADJ@rAH`DVpCVrAJd@BfHp@zGl@pAJ|ALnGp@jEh@fBJpAFF?P@N@ZCtC]r@GJCFCLCD?TEVEXGhAYzAg@NGv@]`@QJEvB_AXMVK\\Qb@Qn@QJCNAZC^ENA`@FnBb@xEtA^H^JnCl@z@r@`@Pr@TtBlA~C`Bn@\\xAl@PF`@LrAVlCh@bBLl@BlBJdG\\RDjCHn@?pB?xB?R@`@@GxAC^?ZInBIfCAvC?r@@dD@n@@b@@^D`C?TDxAFbBHdB@VHp@RjAJb@NNH`@VlBFf@PzARhBFd@@LRbBFh@\\nC@FNhAb@lEj@tDPpABTBRZlBTdBXjBn@xEBLDTRpAR~@Fb@", + "encodedPolyline": "sfbeHarteAE~DQEy@GQ?wDQFkEH{G?M?sA@kB?_FAeC?o@?[@_@\\Ab@CVAz@CJA@?dBGhAGjAExAGlBEvBKdCKTAfCKLAv@ELA|AGnAGt@ClCKjDQpBIf@BXDPDPBF@ZB?S@SAYAUKi@Go@Cc@BgBBs@Bg@JyAJiAXqBDWNs@TaA\\mAFa@Po@`BwF?YL]FSFSl@iB^kALc@L]Ro@f@yAf@{AFQNe@dAoCdBgEx@qBTi@BITe@L[L_@^}@HSXu@pB}El@eAb@e@f@[h@QZCRAL?j@HRFh@Vf@XLJhAn@lAv@TLtAz@r@`@bAn@pAv@f@X~@j@z@h@vBpA`@VHDFFJFf@X`CzApAh@f@L`@Fz@@f@AXEVEVEhA[h@Yn@e@PQFEJKRWV[PW`@w@t@}AHQN]~BiFP]`AoBh@aADGTa@t@aAt@{@PQJKJGFG@Cd@]XSxDmCf@a@n@o@TY\\g@LQHMJSLUP[f@iAPg@b@yAFODMNi@FS|@qCVaAHUHUn@wBHYh@eBpAkEjBiGfAeDj@yADMFQd@sAf@kAJUh@qAf@eAt@sAn@iALSN[p@kAVc@JOLSj@w@z@}@x@q@pAu@p@_@j@Sl@MLCRCb@E`@?^?L@`ABz@?N@~AFdADJ@rAH`DVpCVrAJd@BfHp@zGl@pAJ|ALnGp@jEh@fBJpAFF?P@N@ZCtC]r@GJCFCLCD?TEVEXGhAYzAg@NGv@]`@QJEvB_AXMVK\\Qb@Qn@QJCNAZC^ENA`@FnBb@xEtA^H^JnCl@z@r@`@Pr@TtBlA~C`Bn@\\xAl@PF`@LrAVlCh@bBLl@BlBJdG\\RDjCHn@?pB?xB?R@`@@GxAC^?ZInBIfCAvC?r@@dD@n@@b@@^D`C?TDxAFbBHdB@VHp@RjAJb@NNH`@VlBFf@PzARhBFd@@LRbBFh@\\nC@FNhAb@lEj@tDPpABTBRZlBTdBXjBn@xEBLDTRpAR~@l@jDj@Qv@IrEP", "encodedPolylinePrecision": 5 } ], "sections": [ - { - "startPointIndex": 83, - "endPointIndex": 147, - "sectionType": "TRAFFIC", - "simpleCategory": "JAM", - "effectiveSpeedInKmh": 35, - "delayInSeconds": 76, - "magnitudeOfDelay": 1, - "tec": { - "causes": [ - { - "mainCauseCode": 1 - } - ], - "effectCode": 4 - }, - "eventId": "TTL41048054144049000" - }, { "lanes": [ { @@ -349,9 +331,8 @@ "travelTimeInSeconds": 0, "point": { "latitude": 48.18554, - "longitude": 11.57927 + "longitude": 11.57937 }, - "exitNumber": "", "pointIndex": 0, "instructionType": "LOCATION_DEPARTURE", "street": "Vogelhartstraße", @@ -362,8 +343,8 @@ "message": "Leave from Vogelhartstraße" }, { - "routeOffsetInMeters": 64, - "travelTimeInSeconds": 14, + "routeOffsetInMeters": 72, + "travelTimeInSeconds": 16, "point": { "latitude": 48.18557, "longitude": 11.57841 @@ -380,8 +361,8 @@ "message": "Turn right onto Silcherstraße" }, { - "routeOffsetInMeters": 218, - "travelTimeInSeconds": 57, + "routeOffsetInMeters": 226, + "travelTimeInSeconds": 60, "point": { "latitude": 48.18696, "longitude": 11.57857 @@ -398,8 +379,8 @@ "message": "Turn right onto Schmalkaldener Straße" }, { - "routeOffsetInMeters": 650, - "travelTimeInSeconds": 131, + "routeOffsetInMeters": 658, + "travelTimeInSeconds": 134, "point": { "latitude": 48.18686, "longitude": 11.58437 @@ -419,8 +400,8 @@ "message": "Turn right onto Ingolstädter Straße/B13" }, { - "routeOffsetInMeters": 1713, - "travelTimeInSeconds": 266, + "routeOffsetInMeters": 1720, + "travelTimeInSeconds": 267, "point": { "latitude": 48.17733, "longitude": 11.58503 @@ -441,8 +422,8 @@ "combinedMessage": "Turn left onto Schenkendorfstraße/B2R then keep left at Schenkendorfstraße/B2R toward Messe / ICM" }, { - "routeOffsetInMeters": 2067, - "travelTimeInSeconds": 309, + "routeOffsetInMeters": 2075, + "travelTimeInSeconds": 307, "point": { "latitude": 48.17678, "longitude": 11.58957 @@ -464,8 +445,8 @@ "combinedMessage": "Keep left at Schenkendorfstraße/B2R toward Messe / ICM then keep left at Schenkendorfstraße/B2R toward Passau" }, { - "routeOffsetInMeters": 2419, - "travelTimeInSeconds": 332, + "routeOffsetInMeters": 2426, + "travelTimeInSeconds": 329, "point": { "latitude": 48.17518, "longitude": 11.59363 @@ -486,8 +467,8 @@ "message": "Keep left at Schenkendorfstraße/B2R toward Passau" }, { - "routeOffsetInMeters": 2774, - "travelTimeInSeconds": 357, + "routeOffsetInMeters": 2781, + "travelTimeInSeconds": 353, "point": { "latitude": 48.17329, "longitude": 11.59747 @@ -506,8 +487,8 @@ "message": "Follow Isarring/B2R toward München-Ost" }, { - "routeOffsetInMeters": 8425, - "travelTimeInSeconds": 806, + "routeOffsetInMeters": 8433, + "travelTimeInSeconds": 734, "point": { "latitude": 48.13017, "longitude": 11.61541 @@ -524,8 +505,8 @@ "message": "Bear right at Ampfingstraße" }, { - "routeOffsetInMeters": 9487, - "travelTimeInSeconds": 953, + "routeOffsetInMeters": 9495, + "travelTimeInSeconds": 884, "point": { "latitude": 48.12089, "longitude": 11.61285 @@ -543,8 +524,8 @@ "combinedMessage": "Turn right onto Anzinger Straße then keep straight on at Sankt-Martin-Straße" }, { - "routeOffsetInMeters": 9983, - "travelTimeInSeconds": 1044, + "routeOffsetInMeters": 9991, + "travelTimeInSeconds": 974, "point": { "latitude": 48.12087, "longitude": 11.60621 @@ -561,20 +542,39 @@ "message": "Keep straight on at Sankt-Martin-Straße" }, { - "routeOffsetInMeters": 10879, - "travelTimeInSeconds": 1170, + "routeOffsetInMeters": 10941, + "travelTimeInSeconds": 1103, "point": { - "latitude": 48.1183, - "longitude": 11.59485 + "latitude": 48.11811, + "longitude": 11.59417 }, "pointIndex": 335, + "instructionType": "TURN", + "street": "Hohenwaldeckstraße", + "countryCode": "DEU", + "junctionType": "REGULAR", + "turnAngleInDecimalDegrees": -90, + "possibleCombineWithNext": true, + "drivingSide": "RIGHT", + "maneuver": "TURN_LEFT", + "message": "Turn left onto Hohenwaldeckstraße", + "combinedMessage": "Turn left onto Hohenwaldeckstraße then you have arrived at Hohenwaldeckstraße. Your destination is on the left" + }, + { + "routeOffsetInMeters": 11116, + "travelTimeInSeconds": 1148, + "point": { + "latitude": 48.11655, + "longitude": 11.59422 + }, + "pointIndex": 338, "instructionType": "LOCATION_ARRIVAL", - "street": "Sankt-Martin-Straße", + "street": "Hohenwaldeckstraße", "countryCode": "DEU", "possibleCombineWithNext": false, "drivingSide": "RIGHT", - "maneuver": "ARRIVE", - "message": "You have arrived at Sankt-Martin-Straße" + "maneuver": "ARRIVE_LEFT", + "message": "You have arrived at Hohenwaldeckstraße. Your destination is on the left" } ], "instructionGroups": [ @@ -582,19 +582,25 @@ "firstInstructionIndex": 0, "lastInstructionIndex": 3, "groupMessage": "Leave from Vogelhartstraße. Take the Ingolstädter Straße/B13", - "groupLengthInMeters": 1713 + "groupLengthInMeters": 1720 }, { "firstInstructionIndex": 4, "lastInstructionIndex": 7, "groupMessage": "Take the Schenkendorfstraße, Isarring/B2R toward Messe / ICM, Passau, München-Ost", - "groupLengthInMeters": 6712 + "groupLengthInMeters": 6713 }, { "firstInstructionIndex": 8, - "lastInstructionIndex": 11, - "groupMessage": "Take the Ampfingstraße, Anzinger Straße. Continue to your destination at Sankt-Martin-Straße", - "groupLengthInMeters": 2454 + "lastInstructionIndex": 10, + "groupMessage": "Take the Ampfingstraße, Anzinger Straße, Sankt-Martin-Straße", + "groupLengthInMeters": 2508 + }, + { + "firstInstructionIndex": 11, + "lastInstructionIndex": 12, + "groupMessage": "Get to your destination at Hohenwaldeckstraße", + "groupLengthInMeters": 175 } ] } diff --git a/common/data/src/main/res/raw/tomtom_traffic.json b/common/data/src/main/res/raw/tomtom_traffic.json index 3005575..f460db8 100644 --- a/common/data/src/main/res/raw/tomtom_traffic.json +++ b/common/data/src/main/res/raw/tomtom_traffic.json @@ -1,4578 +1,7197 @@ { - "type": "FeatureCollection", "features" : [ - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.3944369162, 48.257052006], - [11.3943484033, 48.2569756077], - [11.3940479959, 48.2567234758], - [11.3940184916, 48.2566912756], - [11.3939930106, 48.2566604147], - [11.3939769173, 48.256630949], - [11.3939769173, 48.2566027668], - [11.3939822818, 48.256579942], - [11.3939970339, 48.2565531549], - [11.3940198327, 48.2565356875], - [11.3940547014, 48.2565182759], - [11.3941070045, 48.256503543], - [11.3941673542, 48.2564927724], - [11.3942491616, 48.2564793788], - [11.394305488, 48.2564740214], - [11.3945388401, 48.2564579491], - [11.3946313763, 48.2564485178], - [11.3946890438, 48.2564404817], - [11.3947158659, 48.2564351243], - [11.3947896267, 48.2564150339], - [11.3948915506, 48.256373458] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.3953019286, 48.2558678477], - [11.3952523077, 48.2559295146], - [11.3951932991, 48.2560059702], - [11.3951302672, 48.2560984981], - [11.3950565065, 48.2562058147], - [11.3950135911, 48.2562674812], - [11.3949706758, 48.2563117359], - [11.3949559236, 48.2563264688], - [11.3949411715, 48.2563385789], - [11.3949170316, 48.2563546512], - [11.3948915506, 48.256373458] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4109620059, 48.1293372933], - [11.4107809568, 48.1292930407], - [11.4102297629, 48.1291468558], - [11.4098918045, 48.1290583502], - [11.4097013677, 48.1289993277], - [11.4095243419, 48.128949704], - [11.4093781615, 48.1289081365], - [11.4092078412, 48.1288505125], - [11.4087357725, 48.128692242], - [11.4085359479, 48.1286251629] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4125753547, 48.1383267204], - [11.4126289988, 48.138156397], - [11.4128154124, 48.1375515627], - [11.4128422345, 48.1374603867] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4198025669, 48.1518946711], - [11.4199474061, 48.1515379527], - [11.4200587178, 48.1512617025] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4244065786, 48.2547668166], - [11.4246479774, 48.2545508936], - [11.4247606302, 48.2544542888], - [11.4248585308, 48.2543738684], - [11.4249135161, 48.2543363091] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4278585816, 48.1194640996], - [11.427721789, 48.119590168], - [11.4275581742, 48.119740353], - [11.4273771251, 48.1199120245] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Contraflow" - }, - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4085185135, 48.1284816614], - [11.4085815454, 48.1285031447], - [11.4096074904, 48.1288370855], - [11.4104228819, 48.1290543221], - [11.4108050967, 48.1291683388], - [11.4109660293, 48.1292085634], - [11.4112476612, 48.1292769845], - [11.4116365815, 48.1293668324], - [11.4118551815, 48.1294110849], - [11.4123366381, 48.1295103313], - [11.4126531387, 48.1295706399], - [11.413093021, 48.12966183], - [11.4135074223, 48.1297356211], - [11.4138145352, 48.1297865867], - [11.4145293439, 48.1298979164], - [11.4147197808, 48.1299233711], - [11.4148713256, 48.1299475391], - [11.4150014127, 48.1299635952], - [11.4156169797, 48.1300387285], - [11.4166026915, 48.1301553724], - [11.4177010561, 48.1302411908], - [11.4179518426, 48.1302586454], - [11.4181905592, 48.1302747573], - [11.4185218121, 48.1302908132], - [11.4187940563, 48.1303015545], - [11.4189496244, 48.1303055825], - [11.4192419852, 48.1303149811], - [11.419586649, 48.1303216943], - [11.4199567939, 48.1303284076], - [11.4203470553, 48.1303297503], - [11.4205710197, 48.1303297503], - [11.4208325351, 48.1303297503], - [11.4209921266, 48.1303297503], - [11.4213515426, 48.1303257223], - [11.4216358567, 48.1303082678], - [11.4218638445, 48.1302948412], - [11.4222339893, 48.1302613307], - [11.4226457084, 48.1302264775], - [11.4231472815, 48.1301714843], - [11.4233766104, 48.1301446311], - [11.4236756767, 48.1301030645], - [11.4237427319, 48.1300950085], - [11.4237762595, 48.1300923232], - [11.4245608056, 48.1299435111], - [11.4247284437, 48.1299126298], - [11.4249001051, 48.1298737483], - [11.4253533984, 48.1297651039], - [11.4266784097, 48.1293735458], - [11.4268554355, 48.129317209], - [11.4271370674, 48.129223333], - [11.4275219644, 48.1290878894], - [11.4276265706, 48.129050294], - [11.4278693105, 48.128963131], - [11.4281361903, 48.1288652262], - [11.4284298922, 48.1287552929], - [11.4286391045, 48.1286841858], - [11.4289328063, 48.1285755388], - [11.4291299487, 48.128501802], - [11.4296798016, 48.1283059905], - [11.4302189256, 48.1281074928], - [11.4307204987, 48.1279345061], - [11.4309002067, 48.1278674819], - [11.4310758913, 48.1278084581], - [11.4315265025, 48.1276756962], - [11.4319194461, 48.1275737608], - [11.4320133234, 48.1275495916], - [11.4322413112, 48.1274919661], - [11.4325497652, 48.1273592034], - [11.4326825345, 48.1273296632], - [11.4329601432, 48.1272719815], - [11.4331666733, 48.1272411545], - [11.4334174598, 48.1272116702], - [11.4337446893, 48.1271807872], - [11.4339753593, 48.1271526456], - [11.4343334342, 48.1271191331], - [11.4345600809, 48.1271016774], - [11.4348511005, 48.1270895927], - [11.434908768, 48.12708825], - [11.4352279509, 48.1270815922], - [11.4352453853, 48.1270815922], - [11.4353003705, 48.1270802495], - [11.4357442761, 48.1270869632], - [11.436063459, 48.1271083911], - [11.4366951192, 48.1271566738], - [11.4368775094, 48.1271861582], - [11.437153777, 48.1272277271], - [11.4373442138, 48.1272612956], - [11.4376379157, 48.1273175786], - [11.4377103353, 48.127331006], - [11.4379396642, 48.127376603], - [11.4382856692, 48.1274530829], - [11.4385042692, 48.127502652], - [11.4388113821, 48.1275710753], - [11.4394229258, 48.1277038375], - [11.4398923124, 48.1277950309], - [11.4405883456, 48.1278795105], - [11.4413044954, 48.1279425624], - [11.4414319004, 48.1279546469], - [11.4419965054, 48.1279666754], - [11.4424605275, 48.1279506187], - [11.442723384, 48.1279412197], - [11.4429366196, 48.1279331634], - [11.4431364442, 48.1279171067], - [11.4431793595, 48.1279117358], - [11.4432665313, 48.1279023367] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4463980103, 48.1273913731], - [11.4461928214, 48.1274503974], - [11.44579049, 48.1275670471], - [11.445431074, 48.1276662971], - [11.4449227954, 48.1277856318], - [11.4444064702, 48.1278956231], - [11.4442240799, 48.1279264498], - [11.4440309609, 48.127958675], - [11.4440229143, 48.1279600177], - [11.4437694455, 48.1279935298], - [11.4437064136, 48.1280029288], - [11.4436380173, 48.1280122719], - [11.4435548688, 48.1280230136], - [11.4432839657, 48.1280498679], - [11.4432745779, 48.1280512107], - [11.4429325963, 48.1280806945], - [11.4426268245, 48.1280968071], - [11.4422794784, 48.128111521], - [11.4422204698, 48.1281128637], - [11.4418530072, 48.1281128637], - [11.4416531826, 48.1281074928], - [11.4415016378, 48.1281035206], - [11.4414037372, 48.1281008352], - [11.4413219298, 48.1280954643], - [11.4412977899, 48.1280927789], - [11.44128572, 48.1280927789], - [11.4411998893, 48.1280874081], - [11.4407801236, 48.1280525534], - [11.4405320192, 48.1280324126], - [11.4401605333, 48.127982788], - [11.4399808253, 48.127958675], - [11.4398292805, 48.1279318206], - [11.4397032166, 48.1279117358], - [11.439386716, 48.1278500266], - [11.4390769208, 48.1277842891], - [11.4386263097, 48.1276877248], - [11.438308468, 48.1276153294], - [11.4378712679, 48.1275174221], - [11.437654009, 48.1274745106], - [11.43744882, 48.1274342846], - [11.4371551181, 48.1273819739], - [11.4369392003, 48.1273444333], - [11.4364416505, 48.1272840662], - [11.4360688234, 48.1272572674], - [11.4357670749, 48.127238469], - [11.4353017117, 48.1272357836], - [11.434998622, 48.1272451827], - [11.4346727336, 48.1272599528], - [11.434356233, 48.1272880944], - [11.434266379, 48.1273028645], - [11.43404912, 48.1273216068], - [11.4338023568, 48.127351147], - [11.4335797335, 48.127376603], - [11.4333597923, 48.1274114581], - [11.4324129725, 48.1275858453], - [11.4322949553, 48.1276139867], - [11.4320656265, 48.1276783817], - [11.431995889, 48.1276984666], - [11.4314634706, 48.127852712], - [11.4310879613, 48.1279774171], - [11.4309632386, 48.1280216709], - [11.430802306, 48.1280753236], - [11.4301022495, 48.1283261312], - [11.4297790433, 48.1284347227], - [11.4293351377, 48.1286023929], - [11.4290213192, 48.1287150119], - [11.4287544394, 48.1288156024], - [11.4286122824, 48.128870597], - [11.4282770062, 48.1289926702], - [11.4279001559, 48.129124086], - [11.4277311767, 48.1291857378], - [11.4276265706, 48.1292206476], - [11.4272698368, 48.1293480348], - [11.4269761349, 48.129448624], - [11.4265966023, 48.1295706399], - [11.4264276231, 48.1296216057], - [11.4261392857, 48.1297087676], - [11.4259461666, 48.1297624186], - [11.4257959629, 48.1298039855], - [11.4256551469, 48.1298456082], - [11.4254352058, 48.1298992591] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4580750073, 48.199023763], - [11.458084395, 48.1991163381], - [11.4581165815, 48.1993000353], - [11.4581232871, 48.1993402609], - [11.4581568147, 48.1996165315], - [11.4581796134, 48.2000792325] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4632610584, 48.1426611901], - [11.4619749392, 48.1426156067], - [11.4609731341, 48.1425431764] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4583727325, 48.1504221501], - [11.4585551227, 48.150351073], - [11.4587214197, 48.1502893907], - [11.4588890577, 48.1502303926], - [11.4590124393, 48.1501901285], - [11.4597956444, 48.1499125289], - [11.4604487623, 48.1496966109], - [11.461241355, 48.149455191], - [11.4617469514, 48.1493010105], - [11.4619843269, 48.1492326161], - [11.4621761049, 48.1491735609], - [11.4627125467, 48.1490099844], - [11.4635386671, 48.1487900361], - [11.4642534758, 48.1485888773], - [11.4646598304, 48.1484628241], - [11.4653451348, 48.1482388468] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4659607018, 48.1481476338], - [11.4657622183, 48.1482079765], - [11.465732714, 48.1482160296], - [11.4655610527, 48.1482710034], - [11.4649615789, 48.1484574554], - [11.4645230378, 48.1485929038], - [11.4644626881, 48.1486116384], - [11.4641515518, 48.1487041927], - [11.4639812315, 48.1487497708], - [11.4632396008, 48.1489536692], - [11.4624926055, 48.1491588531], - [11.4622082914, 48.1492446397], - [11.4620178546, 48.1493023526], - [11.4617885257, 48.1493707469], - [11.4612882937, 48.1495222988], - [11.4606700445, 48.1497113746], - [11.4603723193, 48.1498172925], - [11.4601403082, 48.1498923968], - [11.4598895217, 48.1499822645], - [11.4595113302, 48.150117709], - [11.459059378, 48.1502786536], - [11.4588112737, 48.150371205], - [11.4585832859, 48.1504530191], - [11.4583955313, 48.1505147011] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.469145825, 48.1823860165], - [11.4691873992, 48.1824812484], - [11.4691941048, 48.1825550194], - [11.4691726471, 48.1826556162], - [11.4691163207, 48.1828044431], - [11.46879982, 48.1836882302], - [11.4686630274, 48.1840678058], - [11.4681815709, 48.1854128958], - [11.4681332911, 48.185545676], - [11.4680581893, 48.1856234663], - [11.4679093267, 48.1856932092], - [11.4677255953, 48.1857468575], - [11.4675069953, 48.1857790465], - [11.4672495032, 48.185730763], - [11.4671033228, 48.185691868] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4671033228, 48.185691868], - [11.4672495032, 48.185730763], - [11.4675069953, 48.1857790465], - [11.4677255953, 48.1857468575], - [11.4679093267, 48.1856932092], - [11.4680581893, 48.1856234663], - [11.4681332911, 48.185545676], - [11.4681815709, 48.1854128958], - [11.4686630274, 48.1840678058], - [11.46879982, 48.1836882302], - [11.4691163207, 48.1828044431], - [11.4691726471, 48.1826556162], - [11.4691941048, 48.1825550194], - [11.4691873992, 48.1824812484], - [11.469145825, 48.1823860165] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.469581684, 48.1470171049], - [11.4694650079, 48.1470479201], - [11.4690291489, 48.1471699501], - [11.4685329402, 48.1473080864], - [11.4681654776, 48.1474113808], - [11.4680152739, 48.1474583022] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4775625969, 48.292721375], - [11.4772165919, 48.2923834264] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Slow traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4777731503, 48.1622131556], - [11.4772072042, 48.163658838], - [11.4771844054, 48.1636870155], - [11.477140149, 48.1637178765], - [11.4770838226, 48.1637326362], - [11.4770046974, 48.1637447122], - [11.4762107636, 48.1637969858], - [11.4761490727, 48.1640679132], - [11.4761343206, 48.1642221053], - [11.4761530961, 48.164392454] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.478937229, 48.1446915989], - [11.4791008438, 48.1446835452], - [11.4792242254, 48.1446795184], - [11.4796989764, 48.1446594401], - [11.4802434648, 48.144644675], - [11.4810213054, 48.1446125161], - [11.4824388529, 48.144550771] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4824388529, 48.144550771], - [11.4810213054, 48.1446125161], - [11.4802434648, 48.144644675], - [11.4796989764, 48.1446594401], - [11.4792242254, 48.1446795184], - [11.4791008438, 48.1446835452], - [11.478937229, 48.1446915989] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4834111537, 48.1336154068], - [11.4838121439, 48.1344093637], - [11.4840508605, 48.1348572701], - [11.4842091108, 48.135169745] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - }, - { - "description": "Construction work" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.486931553, 48.1366423121], - [11.4866686965, 48.1366127773], - [11.4862878228, 48.1366262022], - [11.4859471823, 48.1366369421] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4912056531, 48.1363217911], - [11.491436323, 48.1370272143] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.491436323, 48.1370272143], - [11.4912056531, 48.1363217911] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4930188264, 48.1371412133], - [11.4928458239, 48.1362171879] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4928458239, 48.1362171879], - [11.4930188264, 48.1371412133] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - }, - { - "description": "Construction work" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4941735173, 48.1360817067], - [11.4928458239, 48.1362171879] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4942660535, 48.1370942824], - [11.4941735173, 48.1360817067] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4941735173, 48.1360817067], - [11.4942660535, 48.1370942824] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - }, - { - "description": "Construction work" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4926848913, 48.1361058719], - [11.4933675135, 48.136050885], - [11.4941748584, 48.1359703904], - [11.4947515334, 48.135916746] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4956956709, 48.1378318581], - [11.4955159629, 48.1363714077], - [11.4954877998, 48.1359677054] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4954877998, 48.1359677054], - [11.4955159629, 48.1363714077], - [11.4956956709, 48.1378318581] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4905015732, 48.1945847092], - [11.4905404652, 48.1945793453], - [11.4906625057, 48.1945686175], - [11.4907832051, 48.1945592306], - [11.4908985401, 48.1945525257], - [11.4909696187, 48.1945525257], - [11.4910930003, 48.1945485028], - [11.4912794138, 48.1945511848], - [11.4915704335, 48.1945578897], - [11.4917474593, 48.1945578897], - [11.4918185378, 48.1945565487], - [11.4919244851, 48.1945485028], - [11.4920143391, 48.194539116], - [11.4920880998, 48.1945283882], - [11.4921873416, 48.1945122964], - [11.4923764373, 48.194473408], - [11.4924434925, 48.1944586573], - [11.4925346876, 48.1944372016], - [11.4926124717, 48.1944157459], - [11.4927224423, 48.1943835624], - [11.492847165, 48.1943419919], - [11.4929625, 48.1942990804], - [11.493052354, 48.1942628739], - [11.4932052399, 48.1941985066], - [11.4933245982, 48.1941435261], - [11.4934855307, 48.1940777618], - [11.4936062301, 48.1940335091], - [11.4936410988, 48.1940214402], - [11.4937604571, 48.1939852334], - [11.4938583578, 48.1939610956], - [11.4939924682, 48.1939356167], - [11.4942057038, 48.1939061148], - [11.494349202, 48.1938927049], - [11.4944216217, 48.1938886819], - [11.4945195223, 48.1938873409], - [11.4946294929, 48.1938913639], - [11.4947247113, 48.1938994099], - [11.4948185886, 48.1939114788], - [11.4949795211, 48.1939409807], - [11.4951149727, 48.1939731645], - [11.4952182377, 48.1939986433], - [11.4953335727, 48.1940348501], - [11.4954126979, 48.1940643519], - [11.495490482, 48.1940965356], - [11.4956017936, 48.194150231], - [11.4956219102, 48.1941609589], - [11.4957640673, 48.1942400771], - [11.4958324636, 48.1942843296], - [11.4958874489, 48.1943178542] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4951337482, 48.1246662223], - [11.4957318808, 48.1248110772], - [11.4958552624, 48.1248392201], - [11.4966666306, 48.1250256452], - [11.4969254638, 48.1250766155], - [11.4970220233, 48.1250981002], - [11.4970931018, 48.1251155006] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4993770028, 48.0869865588], - [11.4983456935, 48.0870214414], - [11.4980157817, 48.0869946216], - [11.4978065694, 48.0869879026], - [11.4976617302, 48.0869637704], - [11.4974525179, 48.0869101307], - [11.4971547927, 48.0868229522], - [11.4967564846, 48.0866995469], - [11.4962589348, 48.0864876744], - [11.4961422588, 48.0864380657], - [11.4960148538, 48.0863978075], - [11.4959129299, 48.0863763626], - [11.4957962538, 48.0863656122], - [11.4956621433, 48.0863576053] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4997712875, 48.1313127337], - [11.4996291305, 48.1310230602] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4996291305, 48.1310230602], - [11.4997712875, 48.1313127337] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5009045209, 48.1026372578], - [11.5008723343, 48.1025688573], - [11.5008321012, 48.1024749883], - [11.5008012558, 48.1023998706], - [11.5007677282, 48.1023556508], - [11.5007328595, 48.1023073448], - [11.5007046963, 48.1022684424] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.4994038249, 48.1120759372], - [11.5018620695, 48.1120316698] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5021074916, 48.1057915314], - [11.5020551885, 48.1056681717], - [11.5019881333, 48.1054388024], - [11.5019277836, 48.1052725119], - [11.5018459762, 48.1050499134] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.49859648, 48.1120839961], - [11.4993984605, 48.1120759372], - [11.5018660928, 48.1120316698], - [11.5022550131, 48.1120330129] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5023006106, 48.107427699], - [11.5023059751, 48.1075886096], - [11.5023140217, 48.1078850196], - [11.502318045, 48.1079802219] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5024266745, 48.11218322], - [11.5022483076, 48.1121779034], - [11.5018540228, 48.1121752172] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Left lane closed" - }, - { - "description": "Carriageway reduced to one lane" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5026801432, 48.1277078657], - [11.5026734377, 48.127482567], - [11.5026627089, 48.1269219735] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - }, - { - "description": "Lane closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5027391518, 48.12977316], - [11.5027109886, 48.1289550748], - [11.5026989187, 48.1284132953], - [11.5026801432, 48.1277078657], - [11.5026734377, 48.127482567], - [11.5026627089, 48.1269219735], - [11.5026600267, 48.1267824956], - [11.5026586856, 48.1265612211], - [11.5026506389, 48.1264042863], - [11.5026439334, 48.126293005], - [11.502638569, 48.1261682958], - [11.5026358868, 48.1260998706], - [11.5026345457, 48.1260703857], - [11.5026332046, 48.1260395579], - [11.5026305224, 48.1259697898], - [11.5026291813, 48.125909421], - [11.5026291813, 48.1258356804], - [11.5026291813, 48.1257511974], - [11.5026197935, 48.1256438871], - [11.5026197935, 48.1255969457] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Left lane closed" - }, - { - "description": "Carriageway reduced to one lane" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5028155948, 48.1322408193], - [11.5028129126, 48.1320999572], - [11.5028048659, 48.131775436] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Left lane closed" - }, - { - "description": "Carriageway reduced to one lane" - }, - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5029108132, 48.1302667013], - [11.5029134954, 48.1303592328], - [11.5029497052, 48.1310203749], - [11.5029564108, 48.1314213748], - [11.5029644574, 48.1317902048] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Left lane closed" - }, - { - "description": "Carriageway reduced to one lane" - }, - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5030181016, 48.1396141678], - [11.503011396, 48.1394599578], - [11.5029832328, 48.1387142949], - [11.5029711629, 48.1383535694], - [11.5029644574, 48.1379284034], - [11.5029523874, 48.1373919766], - [11.5029483641, 48.1372189651], - [11.5029322709, 48.1368756814], - [11.5029255654, 48.1366986408], - [11.5029202009, 48.1364572157], - [11.5029134954, 48.1362171879], - [11.5029014255, 48.1357893751], - [11.5028987433, 48.1355533158], - [11.5028960611, 48.1355184662], - [11.5028920377, 48.1354433408], - [11.5028893555, 48.1353990935], - [11.5028880144, 48.1353642438], - [11.5028866733, 48.1352730638], - [11.50288265, 48.1350638528], - [11.50288265, 48.1349994671], - [11.5028786267, 48.1347097585], - [11.5028611923, 48.1341800108], - [11.5028598512, 48.1341210502], - [11.5028518046, 48.1338393919], - [11.5028491224, 48.1337669493] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5026560033, 48.121427498], - [11.502843758, 48.1214127262], - [11.5029684807, 48.1213966115], - [11.5030851568, 48.121377867] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Left lane closed" - }, - { - "description": "Carriageway reduced to one lane" - }, - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5030905212, 48.1423098328], - [11.5030932034, 48.1422735895], - [11.5030918623, 48.142163629], - [11.5030918623, 48.1421354956], - [11.5030905212, 48.1419772101], - [11.5030891801, 48.1417733959] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Left lane closed" - }, - { - "description": "Carriageway reduced to one lane" - }, - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5030154194, 48.1337736621], - [11.5030181016, 48.1338367068], - [11.5030274893, 48.1341303921], - [11.5030288304, 48.1341773816], - [11.5030328537, 48.1346414006], - [11.503036877, 48.1350396872], - [11.5030422414, 48.1352703788], - [11.5030422414, 48.135349476], - [11.5030422414, 48.1353910383], - [11.5030449237, 48.1354379708], - [11.503048947, 48.1355184662], - [11.5030516292, 48.1355519732], - [11.5030502881, 48.1358041427], - [11.5030610169, 48.1363794627], - [11.503062358, 48.1364317642], - [11.5030851568, 48.13692127], - [11.5030945445, 48.137190829], - [11.5031025911, 48.1374348797], - [11.5031160022, 48.1376011781], - [11.5031253899, 48.138067907], - [11.5031347777, 48.1382596539], - [11.5031508709, 48.138574849], - [11.5031709875, 48.1391354271], - [11.5031937863, 48.1396302768], - [11.5031964685, 48.139689287], - [11.5031978096, 48.139750982], - [11.5032125617, 48.1400943024], - [11.5032206083, 48.1402780434], - [11.5032273139, 48.1404268814], - [11.503228655, 48.1405207929], - [11.5032340194, 48.1407755668], - [11.5032340194, 48.1408386029], - [11.5032514537, 48.1412811956], - [11.503254136, 48.141438085], - [11.5032581593, 48.1416057127], - [11.5032554771, 48.1417063339], - [11.503254136, 48.1417787094], - [11.5032581593, 48.1419798948] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5014436449, 48.1029564217], - [11.501444986, 48.1029443874], - [11.5014516915, 48.1028960819], - [11.5014771725, 48.102775402], - [11.5015308167, 48.1025929822], - [11.5015670265, 48.1025299551], - [11.5015951897, 48.1024817052], - [11.5016153062, 48.1024454898], - [11.5016448105, 48.1023891795], - [11.5016930903, 48.1023180919], - [11.5017950143, 48.1021732295], - [11.5019398535, 48.1020082718], - [11.5020377542, 48.1019090282], - [11.5021611358, 48.1018030674], - [11.5022483076, 48.1017360092], - [11.5023341383, 48.1016729811], - [11.5024521555, 48.1015965748], - [11.5025151874, 48.1015549851], - [11.5028598512, 48.1013591829], - [11.5031589175, 48.1012049698], - [11.5033252145, 48.101119103] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.502997985, 48.1255782027], - [11.5030771102, 48.1255674605], - [11.5032045151, 48.1255553754], - [11.5032876636, 48.1255460319], - [11.5034767593, 48.1255285757], - [11.5038415397, 48.1254789487] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5033453311, 48.149288931], - [11.5034593249, 48.1498723205], - [11.5036873127, 48.1504208079], - [11.5037610735, 48.1505656461], - [11.5039407815, 48.1508875321] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5042626465, 48.1211806854], - [11.503523698, 48.1213080926], - [11.5031937863, 48.1213604094], - [11.5030851568, 48.121377867], - [11.5029684807, 48.1213966115], - [11.502843758, 48.1214127262], - [11.5026560033, 48.121427498] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5062340702, 48.0989371736], - [11.5062380935, 48.098843298], - [11.5062327291, 48.0987842409], - [11.5062112714, 48.0987373309], - [11.5061670149, 48.0986890215], - [11.506116053, 48.098640768], - [11.5060932542, 48.0986179847], - [11.5060717965, 48.0985991759], - [11.506065091, 48.0985777361], - [11.5059913303, 48.0985804231], - [11.5059323217, 48.0985804231], - [11.5056211854, 48.0985790796], - [11.5040225888, 48.0985616702], - [11.5029805506, 48.0985562963] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5071272458, 48.1397308459], - [11.5067611242, 48.1397482972], - [11.5065049733, 48.1397617213], - [11.5053060259, 48.139767091], - [11.5048634614, 48.1397697758], - [11.5044718588, 48.1397711182], - [11.5043605472, 48.1397724606], - [11.5041687692, 48.1397724606], - [11.5039568747, 48.139773803], - [11.5036578084, 48.1397751454], - [11.503357401, 48.1397684334], - [11.5031978096, 48.139750982] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5086708571, 48.1060624293], - [11.5083100999, 48.1059431001], - [11.5076516176, 48.105642649], - [11.5068134273, 48.1052765418], - [11.5065049733, 48.1051357177], - [11.5063936616, 48.105082097], - [11.5061911548, 48.104985546], - [11.5059376861, 48.1048634717], - [11.5055621768, 48.104683802], - [11.5052885915, 48.1045537229], - [11.5050619448, 48.1044370209], - [11.5049291755, 48.1043713095], - [11.5048098172, 48.1043096279], - [11.5046046282, 48.104191582], - [11.5045429374, 48.1041526811], - [11.5044852699, 48.1041151795], - [11.5044262613, 48.1040695618], - [11.5043565239, 48.1040065366], - [11.5043028797, 48.1039528587], - [11.5042210723, 48.1038643657], - [11.5041231717, 48.1037610956], - [11.5040842796, 48.1037128469], - [11.5040427054, 48.1036498212], - [11.5039877201, 48.1035626151], - [11.5039112772, 48.1034258164], - [11.5038656796, 48.1033306056], - [11.5037771667, 48.1031254065], - [11.5037060882, 48.1029390139], - [11.5036792661, 48.1028424588], - [11.5036551262, 48.1027164053], - [11.5036336685, 48.1025634837], - [11.5036175753, 48.1023918103], - [11.5036068464, 48.1022201923], - [11.5036095286, 48.1020418007], - [11.5036229397, 48.10189162], - [11.5036470796, 48.1017091971], - [11.5036739017, 48.1015657324], - [11.5037007238, 48.1014597709], - [11.5037436391, 48.1013310271], - [11.5037583912, 48.1012974977], - [11.5037785078, 48.1012559078], - [11.5038388575, 48.101100351], - [11.5039206649, 48.1009434504], - [11.5040091778, 48.1007865493], - [11.5041164662, 48.1006470564], - [11.5041835214, 48.1005773098], - [11.504268011, 48.1004780634], - [11.5044664944, 48.1002782827], - [11.5048741902, 48.0999148242], - [11.5050243939, 48.0998007986], - [11.5052577461, 48.0996237981], - [11.5058062578, 48.0992214863], - [11.5059537793, 48.0991182069], - [11.5061240996, 48.0990095534], - [11.5062340702, 48.0989371736], - [11.5066967512, 48.0986970824], - [11.5069113279, 48.0986259897], - [11.5069435145, 48.0986152978], - [11.5070508028, 48.0985790796] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5086373294, 48.1531647229], - [11.508823743, 48.1533564693], - [11.5093293394, 48.1539157118] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5089028681, 48.097982288], - [11.5090342964, 48.0979541304], - [11.5092515553, 48.0979098508], - [11.509542575, 48.0978589095], - [11.5095734204, 48.0978535355] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5096485222, 48.1823538254], - [11.5093963946, 48.1824906374], - [11.5090222264, 48.1826945135], - [11.5089296902, 48.1827360934], - [11.5088344718, 48.1827789587], - [11.5086480583, 48.1828634596], - [11.5085474754, 48.1828983329], - [11.5085206534, 48.1829077219], - [11.5084589625, 48.182931865], - [11.5080941821, 48.1830659929], - [11.5079681183, 48.1831129376] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5100508536, 48.1544642678], - [11.5099905039, 48.1544508475], - [11.5098979677, 48.1544334012], - [11.5098242069, 48.1544038766], - [11.5097598339, 48.1543730659], - [11.5096726621, 48.1543180427], - [11.5095465983, 48.1542242123], - [11.5095077063, 48.1541195896], - [11.509413829, 48.1540109406], - [11.5093293394, 48.1539157118], - [11.508823743, 48.1533564693], - [11.5086373294, 48.1531647229], - [11.5085944141, 48.1531338555], - [11.5085582043, 48.1531164087], - [11.5080780889, 48.1528737187], - [11.5077629293, 48.1527623829], - [11.507489344, 48.1526752042], - [11.5068818236, 48.1524927938], - [11.5054428185, 48.1521347374], - [11.5048889423, 48.1519966141], - [11.5047776307, 48.1519483548], - [11.5046837534, 48.1519054078], - [11.504601946, 48.15185178], - [11.5045415963, 48.1518021784], - [11.504500022, 48.1517538629], - [11.504447719, 48.1517029192], - [11.5042760576, 48.1514454034], - [11.5042492355, 48.1514038541], - [11.5041473116, 48.1512294918], - [11.504076233, 48.1511168663], - [11.5040534342, 48.1510792871], - [11.5039823557, 48.1509559242], - [11.5039407815, 48.1508875321], - [11.5037610735, 48.1505656461], - [11.5036873127, 48.1504208079], - [11.5034593249, 48.1498723205], - [11.5033453311, 48.149288931] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5079681183, 48.1831129376], - [11.5080941821, 48.1830659929], - [11.5084589625, 48.182931865], - [11.5085206534, 48.1829077219], - [11.5085474754, 48.1828983329], - [11.5086480583, 48.1828634596], - [11.5088344718, 48.1827789587], - [11.5089296902, 48.1827360934], - [11.5090222264, 48.1826945135], - [11.5093963946, 48.1824906374], - [11.5096485222, 48.1823538254], - [11.5096793677, 48.1823351031], - [11.5097263063, 48.1823082772], - [11.5100320781, 48.1821365908], - [11.5100763346, 48.1821111061], - [11.5101286377, 48.1820789148], - [11.5102667714, 48.1819957539], - [11.5106744672, 48.1817503503] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 7, - "events": [ - { - "description": "Lane closed" - }, - { - "description": "Right lane closed" - }, - { - "description": "Carriageway reduced to two lanes" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.511416098, 48.1249317613], - [11.5110835041, 48.1249813889], - [11.5098537112, 48.1251530428], - [11.5094165112, 48.1252147553], - [11.5091080571, 48.1252522975], - [11.5088612939, 48.125287154], - [11.508733889, 48.1253032675], - [11.5086561049, 48.1253032675], - [11.5085702742, 48.1253166954], - [11.5084053184, 48.1253394668], - [11.5079694594, 48.1253958079], - [11.5077535416, 48.1254252933], - [11.5075604225, 48.1254508062], - [11.5065049733, 48.1255916305], - [11.5062179769, 48.1256238013], - [11.505961826, 48.1256532865], - [11.5054186786, 48.1257136556], - [11.5052711571, 48.125729713], - [11.5052483584, 48.1257323985], - [11.5049171055, 48.1257673107], - [11.5048916246, 48.1257686535], - [11.504820546, 48.1257753114], - [11.5044919754, 48.1258048525], - [11.5039917434, 48.1258410515], - [11.5033050979, 48.1258866499], - [11.5031535531, 48.1258960493], - [11.5030274893, 48.1259027631], - [11.5028786267, 48.1259054487], - [11.5026291813, 48.125909421], - [11.5024762953, 48.125909421], - [11.5019532646, 48.1259080783], - [11.5011714007, 48.1258826215], - [11.5007368828, 48.1258571648], - [11.4998128618, 48.1257726259], - [11.4996344949, 48.1257525402], - [11.4994923378, 48.1257364269], - [11.4993246997, 48.1257109701], - [11.4989156629, 48.125650601], - [11.4988338555, 48.1256372291], - [11.4985803867, 48.1255982885], - [11.4974337424, 48.1253649798], - [11.4970796908, 48.1252925252], - [11.4969254638, 48.1252576686], - [11.4957841838, 48.1249934741], - [11.494913807, 48.1247829343], - [11.4947971309, 48.1247520499], - [11.4946603383, 48.1247145073], - [11.4944806303, 48.1246662223], - [11.4943156744, 48.1246233085], - [11.493810078, 48.1245079949], - [11.4933299626, 48.1244100816], - [11.4930738116, 48.1243604535], - [11.4928900803, 48.1243242535], - [11.4924287404, 48.1242343967], - [11.4919218029, 48.1241552824], - [11.4919003452, 48.1241525968], - [11.4917018617, 48.1241231107], - [11.4914671684, 48.124090883], - [11.4914068187, 48.1240828821] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5175275112, 48.054802749], - [11.5173263456, 48.0548456651], - [11.5169387664, 48.0549033161], - [11.5164814497, 48.0549355311], - [11.5159369613, 48.054939509], - [11.5155145134, 48.0549046607], - [11.5151068176, 48.054849699], - [11.5143276359, 48.0547128828], - [11.5132413412, 48.0545761223] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - }, - { - "description": "New roadworks layout" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5175811554, 48.1118694299], - [11.5175570155, 48.111908325], - [11.5175033713, 48.1120115787], - [11.517421564, 48.1121993376], - [11.5173786486, 48.1122918456], - [11.5173330511, 48.1124139023], - [11.5172311271, 48.1127370908], - [11.5171989406, 48.112865862], - [11.5171613897, 48.1130737084], - [11.5171452964, 48.1131850184] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5178225542, 48.0945624563], - [11.5174550916, 48.0945584256], - [11.5172968413, 48.0945557384] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.512173822, 48.1246796504], - [11.5125131215, 48.1245924799], - [11.5130562688, 48.124499938], - [11.5130777265, 48.1244972524], - [11.5134881045, 48.1244302238], - [11.5136476959, 48.124407396], - [11.5141559745, 48.12430551], - [11.5144523586, 48.1242518534], - [11.514559647, 48.1242276827], - [11.5146454776, 48.1242075964], - [11.5148560311, 48.1241700534], - [11.5149351562, 48.1241539396], - [11.515022328, 48.124136483], - [11.515368333, 48.1240640826], - [11.5157867576, 48.1239916821], - [11.5163030828, 48.1238991391], - [11.5167389418, 48.1238253956], - [11.5170017983, 48.1237797954], - [11.5174322928, 48.1237033101], - [11.5180170144, 48.1236000799], - [11.5183978881, 48.1235397083], - [11.5186674501, 48.1234873937], - [11.5188163127, 48.1234511931], - [11.5189531053, 48.1233988784], - [11.5190858747, 48.1233318483], - [11.5191730465, 48.1232808763], - [11.5192065741, 48.1232513898] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5165659393, 48.0762577411], - [11.5168247725, 48.0762644615], - [11.5170125271, 48.0762658056], - [11.5171332265, 48.0762644615], - [11.5172364916, 48.0762644615], - [11.51731964, 48.0762604293], - [11.5174376572, 48.0762563971], - [11.5175677444, 48.0762510208], - [11.5176978315, 48.0762510208], - [11.5178386475, 48.0762577411], - [11.5179915334, 48.076273814], - [11.5182463432, 48.0763033275], - [11.5184220279, 48.0763234325], - [11.5185802783, 48.076332841], - [11.518718412, 48.0763341851], - [11.5188753213, 48.0763368732], - [11.518884709, 48.0763368732], - [11.519230714, 48.0763475698], - [11.5197456981, 48.0763743951], - [11.5200823153, 48.0763838036], - [11.5202982331, 48.0763878358], - [11.5204672123, 48.0763838036], - [11.5207488443, 48.0763757392] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5206911768, 48.1243068528], - [11.5209647621, 48.1244905383], - [11.5210264529, 48.1245079949] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5221905316, 48.076332841], - [11.5218472089, 48.0763422495], - [11.5208547915, 48.076373051] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5202848221, 48.0763878358], - [11.5202982331, 48.0763878358], - [11.5204672123, 48.0763838036], - [11.5207609142, 48.0763757392], - [11.5208521093, 48.076373051], - [11.5218472089, 48.0763422495], - [11.5221905316, 48.076332841] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5243523921, 48.1779751441], - [11.52274709, 48.1780998952], - [11.5213805045, 48.1781414229] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5246367062, 48.2007953996], - [11.5245803798, 48.2006317642], - [11.5245481933, 48.2005365661], - [11.5244087185, 48.199922299], - [11.524389943, 48.1998284403], - [11.5243497099, 48.1996580976], - [11.5243175234, 48.1995092638], - [11.524300089, 48.1994113818], - [11.5242960657, 48.1993899282], - [11.5242679025, 48.1992437194], - [11.5241968239, 48.198868223], - [11.5241807307, 48.1987904528], - [11.5241659785, 48.198719331], - [11.5240747834, 48.1982258333], - [11.524043938, 48.198058167], - [11.5239956583, 48.197768535], - [11.5239889527, 48.1977014344] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Slow traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5282684172, 48.1301285751], - [11.528252324, 48.1301205191], - [11.5281128491, 48.1300507566], - [11.5277427043, 48.129858979], - [11.5270855631, 48.1295036179], - [11.5262648071, 48.1290570075], - [11.5262366439, 48.1290409511], - [11.5260247494, 48.1289269342], - [11.5258638169, 48.1288330574], - [11.5255137886, 48.1286493315], - [11.5252522732, 48.128501802], - [11.5252334977, 48.1284910604], - [11.5250993873, 48.128414638], - [11.5246742572, 48.1281665163], - [11.5244167651, 48.1280002434], - [11.5242410804, 48.1278942804], - [11.523979565, 48.1277253211], - [11.5235276128, 48.1274074859], - [11.5230930949, 48.1270949637], - [11.5228409673, 48.1269085461], - [11.5225714053, 48.1267087562], - [11.5224627758, 48.1266283029], - [11.5221918727, 48.1264297988], - [11.5220577623, 48.1263318892], - [11.5220443512, 48.1263211471], - [11.5219102408, 48.1262112083] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5283274258, 48.1520234559], - [11.5279908086, 48.1519188287], - [11.5276179815, 48.151823596] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5271016563, 48.1820279452], - [11.5277963484, 48.1820413583], - [11.5286841596, 48.1820386757], - [11.5293976272, 48.1820641604], - [11.5294780935, 48.1820292865], - [11.5295411254, 48.1820212387] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5324432756, 48.2521851686], - [11.5324151124, 48.2520376594], - [11.5324043835, 48.2519893826], - [11.5323869492, 48.2519222973], - [11.5323319639, 48.251819046], - [11.5322742964, 48.2517358867], - [11.5322112645, 48.2516661778], - [11.5321334804, 48.2516205796], - [11.5319926645, 48.2515561728], - [11.5318411196, 48.2515199509], - [11.5316426362, 48.2514998586], - [11.5314682926, 48.251511914], - [11.5313730742, 48.2515307226], - [11.5312791969, 48.2515655492], - [11.5311866606, 48.251609808], - [11.5310981477, 48.2516701963], - [11.5310284103, 48.2517412446], - [11.5309653784, 48.2518217249], - [11.5309372152, 48.2519062236], - [11.5309238042, 48.2520228694], - [11.5309144164, 48.2521275156], - [11.5309197808, 48.2522146927], - [11.5309720839, 48.2525043516] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Queuing traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5276380981, 48.1890781412], - [11.5280551816, 48.1890593655], - [11.5281128491, 48.1890566833], - [11.5282201375, 48.1890499777], - [11.5284373964, 48.1890365665], - [11.528650632, 48.1890285197], - [11.5288263167, 48.1890151085], - [11.5289792026, 48.1890003562], - [11.5291454996, 48.1889735337], - [11.52929168, 48.1889413467], - [11.5294311548, 48.1888877018], - [11.5295344199, 48.1888407624], - [11.5296309794, 48.1887871173], - [11.5297074224, 48.1887334721], - [11.5297986175, 48.1886650745], - [11.5298737193, 48.1885779009], - [11.5299313868, 48.1885081619], - [11.5299729611, 48.1884317171], - [11.5300131942, 48.1883364963], - [11.5300426985, 48.1881903118], - [11.5300507451, 48.1881072167], - [11.5300520862, 48.1880884407], - [11.5300628151, 48.1879663962], - [11.5300668384, 48.1879087268], - [11.5300842727, 48.1877813173], - [11.5301245059, 48.1876700013], - [11.5302022899, 48.1875694144], - [11.5302693452, 48.1875036976], - [11.5303270127, 48.1874473687], - [11.5304141844, 48.1873937222], - [11.5304825808, 48.1873575107], - [11.5305818225, 48.1873078876], - [11.5307078863, 48.1872622879], - [11.530819198, 48.1872341234], - [11.5308808888, 48.1872247352], - [11.5309694017, 48.1872099823], - [11.5310807134, 48.1871952295], - [11.5312577392, 48.1871845001], - [11.531512549, 48.1871657237], - [11.5317499245, 48.1871549944], - [11.5320168043, 48.1871321945], - [11.5323681737, 48.1871093945], - [11.5324499811, 48.1871040299], - [11.5327289308, 48.1870852534], - [11.5329850818, 48.1870705005], - [11.5335443224, 48.1870222183] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Slow traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5350088085, 48.1450724699], - [11.5349712576, 48.144941039], - [11.53492566, 48.1447036794], - [11.5348559226, 48.1443228057], - [11.5348371471, 48.1442235879], - [11.5348291005, 48.1441779499], - [11.5347432698, 48.1435396288], - [11.5347244943, 48.1434162478], - [11.5346990133, 48.1432552816], - [11.5346856023, 48.14318151], - [11.5346735324, 48.1429924101], - [11.5346520747, 48.1429079554], - [11.5346319581, 48.1428341832], - [11.5346198882, 48.1427523569], - [11.534605136, 48.1426611901], - [11.5345984305, 48.1426236047], - [11.5345809962, 48.1425203567], - [11.5345635618, 48.1424211354], - [11.5345313753, 48.1422145823], - [11.5345260109, 48.1421770525], - [11.5345219876, 48.1421394667], - [11.5345099176, 48.1420804593], - [11.5345005299, 48.1420415871], - [11.5344924833, 48.1419892913], - [11.5344710256, 48.1418055565], - [11.5344616379, 48.1417317828], - [11.5344535912, 48.1416821714], - [11.5344227458, 48.141493066], - [11.5344066526, 48.1413938428], - [11.5344053115, 48.1413857886], - [11.5343664194, 48.1409955495], - [11.534335574, 48.1407018475], - [11.5343074108, 48.1404335934], - [11.5343007053, 48.1401117537], - [11.5343033875, 48.1400191838], - [11.5343060697, 48.1399226425], - [11.534322163, 48.1394277956], - [11.5343409384, 48.1391769864], - [11.534347644, 48.1390509101], - [11.5343664194, 48.1387585953], - [11.5344053115, 48.1382959], - [11.534412017, 48.1381953282], - [11.5344160403, 48.138112152], - [11.5344294513, 48.1379096649], - [11.5344240869, 48.1378291732], - [11.5344200636, 48.1377487374], - [11.5344146992, 48.1376092329], - [11.5343972648, 48.1374523318], - [11.5343892182, 48.1373598131], - [11.534373125, 48.137165322], - [11.5343208219, 48.1367790783], - [11.5343033875, 48.1366476821], - [11.5342644955, 48.1363915452], - [11.534220239, 48.1361689137], - [11.5341451372, 48.1358041427], - [11.534116974, 48.1356767156], - [11.5340593065, 48.1354205739], - [11.5340338255, 48.1352971734], - [11.5340070034, 48.135146978], - [11.5339721347, 48.1349927545], - [11.533937266, 48.1348345029], - [11.5339091028, 48.1346789359], - [11.5338822807, 48.1345354514], - [11.5338433887, 48.1343610878], - [11.5337977911, 48.1341773816], - [11.5337535347, 48.1340553207], - [11.533732077, 48.1339922763], - [11.5336596574, 48.1338232811], - [11.5336060132, 48.1337280708], - [11.5335832144, 48.1336851645], - [11.5335228647, 48.1335872687], - [11.5334772671, 48.1335161683], - [11.5334397162, 48.1334638638], - [11.5334021653, 48.1334102167], - [11.5333833898, 48.1333874489], - [11.5333418156, 48.1333378294], - [11.5332801248, 48.1332788119], - [11.5332103873, 48.1331943412], - [11.5330414082, 48.1330280285], - [11.5328241492, 48.1328576876], - [11.5325331296, 48.1326699483], - [11.532307824, 48.1325076617], - [11.5321683491, 48.1324205045], - [11.5321106816, 48.1323802824], - [11.5320261921, 48.1323333472], - [11.5319712068, 48.1322944676], - [11.5318370963, 48.1322126245], - [11.5316962804, 48.132128152], - [11.5316091086, 48.1320731609], - [11.5314803625, 48.1319954013], - [11.5311866606, 48.1318102881], - [11.5310042704, 48.1317003611], - [11.5308165158, 48.1315876927], - [11.5306917931, 48.1315125616], - [11.5305737759, 48.1314334585], - [11.5305281783, 48.1314053192], - [11.5304530765, 48.1313583272] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5363096799, 48.1536193437], - [11.5365135277, 48.1536743117], - [11.5365416909, 48.1536622892], - [11.5365658308, 48.1536542369], - [11.5367374922, 48.1536072652], - [11.5368783082, 48.1535643756] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5368984247, 48.199938389], - [11.5366395916, 48.2007081908], - [11.5362117792, 48.2019245758], - [11.5361500884, 48.2020935702], - [11.5361111964, 48.2022732903], - [11.5360870565, 48.202607198], - [11.5360655988, 48.2028083684], - [11.5360763277, 48.2029277519], - [11.536105832, 48.2029947897], - [11.5361567939, 48.2030725535], - [11.5362184848, 48.2031342841], - [11.5362935866, 48.2031879141], - [11.5366650726, 48.2034507565], - [11.5366932358, 48.2035137715], - [11.5367160345, 48.2035929311], - [11.5367160345, 48.2037578978] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Slow traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5370030309, 48.1534946449], - [11.5369829143, 48.153167407], - [11.5369560922, 48.1527395677], - [11.5369426812, 48.1524176933], - [11.5369198824, 48.1520958728], - [11.5369064714, 48.1518061488], - [11.5369051303, 48.1517578892], - [11.5369037892, 48.1517243927], - [11.5369037892, 48.1516854719], - [11.5369024481, 48.1516090281], - [11.5368930603, 48.1514749297], - [11.5368850137, 48.1513354625], - [11.5368528272, 48.1508929006], - [11.5367884542, 48.150061395], - [11.536785772, 48.1500252131], - [11.5367589499, 48.1496684257], - [11.5367307867, 48.1492755094], - [11.5366610492, 48.1485432432], - [11.5366409327, 48.1484104789], - [11.5366355683, 48.1483689271], - [11.5366315449, 48.1483407412], - [11.5365792419, 48.1478982094], - [11.5365510787, 48.1476983893], - [11.5365470554, 48.1476715452] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5402686204, 48.1262152366], - [11.5401197578, 48.1264861387], - [11.5400795246, 48.1265665922], - [11.540032586, 48.126649731], - [11.5399977173, 48.1267141272], - [11.5399789418, 48.12674764], - [11.5398448313, 48.1269756274], - [11.5395886804, 48.1273242923] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5444877352, 48.176448987], - [11.5444072689, 48.1764543528], - [11.5441296602, 48.1764771575], - [11.5438520516, 48.1764972233], - [11.5435570086, 48.1765173451], - [11.5428851153, 48.1765696615], - [11.5426946784, 48.1765763688], - [11.5423258747, 48.1765938076], - [11.5422105397, 48.1765978319], - [11.5420791115, 48.1765978319], - [11.5419302489, 48.1765924662], - [11.5416767801, 48.1765750273], - [11.5415359641, 48.1765629543], - [11.5413897837, 48.1765401497], - [11.5412610377, 48.1765160036], - [11.5411765481, 48.1765012477], - [11.5408305432, 48.176422158], - [11.5408090855, 48.1764154507], - [11.5407353247, 48.1763953289], - [11.5406669284, 48.1763765486], - [11.5406079198, 48.1763604512], - [11.5405502523, 48.1763295977], - [11.5404456462, 48.1762839883], - [11.5403933431, 48.1762518492], - [11.540237775, 48.1761740447], - [11.54012244, 48.1761123376], - [11.5400138105, 48.1760520278], - [11.5398756767, 48.1759608084], - [11.5397134031, 48.1758387909], - [11.5396114792, 48.1757475711], - [11.5395176018, 48.1756469608], - [11.5394089724, 48.17553165], - [11.5393150951, 48.1754029241], - [11.5392453576, 48.1752942643], - [11.539160868, 48.1751346837], - [11.539134046, 48.1750676094], - [11.5391125883, 48.1750086398], - [11.5390978361, 48.1749657122], - [11.5390683318, 48.1748557099], - [11.5390294398, 48.1747095429], - [11.5390079821, 48.1745875225], - [11.5389610435, 48.1743179363], - [11.5389409269, 48.1741556696], - [11.5389395858, 48.174146279] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Heavy traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5492714549, 48.1122288305], - [11.5491963531, 48.1122234579], - [11.5487873162, 48.1121926219], - [11.5487001444, 48.1121899356], - [11.5486196781, 48.11218322], - [11.5481838192, 48.1121456683], - [11.5476500596, 48.1121001137], - [11.5474421884, 48.1120853392], - [11.5470894779, 48.1120504737], - [11.5469178165, 48.112034356], - [11.5464336778, 48.1119740268], - [11.5463170017, 48.1119632817], - [11.5458409096, 48.1119351318], - [11.5456209685, 48.1119163838], - [11.5455726887, 48.1119123544], - [11.5455150212, 48.1119096681], - [11.5448686088, 48.1118748025], - [11.5447090174, 48.1118627142], - [11.5445252861, 48.1118453094], - [11.5443992223, 48.1118385937], - [11.5442825462, 48.1118278486], - [11.5440277363, 48.1117996986], - [11.5438802148, 48.1117728357], - [11.5436884369, 48.1117326534], - [11.5436294283, 48.1117192219], - [11.543382665, 48.1116588924], - [11.5430554355, 48.1115931342], - [11.5429132785, 48.1115569252], - [11.5426034833, 48.1114442685], - [11.5424412097, 48.1113839386], - [11.5422091986, 48.1112980887], - [11.5420415605, 48.1112391018], - [11.5419007446, 48.1111841443], - [11.5416794623, 48.1111076962], - [11.5415158476, 48.1110593984], - [11.5412623788, 48.1109789206], - [11.5410129334, 48.110917247], - [11.5407487358, 48.1108582037], - [11.5405703689, 48.1108246805], - [11.5404523517, 48.1108059321], - [11.5402713026, 48.1107750952], - [11.5399910117, 48.1107429152], - [11.5397938694, 48.1107200813], - [11.539557835, 48.1107040192], - [11.5393848325, 48.110702676], - [11.5390804018, 48.1106986465], - [11.5386794115, 48.1106838717], - [11.5386432017, 48.1106825285], - [11.5385654176, 48.1106811853], - [11.5384769047, 48.1106825285], - [11.5383280421, 48.1106811853], - [11.537235042, 48.1106745254], - [11.5371049548, 48.1106704959], - [11.5369923021, 48.1106704959], - [11.5368622149, 48.1106651232], - [11.5367173756, 48.1106610937], - [11.5363955106, 48.1106584074], - [11.5362037326, 48.110655721], - [11.5360776688, 48.1106597505], - [11.53583627, 48.1106570642], - [11.5355586613, 48.1106543779], - [11.5350892748, 48.1106409461], - [11.5348545815, 48.1106356294], - [11.5345568563, 48.1106235409], - [11.5343798305, 48.1106181682], - [11.5341116096, 48.1106074228], - [11.5339547003, 48.1105913607], - [11.5326216425, 48.1104478648] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5484600867, 48.1241499111], - [11.5486330892, 48.1242370824], - [11.5487269665, 48.1242893962], - [11.5488543714, 48.1243913382], - [11.5489039923, 48.1244315666], - [11.5489603187, 48.1244744806], - [11.5490260328, 48.1245147089], - [11.5490971113, 48.1245817374], - [11.5491735543, 48.1247038208], - [11.5493908132, 48.1248848193], - [11.5496590341, 48.1250766155] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5497757102, 48.1389651064], - [11.549708655, 48.1389851869], - [11.5496174599, 48.1389999537], - [11.5495812501, 48.1390012961], - [11.5494551862, 48.1390106931], - [11.5492379273, 48.139022775], - [11.5491118635, 48.1390254598], - [11.5490327383, 48.1390308296], - [11.5486317481, 48.1390697041], - [11.5478713418, 48.1391890682], - [11.5472946669, 48.1392815836], - [11.5471337343, 48.1393070896], - [11.5469580497, 48.1393205139], - [11.5468132104, 48.1393352246], - [11.5458516384, 48.1394036321], - [11.5455203856, 48.1394264532] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Queuing traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5456504728, 48.2513000515], - [11.5461212004, 48.2512705269], - [11.5466656889, 48.2512343048], - [11.5475280191, 48.2511820087], - [11.5478029455, 48.2511619163], - [11.5483112241, 48.2511243546], - [11.5483635272, 48.2511203361], - [11.5488865579, 48.2510841139], - [11.5501512195, 48.2510009534], - [11.5506635214, 48.2509741634], - [11.5511557068, 48.2509459781], - [11.5513796712, 48.2509299041], - [11.5517055596, 48.2509084163], - [11.5520757045, 48.2508843052] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Queuing traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5577847863, 48.1865287197], - [11.5571584905, 48.1864697074], - [11.5566166843, 48.1864267894], - [11.5564557518, 48.1864120363], - [11.556317618, 48.1863999656], - [11.5561687554, 48.1863865537], - [11.5560292805, 48.1863758241], - [11.5559126045, 48.1863650946], - [11.5557422842, 48.1863490003], - [11.5555263664, 48.1863275412], - [11.5553895737, 48.1863181529], - [11.5552594866, 48.1863033998], - [11.5549416448, 48.1862779171], - [11.5545513834, 48.1862417049], - [11.554469576, 48.1862363401], - [11.5542804803, 48.1862202457], - [11.5540068949, 48.186194763], - [11.5537480618, 48.1861733039], - [11.5536917354, 48.1861679391], - [11.5536783243, 48.1861665979], - [11.553340366, 48.1861451387], - [11.5530480052, 48.1861277032], - [11.5527382101, 48.1861116088], - [11.552660426, 48.1861075852], - [11.5522969867, 48.1861035616], - [11.5518691744, 48.1860981968], - [11.5516867841, 48.1861035616] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Queuing traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5586243178, 48.1363512702], - [11.5558468903, 48.1363781202] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Slow traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5640008057, 48.1393352246], - [11.5635367836, 48.1393392518], - [11.5631652976, 48.1393567033], - [11.5630217994, 48.139362073], - [11.5629829074, 48.1393634154], - [11.5626449491, 48.139362073], - [11.5624813343, 48.1393661003], - [11.5619314815, 48.139378182], - [11.5613212789, 48.1394049745], - [11.5611362065, 48.139413029] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Queuing traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5644514169, 48.1436830881], - [11.5638345088, 48.1438654739], - [11.563670894, 48.1439111122], - [11.5628970767, 48.1441283409], - [11.5627401675, 48.1441725808], - [11.5626650656, 48.1441967421], - [11.5625899638, 48.1442168765], - [11.5608813967, 48.1447144177], - [11.5603302027, 48.1448900884], - [11.560218891, 48.1449343276], - [11.5595604087, 48.1451167648] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Queuing traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5651246513, 48.136273517], - [11.5650911237, 48.1363083661], - [11.5650522317, 48.1363418727], - [11.5650321151, 48.1363620102], - [11.5650012697, 48.1363834902], - [11.5649610366, 48.1364102842], - [11.5649328734, 48.1364210242], - [11.564915439, 48.1364263942], - [11.5648752059, 48.1364344492], - [11.5648309494, 48.1364371342], - [11.5647652353, 48.1364357917] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5661546196, 48.1378828157], - [11.5659574772, 48.1366905859] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5710724498, 48.2720428888], - [11.5718167628, 48.2718149324] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5704032387, 48.1674608698], - [11.5705923344, 48.1674461113], - [11.5709745492, 48.1674153084], - [11.571973672, 48.1673173651], - [11.57239612, 48.1672758286] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5734690036, 48.2002388472], - [11.5735494698, 48.2004936598], - [11.5735669042, 48.2006760112], - [11.5735736097, 48.2007443928] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5737868453, 48.2712328747], - [11.5725007261, 48.2716083983] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5736902858, 48.1355948779], - [11.5738109852, 48.1355198087], - [11.5739853288, 48.1354473684], - [11.5741315092, 48.1354017785] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5737962331, 48.1341116523], - [11.5739397312, 48.1342001491], - [11.5741945411, 48.1343624303], - [11.5742723252, 48.1344160764], - [11.5743192638, 48.1344455566], - [11.5743782724, 48.1344885181], - [11.5745217706, 48.1345823846], - [11.5745646859, 48.1346158923], - [11.5746008958, 48.1346427432], - [11.5746987964, 48.1347339242], - [11.574744394, 48.1347821998], - [11.5748127903, 48.1348559276], - [11.5748758222, 48.1349511918], - [11.5749187375, 48.1350115499], - [11.5749589707, 48.1350812498], - [11.5749898161, 48.1351483205], - [11.5750126149, 48.1352046508], - [11.5750421192, 48.1352944883], - [11.5749160553, 48.1352985159] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5750206615, 48.1343731707], - [11.5752781535, 48.1341988066], - [11.5754806603, 48.1340714314], - [11.5759715046, 48.1337280708], - [11.5761002506, 48.133648971], - [11.5761351193, 48.1336328602], - [11.5762021745, 48.1336154068], - [11.5762906874, 48.1336033796] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5804266537, 48.2705851443], - [11.5794597174, 48.2706172799] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Slow traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5802603568, 48.1323038099], - [11.5810194219, 48.1330146027], - [11.5812165643, 48.1331970263], - [11.5813345815, 48.1332841822], - [11.5814230944, 48.1333512552], - [11.581507584, 48.1334035598], - [11.5816671754, 48.133485345], - [11.5817503239, 48.1335309366], - [11.5819045509, 48.1336033796], - [11.581931373, 48.1336167494], - [11.5820695068, 48.1336744239], - [11.58253487, 48.133811254], - [11.5827641989, 48.1338742427] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5835044886, 48.1265330792], - [11.5836372579, 48.1266108471], - [11.5841468777, 48.1271539884] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5837820972, 48.1688234457], - [11.5846497918, 48.1686718949] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5851111318, 48.1325371989], - [11.5849287416, 48.1323775972], - [11.5848429109, 48.1322796989], - [11.5846538152, 48.1321160685] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5846538152, 48.1321160685], - [11.5848429109, 48.1322796989], - [11.5849287416, 48.1323775972], - [11.5851111318, 48.1325371989] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5851687993, 48.1426397128], - [11.5851352717, 48.1425780212], - [11.5850910152, 48.1424855118], - [11.5847919489, 48.1416794867], - [11.5847825612, 48.1416231634] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5903065707, 48.1387223495], - [11.5901255215, 48.1388175506], - [11.5899592246, 48.138902068], - [11.5891384686, 48.1393151442] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5907665695, 48.1393070896], - [11.5906633045, 48.1391233452], - [11.5905922259, 48.1390294871], - [11.5905278529, 48.1389516821], - [11.5904044713, 48.1388282901], - [11.5903065707, 48.1387223495], - [11.590246221, 48.1386633381], - [11.5899659301, 48.1383897595], - [11.5899082626, 48.1383334327] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - }, - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5918166543, 48.1417277557], - [11.5917402114, 48.141592345], - [11.5913217868, 48.1408962694], - [11.5912654604, 48.1407863059], - [11.5912399794, 48.1406991627], - [11.5911219622, 48.1402807282], - [11.5910777058, 48.1401211505], - [11.5910455192, 48.1400071581], - [11.590990534, 48.1398019377], - [11.5909301843, 48.1396289344], - [11.5907665695, 48.1393070896], - [11.5906633045, 48.1391233452], - [11.5905922259, 48.1390294871], - [11.5905278529, 48.1389516821], - [11.5904044713, 48.1388282901], - [11.5903065707, 48.1387223495], - [11.590246221, 48.1386633381], - [11.5899659301, 48.1383897595], - [11.5899082626, 48.1383334327], - [11.5897419657, 48.138171164], - [11.5895220245, 48.1379633073], - [11.5894241239, 48.1378707336], - [11.5893637742, 48.1377983525], - [11.5893396343, 48.1377500798], - [11.589296719, 48.1376548208] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5946490671, 48.1306945042], - [11.5953571702, 48.1303552048] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Slow traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.5507788564, 48.1761109962], - [11.5510135497, 48.1761083133], - [11.5514078344, 48.1761056303], - [11.5523694063, 48.176101606], - [11.5536179746, 48.1760922157], - [11.5539022888, 48.1760895328], - [11.5541772152, 48.1760895328], - [11.5552299823, 48.176081484], - [11.5553587283, 48.1760828255], - [11.5555303897, 48.1760828255], - [11.5558401848, 48.1760975816], - [11.5560708548, 48.1760975816], - [11.5568084623, 48.1760922157], - [11.5570525433, 48.1760895328], - [11.5571960415, 48.1760881914], - [11.557690909, 48.176084167], - [11.5579296256, 48.1760801426], - [11.5580583717, 48.1760761182], - [11.5581750478, 48.1760747767], - [11.5583346392, 48.1760761182], - [11.5585518981, 48.1760761182], - [11.5588616933, 48.1760640451], - [11.5590065326, 48.1760600766], - [11.5597159768, 48.1760493449], - [11.560039183, 48.1760412961], - [11.5605729426, 48.1760332473], - [11.5609672273, 48.1760225156], - [11.5611469353, 48.1760184913], - [11.5612233783, 48.1760171498], - [11.561399063, 48.1760131254], - [11.5615693833, 48.1760131254], - [11.561809441, 48.1760050766], - [11.5621715392, 48.1759956864], - [11.562272122, 48.1759943449], - [11.5629735197, 48.1759876376], - [11.5632296706, 48.1759809303], - [11.5634858216, 48.1759782474], - [11.5638103689, 48.1759701986], - [11.5638868119, 48.1759688571], - [11.5639806892, 48.1759621498], - [11.5640490855, 48.1759608084], - [11.5644929911, 48.175956784], - [11.564632466, 48.1759634913], - [11.5647853519, 48.1759661742], - [11.564966401, 48.1759755645], - [11.565081736, 48.1759849547], - [11.5650978292, 48.1759862962], - [11.5652212108, 48.1759983693], - [11.5652533973, 48.1760010523], - [11.5653486158, 48.176011784], - [11.5655122305, 48.1760372717], - [11.5656517054, 48.1760627036], - [11.5658542122, 48.1761069718], - [11.5659507717, 48.1761311181], - [11.5662069227, 48.1761968495], - [11.5664027239, 48.1762478249], - [11.5664791669, 48.1762679467], - [11.5666414405, 48.1763108174], - [11.5669257547, 48.1763953289], - [11.567148378, 48.1764583772], - [11.5675171818, 48.1765508813], - [11.567584237, 48.176571003], - [11.5676727499, 48.1765964905], - [11.5677558984, 48.1766246609], - [11.5686463918, 48.1769089908], - [11.5690809096, 48.1770457615], - [11.5698533858, 48.1772697248], - [11.5708377565, 48.1774842971], - [11.5712253357, 48.1775916109], - [11.5715539063, 48.1776706988], - [11.571690699, 48.1777042343], - [11.5718543137, 48.177741794], - [11.5719844009, 48.1777713051], - [11.5721466745, 48.1777994749], - [11.5723102893, 48.1778249618], - [11.5725490059, 48.1778571557], - [11.572704574, 48.1778745382], - [11.5728547777, 48.177893318], - [11.572935244, 48.177900025], - [11.5730452145, 48.1779053907], - [11.5732812489, 48.1779147806], - [11.5735548343, 48.1779295361], - [11.5741020049, 48.1779416088], - [11.5747403706, 48.1779349018], - [11.5750166382, 48.1779322189], - [11.5751534308, 48.1779268533], - [11.5752553548, 48.1779228291], - [11.5753653253, 48.1779201462], - [11.5757435168, 48.177900025], - [11.5761485304, 48.1778745382], - [11.5771731342, 48.1777887435], - [11.5775701011, 48.1777511839], - [11.5781521405, 48.1776961858], - [11.579005083, 48.1776331391], - [11.5791163946, 48.1776250906], - [11.5792920793, 48.1776144151], - [11.5799975003, 48.177547344], - [11.5806009973, 48.1775057599], - [11.5814029778, 48.1774735658], - [11.5816256012, 48.1774682001], - [11.5817677583, 48.1774668586], - [11.5820681657, 48.1774695415], - [11.5833314861, 48.1774722243], - [11.5839269365, 48.1774896628], - [11.5841468777, 48.17749637], - [11.584305128, 48.1774990528], - [11.5845210458, 48.1775044185], - [11.5848590041, 48.177512467], - [11.5850588287, 48.177512467], - [11.5855201687, 48.1775231984], - [11.5857950951, 48.1775258813], - [11.5860606338, 48.1775299055], - [11.5862752105, 48.1775285641], - [11.5864549185, 48.1775231984], - [11.5869913603, 48.1774789314], - [11.5874339248, 48.177423933], - [11.5878255273, 48.1773622833], - [11.5882224943, 48.1772764319], - [11.5884799863, 48.1772147262], - [11.5885980035, 48.1771838732], - [11.5888273324, 48.1771074675], - [11.5891465153, 48.1769988112], - [11.5893852319, 48.176915698], - [11.5895971264, 48.1768365531], - [11.5897795166, 48.1767654566], - [11.5899042393, 48.1767198476], - [11.5902408565, 48.1766031977], - [11.5903454627, 48.1765602714], - [11.5913472678, 48.1761606302], - [11.5915001537, 48.1760922157], - [11.5916007365, 48.1760493449], - [11.5917013193, 48.1760064181], - [11.5917281414, 48.1759956864], - [11.5918515231, 48.1759433693], - [11.5922350789, 48.1757811078], - [11.592363825, 48.1757247661], - [11.5925234164, 48.175659034], - [11.5926172937, 48.1756201873], - [11.5927929784, 48.1755477477], - [11.5929391588, 48.1754820154], - [11.5931309368, 48.1754002412], - [11.5931805576, 48.175380119], - [11.5936271454, 48.1751816356], - [11.5940911676, 48.174984493], - [11.5941837038, 48.1749442483], - [11.5943714584, 48.1748597344], - [11.5945913996, 48.1747564952], - [11.5947885419, 48.1746652735], - [11.5949333812, 48.1745928885], - [11.5950889493, 48.1745150814], - [11.5953880156, 48.1743635475], - [11.5960920955, 48.174002793], - [11.5966647471, 48.1737104537], - [11.5968726183, 48.1736044734], - [11.596919557, 48.1735776428], - [11.5971153582, 48.173469035], - [11.5972494687, 48.1734046416], - [11.597343346, 48.1733564024], - [11.5974063779, 48.1733268887], - [11.5977201964, 48.1731673019], - [11.5978167559, 48.1731190066], - [11.5980930234, 48.1729956409], - [11.5982780959, 48.1728963667], - [11.5984779204, 48.1727917821], - [11.5986576284, 48.1727018984], - [11.5988279487, 48.1726174366], - [11.5989821757, 48.1725396266], - [11.599101534, 48.1724766295], - [11.5992047991, 48.1724229673], - [11.5993120874, 48.1723599141], - [11.5993885304, 48.1723103323], - [11.5994515623, 48.1722674024], - [11.5995521451, 48.1721949581], - [11.5996567513, 48.1721064708], - [11.5997452642, 48.1720126171], - [11.5998418237, 48.1718757771], - [11.5998820568, 48.1718087544], - [11.5999316777, 48.1717041676], - [11.5999692286, 48.1716022078], - [11.599986663, 48.1715137195], - [11.5999933685, 48.171464081], - [11.5999947096, 48.1714426157], - [11.5999987329, 48.1713635182], - [11.5999973918, 48.1712857063], - [11.5999826397, 48.1711999006], - [11.5999678875, 48.1711314796], - [11.5999491121, 48.1710711639], - [11.5999088789, 48.1709705444], - [11.5998297538, 48.1708270495], - [11.5997895206, 48.1707640503], - [11.5996554102, 48.1705655491], - [11.5996031071, 48.1704890775], - [11.5995038654, 48.1703428981], - [11.5994368101, 48.1702436747], - [11.5993563439, 48.1701256685], - [11.5992731954, 48.1700103453], - [11.5991846825, 48.1698762391], - [11.5990854408, 48.1697340828], - [11.5990532543, 48.1696844426], - [11.5990130211, 48.1696173611], - [11.5988722051, 48.1694242779], - [11.5987139548, 48.1691895472], - [11.5986294652, 48.1690608054], - [11.5985382701, 48.1689307217], - [11.5985329057, 48.1689226718], - [11.5983022357, 48.1685874265], - [11.598292848, 48.1685740099], - [11.5981815363, 48.1684036751], - [11.5980836357, 48.1682655397], - [11.5980259682, 48.1681810706], - [11.59789454, 48.1679839011], - [11.5977738406, 48.1678095952], - [11.5976678933, 48.1676607248], - [11.5974627043, 48.1673629826], - [11.5970509852, 48.1667648655], - [11.5969316269, 48.1665945247], - [11.5968994404, 48.1665449373], - [11.5968645717, 48.1664993192], - [11.5968243386, 48.1664429673], - [11.5968028809, 48.1664094804], - [11.5967559422, 48.1663397112], - [11.5966862048, 48.1662431635], - [11.596560141, 48.1660741627], - [11.5964099373, 48.1658582568], - [11.5962959434, 48.1656906523], - [11.5962355937, 48.1655953892], - [11.5961511041, 48.1654398596], - [11.59607332, 48.165286957], - [11.5960250403, 48.1651823569], - [11.5959861482, 48.1650764148], - [11.5959526206, 48.1649812064], - [11.5959325041, 48.1649060683], - [11.5959123875, 48.164814885], - [11.5959016587, 48.1647143091], - [11.5958962942, 48.1646083661], - [11.5958976354, 48.1645051063], - [11.5959137286, 48.1643079226], - [11.5959365274, 48.1641859334], - [11.5959713961, 48.1640638879], - [11.5960022415, 48.1639405004], - [11.5960263814, 48.163864019], - [11.5960679556, 48.1637500234], - [11.5961457397, 48.1635757031], - [11.5962060894, 48.1634684159], - [11.5962718035, 48.1633651539], - [11.5963361765, 48.1632699424], - [11.5963992084, 48.1631948577], - [11.5964622403, 48.1631170334], - [11.5965145434, 48.1630661009], - [11.5965520944, 48.1630285304], - [11.5965829398, 48.1629923017], - [11.5966446306, 48.1629360019], - [11.5967559422, 48.1628340806], - [11.5968095864, 48.1627898009], - [11.5969007815, 48.1627147155], - [11.5969678367, 48.1626677521], - [11.5970255042, 48.1626262119], - [11.5971220638, 48.162560463], - [11.5972950662, 48.1624518878], - [11.5973513926, 48.1624170005], - [11.5974707509, 48.1623445982], - [11.597574016, 48.1622882418], - [11.5975914503, 48.162278849], - [11.5977698172, 48.1621822937], - [11.5978583301, 48.1621353857], - [11.5980071927, 48.1620521925], - [11.5981694664, 48.1619623459], - [11.5983156468, 48.1618805501], - [11.5984229351, 48.1618215654], - [11.5989513303, 48.1615318403], - [11.5991806592, 48.1614071608], - [11.5992343034, 48.1613776402], - [11.5993040408, 48.1613400685], - [11.5993295218, 48.16132665], - [11.5995199586, 48.1612167303], - [11.5996299292, 48.1611523215], - [11.5997734274, 48.1610664989], - [11.5998927857, 48.1609940947], - [11.600012144, 48.1609190066], - [11.6001221146, 48.1608438626], - [11.6002240385, 48.1607768255], - [11.6002602483, 48.160752672], - [11.6003635134, 48.1606842929], - [11.6004305686, 48.1606413533], - [11.6007524337, 48.1603825405] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Queuing traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6008771564, 48.1079185447], - [11.6006464864, 48.1078608412], - [11.6005150582, 48.1078246295], - [11.6002964581, 48.1077696684], - [11.6000148262, 48.1076985882], - [11.5995923783, 48.1076020421], - [11.5994448568, 48.1075738898], - [11.5992946531, 48.1075456815], - [11.5990344788, 48.1075323049], - [11.5982646848, 48.1073726814], - [11.598087659, 48.1073351262], - [11.5979414786, 48.1073016007], - [11.5978677179, 48.1072841943], - [11.5977014209, 48.1072452957], - [11.5974855031, 48.1072010241], - [11.5973661448, 48.1071742148], - [11.5972829963, 48.1071580956], - [11.5971555914, 48.1071353161], - [11.597112676, 48.1071232268], - [11.5969812478, 48.1070870706], - [11.5969007815, 48.1070548322], - [11.5968189741, 48.1070199633], - [11.5967478956, 48.1069850943], - [11.5967036392, 48.1069623147], - [11.5965494121, 48.1068804872], - [11.5964153017, 48.1068120924] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6004989649, 48.206367686], - [11.6005579735, 48.2063944994], - [11.6005995478, 48.2064454447], - [11.6006438042, 48.2065540944], - [11.6006759907, 48.2067177109], - [11.6007376815, 48.2071066121], - [11.6007966901, 48.2074606538], - [11.6008691098, 48.2078187708], - [11.6009415294, 48.2081754889] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6076430286, 48.0711038698], - [11.6071696187, 48.0711105908], - [11.60713475, 48.0711065582], - [11.606955042, 48.0710797301], - [11.606826296, 48.071046181] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.606826296, 48.071046181], - [11.606955042, 48.0710797301], - [11.60713475, 48.0711065582], - [11.6071696187, 48.0711105908], - [11.6076430286, 48.0711038698] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6125823165, 48.1473376151], - [11.6125581767, 48.1472544538], - [11.6125192846, 48.1471283973], - [11.612472346, 48.1470157627], - [11.6124052907, 48.1468601767], - [11.6123771275, 48.1467917791] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Heavy traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6162703539, 48.1503779156], - [11.6162421907, 48.150471753], - [11.6162059809, 48.1505723567], - [11.6161536778, 48.1507024311], - [11.6161201502, 48.1507694814], - [11.6160893048, 48.1508311631], - [11.6160611416, 48.1508875321], - [11.6160370017, 48.1509344503], - [11.6160115208, 48.1509773981], - [11.6159672643, 48.1510564711], - [11.6158908214, 48.151183916], - [11.6158519293, 48.1512429129], - [11.6157942618, 48.1513233836], - [11.6157151367, 48.1514373508], - [11.615642717, 48.1515258737], - [11.6155515219, 48.1516412385], - [11.615437528, 48.1517713102], - [11.6153584029, 48.1518544642], - [11.6152618433, 48.151951039], - [11.6151813771, 48.152024798], - [11.6150298323, 48.1521454741], - [11.6149225439, 48.1522272854], - [11.6148326899, 48.1522929916], - [11.6147401537, 48.1523694343], - [11.6146637107, 48.1524391666], - [11.6145242359, 48.1525303719], - [11.6144410874, 48.1525853411], - [11.6142426039, 48.1527154663], - [11.6141111757, 48.152801247], - [11.6140172984, 48.1528616401], - [11.6139837707, 48.1528843993], - [11.6138550247, 48.1529715777], - [11.6134379412, 48.1532384802], - [11.6132354344, 48.1533631796], - [11.6129658724, 48.153522772], - [11.6127352024, 48.153658263], - [11.6124656404, 48.1537990659], - [11.6122939791, 48.1538849007], - [11.6121048833, 48.1539801296], - [11.6118031348, 48.1541424042], - [11.6114611532, 48.1542979681], - [11.6113592292, 48.1543475673], - [11.6112304832, 48.1544146128], - [11.6110762562, 48.1544870263], - [11.6107892598, 48.1546184887], - [11.6105706598, 48.1547110322], - [11.6103547419, 48.1547968096], - [11.6102568413, 48.154834386], - [11.6098250057, 48.1550154461], - [11.6096466388, 48.1550892007], - [11.6093127037, 48.1552286577], - [11.60917457, 48.1552836799], - [11.6088969613, 48.1553962964], - [11.6087829675, 48.1554432664], - [11.6085938717, 48.1555210464], - [11.608135214, 48.1557047881], - [11.6080614532, 48.155734256], - [11.6075679268, 48.1559367847], - [11.6072152163, 48.1560802653], - [11.6070770825, 48.1561365727], - [11.6063528861, 48.1564316401], - [11.6062335278, 48.1564798953], - [11.6061235572, 48.1565282063], - [11.6057949866, 48.1566596076], - [11.6054395939, 48.1567937483], - [11.6051297988, 48.1569238069], - [11.6050573791, 48.156954672], - [11.6050158049, 48.1569721175], - [11.6049514319, 48.1570029267], - [11.6048320736, 48.1570472113], - [11.6047529484, 48.1570807603], - [11.6046456601, 48.157122305], - [11.6045946981, 48.1571397505], - [11.6042849029, 48.1572698082], - [11.6039456035, 48.1574240766], - [11.6037256624, 48.1575313765], - [11.6035808231, 48.1576131792], - [11.6035392488, 48.1576386202], - [11.6033273543, 48.1577714164], - [11.6032710279, 48.1578102768], - [11.6032133604, 48.1578532188], - [11.6031503285, 48.1578987887], - [11.6030242647, 48.1579993779], - [11.6028365101, 48.1581482764], - [11.602823099, 48.1581616957], - [11.6026380266, 48.1583360344], - [11.6025749947, 48.1584030746], - [11.6025374438, 48.1584459603], - [11.6022933627, 48.1587356468], - [11.6020921971, 48.1589944679], - [11.6018226351, 48.1593592977], - [11.6013787295, 48.1599332913], - [11.6013438608, 48.1599640987], - [11.6013022865, 48.1600070389], - [11.6012486423, 48.1600579744], - [11.6009321417, 48.1603530194], - [11.6008476521, 48.1604294501], - [11.600512376, 48.1606910022], - [11.6003179158, 48.1608277603], - [11.6002468373, 48.1608774091], - [11.6001864876, 48.1609163229], - [11.5999450888, 48.1610705245], - [11.599640658, 48.1612475369], - [11.5994877721, 48.1613373848], - [11.5992799009, 48.1614513857], - [11.5991431083, 48.1615278148], - [11.5990559365, 48.1615761211], - [11.5988802518, 48.1616726775], - [11.5987743045, 48.1617289788], - [11.5985449756, 48.1618550553], - [11.5982941891, 48.1619972334], - [11.5981453265, 48.1620830545], - [11.5980836357, 48.1621166002], - [11.5978489424, 48.1622479871], - [11.5976652111, 48.1623499096], - [11.5976155902, 48.162376746], - [11.5974264945, 48.1624840355], - [11.5972561742, 48.1625913247], - [11.5970952417, 48.1626999556], - [11.5970509852, 48.1627321591], - [11.5970120932, 48.1627630207], - [11.5969262625, 48.162831397], - [11.5968471373, 48.1628984314], - [11.5967224146, 48.163017796], - [11.596663406, 48.1630781771], - [11.596649995, 48.1630902533], - [11.5965923275, 48.1631559455], - [11.59653466, 48.1632243213], - [11.596458217, 48.1633208747], - [11.5963978673, 48.1634054077], - [11.5963495876, 48.1634818338], - [11.5963026489, 48.1635663106], - [11.596239617, 48.1636950662], - [11.5961980428, 48.1637795426], - [11.5961671974, 48.1638546824], - [11.5961162354, 48.1639847231], - [11.5960813667, 48.1641242118], - [11.5960558857, 48.1642596748], - [11.5960411335, 48.1643629351], - [11.5960317458, 48.1644621699], - [11.5960277225, 48.1645734803], - [11.5960357691, 48.1647183344], - [11.5960572268, 48.1648497706], - [11.5960840489, 48.1649530297], - [11.5961376931, 48.1651005662], - [11.5961926783, 48.1652252927], - [11.5962516869, 48.1653606969], - [11.59631606, 48.165484081], - [11.5963844563, 48.1656020979], - [11.5966419484, 48.1660031073], - [11.5967318024, 48.166130515], - [11.5968565251, 48.1663115352], - [11.5969021226, 48.1663692289], - [11.5969477202, 48.1664295502], - [11.5969919766, 48.1664845604], - [11.597034892, 48.1665476208], - [11.5973567571, 48.1670196769], - [11.5977617706, 48.1675990074], - [11.5980246271, 48.1679771927], - [11.5982941891, 48.1683687919], - [11.5984832848, 48.1686450618], - [11.5986200775, 48.1688449121], - [11.5987313892, 48.1690098788], - [11.598986199, 48.1693706125], - [11.5991109218, 48.1695476522], - [11.5991927291, 48.1696616349], - [11.5992503966, 48.1697501264], - [11.5993429328, 48.1698829472], - [11.5994689967, 48.170067979] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6143619622, 48.0622593062], - [11.6148152555, 48.0622324735], - [11.6154938544, 48.0621855302], - [11.6163454558, 48.0621291758] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6166485454, 48.145795334], - [11.6166901196, 48.1460595334], - [11.6166874374, 48.1460836938], - [11.6166793908, 48.1460917473], - [11.6166632975, 48.1460998007], - [11.6166364755, 48.1461051138], - [11.6166016067, 48.1461024293], - [11.6165721024, 48.146101143], - [11.6165479626, 48.146095774], - [11.6165157761, 48.1460742981], - [11.616437992, 48.1457121702], - [11.6164031233, 48.145566032] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Slow traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6172118093, 48.0721579957], - [11.6171528007, 48.0719326774], - [11.6171286608, 48.071856227], - [11.6171045209, 48.0718213342], - [11.6170052792, 48.0718146692], - [11.6168577577, 48.0718160134], - [11.6167558338, 48.0718320876], - [11.6167156006, 48.0718683246], - [11.6167102362, 48.0719085382], - [11.6167451049, 48.0720654154], - [11.616758516, 48.0722035857] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6237765159, 48.3002543717], - [11.6241050865, 48.3000451647], - [11.6243290509, 48.2998976264], - [11.6245194878, 48.2997742314], - [11.6245369221, 48.2997635256], - [11.6245852019, 48.2997313525], - [11.62474077, 48.2996334392], - [11.6250183786, 48.2994497117], - [11.6251162793, 48.2993907181], - [11.6253174449, 48.2992686601], - [11.6253523137, 48.2992458544], - [11.6256191935, 48.2990742254], - [11.6257747616, 48.2989776491], - [11.6258659567, 48.2989159784], - [11.6260724868, 48.2988127105], - [11.6261422242, 48.2987308544], - [11.6262441482, 48.2986665069], - [11.6263272966, 48.2986182183], - [11.6264627482, 48.2985404324] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6430924441, 48.1949937612], - [11.6428953017, 48.1948824609], - [11.6428282465, 48.194836868], - [11.642205974, 48.1943634476], - [11.6420383359, 48.1942159394], - [11.6419122721, 48.1940938536] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6602532174, 48.0765889974], - [11.6638232376, 48.0758540705] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6701586153, 48.238210877], - [11.6703503932, 48.2381934033], - [11.6705529, 48.2381759854], - [11.6706293429, 48.2381692863], - [11.6708170976, 48.2381532082], - [11.6708694006, 48.2381491887], - [11.6709833945, 48.2381410939], - [11.6710222866, 48.2381384142], - [11.6710799541, 48.2381330549], - [11.6711148228, 48.2381303752], - [11.671695521, 48.238099559], - [11.671759894, 48.2380955394], - [11.6720053162, 48.2380727064], - [11.6721045579, 48.2380753861], - [11.6723459567, 48.2380633275], - [11.6726289298, 48.238027096], - [11.6729481126, 48.2380069985], - [11.6732954587, 48.2379815415], - [11.6734429802, 48.2379694829], - [11.6743562724, 48.2378970199], - [11.6745869423, 48.2378742425], - [11.6752253081, 48.2378138937], - [11.6755042578, 48.2377911164], - [11.6758542861, 48.2377629238], - [11.6762995328, 48.2377266921], - [11.6765087451, 48.2377092741], - [11.676726004, 48.2376905162], - [11.6774206962, 48.237640886], - [11.6779128815, 48.2375925956], - [11.6781287993, 48.2375698181], - [11.6786773111, 48.2375108088] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.6850341465, 48.0710167205], - [11.6852433588, 48.0710676323], - [11.6853077318, 48.0710864512], - [11.6855008508, 48.0711481165], - [11.6855920459, 48.0711789772], - [11.6857020165, 48.0712138145], - [11.6859380509, 48.0712715031], - [11.6864342596, 48.0714270941] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.7069638874, 48.1224654854], - [11.7071047033, 48.1224507139], - [11.7072133328, 48.1224158554], - [11.7073407377, 48.122359567], - [11.7074399795, 48.1223032225] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Stationary traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.7318681981, 48.1658341057], - [11.7319419588, 48.1656906523], - [11.7320519294, 48.1655229914], - [11.7320787515, 48.1654746889], - [11.732110938, 48.1653848482], - [11.7321028914, 48.1653660639], - [11.7320680227, 48.1653593552], - [11.7319982852, 48.1653526465], - [11.7318936791, 48.165349963], - [11.7318105306, 48.1653687474], - [11.7316254582, 48.1654813975], - [11.7316549625, 48.1655980727], - [11.7316710557, 48.165722798] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 6, - "events": [ - { - "description": "Queuing traffic" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.7324851062, 48.1093065996], - [11.7320023085, 48.1082806033], - [11.7319473232, 48.1081505334], - [11.7315476741, 48.1073512453], - [11.7314739134, 48.1072023673], - [11.7314189281, 48.1071098501] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.7467222716, 48.3200075239], - [11.7470883931, 48.3205305582] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.7474853601, 48.3210978415], - [11.7470883931, 48.3205305582], - [11.7467222716, 48.3200075239], - [11.746688744, 48.3199591998] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.7550223674, 48.1679208984], - [11.7550116386, 48.167971826], - [11.7549955453, 48.1680483013], - [11.7549794521, 48.1681274039], - [11.7548413183, 48.1684988771], - [11.7547031845, 48.1688086875], - [11.7546656336, 48.1688905281], - [11.7546468581, 48.1689240134], - [11.7544966544, 48.1691775283], - [11.7542458679, 48.1695503355], - [11.7541493084, 48.1697903751] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 8, - "events": [ - { - "description": "Closed" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.7541493084, 48.1697903751], - [11.7542458679, 48.1695503355], - [11.7544966544, 48.1691775283], - [11.7546468581, 48.1689240134], - [11.7546656336, 48.1688905281], - [11.7547031845, 48.1688086875], - [11.7548413183, 48.1684988771], - [11.7549794521, 48.1681274039], - [11.7549955453, 48.1680483013], - [11.7550116386, 48.167971826], - [11.7550223674, 48.1679208984] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.7553026582, 48.1086132204], - [11.7554595675, 48.1090544679], - [11.7556097712, 48.1095037148], - [11.7558095958, 48.1100777064], - [11.7558779921, 48.1102681587], - [11.7560429479, 48.110733513], - [11.7561059798, 48.1109346522], - [11.7561488952, 48.1110647711], - [11.7562038805, 48.1112243271], - [11.756223997, 48.1112887426], - [11.7563326265, 48.111618654], - [11.7564358916, 48.1119579092], - [11.756556591, 48.1123468579], - [11.7567604388, 48.1129999494], - [11.7569321002, 48.1135967904], - [11.7570568229, 48.1140232212], - [11.7571681346, 48.1144228989], - [11.7572325076, 48.1146562572], - [11.7573719825, 48.1151658367], - [11.7575570549, 48.1158954453], - [11.7576616611, 48.1163232559], - [11.7578051593, 48.1169200025], - [11.7579084243, 48.1173786935], - [11.7579701151, 48.1176643591], - [11.7580693568, 48.1181310453], - [11.7581699397, 48.1186084711] - ] - } - }, - { - "type": "Feature", - "properties": { - "iconCategory": 9, - "events": [ - { - "description": "Roadworks" - } - ] - }, - "geometry": { - "type": "LineString", - "coordinates": [ - [11.7590255644, 48.1313315305], - [11.7590255644, 48.1307159865], - [11.7590228822, 48.1301473164], - [11.7590175177, 48.1296511445], - [11.75900813, 48.1292340185], - [11.7589987423, 48.1288411136], - [11.7589772846, 48.1282550235], - [11.7589705791, 48.1280833799], - [11.758957168, 48.1277910027], - [11.7589330282, 48.1272907798] - ] - } - } -] + "incidents": [ + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4109620059, + 48.1293372933 + ], + [ + 11.4107809568, + 48.1292930407 + ], + [ + 11.4102297629, + 48.1291468558 + ], + [ + 11.4098918045, + 48.1290583502 + ], + [ + 11.4097013677, + 48.1289993277 + ], + [ + 11.4095243419, + 48.1289497040 + ], + [ + 11.4093781615, + 48.1289081365 + ], + [ + 11.4092078412, + 48.1288505125 + ], + [ + 11.4087357725, + 48.1286922420 + ], + [ + 11.4085359479, + 48.1286251629 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4125753547, + 48.1383267204 + ], + [ + 11.4126289988, + 48.1381563970 + ], + [ + 11.4128154124, + 48.1375515627 + ], + [ + 11.4128422345, + 48.1374603867 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4198025669, + 48.1518946711 + ], + [ + 11.4199474061, + 48.1515379527 + ], + [ + 11.4200587178, + 48.1512617025 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4210243131, + 48.1486653255 + ], + [ + 11.4208177830, + 48.1492393270 + ], + [ + 11.4207601155, + 48.1494243773 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4244065786, + 48.2547668166 + ], + [ + 11.4246479774, + 48.2545508936 + ], + [ + 11.4247606302, + 48.2544542888 + ], + [ + 11.4248585308, + 48.2543738684 + ], + [ + 11.4249135161, + 48.2543363091 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4277217890, + 48.1195901680 + ], + [ + 11.4275581742, + 48.1197403530 + ], + [ + 11.4273757840, + 48.1199133674 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4335985089, + 48.1639806978 + ], + [ + 11.4335569347, + 48.1639163484 + ], + [ + 11.4335274304, + 48.1638760950 + ], + [ + 11.4334670807, + 48.1637956440 + ], + [ + 11.4333825911, + 48.1637178765 + ], + [ + 11.4332592095, + 48.1636105896 + ], + [ + 11.4328099395, + 48.1632927529 + ], + [ + 11.4325846339, + 48.1631411857 + ], + [ + 11.4315908755, + 48.1624987954 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Slow traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4381233955, + 48.2644750414 + ], + [ + 11.4381046201, + 48.2642805859 + ], + [ + 11.4380858446, + 48.2641665905 + ], + [ + 11.4380777980, + 48.2641169860 + ], + [ + 11.4380724336, + 48.2640847904 + ], + [ + 11.4380603636, + 48.2640458991 + ], + [ + 11.4380482937, + 48.2640070077 + ], + [ + 11.4380335415, + 48.2639667771 + ], + [ + 11.4380174483, + 48.2639319032 + ], + [ + 11.4379986728, + 48.2639037250 + ], + [ + 11.4379691685, + 48.2638608160 + ], + [ + 11.4379450286, + 48.2638259420 + ], + [ + 11.4379168654, + 48.2637910680 + ], + [ + 11.4375802482, + 48.2633726333 + ], + [ + 11.4374970997, + 48.2632506008 + ], + [ + 11.4373240972, + 48.2630266786 + ], + [ + 11.4372168089, + 48.2628603405 + ], + [ + 11.4370411242, + 48.2625907723 + ], + [ + 11.4369378592, + 48.2624486500 + ], + [ + 11.4368600751, + 48.2623279545 + ], + [ + 11.4368158186, + 48.2622515083 + ], + [ + 11.4368077720, + 48.2622327036 + ], + [ + 11.4367340113, + 48.2620744540 + ], + [ + 11.4367179180, + 48.2620328827 + ], + [ + 11.4367018248, + 48.2619725624 + ], + [ + 11.4366964603, + 48.2619255784 + ], + [ + 11.4366978014, + 48.2619081686 + ], + [ + 11.4366910959, + 48.2618250257 + ], + [ + 11.4366870726, + 48.2617714012 + ], + [ + 11.4366669560, + 48.2616466307 + ], + [ + 11.4366441573, + 48.2615205765 + ], + [ + 11.4366226996, + 48.2614387721 + ], + [ + 11.4365918542, + 48.2613408970 + ], + [ + 11.4365556444, + 48.2612456443 + ], + [ + 11.4365234579, + 48.2611732700 + ], + [ + 11.4364201928, + 48.2609519613 + ], + [ + 11.4363209511, + 48.2607883507 + ], + [ + 11.4362726713, + 48.2607427607 + ], + [ + 11.4362310971, + 48.2607212769 + ], + [ + 11.4361989106, + 48.2607105630 + ], + [ + 11.4361761118, + 48.2607092237 + ], + [ + 11.4361828173, + 48.2606489019 + ], + [ + 11.4361801351, + 48.2606019166 + ], + [ + 11.4361761118, + 48.2605858457 + ], + [ + 11.4361559952, + 48.2605187716 + ], + [ + 11.4359441007, + 48.2602116919 + ], + [ + 11.4357603694, + 48.2599796649 + ], + [ + 11.4357482995, + 48.2599676115 + ], + [ + 11.4356758798, + 48.2598804477 + ], + [ + 11.4356155301, + 48.2598294439 + ], + [ + 11.4355243350, + 48.2597717996 + ], + [ + 11.4354170466, + 48.2597275479 + ], + [ + 11.4352735485, + 48.2596685083 + ], + [ + 11.4349342490, + 48.2595451277 + ], + [ + 11.4349154736, + 48.2595384314 + ], + [ + 11.4348671938, + 48.2595223600 + ], + [ + 11.4348095263, + 48.2595008758 + ], + [ + 11.4347210134, + 48.2594727510 + ], + [ + 11.4345024134, + 48.2594204076 + ], + [ + 11.4343468452, + 48.2593963005 + ], + [ + 11.4343092943, + 48.2593949613 + ], + [ + 11.4341738428, + 48.2593922827 + ], + [ + 11.4340933765, + 48.2593896042 + ], + [ + 11.4339592660, + 48.2594244254 + ], + [ + 11.4338640476, + 48.2594485882 + ], + [ + 11.4337366427, + 48.2594915009 + ], + [ + 11.4336347187, + 48.2595277172 + ], + [ + 11.4335341359, + 48.2595599156 + ], + [ + 11.4334281887, + 48.2595947925 + ], + [ + 11.4331157113, + 48.2597624247 + ], + [ + 11.4328716303, + 48.2599541631 + ], + [ + 11.4326718057, + 48.2601419388 + ], + [ + 11.4326355959, + 48.2601915472 + ], + [ + 11.4326195026, + 48.2602143704 + ], + [ + 11.4325604940, + 48.2603243010 + ], + [ + 11.4324143136, + 48.2605925419 + ], + [ + 11.4321715737, + 48.2610324271 + ], + [ + 11.4319999124, + 48.2612510570 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 7, + "events": [ + { + "description": "Contraflow" + }, + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4166563357, + 48.1301594004 + ], + [ + 11.4177010561, + 48.1302411908 + ], + [ + 11.4179518426, + 48.1302586454 + ], + [ + 11.4181905592, + 48.1302747573 + ], + [ + 11.4185218121, + 48.1302908132 + ], + [ + 11.4187940563, + 48.1303015545 + ], + [ + 11.4189496244, + 48.1303055825 + ], + [ + 11.4192419852, + 48.1303149811 + ], + [ + 11.4195866490, + 48.1303216943 + ], + [ + 11.4199567939, + 48.1303284076 + ], + [ + 11.4203470553, + 48.1303297503 + ], + [ + 11.4205710197, + 48.1303297503 + ], + [ + 11.4208325351, + 48.1303297503 + ], + [ + 11.4209921266, + 48.1303297503 + ], + [ + 11.4213515426, + 48.1303257223 + ], + [ + 11.4216358567, + 48.1303082678 + ], + [ + 11.4218638445, + 48.1302948412 + ], + [ + 11.4222339893, + 48.1302613307 + ], + [ + 11.4226457084, + 48.1302264775 + ], + [ + 11.4231472815, + 48.1301714843 + ], + [ + 11.4233766104, + 48.1301446311 + ], + [ + 11.4236756767, + 48.1301030645 + ], + [ + 11.4237427319, + 48.1300950085 + ], + [ + 11.4237762595, + 48.1300923232 + ], + [ + 11.4245608056, + 48.1299435111 + ], + [ + 11.4247284437, + 48.1299126298 + ], + [ + 11.4249001051, + 48.1298737483 + ], + [ + 11.4253533984, + 48.1297651039 + ], + [ + 11.4266784097, + 48.1293735458 + ], + [ + 11.4268554355, + 48.1293172090 + ], + [ + 11.4271370674, + 48.1292233330 + ], + [ + 11.4275219644, + 48.1290878894 + ], + [ + 11.4276265706, + 48.1290502940 + ], + [ + 11.4278693105, + 48.1289631310 + ], + [ + 11.4281361903, + 48.1288652262 + ], + [ + 11.4284298922, + 48.1287552929 + ], + [ + 11.4286391045, + 48.1286841858 + ], + [ + 11.4289328063, + 48.1285755388 + ], + [ + 11.4291299487, + 48.1285018020 + ], + [ + 11.4296798016, + 48.1283059905 + ], + [ + 11.4302189256, + 48.1281074928 + ], + [ + 11.4307204987, + 48.1279345061 + ], + [ + 11.4309002067, + 48.1278674819 + ], + [ + 11.4310758913, + 48.1278084581 + ], + [ + 11.4315265025, + 48.1276756962 + ], + [ + 11.4319194461, + 48.1275737608 + ], + [ + 11.4320133234, + 48.1275495916 + ], + [ + 11.4322413112, + 48.1274919661 + ], + [ + 11.4325497652, + 48.1273592034 + ], + [ + 11.4326825345, + 48.1273296632 + ], + [ + 11.4329601432, + 48.1272719815 + ], + [ + 11.4331666733, + 48.1272411545 + ], + [ + 11.4334174598, + 48.1272116702 + ], + [ + 11.4337446893, + 48.1271807872 + ], + [ + 11.4339753593, + 48.1271526456 + ], + [ + 11.4343334342, + 48.1271191331 + ], + [ + 11.4345600809, + 48.1271016774 + ], + [ + 11.4348511005, + 48.1270895927 + ], + [ + 11.4349087680, + 48.1270882500 + ], + [ + 11.4352279509, + 48.1270815922 + ], + [ + 11.4352453853, + 48.1270815922 + ], + [ + 11.4353003705, + 48.1270802495 + ], + [ + 11.4357442761, + 48.1270869632 + ], + [ + 11.4360634590, + 48.1271083911 + ], + [ + 11.4366951192, + 48.1271566738 + ], + [ + 11.4368775094, + 48.1271861582 + ], + [ + 11.4371537770, + 48.1272277271 + ], + [ + 11.4373442138, + 48.1272612956 + ], + [ + 11.4376379157, + 48.1273175786 + ], + [ + 11.4377103353, + 48.1273310060 + ], + [ + 11.4379396642, + 48.1273766030 + ], + [ + 11.4382856692, + 48.1274530829 + ], + [ + 11.4385042692, + 48.1275026520 + ], + [ + 11.4388113821, + 48.1275710753 + ], + [ + 11.4394229258, + 48.1277038375 + ], + [ + 11.4398923124, + 48.1277950309 + ], + [ + 11.4405883456, + 48.1278795105 + ], + [ + 11.4413044954, + 48.1279425624 + ], + [ + 11.4414319004, + 48.1279546469 + ], + [ + 11.4419965054, + 48.1279666754 + ], + [ + 11.4424605275, + 48.1279506187 + ], + [ + 11.4427233840, + 48.1279412197 + ], + [ + 11.4429366196, + 48.1279331634 + ], + [ + 11.4431364442, + 48.1279171067 + ], + [ + 11.4431793595, + 48.1279117358 + ], + [ + 11.4433107878, + 48.1278983086 + ], + [ + 11.4433416332, + 48.1278956231 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4463980103, + 48.1273913731 + ], + [ + 11.4461928214, + 48.1274503974 + ], + [ + 11.4457904900, + 48.1275670471 + ], + [ + 11.4454310740, + 48.1276662971 + ], + [ + 11.4449227954, + 48.1277856318 + ], + [ + 11.4444064702, + 48.1278956231 + ], + [ + 11.4442240799, + 48.1279264498 + ], + [ + 11.4440309609, + 48.1279586750 + ], + [ + 11.4440229143, + 48.1279600177 + ], + [ + 11.4437694455, + 48.1279935298 + ], + [ + 11.4437064136, + 48.1280029288 + ], + [ + 11.4436380173, + 48.1280122719 + ], + [ + 11.4435548688, + 48.1280230136 + ], + [ + 11.4432839657, + 48.1280498679 + ], + [ + 11.4432745779, + 48.1280512107 + ], + [ + 11.4429325963, + 48.1280806945 + ], + [ + 11.4426268245, + 48.1280968071 + ], + [ + 11.4422794784, + 48.1281115210 + ], + [ + 11.4422204698, + 48.1281128637 + ], + [ + 11.4418530072, + 48.1281128637 + ], + [ + 11.4416531826, + 48.1281074928 + ], + [ + 11.4415016378, + 48.1281035206 + ], + [ + 11.4414037372, + 48.1281008352 + ], + [ + 11.4413219298, + 48.1280954643 + ], + [ + 11.4412977899, + 48.1280927789 + ], + [ + 11.4412857200, + 48.1280927789 + ], + [ + 11.4411998893, + 48.1280874081 + ], + [ + 11.4407801236, + 48.1280525534 + ], + [ + 11.4405320192, + 48.1280324126 + ], + [ + 11.4401605333, + 48.1279827880 + ], + [ + 11.4399808253, + 48.1279586750 + ], + [ + 11.4398292805, + 48.1279318206 + ], + [ + 11.4397032166, + 48.1279117358 + ], + [ + 11.4393867160, + 48.1278500266 + ], + [ + 11.4390769208, + 48.1277842891 + ], + [ + 11.4386263097, + 48.1276877248 + ], + [ + 11.4383084680, + 48.1276153294 + ], + [ + 11.4378712679, + 48.1275174221 + ], + [ + 11.4376540090, + 48.1274745106 + ], + [ + 11.4374488200, + 48.1274342846 + ], + [ + 11.4371551181, + 48.1273819739 + ], + [ + 11.4369392003, + 48.1273444333 + ], + [ + 11.4364416505, + 48.1272840662 + ], + [ + 11.4360688234, + 48.1272572674 + ], + [ + 11.4357670749, + 48.1272384690 + ], + [ + 11.4353017117, + 48.1272357836 + ], + [ + 11.4349986220, + 48.1272451827 + ], + [ + 11.4346727336, + 48.1272599528 + ], + [ + 11.4343562330, + 48.1272880944 + ], + [ + 11.4342663790, + 48.1273028645 + ], + [ + 11.4340491200, + 48.1273216068 + ], + [ + 11.4338023568, + 48.1273511470 + ], + [ + 11.4335797335, + 48.1273766030 + ], + [ + 11.4333597923, + 48.1274114581 + ], + [ + 11.4324129725, + 48.1275858453 + ], + [ + 11.4322949553, + 48.1276139867 + ], + [ + 11.4320656265, + 48.1276783817 + ], + [ + 11.4319958890, + 48.1276984666 + ], + [ + 11.4314634706, + 48.1278527120 + ], + [ + 11.4310879613, + 48.1279774171 + ], + [ + 11.4309632386, + 48.1280216709 + ], + [ + 11.4308023060, + 48.1280753236 + ], + [ + 11.4301022495, + 48.1283261312 + ], + [ + 11.4297790433, + 48.1284347227 + ], + [ + 11.4293351377, + 48.1286023929 + ], + [ + 11.4290213192, + 48.1287150119 + ], + [ + 11.4287544394, + 48.1288156024 + ], + [ + 11.4286122824, + 48.1288705970 + ], + [ + 11.4282770062, + 48.1289926702 + ], + [ + 11.4279001559, + 48.1291240860 + ], + [ + 11.4277311767, + 48.1291857378 + ], + [ + 11.4276265706, + 48.1292206476 + ], + [ + 11.4272698368, + 48.1293480348 + ], + [ + 11.4269761349, + 48.1294486240 + ], + [ + 11.4265966023, + 48.1295706399 + ], + [ + 11.4264276231, + 48.1296216057 + ], + [ + 11.4261392857, + 48.1297087676 + ], + [ + 11.4259461666, + 48.1297624186 + ], + [ + 11.4257959629, + 48.1298039855 + ], + [ + 11.4256551469, + 48.1298456082 + ], + [ + 11.4254352058, + 48.1298992591 + ], + [ + 11.4253775383, + 48.1299139725 + ], + [ + 11.4251093174, + 48.1299797072 + ], + [ + 11.4250892008, + 48.1299837352 + ], + [ + 11.4249805714, + 48.1300051619 + ], + [ + 11.4249027873, + 48.1300212739 + ], + [ + 11.4247659946, + 48.1300547846 + ], + [ + 11.4247512425, + 48.1300574699 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4632610584, + 48.1426611901 + ], + [ + 11.4619749392, + 48.1426156067 + ], + [ + 11.4609731341, + 48.1425431764 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 7, + "events": [ + { + "description": "Lane closed" + }, + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4583727325, + 48.1504221501 + ], + [ + 11.4585551227, + 48.1503510730 + ], + [ + 11.4587214197, + 48.1502893907 + ], + [ + 11.4588890577, + 48.1502303926 + ], + [ + 11.4590124393, + 48.1501901285 + ], + [ + 11.4597956444, + 48.1499125289 + ], + [ + 11.4604487623, + 48.1496966109 + ], + [ + 11.4612413550, + 48.1494551910 + ], + [ + 11.4617469514, + 48.1493010105 + ], + [ + 11.4619843269, + 48.1492326161 + ], + [ + 11.4621761049, + 48.1491735609 + ], + [ + 11.4627125467, + 48.1490099844 + ], + [ + 11.4635386671, + 48.1487900361 + ], + [ + 11.4642534758, + 48.1485888773 + ], + [ + 11.4646598304, + 48.1484628241 + ], + [ + 11.4653451348, + 48.1482388468 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 7, + "events": [ + { + "description": "Lane closed" + }, + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4659607018, + 48.1481476338 + ], + [ + 11.4657622183, + 48.1482079765 + ], + [ + 11.4657327140, + 48.1482160296 + ], + [ + 11.4655610527, + 48.1482710034 + ], + [ + 11.4649615789, + 48.1484574554 + ], + [ + 11.4645230378, + 48.1485929038 + ], + [ + 11.4644626881, + 48.1486116384 + ], + [ + 11.4641515518, + 48.1487041927 + ], + [ + 11.4639812315, + 48.1487497708 + ], + [ + 11.4632396008, + 48.1489536692 + ], + [ + 11.4624926055, + 48.1491588531 + ], + [ + 11.4622082914, + 48.1492446397 + ], + [ + 11.4620178546, + 48.1493023526 + ], + [ + 11.4617885257, + 48.1493707469 + ], + [ + 11.4612882937, + 48.1495222988 + ], + [ + 11.4606700445, + 48.1497113746 + ], + [ + 11.4603723193, + 48.1498172925 + ], + [ + 11.4601403082, + 48.1498923968 + ], + [ + 11.4598895217, + 48.1499822645 + ], + [ + 11.4595113302, + 48.1501177090 + ], + [ + 11.4590593780, + 48.1502786536 + ], + [ + 11.4588112737, + 48.1503712050 + ], + [ + 11.4585832859, + 48.1504530191 + ], + [ + 11.4583955313, + 48.1505147011 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4658788944, + 48.1869511360 + ], + [ + 11.4659902061, + 48.1867889093 + ], + [ + 11.4661806429, + 48.1865139666 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4661806429, + 48.1865139666 + ], + [ + 11.4659902061, + 48.1867889093 + ], + [ + 11.4658788944, + 48.1869511360 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4671033228, + 48.1856918680 + ], + [ + 11.4672495032, + 48.1857307630 + ], + [ + 11.4675069953, + 48.1857790465 + ], + [ + 11.4677255953, + 48.1857468575 + ], + [ + 11.4679093267, + 48.1856932092 + ], + [ + 11.4680581893, + 48.1856234663 + ], + [ + 11.4681332911, + 48.1855456760 + ], + [ + 11.4681815709, + 48.1854128958 + ], + [ + 11.4686630274, + 48.1840678058 + ], + [ + 11.4687998200, + 48.1836882302 + ], + [ + 11.4691163207, + 48.1828044431 + ], + [ + 11.4691726471, + 48.1826556162 + ], + [ + 11.4691941048, + 48.1825550194 + ], + [ + 11.4691873992, + 48.1824812484 + ], + [ + 11.4691458250, + 48.1823860165 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4691458250, + 48.1823860165 + ], + [ + 11.4691873992, + 48.1824812484 + ], + [ + 11.4691941048, + 48.1825550194 + ], + [ + 11.4691726471, + 48.1826556162 + ], + [ + 11.4691163207, + 48.1828044431 + ], + [ + 11.4687998200, + 48.1836882302 + ], + [ + 11.4686630274, + 48.1840678058 + ], + [ + 11.4681815709, + 48.1854128958 + ], + [ + 11.4681332911, + 48.1855456760 + ], + [ + 11.4680581893, + 48.1856234663 + ], + [ + 11.4679093267, + 48.1856932092 + ], + [ + 11.4677255953, + 48.1857468575 + ], + [ + 11.4675069953, + 48.1857790465 + ], + [ + 11.4672495032, + 48.1857307630 + ], + [ + 11.4671033228, + 48.1856918680 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 7, + "events": [ + { + "description": "Lane closed" + }, + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4695816840, + 48.1470171049 + ], + [ + 11.4694650079, + 48.1470479201 + ], + [ + 11.4690291489, + 48.1471699501 + ], + [ + 11.4685329402, + 48.1473080864 + ], + [ + 11.4681654776, + 48.1474113808 + ], + [ + 11.4680152739, + 48.1474583022 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4763180519, + 48.2918148200 + ], + [ + 11.4765822495, + 48.2919462090 + ], + [ + 11.4769725109, + 48.2921795966 + ], + [ + 11.4772165919, + 48.2923834264 + ], + [ + 11.4775625969, + 48.2927213750 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4775625969, + 48.2927213750 + ], + [ + 11.4772165919, + 48.2923834264 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4767512287, + 48.1124474245 + ], + [ + 11.4767592753, + 48.1125010934 + ], + [ + 11.4767767097, + 48.1126124047 + ], + [ + 11.4768048729, + 48.1128336832 + ], + [ + 11.4768129195, + 48.1129248471 + ], + [ + 11.4768316949, + 48.1130790809 + ], + [ + 11.4768451060, + 48.1131622416 + ], + [ + 11.4768518115, + 48.1132145667 + ], + [ + 11.4768571759, + 48.1132654927 + ], + [ + 11.4768652226, + 48.1133057298 + ], + [ + 11.4768786336, + 48.1133607410 + ], + [ + 11.4768933858, + 48.1134599625 + ], + [ + 11.4771025981, + 48.1144845682 + ], + [ + 11.4771267379, + 48.1146025905 + ], + [ + 11.4771535600, + 48.1147232986 + ], + [ + 11.4772501195, + 48.1151618075 + ], + [ + 11.4772702361, + 48.1152395926 + ], + [ + 11.4773252214, + 48.1154823486 + ], + [ + 11.4773574079, + 48.1156205142 + ], + [ + 11.4774714018, + 48.1159209070 + ], + [ + 11.4775652791, + 48.1162172689 + ], + [ + 11.4777476693, + 48.1168288457 + ], + [ + 11.4778187479, + 48.1170433911 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4834111537, + 48.1336154068 + ], + [ + 11.4838121439, + 48.1344093637 + ], + [ + 11.4840508605, + 48.1348572701 + ], + [ + 11.4842091108, + 48.1351697450 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + }, + { + "description": "Construction work" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4859471823, + 48.1366369421 + ], + [ + 11.4862878228, + 48.1366262022 + ], + [ + 11.4866686965, + 48.1366127773 + ], + [ + 11.4869315530, + 48.1366423121 + ], + [ + 11.4871193076, + 48.1366476821 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + }, + { + "description": "Construction work" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4895198847, + 48.1364585582 + ], + [ + 11.4899047817, + 48.1364304217 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + }, + { + "description": "Construction work" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4907201732, + 48.1363620102 + ], + [ + 11.4899047817, + 48.1364304217 + ], + [ + 11.4895198847, + 48.1364585582 + ], + [ + 11.4890800024, + 48.1364921206 + ], + [ + 11.4885958637, + 48.1365296545 + ], + [ + 11.4885019864, + 48.1365403945 + ], + [ + 11.4884134735, + 48.1365511344 + ], + [ + 11.4882230366, + 48.1365739009 + ], + [ + 11.4880553986, + 48.1365926958 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4912056531, + 48.1363217911 + ], + [ + 11.4914363230, + 48.1370272143 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4914363230, + 48.1370272143 + ], + [ + 11.4912056531, + 48.1363217911 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4928458239, + 48.1362171879 + ], + [ + 11.4930188264, + 48.1371412133 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4930188264, + 48.1371412133 + ], + [ + 11.4928458239, + 48.1362171879 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + }, + { + "description": "Construction work" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4941735173, + 48.1360817067 + ], + [ + 11.4928458239, + 48.1362171879 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4942660535, + 48.1370942824 + ], + [ + 11.4941735173, + 48.1360817067 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + }, + { + "description": "Construction work" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4926848913, + 48.1361058719 + ], + [ + 11.4933675135, + 48.1360508850 + ], + [ + 11.4941748584, + 48.1359703904 + ], + [ + 11.4947515334, + 48.1359167460 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4954877998, + 48.1359677054 + ], + [ + 11.4955159629, + 48.1363714077 + ], + [ + 11.4956956709, + 48.1378318581 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4956956709, + 48.1378318581 + ], + [ + 11.4955159629, + 48.1363714077 + ], + [ + 11.4954877998, + 48.1359677054 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + }, + { + "description": "Construction work" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4963917042, + 48.1358014577 + ], + [ + 11.4966854061, + 48.1358121419 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4966854061, + 48.0950184358 + ], + [ + 11.4965928699, + 48.0952451085 + ], + [ + 11.4964761938, + 48.0953805294 + ], + [ + 11.4963997508, + 48.0954570009 + ], + [ + 11.4960671569, + 48.0957211794 + ], + [ + 11.4962173606, + 48.0957936197 + ], + [ + 11.4962374772, + 48.0958526243 + ], + [ + 11.4962079729, + 48.0959250085 + ], + [ + 11.4952919985, + 48.0967726176 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4974203313, + 48.1253622942 + ], + [ + 11.4970796908, + 48.1252925252 + ], + [ + 11.4969254638, + 48.1252576686 + ], + [ + 11.4957841838, + 48.1249934741 + ], + [ + 11.4949138070, + 48.1247829343 + ], + [ + 11.4947971309, + 48.1247520499 + ], + [ + 11.4946603383, + 48.1247145073 + ], + [ + 11.4944806303, + 48.1246662223 + ], + [ + 11.4943156744, + 48.1246233085 + ], + [ + 11.4938100780, + 48.1245079949 + ], + [ + 11.4933299626, + 48.1244100816 + ], + [ + 11.4930738116, + 48.1243604535 + ], + [ + 11.4928900803, + 48.1243242535 + ], + [ + 11.4924287404, + 48.1242343967 + ], + [ + 11.4919218029, + 48.1241552824 + ], + [ + 11.4919003452, + 48.1241525968 + ], + [ + 11.4917018617, + 48.1241231107 + ], + [ + 11.4914671684, + 48.1240908830 + ], + [ + 11.4914309586, + 48.1240855677 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4997712875, + 48.1313127337 + ], + [ + 11.4996291305, + 48.1310230602 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4996291305, + 48.1310230602 + ], + [ + 11.4997712875, + 48.1313127337 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5009045209, + 48.1026372578 + ], + [ + 11.5008723343, + 48.1025688573 + ], + [ + 11.5008321012, + 48.1024749883 + ], + [ + 11.5008012558, + 48.1023998706 + ], + [ + 11.5007677282, + 48.1023556508 + ], + [ + 11.5007328595, + 48.1023073448 + ], + [ + 11.5007046963, + 48.1022684424 + ], + [ + 11.5006389822, + 48.1021986980 + ], + [ + 11.5005437637, + 48.1021196057 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.4994038249, + 48.1120759372 + ], + [ + 11.5018620695, + 48.1120316698 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5021074916, + 48.1057915314 + ], + [ + 11.5020551885, + 48.1056681717 + ], + [ + 11.5019881333, + 48.1054388024 + ], + [ + 11.5019277836, + 48.1052725119 + ], + [ + 11.5018459762, + 48.1050499134 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5023006106, + 48.1074276990 + ], + [ + 11.5023059751, + 48.1075886096 + ], + [ + 11.5023140217, + 48.1078850196 + ], + [ + 11.5023180450, + 48.1079802219 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5024266745, + 48.1121832200 + ], + [ + 11.5022483076, + 48.1121779034 + ], + [ + 11.5018540228, + 48.1121752172 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 7, + "events": [ + { + "description": "Lane closed" + }, + { + "description": "Left lane closed" + }, + { + "description": "Carriageway reduced to one lane" + }, + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5030181016, + 48.1396141678 + ], + [ + 11.5030113960, + 48.1394599578 + ], + [ + 11.5029832328, + 48.1387142949 + ], + [ + 11.5029711629, + 48.1383535694 + ], + [ + 11.5029644574, + 48.1379284034 + ], + [ + 11.5029523874, + 48.1373919766 + ], + [ + 11.5029483641, + 48.1372189651 + ], + [ + 11.5029322709, + 48.1368756814 + ], + [ + 11.5029255654, + 48.1366986408 + ], + [ + 11.5029202009, + 48.1364572157 + ], + [ + 11.5029134954, + 48.1362171879 + ], + [ + 11.5029014255, + 48.1357893751 + ], + [ + 11.5028987433, + 48.1355533158 + ], + [ + 11.5028960611, + 48.1355184662 + ], + [ + 11.5028920377, + 48.1354433408 + ], + [ + 11.5028893555, + 48.1353990935 + ], + [ + 11.5028880144, + 48.1353642438 + ], + [ + 11.5028866733, + 48.1352730638 + ], + [ + 11.5028826500, + 48.1350638528 + ], + [ + 11.5028826500, + 48.1349994671 + ], + [ + 11.5028786267, + 48.1347097585 + ], + [ + 11.5028611923, + 48.1341800108 + ], + [ + 11.5028598512, + 48.1341210502 + ], + [ + 11.5028518046, + 48.1338393919 + ], + [ + 11.5028491224, + 48.1337669493 + ], + [ + 11.5028477813, + 48.1337186728 + ], + [ + 11.5028343702, + 48.1331889708 + ], + [ + 11.5028370525, + 48.1330521951 + ], + [ + 11.5028155948, + 48.1322408193 + ], + [ + 11.5028129126, + 48.1320999572 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 7, + "events": [ + { + "description": "Lane closed" + }, + { + "description": "Left lane closed" + }, + { + "description": "Carriageway reduced to one lane" + }, + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5030905212, + 48.1423098328 + ], + [ + 11.5030932034, + 48.1422735895 + ], + [ + 11.5030918623, + 48.1421636290 + ], + [ + 11.5030918623, + 48.1421354956 + ], + [ + 11.5030905212, + 48.1419772101 + ], + [ + 11.5030891801, + 48.1417733959 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 7, + "events": [ + { + "description": "Lane closed" + }, + { + "description": "Left lane closed" + }, + { + "description": "Carriageway reduced to one lane" + }, + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5029108132, + 48.1302814706 + ], + [ + 11.5029134954, + 48.1303592328 + ], + [ + 11.5029497052, + 48.1310203749 + ], + [ + 11.5029564108, + 48.1314213748 + ], + [ + 11.5029644574, + 48.1317942326 + ], + [ + 11.5029725040, + 48.1322515042 + ], + [ + 11.5029953028, + 48.1331849431 + ], + [ + 11.5030154194, + 48.1337656627 + ], + [ + 11.5030181016, + 48.1338367068 + ], + [ + 11.5030274893, + 48.1341303921 + ], + [ + 11.5030288304, + 48.1341773816 + ], + [ + 11.5030328537, + 48.1346414006 + ], + [ + 11.5030368770, + 48.1350396872 + ], + [ + 11.5030422414, + 48.1352703788 + ], + [ + 11.5030422414, + 48.1353494760 + ], + [ + 11.5030422414, + 48.1353910383 + ], + [ + 11.5030449237, + 48.1354379708 + ], + [ + 11.5030489470, + 48.1355184662 + ], + [ + 11.5030516292, + 48.1355519732 + ], + [ + 11.5030502881, + 48.1358041427 + ], + [ + 11.5030610169, + 48.1363794627 + ], + [ + 11.5030623580, + 48.1364317642 + ], + [ + 11.5030851568, + 48.1369212700 + ], + [ + 11.5030945445, + 48.1371908290 + ], + [ + 11.5031025911, + 48.1374348797 + ], + [ + 11.5031160022, + 48.1376011781 + ], + [ + 11.5031253899, + 48.1380679070 + ], + [ + 11.5031347777, + 48.1382596539 + ], + [ + 11.5031508709, + 48.1385748490 + ], + [ + 11.5031709875, + 48.1391354271 + ], + [ + 11.5031937863, + 48.1396302768 + ], + [ + 11.5031964685, + 48.1396892870 + ], + [ + 11.5031978096, + 48.1397509820 + ], + [ + 11.5032125617, + 48.1400943024 + ], + [ + 11.5032206083, + 48.1402780434 + ], + [ + 11.5032273139, + 48.1404268814 + ], + [ + 11.5032286550, + 48.1405207929 + ], + [ + 11.5032340194, + 48.1407755668 + ], + [ + 11.5032340194, + 48.1408386029 + ], + [ + 11.5032514537, + 48.1412811956 + ], + [ + 11.5032541360, + 48.1414380850 + ], + [ + 11.5032581593, + 48.1416057127 + ], + [ + 11.5032554771, + 48.1417063339 + ], + [ + 11.5032541360, + 48.1417787094 + ], + [ + 11.5032581593, + 48.1419798948 + ], + [ + 11.5032581593, + 48.1420000301 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5029979850, + 48.1255782027 + ], + [ + 11.5030771102, + 48.1255674605 + ], + [ + 11.5032045151, + 48.1255553754 + ], + [ + 11.5032876636, + 48.1255460319 + ], + [ + 11.5034767593, + 48.1255285757 + ], + [ + 11.5038415397, + 48.1254789487 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5039407815, + 48.1508875321 + ], + [ + 11.5037610735, + 48.1505656461 + ], + [ + 11.5036873127, + 48.1504208079 + ], + [ + 11.5034593249, + 48.1498723205 + ], + [ + 11.5033453311, + 48.1492889310 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5033453311, + 48.1492889310 + ], + [ + 11.5034593249, + 48.1498723205 + ], + [ + 11.5036873127, + 48.1504208079 + ], + [ + 11.5037610735, + 48.1505656461 + ], + [ + 11.5039407815, + 48.1508875321 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Queuing traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5030851568, + 48.1369212700 + ], + [ + 11.5032179261, + 48.1369038177 + ], + [ + 11.5034003163, + 48.1368796530 + ], + [ + 11.5039783324, + 48.1368032431 + ], + [ + 11.5044262613, + 48.1367428870 + ], + [ + 11.5048728491, + 48.1366838734 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5062340702, + 48.0989371736 + ], + [ + 11.5062380935, + 48.0988432980 + ], + [ + 11.5062327291, + 48.0987842409 + ], + [ + 11.5062112714, + 48.0987373309 + ], + [ + 11.5061670149, + 48.0986890215 + ], + [ + 11.5061160530, + 48.0986407680 + ], + [ + 11.5060932542, + 48.0986179847 + ], + [ + 11.5060717965, + 48.0985991759 + ], + [ + 11.5060650910, + 48.0985777361 + ], + [ + 11.5059913303, + 48.0985804231 + ], + [ + 11.5059323217, + 48.0985804231 + ], + [ + 11.5056211854, + 48.0985790796 + ], + [ + 11.5040225888, + 48.0985616702 + ], + [ + 11.5029805506, + 48.0985562963 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + }, + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5071272458, + 48.1397308459 + ], + [ + 11.5067611242, + 48.1397482972 + ], + [ + 11.5065049733, + 48.1397617213 + ], + [ + 11.5053060259, + 48.1397670910 + ], + [ + 11.5048634614, + 48.1397697758 + ], + [ + 11.5044718588, + 48.1397711182 + ], + [ + 11.5043605472, + 48.1397724606 + ], + [ + 11.5041687692, + 48.1397724606 + ], + [ + 11.5039568747, + 48.1397738030 + ], + [ + 11.5036578084, + 48.1397751454 + ], + [ + 11.5033574010, + 48.1397684334 + ], + [ + 11.5031978096, + 48.1397509820 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5080780889, + 48.1528737187 + ], + [ + 11.5085675920, + 48.1523989601 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + }, + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5086708571, + 48.1060624293 + ], + [ + 11.5083100999, + 48.1059431001 + ], + [ + 11.5076516176, + 48.1056426490 + ], + [ + 11.5068134273, + 48.1052765418 + ], + [ + 11.5065049733, + 48.1051357177 + ], + [ + 11.5063936616, + 48.1050820970 + ], + [ + 11.5061911548, + 48.1049855460 + ], + [ + 11.5059376861, + 48.1048634717 + ], + [ + 11.5055621768, + 48.1046838020 + ], + [ + 11.5052885915, + 48.1045537229 + ], + [ + 11.5050619448, + 48.1044370209 + ], + [ + 11.5049291755, + 48.1043713095 + ], + [ + 11.5048098172, + 48.1043096279 + ], + [ + 11.5046046282, + 48.1041915820 + ], + [ + 11.5045429374, + 48.1041526811 + ], + [ + 11.5044852699, + 48.1041151795 + ], + [ + 11.5044262613, + 48.1040695618 + ], + [ + 11.5043565239, + 48.1040065366 + ], + [ + 11.5043028797, + 48.1039528587 + ], + [ + 11.5042210723, + 48.1038643657 + ], + [ + 11.5041231717, + 48.1037610956 + ], + [ + 11.5040842796, + 48.1037128469 + ], + [ + 11.5040427054, + 48.1036498212 + ], + [ + 11.5039877201, + 48.1035626151 + ], + [ + 11.5039112772, + 48.1034258164 + ], + [ + 11.5038656796, + 48.1033306056 + ], + [ + 11.5037771667, + 48.1031254065 + ], + [ + 11.5037060882, + 48.1029390139 + ], + [ + 11.5036792661, + 48.1028424588 + ], + [ + 11.5036551262, + 48.1027164053 + ], + [ + 11.5036336685, + 48.1025634837 + ], + [ + 11.5036175753, + 48.1023918103 + ], + [ + 11.5036068464, + 48.1022201923 + ], + [ + 11.5036095286, + 48.1020418007 + ], + [ + 11.5036229397, + 48.1018916200 + ], + [ + 11.5036470796, + 48.1017091971 + ], + [ + 11.5036739017, + 48.1015657324 + ], + [ + 11.5037007238, + 48.1014597709 + ], + [ + 11.5037436391, + 48.1013310271 + ], + [ + 11.5037583912, + 48.1012974977 + ], + [ + 11.5037785078, + 48.1012559078 + ], + [ + 11.5038388575, + 48.1011003510 + ], + [ + 11.5039206649, + 48.1009434504 + ], + [ + 11.5040091778, + 48.1007865493 + ], + [ + 11.5041164662, + 48.1006470564 + ], + [ + 11.5041835214, + 48.1005773098 + ], + [ + 11.5042680110, + 48.1004780634 + ], + [ + 11.5044664944, + 48.1002782827 + ], + [ + 11.5048741902, + 48.0999148242 + ], + [ + 11.5050243939, + 48.0998007986 + ], + [ + 11.5052577461, + 48.0996237981 + ], + [ + 11.5058062578, + 48.0992214863 + ], + [ + 11.5059537793, + 48.0991182069 + ], + [ + 11.5061240996, + 48.0990095534 + ], + [ + 11.5062340702, + 48.0989371736 + ], + [ + 11.5066967512, + 48.0986970824 + ], + [ + 11.5069113279, + 48.0986259897 + ], + [ + 11.5069435145, + 48.0986152978 + ], + [ + 11.5070508028, + 48.0985790796 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5092971529, + 48.1516854719 + ], + [ + 11.5085675920, + 48.1523989601 + ], + [ + 11.5080780889, + 48.1528737187 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5080780889, + 48.1528737187 + ], + [ + 11.5085582043, + 48.1531164087 + ], + [ + 11.5085944141, + 48.1531338555 + ], + [ + 11.5086373294, + 48.1531647229 + ], + [ + 11.5088237430, + 48.1533564693 + ], + [ + 11.5093293394, + 48.1539157118 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5093722547, + 48.1351550331 + ], + [ + 11.5093400682, + 48.1346990181 + ], + [ + 11.5093360449, + 48.1346279752 + ], + [ + 11.5093145872, + 48.1343624303 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + }, + { + "description": "New roadworks layout" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5089028681, + 48.0979822880 + ], + [ + 11.5090342964, + 48.0979541304 + ], + [ + 11.5092515553, + 48.0979098508 + ], + [ + 11.5095425750, + 48.0978589095 + ], + [ + 11.5095734204, + 48.0978535355 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + }, + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5096485222, + 48.1823538254 + ], + [ + 11.5093963946, + 48.1824906374 + ], + [ + 11.5090222264, + 48.1826945135 + ], + [ + 11.5089296902, + 48.1827360934 + ], + [ + 11.5088344718, + 48.1827789587 + ], + [ + 11.5086480583, + 48.1828634596 + ], + [ + 11.5085474754, + 48.1828983329 + ], + [ + 11.5085206534, + 48.1829077219 + ], + [ + 11.5084589625, + 48.1829318650 + ], + [ + 11.5080941821, + 48.1830659929 + ], + [ + 11.5079681183, + 48.1831129376 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + }, + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5100508536, + 48.1544642678 + ], + [ + 11.5099905039, + 48.1544508475 + ], + [ + 11.5098979677, + 48.1544334012 + ], + [ + 11.5098242069, + 48.1544038766 + ], + [ + 11.5097598339, + 48.1543730659 + ], + [ + 11.5096726621, + 48.1543180427 + ], + [ + 11.5095465983, + 48.1542242123 + ], + [ + 11.5095077063, + 48.1541195896 + ], + [ + 11.5094138290, + 48.1540109406 + ], + [ + 11.5093293394, + 48.1539157118 + ], + [ + 11.5088237430, + 48.1533564693 + ], + [ + 11.5086373294, + 48.1531647229 + ], + [ + 11.5085944141, + 48.1531338555 + ], + [ + 11.5085582043, + 48.1531164087 + ], + [ + 11.5080780889, + 48.1528737187 + ], + [ + 11.5077629293, + 48.1527623829 + ], + [ + 11.5074893440, + 48.1526752042 + ], + [ + 11.5068818236, + 48.1524927938 + ], + [ + 11.5054428185, + 48.1521347374 + ], + [ + 11.5048889423, + 48.1519966141 + ], + [ + 11.5047776307, + 48.1519483548 + ], + [ + 11.5046837534, + 48.1519054078 + ], + [ + 11.5046019460, + 48.1518517800 + ], + [ + 11.5045415963, + 48.1518021784 + ], + [ + 11.5045000220, + 48.1517538629 + ], + [ + 11.5044477190, + 48.1517029192 + ], + [ + 11.5042760576, + 48.1514454034 + ], + [ + 11.5042492355, + 48.1514038541 + ], + [ + 11.5041473116, + 48.1512294918 + ], + [ + 11.5040762330, + 48.1511168663 + ], + [ + 11.5040534342, + 48.1510792871 + ], + [ + 11.5039823557, + 48.1509559242 + ], + [ + 11.5039407815, + 48.1508875321 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + }, + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5079681183, + 48.1831129376 + ], + [ + 11.5080941821, + 48.1830659929 + ], + [ + 11.5084589625, + 48.1829318650 + ], + [ + 11.5085206534, + 48.1829077219 + ], + [ + 11.5085474754, + 48.1828983329 + ], + [ + 11.5086480583, + 48.1828634596 + ], + [ + 11.5088344718, + 48.1827789587 + ], + [ + 11.5089296902, + 48.1827360934 + ], + [ + 11.5090222264, + 48.1826945135 + ], + [ + 11.5093963946, + 48.1824906374 + ], + [ + 11.5096485222, + 48.1823538254 + ], + [ + 11.5096793677, + 48.1823351031 + ], + [ + 11.5097263063, + 48.1823082772 + ], + [ + 11.5100320781, + 48.1821365908 + ], + [ + 11.5100763346, + 48.1821111061 + ], + [ + 11.5101286377, + 48.1820789148 + ], + [ + 11.5102667714, + 48.1819957539 + ], + [ + 11.5106744672, + 48.1817503503 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5175275112, + 48.0548027490 + ], + [ + 11.5173263456, + 48.0548456651 + ], + [ + 11.5169387664, + 48.0549033161 + ], + [ + 11.5164814497, + 48.0549355311 + ], + [ + 11.5159369613, + 48.0549395090 + ], + [ + 11.5155145134, + 48.0549046607 + ], + [ + 11.5151068176, + 48.0548496990 + ], + [ + 11.5143276359, + 48.0547128828 + ], + [ + 11.5132413412, + 48.0545761223 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5178225542, + 48.0945624563 + ], + [ + 11.5174550916, + 48.0945584256 + ], + [ + 11.5172968413, + 48.0945557384 + ], + [ + 11.5169655884, + 48.0945531072 + ], + [ + 11.5166598166, + 48.0945504200 + ], + [ + 11.5165699626, + 48.0945504200 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5175275112, + 48.0548027490 + ], + [ + 11.5177635456, + 48.0547370302 + ], + [ + 11.5181444193, + 48.0546096261 + ], + [ + 11.5183724071, + 48.0545398731 + ], + [ + 11.5186164881, + 48.0544795324 + ], + [ + 11.5187599863, + 48.0544513510 + ], + [ + 11.5189101900, + 48.0544245703 + ], + [ + 11.5200849975, + 48.0543172791 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5206911768, + 48.1243068528 + ], + [ + 11.5209647621, + 48.1244905383 + ], + [ + 11.5210264529, + 48.1245079949 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5202848221, + 48.0763878358 + ], + [ + 11.5202982331, + 48.0763878358 + ], + [ + 11.5204672123, + 48.0763838036 + ], + [ + 11.5207609142, + 48.0763757392 + ], + [ + 11.5208521093, + 48.0763730510 + ], + [ + 11.5218472089, + 48.0763422495 + ], + [ + 11.5221905316, + 48.0763328410 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5221905316, + 48.0763328410 + ], + [ + 11.5218472089, + 48.0763422495 + ], + [ + 11.5208547915, + 48.0763730510 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5210344995, + 48.1952029514 + ], + [ + 11.5219625438, + 48.1950836058 + ], + [ + 11.5229831244, + 48.1959298584 + ], + [ + 11.5235544349, + 48.1963603545 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5235544349, + 48.1963603545 + ], + [ + 11.5229831244, + 48.1959298584 + ], + [ + 11.5219625438, + 48.1950836058 + ], + [ + 11.5210344995, + 48.1952029514 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5209003891, + 48.0786194423 + ], + [ + 11.5212732161, + 48.0790123393 + ], + [ + 11.5221422518, + 48.0797687248 + ], + [ + 11.5225110556, + 48.0800074484 + ], + [ + 11.5233546103, + 48.0804325899 + ], + [ + 11.5235745515, + 48.0805425706 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5243523921, + 48.1779751441 + ], + [ + 11.5227470900, + 48.1780998952 + ], + [ + 11.5213805045, + 48.1781414229 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Slow traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5336784328, + 48.1551535613 + ], + [ + 11.5332412327, + 48.1550355763 + ], + [ + 11.5330668892, + 48.1549886058 + ], + [ + 11.5328563358, + 48.1549269292 + ], + [ + 11.5326873566, + 48.1548893528 + ], + [ + 11.5319162215, + 48.1547163444 + ], + [ + 11.5314213539, + 48.1546184887 + ], + [ + 11.5306703354, + 48.1544709220 + ], + [ + 11.5299246813, + 48.1543006522 + ], + [ + 11.5295585598, + 48.1542242123 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5363096799, + 48.1536193437 + ], + [ + 11.5365135277, + 48.1536743117 + ], + [ + 11.5365416909, + 48.1536622892 + ], + [ + 11.5365658308, + 48.1536542369 + ], + [ + 11.5367374922, + 48.1536072652 + ], + [ + 11.5368783082, + 48.1535643756 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5368984247, + 48.1999383890 + ], + [ + 11.5366395916, + 48.2007081908 + ], + [ + 11.5362117792, + 48.2019245758 + ], + [ + 11.5361500884, + 48.2020935702 + ], + [ + 11.5361111964, + 48.2022732903 + ], + [ + 11.5360870565, + 48.2026071980 + ], + [ + 11.5360655988, + 48.2028083684 + ], + [ + 11.5360763277, + 48.2029277519 + ], + [ + 11.5361058320, + 48.2029947897 + ], + [ + 11.5361567939, + 48.2030725535 + ], + [ + 11.5362184848, + 48.2031342841 + ], + [ + 11.5362935866, + 48.2031879141 + ], + [ + 11.5366650726, + 48.2034507565 + ], + [ + 11.5366932358, + 48.2035137715 + ], + [ + 11.5367160345, + 48.2035929311 + ], + [ + 11.5367160345, + 48.2037578978 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5402726437, + 48.1262071800 + ], + [ + 11.5401197578, + 48.1264861387 + ], + [ + 11.5400795246, + 48.1265665922 + ], + [ + 11.5400325860, + 48.1266497310 + ], + [ + 11.5399977173, + 48.1267141272 + ], + [ + 11.5399789418, + 48.1267476400 + ], + [ + 11.5398448313, + 48.1269756274 + ], + [ + 11.5395886804, + 48.1273242923 + ], + [ + 11.5394948031, + 48.1274450265 + ], + [ + 11.5392078067, + 48.1277977163 + ], + [ + 11.5390441920, + 48.1279975579 + ], + [ + 11.5390280987, + 48.1280176427 + ], + [ + 11.5389892067, + 48.1280605537 + ], + [ + 11.5389704312, + 48.1280887508 + ], + [ + 11.5389650668, + 48.1280954643 + ], + [ + 11.5388846005, + 48.1281960560 + ], + [ + 11.5388296152, + 48.1282818777 + ], + [ + 11.5387920643, + 48.1283529294 + ], + [ + 11.5387692655, + 48.1284306946 + ], + [ + 11.5387746299, + 48.1285460553 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5407594646, + 48.1617223255 + ], + [ + 11.5417424942, + 48.1624545714 + ], + [ + 11.5420268084, + 48.1626731194 + ], + [ + 11.5420496072, + 48.1626905629 + ], + [ + 11.5420871581, + 48.1627187410 + ], + [ + 11.5421233679, + 48.1627549698 + ], + [ + 11.5421743299, + 48.1628126117 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5484600867, + 48.1241499111 + ], + [ + 11.5486330892, + 48.1242370824 + ], + [ + 11.5487269665, + 48.1242893962 + ], + [ + 11.5488543714, + 48.1243913382 + ], + [ + 11.5489039923, + 48.1244315666 + ], + [ + 11.5489603187, + 48.1244744806 + ], + [ + 11.5490260328, + 48.1245147089 + ], + [ + 11.5490971113, + 48.1245817374 + ], + [ + 11.5491735543, + 48.1247038208 + ], + [ + 11.5493908132, + 48.1248848193 + ], + [ + 11.5496590341, + 48.1250766155 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5523372198, + 48.2078335178 + ], + [ + 11.5526201929, + 48.2082841349 + ], + [ + 11.5527140702, + 48.2085563354 + ], + [ + 11.5527677144, + 48.2087629007 + ], + [ + 11.5527771021, + 48.2087977565 + ], + [ + 11.5527918543, + 48.2089171260 + ], + [ + 11.5528857316, + 48.2096453465 + ], + [ + 11.5528937782, + 48.2097029915 + ], + [ + 11.5529098715, + 48.2098250400 + ], + [ + 11.5529420580, + 48.2100785203 + ], + [ + 11.5529755856, + 48.2103346803 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5534691120, + 48.1500372364 + ], + [ + 11.5534892286, + 48.1500855535 + ], + [ + 11.5536260213, + 48.1502585216 + ], + [ + 11.5538499857, + 48.1505267803 + ], + [ + 11.5540162827, + 48.1507359842 + ], + [ + 11.5542053784, + 48.1509693454 + ], + [ + 11.5544052030, + 48.1512160707 + ], + [ + 11.5545822288, + 48.1514319824 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5602054800, + 48.1392427093 + ], + [ + 11.5600338186, + 48.1376078904 + ], + [ + 11.5600190665, + 48.1373973464 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5609283353, + 48.1363325311 + ], + [ + 11.5609176065, + 48.1362198729 + ], + [ + 11.5608921255, + 48.1359234585 + ], + [ + 11.5606815721, + 48.1342363422 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5661546196, + 48.1378828157 + ], + [ + 11.5659574772, + 48.1366905859 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Slow traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5623016263, + 48.1417666841 + ], + [ + 11.5623619760, + 48.1417465487 + ], + [ + 11.5625094975, + 48.1416955950 + ], + [ + 11.5630928780, + 48.1415212557 + ], + [ + 11.5638868119, + 48.1412798533 + ], + [ + 11.5645251776, + 48.1410853769 + ], + [ + 11.5650173630, + 48.1409419103 + ], + [ + 11.5654921140, + 48.1408037569 + ], + [ + 11.5658045913, + 48.1407125307 + ], + [ + 11.5659454073, + 48.1406615759 + ], + [ + 11.5660218502, + 48.1405771173 + ], + [ + 11.5660889055, + 48.1405623511 + ], + [ + 11.5663490797, + 48.1405060266 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Queuing traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5600096787, + 48.1302371628 + ], + [ + 11.5623713638, + 48.1313369011 + ], + [ + 11.5631250645, + 48.1316896201 + ], + [ + 11.5632189418, + 48.1317352133 + ], + [ + 11.5637044216, + 48.1319658638 + ], + [ + 11.5650884415, + 48.1326860594 + ], + [ + 11.5655940379, + 48.1329059649 + ], + [ + 11.5656449999, + 48.1329287889 + ], + [ + 11.5658354367, + 48.1330159452 + ], + [ + 11.5659252907, + 48.1330575095 + ], + [ + 11.5660070981, + 48.1330937593 + ], + [ + 11.5662417914, + 48.1331849431 + ], + [ + 11.5663906540, + 48.1332385904 + ], + [ + 11.5665381755, + 48.1332922377 + ], + [ + 11.5666615571, + 48.1333324591 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5690406765, + 48.1361648862 + ], + [ + 11.5684103574, + 48.1362882286 + ], + [ + 11.5682735647, + 48.1363056811 + ], + [ + 11.5677880849, + 48.1363982017 + ], + [ + 11.5671389903, + 48.1365189146 + ], + [ + 11.5670477952, + 48.1365323395 + ], + [ + 11.5668519939, + 48.1365511344 + ], + [ + 11.5667540933, + 48.1365497919 + ], + [ + 11.5666897203, + 48.1365538194 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5701309944, + 48.1148077997 + ], + [ + 11.5701041724, + 48.1140085032 + ], + [ + 11.5701403822, + 48.1130522747 + ], + [ + 11.5701055135, + 48.1127612669 + ], + [ + 11.5700558926, + 48.1125118384 + ], + [ + 11.5700102950, + 48.1123870957 + ], + [ + 11.5699298288, + 48.1121644721 + ], + [ + 11.5699123944, + 48.1121309498 + ], + [ + 11.5698332692, + 48.1120102356 + ], + [ + 11.5697890128, + 48.1119351318 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5693544949, + 48.1374831527 + ], + [ + 11.5698922778, + 48.1373611556 + ], + [ + 11.5700532104, + 48.1373289363 + ], + [ + 11.5700800325, + 48.1373249088 + ], + [ + 11.5701081957, + 48.1373235664 + ], + [ + 11.5701524521, + 48.1373249088 + ], + [ + 11.5702020730, + 48.1373329637 + ], + [ + 11.5702436472, + 48.1373517583 + ], + [ + 11.5702718104, + 48.1373692105 + ], + [ + 11.5703415479, + 48.1374107712 + ], + [ + 11.5703804399, + 48.1374295098 + ], + [ + 11.5704367663, + 48.1374402496 + ], + [ + 11.5705038215, + 48.1374362222 + ], + [ + 11.5706111099, + 48.1374295098 + ], + [ + 11.5708069111, + 48.1374121136 + ], + [ + 11.5710872020, + 48.1373825793 + ], + [ + 11.5711193885, + 48.1373798943 + ], + [ + 11.5711341406, + 48.1373785518 + ], + [ + 11.5711971725, + 48.1373678680 + ], + [ + 11.5712454523, + 48.1373598131 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5710724498, + 48.2720428888 + ], + [ + 11.5718167628, + 48.2718149324 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Queuing traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5726388599, + 48.1329261037 + ], + [ + 11.5724430586, + 48.1328107528 + ], + [ + 11.5718127395, + 48.1324325879 + ], + [ + 11.5716705824, + 48.1323427454 + ], + [ + 11.5715539063, + 48.1322649302 + ], + [ + 11.5713835861, + 48.1321683744 + ], + [ + 11.5711327995, + 48.1320248828 + ], + [ + 11.5710094179, + 48.1319604933 + ], + [ + 11.5708900596, + 48.1319095299 + ], + [ + 11.5708015467, + 48.1318827335 + ], + [ + 11.5707599725, + 48.1318746778 + ], + [ + 11.5707090105, + 48.1318652795 + ], + [ + 11.5706486608, + 48.1318545385 + ], + [ + 11.5705976988, + 48.1318505666 + ], + [ + 11.5705628301, + 48.1318438535 + ], + [ + 11.5703965331, + 48.1318425109 + ], + [ + 11.5702610816, + 48.1318357978 + ], + [ + 11.5702141429, + 48.1318384831 + ], + [ + 11.5701189245, + 48.1318425109 + ], + [ + 11.5700505282, + 48.1318545385 + ], + [ + 11.5693813170, + 48.1320704757 + ], + [ + 11.5691372360, + 48.1321643465 + ], + [ + 11.5690795685, + 48.1321858283 + ], + [ + 11.5689736213, + 48.1322273932 + ], + [ + 11.5689052249, + 48.1322582172 + ], + [ + 11.5688488985, + 48.1322850693 + ], + [ + 11.5688260998, + 48.1323414028 + ], + [ + 11.5687992777, + 48.1323668563 + ], + [ + 11.5686061586, + 48.1325304859 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5730747188, + 48.1298589790 + ], + [ + 11.5725114549, + 48.1295076460 + ], + [ + 11.5717751886, + 48.1290462660 + ], + [ + 11.5709209050, + 48.1285125437 + ], + [ + 11.5707036461, + 48.1283757554 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5727515127, + 48.1362480095 + ], + [ + 11.5729339029, + 48.1361112419 + ], + [ + 11.5731444563, + 48.1359958981 + ], + [ + 11.5732571091, + 48.1358859241 + ], + [ + 11.5733469631, + 48.1358242245 + ], + [ + 11.5733737851, + 48.1358041427 + ], + [ + 11.5734555925, + 48.1357571547 + ], + [ + 11.5735615398, + 48.1356794007 + ], + [ + 11.5736312772, + 48.1356338110 + ], + [ + 11.5736902858, + 48.1355948779 + ], + [ + 11.5738109852, + 48.1355198087 + ], + [ + 11.5739853288, + 48.1354473684 + ], + [ + 11.5741315092, + 48.1354017785 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5718395616, + 48.1414836695 + ], + [ + 11.5721989776, + 48.1414139783 + ], + [ + 11.5727059151, + 48.1412959617 + ], + [ + 11.5732544268, + 48.1411618364 + ], + [ + 11.5745271350, + 48.1408077840 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5745271350, + 48.1408077840 + ], + [ + 11.5732544268, + 48.1411618364 + ], + [ + 11.5727059151, + 48.1412959617 + ], + [ + 11.5721989776, + 48.1414139783 + ], + [ + 11.5718395616, + 48.1414836695 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5737962331, + 48.1341116523 + ], + [ + 11.5739397312, + 48.1342001491 + ], + [ + 11.5741945411, + 48.1343624303 + ], + [ + 11.5742723252, + 48.1344160764 + ], + [ + 11.5743192638, + 48.1344455566 + ], + [ + 11.5743782724, + 48.1344885181 + ], + [ + 11.5745217706, + 48.1345823846 + ], + [ + 11.5745646859, + 48.1346158923 + ], + [ + 11.5746008958, + 48.1346427432 + ], + [ + 11.5746987964, + 48.1347339242 + ], + [ + 11.5747443940, + 48.1347821998 + ], + [ + 11.5748127903, + 48.1348559276 + ], + [ + 11.5748758222, + 48.1349511918 + ], + [ + 11.5749187375, + 48.1350115499 + ], + [ + 11.5749589707, + 48.1350812498 + ], + [ + 11.5749898161, + 48.1351483205 + ], + [ + 11.5750126149, + 48.1352046508 + ], + [ + 11.5750421192, + 48.1352944883 + ], + [ + 11.5749160553, + 48.1352985159 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5746143068, + 48.1481972390 + ], + [ + 11.5747940148, + 48.1481422651 + ], + [ + 11.5749589707, + 48.1480966865 + ], + [ + 11.5759768690, + 48.1478110224 + ], + [ + 11.5766916777, + 48.1476112020 + ], + [ + 11.5769531931, + 48.1475307255 + ], + [ + 11.5771235133, + 48.1474811197 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5804266537, + 48.2705851443 + ], + [ + 11.5794583763, + 48.2706172799 + ], + [ + 11.5782849099, + 48.2706589000 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5834790076, + 48.1894174435 + ], + [ + 11.5821030344, + 48.1894013502 + ], + [ + 11.5820467080, + 48.1894281724 + ], + [ + 11.5819984282, + 48.1896427498 + ], + [ + 11.5819823350, + 48.1897916123 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5819823350, + 48.1897916123 + ], + [ + 11.5819984282, + 48.1896427498 + ], + [ + 11.5820467080, + 48.1894281724 + ], + [ + 11.5821030344, + 48.1894013502 + ], + [ + 11.5834790076, + 48.1894174435 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5835044886, + 48.1265330792 + ], + [ + 11.5836372579, + 48.1266108471 + ], + [ + 11.5841468777, + 48.1271539884 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5837820972, + 48.1688234457 + ], + [ + 11.5846497918, + 48.1686718949 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5851111318, + 48.1325371989 + ], + [ + 11.5849287416, + 48.1323775972 + ], + [ + 11.5848429109, + 48.1322796989 + ], + [ + 11.5846538152, + 48.1321160685 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5846538152, + 48.1321160685 + ], + [ + 11.5848429109, + 48.1322796989 + ], + [ + 11.5849287416, + 48.1323775972 + ], + [ + 11.5851111318, + 48.1325371989 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5851687993, + 48.1426397128 + ], + [ + 11.5851352717, + 48.1425780212 + ], + [ + 11.5850910152, + 48.1424855118 + ], + [ + 11.5847919489, + 48.1416794867 + ], + [ + 11.5847825612, + 48.1416231634 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5903065707, + 48.1387223495 + ], + [ + 11.5901255215, + 48.1388175506 + ], + [ + 11.5899592246, + 48.1389020680 + ], + [ + 11.5891384686, + 48.1393151442 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5907665695, + 48.1393070896 + ], + [ + 11.5906633045, + 48.1391233452 + ], + [ + 11.5905922259, + 48.1390294871 + ], + [ + 11.5905278529, + 48.1389516821 + ], + [ + 11.5904044713, + 48.1388282901 + ], + [ + 11.5903065707, + 48.1387223495 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + }, + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.5918166543, + 48.1417277557 + ], + [ + 11.5917402114, + 48.1415923450 + ], + [ + 11.5913217868, + 48.1408962694 + ], + [ + 11.5912654604, + 48.1407863059 + ], + [ + 11.5912399794, + 48.1406991627 + ], + [ + 11.5911219622, + 48.1402807282 + ], + [ + 11.5910777058, + 48.1401211505 + ], + [ + 11.5910455192, + 48.1400071581 + ], + [ + 11.5909905340, + 48.1398019377 + ], + [ + 11.5909301843, + 48.1396289344 + ], + [ + 11.5907665695, + 48.1393070896 + ], + [ + 11.5906633045, + 48.1391233452 + ], + [ + 11.5905922259, + 48.1390294871 + ], + [ + 11.5905278529, + 48.1389516821 + ], + [ + 11.5904044713, + 48.1388282901 + ], + [ + 11.5903065707, + 48.1387223495 + ], + [ + 11.5902462210, + 48.1386633381 + ], + [ + 11.5899659301, + 48.1383897595 + ], + [ + 11.5899082626, + 48.1383334327 + ], + [ + 11.5897419657, + 48.1381711640 + ], + [ + 11.5895220245, + 48.1379633073 + ], + [ + 11.5894241239, + 48.1378707336 + ], + [ + 11.5893637742, + 48.1377983525 + ], + [ + 11.5893396343, + 48.1377500798 + ], + [ + 11.5892967190, + 48.1376548208 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6014618780, + 48.1271687585 + ], + [ + 11.6001824643, + 48.1280444971 + ], + [ + 11.6001408900, + 48.1280806945 + ], + [ + 11.6001167501, + 48.1281276336 + ], + [ + 11.6001127268, + 48.1281866570 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6016549970, + 48.1500842114 + ], + [ + 11.6018065418, + 48.1501029454 + ], + [ + 11.6019661332, + 48.1501150247 + ], + [ + 11.6021310891, + 48.1501351568 + ], + [ + 11.6021994854, + 48.1501539467 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6045745815, + 48.0917421235 + ], + [ + 11.6047502662, + 48.0895882943 + ], + [ + 11.6049085165, + 48.0889110540 + ], + [ + 11.6050654258, + 48.0884913016 + ], + [ + 11.6050721313, + 48.0884738328 + ], + [ + 11.6052008773, + 48.0881640413 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6068262960, + 48.0710461810 + ], + [ + 11.6069550420, + 48.0710797301 + ], + [ + 11.6071347500, + 48.0711065582 + ], + [ + 11.6071696187, + 48.0711105908 + ], + [ + 11.6076430286, + 48.0711038698 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6076430286, + 48.0711038698 + ], + [ + 11.6071696187, + 48.0711105908 + ], + [ + 11.6071347500, + 48.0711065582 + ], + [ + 11.6069550420, + 48.0710797301 + ], + [ + 11.6068262960, + 48.0710461810 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6122161950, + 48.0623692697 + ], + [ + 11.6123489643, + 48.0623625476 + ], + [ + 11.6135908271, + 48.0622995272 + ], + [ + 11.6143579389, + 48.0622593062 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Queuing traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6177938486, + 48.1516251333 + ], + [ + 11.6177992131, + 48.1519174867 + ], + [ + 11.6178072597, + 48.1521588950 + ], + [ + 11.6178072597, + 48.1522017858 + ], + [ + 11.6178018953, + 48.1522353379 + ], + [ + 11.6177925075, + 48.1522674920 + ], + [ + 11.6177858020, + 48.1523090966 + ], + [ + 11.6177871431, + 48.1524619819 + ], + [ + 11.6177884842, + 48.1525075566 + ], + [ + 11.6177898253, + 48.1525558714 + ], + [ + 11.6177911664, + 48.1526094985 + ], + [ + 11.6177911664, + 48.1528146677 + ], + [ + 11.6177911664, + 48.1532170073 + ], + [ + 11.6177925075, + 48.1532653213 + ], + [ + 11.6178126241, + 48.1534839085 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6412967051, + 48.1932328755 + ], + [ + 11.6414093579, + 48.1934059216 + ], + [ + 11.6415193285, + 48.1935815932 + ], + [ + 11.6415528561, + 48.1936620533 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6643462683, + 48.1334209574 + ], + [ + 11.6644374634, + 48.1332412756 + ], + [ + 11.6645876671, + 48.1330964445 + ], + [ + 11.6647445764, + 48.1329985476 + ], + [ + 11.6649323310, + 48.1329099927 + ], + [ + 11.6670418884, + 48.1322166523 + ], + [ + 11.6679082419, + 48.1318975023 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.6850341465, + 48.0710167205 + ], + [ + 11.6852433588, + 48.0710676323 + ], + [ + 11.6853077318, + 48.0710864512 + ], + [ + 11.6855008508, + 48.0711481165 + ], + [ + 11.6855920459, + 48.0711789772 + ], + [ + 11.6857020165, + 48.0712138145 + ], + [ + 11.6859380509, + 48.0712715031 + ], + [ + 11.6864342596, + 48.0714270941 + ], + [ + 11.6868151332, + 48.0715464474 + ], + [ + 11.6877445187, + 48.0717851531 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 6, + "events": [ + { + "description": "Stationary traffic" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.7324851062, + 48.1093065996 + ], + [ + 11.7320023085, + 48.1082806033 + ], + [ + 11.7319473232, + 48.1081505334 + ], + [ + 11.7315476741, + 48.1073512453 + ], + [ + 11.7314739134, + 48.1072023673 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.7541493084, + 48.1697903751 + ], + [ + 11.7542458679, + 48.1695503355 + ], + [ + 11.7544966544, + 48.1691775283 + ], + [ + 11.7546468581, + 48.1689240134 + ], + [ + 11.7546656336, + 48.1688905281 + ], + [ + 11.7547031845, + 48.1688086875 + ], + [ + 11.7548413183, + 48.1684988771 + ], + [ + 11.7549794521, + 48.1681274039 + ], + [ + 11.7549955453, + 48.1680483013 + ], + [ + 11.7550116386, + 48.1679718260 + ], + [ + 11.7550223674, + 48.1679208984 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 8, + "events": [ + { + "description": "Closed" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.7550223674, + 48.1679208984 + ], + [ + 11.7550116386, + 48.1679718260 + ], + [ + 11.7549955453, + 48.1680483013 + ], + [ + 11.7549794521, + 48.1681274039 + ], + [ + 11.7548413183, + 48.1684988771 + ], + [ + 11.7547031845, + 48.1688086875 + ], + [ + 11.7546656336, + 48.1688905281 + ], + [ + 11.7546468581, + 48.1689240134 + ], + [ + 11.7544966544, + 48.1691775283 + ], + [ + 11.7542458679, + 48.1695503355 + ], + [ + 11.7541493084, + 48.1697903751 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "iconCategory": 9, + "events": [ + { + "description": "Roadworks" + } + ] + }, + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 11.7475939895, + 48.0938744767 + ], + [ + 11.7476757969, + 48.0939965211 + ], + [ + 11.7477321233, + 48.0940836875 + ], + [ + 11.7477669920, + 48.0941346325 + ], + [ + 11.7481451835, + 48.0947086277 + ], + [ + 11.7484670486, + 48.0952129187 + ], + [ + 11.7488278057, + 48.0957815277 + ], + [ + 11.7490624990, + 48.0961516771 + ], + [ + 11.7493293788, + 48.0965982378 + ], + [ + 11.7495707776, + 48.0969925649 + ], + [ + 11.7498550917, + 48.0974633015 + ], + [ + 11.7500575985, + 48.0978092558 + ], + [ + 11.7500777151, + 48.0978441310 + ], + [ + 11.7503472771, + 48.0983001374 + ], + [ + 11.7505511250, + 48.0986595208 + ], + [ + 11.7507281508, + 48.0989707046 + ], + [ + 11.7508045937, + 48.0991074591 + ], + [ + 11.7511036600, + 48.0996452374 + ], + [ + 11.7512417938, + 48.0998839808 + ], + [ + 11.7524782922, + 48.1022040716 + ], + [ + 11.7526459302, + 48.1025152339 + ], + [ + 11.7526834811, + 48.1026104461 + ], + [ + 11.7530348505, + 48.1033051377 + ], + [ + 11.7530817892, + 48.1034070653 + ], + [ + 11.7532051708, + 48.1036726023 + ], + [ + 11.7534237708, + 48.1041366170 + ], + [ + 11.7535055782, + 48.1043136579 + ], + [ + 11.7538408543, + 48.1050740371 + ], + [ + 11.7540111746, + 48.1054763591 + ], + [ + 11.7541788127, + 48.1058747039 + ], + [ + 11.7542928066, + 48.1061496312 + ], + [ + 11.7543853428, + 48.1063722249 + ], + [ + 11.7544537391, + 48.1065344821 + ], + [ + 11.7546763624, + 48.1070857273 + ], + [ + 11.7547031845, + 48.1071554651 + ], + [ + 11.7547621931, + 48.1072949404 + ], + [ + 11.7548560704, + 48.1075269319 + ], + [ + 11.7550129797, + 48.1079145149 + ], + [ + 11.7552168276, + 48.1083986398 + ], + [ + 11.7552758362, + 48.1085502008 + ], + [ + 11.7553026582, + 48.1086132204 + ], + [ + 11.7554595675, + 48.1090544679 + ], + [ + 11.7556097712, + 48.1095037148 + ], + [ + 11.7558095958, + 48.1100777064 + ], + [ + 11.7558471467, + 48.1101836501 + ] + ] + } + } + ] } \ No newline at end of file diff --git a/common/data/src/main/res/values-de/strings.xml b/common/data/src/main/res/values-de/strings.xml index 2ec7b3a..695ac1a 100644 --- a/common/data/src/main/res/values-de/strings.xml +++ b/common/data/src/main/res/values-de/strings.xml @@ -27,7 +27,7 @@ "Ablehnen" "OK" "Favoriten" - "Einstellungen für die Anzeige" + "Anzeige" "Angekommen!" "Kategorien" "Keine Orte" @@ -42,12 +42,13 @@ Kontakte Route Vorschau Anzeige - Navigations Einstellungen + Navigation Tankstelle Apotheke Ladestation Speed camera Auto GPS verwenden TomTom\t + Optionen diff --git a/common/data/src/main/res/values/strings.xml b/common/data/src/main/res/values/strings.xml index 91e4c8f..3db663a 100644 --- a/common/data/src/main/res/values/strings.xml +++ b/common/data/src/main/res/values/strings.xml @@ -10,7 +10,7 @@ Off Use telephon settings Dark mode - Display settings + Display 3D building Arrived! Drive now @@ -24,7 +24,7 @@ Recent item deleted Route preview Display - Navigation settings + Navigation Settings Accept Reject @@ -35,4 +35,5 @@ Routing engine Use car location TomTom\t + Options \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ae54b42..f95715c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,6 +38,7 @@ material3WindowSizeClass = "1.4.0" uiGraphics = "1.10.0" window = "1.5.1" foundationLayout = "1.10.0" +foundationLayoutVersion = "1.10.1" [libraries] @@ -79,6 +80,7 @@ androidx-app-automotive = { module = "androidx.car.app:app-automotive", version. androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics", version.ref = "uiGraphics" } androidx-window = { group = "androidx.window", name = "window", version.ref = "window" } androidx-compose-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout", version.ref = "foundationLayout" } +androidx-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout", version.ref = "foundationLayoutVersion" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }