This commit is contained in:
Dimitris
2026-01-12 13:12:22 +01:00
parent e274011080
commit e22865bd73
24 changed files with 3670 additions and 918 deletions

View File

@@ -37,10 +37,10 @@ abstract class NavigationRepository {
private val nominatimUrl = "https://kouros-online.de/nominatim/"
abstract fun getRoute(currentLocation: Location, location: Location, searchFilter: SearchFilter): String
abstract fun getRoute(currentLocation: Location, location: Location, carOrientation: Float, searchFilter: SearchFilter): String
fun getRouteDistance(currentLocation: Location, location: Location, searchFilter: SearchFilter, context: Context): Double {
val route = getRoute(currentLocation, location, searchFilter)
fun getRouteDistance(currentLocation: Location, location: Location, carOrientation : Float, searchFilter: SearchFilter, context: Context): Double {
val route = getRoute(currentLocation, location, carOrientation, searchFilter)
val routeModel = RouteModel()
routeModel.startNavigation(route, context)
return routeModel.route.summary!!.distance

View File

@@ -46,7 +46,6 @@ data class Route(
this.routeGeoJson = routeGeoJson
centerLocation = createCenterLocation(routeGeoJson)
}
fun routeEngine(routeEngine: Int) = apply { this.routeEngine = routeEngine }
fun waypoints(waypoints: List<List<Double>>) = apply { this.waypoints = waypoints }
fun route(route: String) = apply {

View File

@@ -10,6 +10,7 @@ class OsrmRepository : NavigationRepository() {
override fun getRoute(
currentLocation: Location,
location: Location,
carOrientation: Float,
searchFilter: SearchFilter
): String {
@@ -20,7 +21,7 @@ class OsrmRepository : NavigationRepository() {
if (searchFilter.avoidTollway) {
exclude = "$exclude&exclude=toll"
}
val routeLocation = "${currentLocation.longitude},${currentLocation.latitude};${location.longitude},${location.latitude}?steps=true"
val routeLocation = "${currentLocation.longitude},${currentLocation.latitude};${location.longitude},${location.latitude}?steps=true&alternatives=2"
return fetchUrl(routeUrl + routeLocation + exclude, true)
}
}

View File

@@ -62,6 +62,7 @@ class OsrmRoute {
}
}
val leg = Leg(steps)
builder
.routeType(1)
.summary(summary)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,5 @@
package com.kouros.navigation.data.route
class Routes (
var legs : List<Leg> = arrayListOf()
)

View File

@@ -12,7 +12,12 @@ private const val routeUrl = "https://kouros-online.de/valhalla/route?json="
class ValhallaRepository : NavigationRepository() {
override fun getRoute(currentLocation: Location, location: Location, searchFilter: SearchFilter): String {
override fun getRoute(
currentLocation: Location,
location: Location,
carOrientation: Float,
searchFilter: SearchFilter
): String {
var exclude = ""
if (searchFilter.avoidMotorway) {
@@ -23,7 +28,11 @@ class ValhallaRepository : NavigationRepository() {
}
val vLocation = listOf(
Locations(lat = currentLocation.latitude, lon = currentLocation.longitude, search_filter = exclude),
Locations(
lat = currentLocation.latitude,
lon = currentLocation.longitude,
search_filter = exclude
),
Locations(lat = location.latitude, lon = location.longitude, search_filter = exclude)
)
val valhallaLocation = ValhallaLocation(

View File

@@ -114,8 +114,8 @@ open class RouteModel() {
val interBearing = location.bearingTo(location(it.location[0], it.location[1]))
if (distance < nearestDistance) {
nearestDistance = distance
if (distance <= NEXT_STEP_THRESHOLD) {
if ((interBearing.absoluteValue - route.currentStep().maneuver.bearingAfter.absoluteValue).absoluteValue < 10) {
if (distance <= NEXT_STEP_THRESHOLD * 3) {
if ((interBearing.absoluteValue - route.currentStep().maneuver.bearingAfter.absoluteValue).absoluteValue < 20) {
inter = it
}
}
@@ -171,11 +171,11 @@ open class RouteModel() {
val maneuverIcon = maneuverIcon(curManeuverType)
maneuverType = curManeuverType
val lanes = if (shouldAdvance) {
currentLanes(location)
} else {
emptyList()
}
val lanes = currentLanes(location)
if (lanes.isNotEmpty())
println("Street: $streetName Dist: $distanceToNextStep Lane: ${lanes.size}")
// Construct and return the final StepData object
return StepData(
streetName,
@@ -186,6 +186,7 @@ open class RouteModel() {
travelLeftDistance(),
lanes
)
}
@@ -334,7 +335,7 @@ open class RouteModel() {
fun createLaneIcon(context: Context, stepData: StepData): IconCompat {
val bitmaps = mutableListOf<Bitmap>()
stepData.lane.forEach {
if (it.indications.isNotEmpty()) { //&& it.valid) {
if (it.indications.isNotEmpty()) {
Collections.sort<String>(it.indications)
val resource = laneToResource(it.indications, stepData)
if (resource.isNotEmpty()) {
@@ -357,7 +358,7 @@ open class RouteModel() {
return bitmaps.first()
}
val bmOverlay = createBitmap(
bitmaps.first().getWidth() * (bitmaps.size),
bitmaps.first().getWidth() * (bitmaps.size * 1.5).toInt(),
bitmaps.first().getHeight(),
bitmaps.first().getConfig()!!
)

View File

@@ -73,7 +73,7 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
MutableLiveData()
}
fun loadRecentPlace(location: Location, context: Context) {
fun loadRecentPlace(location: Location, carOrientation: Float, context: Context) {
viewModelScope.launch(Dispatchers.IO) {
try {
val placeBox = boxStore.boxFor(Place::class)
@@ -85,7 +85,7 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
query.close()
for (place in results) {
val plLocation = location(place.longitude, place.latitude)
val distance = repository.getRouteDistance(location, plLocation, SearchFilter(), context)
val distance = repository.getRouteDistance(location, plLocation, carOrientation, SearchFilter(), context)
place.distance = distance.toFloat()
if (place.distance > 1F) {
recentPlace.postValue(place)
@@ -98,7 +98,7 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
}
}
fun loadRecentPlaces(context: Context, location: Location) {
fun loadRecentPlaces(context: Context, location: Location, carOrientation : Float) {
viewModelScope.launch(Dispatchers.IO) {
try {
val placeBox = boxStore.boxFor(Place::class)
@@ -115,6 +115,7 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
repository.getRouteDistance(
location,
plLocation,
carOrientation,
getSearchFilter(context), context
)
place.distance = distance.toFloat()
@@ -127,7 +128,7 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
}
}
fun loadFavorites(context: Context, location: Location) {
fun loadFavorites(context: Context, location: Location, carOrientation: Float) {
viewModelScope.launch(Dispatchers.IO) {
try {
val placeBox = boxStore.boxFor(Place::class)
@@ -140,7 +141,7 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
for (place in results) {
val plLocation = location(place.longitude, place.latitude)
val distance =
repository.getRouteDistance(location, plLocation, getSearchFilter(context), context)
repository.getRouteDistance(location, plLocation, carOrientation, getSearchFilter(context), context)
place.distance = distance.toFloat()
}
favorites.postValue(results)
@@ -150,13 +151,14 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
}
}
fun loadRoute(context: Context, currentLocation: Location, location: Location) {
fun loadRoute(context: Context, currentLocation: Location, location: Location, carOrientation : Float) {
viewModelScope.launch(Dispatchers.IO) {
try {
route.postValue(
repository.getRoute(
currentLocation,
location,
carOrientation,
getSearchFilter(context)
)
)
@@ -166,13 +168,14 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
}
}
fun loadPreviewRoute(context: Context, currentLocation: Location, location: Location) {
fun loadPreviewRoute(context: Context, currentLocation: Location, location: Location, carOrientation: Float) {
viewModelScope.launch(Dispatchers.IO) {
try {
previewRoute.postValue(
repository.getRoute(
currentLocation,
location,
carOrientation,
getSearchFilter(context)
)
)
@@ -369,7 +372,7 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
}
fun loadPlaces2(context: Context, location: Location): SnapshotStateList<Place?> {
fun loadPlaces2(context: Context, location: Location, carOrientation: Float): SnapshotStateList<Place?> {
val results = listOf<Place>()
try {
val placeBox = boxStore.boxFor(Place::class)
@@ -382,7 +385,7 @@ class ViewModel(private val repository: NavigationRepository) : ViewModel() {
for (place in results) {
val plLocation = location(place.longitude, place.latitude)
val distance =
repository.getRouteDistance(location, plLocation, getSearchFilter(context), context)
repository.getRouteDistance(location, plLocation, carOrientation, getSearchFilter(context), context)
place.distance = distance.toFloat()
}
} catch (e: Exception) {

View File

@@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M340,760L440,600L380,600L380,480L280,640L340,640L340,760ZM240,400L480,400L480,200Q480,200 480,200Q480,200 480,200L240,200Q240,200 240,200Q240,200 240,200L240,400ZM240,760L480,760L480,480L240,480L240,760ZM160,840L160,200Q160,167 183.5,143.5Q207,120 240,120L480,120Q513,120 536.5,143.5Q560,167 560,200L560,480L610,480Q639,480 659.5,500.5Q680,521 680,550L680,735Q680,752 694,766Q708,780 725,780Q743,780 756.5,766Q770,752 770,735L770,360L760,360Q743,360 731.5,348.5Q720,337 720,320L720,240L740,240L740,180L780,180L780,240L820,240L820,180L860,180L860,240L880,240L880,320Q880,337 868.5,348.5Q857,360 840,360L830,360L830,735Q830,777 799.5,808.5Q769,840 725,840Q682,840 651,808.5Q620,777 620,735L620,550Q620,545 617.5,542.5Q615,540 610,540L560,540L560,840L160,840ZM480,760L240,760L240,760L480,760Z"/>
</vector>

View File

@@ -6,5 +6,5 @@
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M337,746L425,606L372,606L372,501L285,641L337,641L337,746ZM220,408L489,408L489,180Q489,180 489,180Q489,180 489,180L220,180Q220,180 220,180Q220,180 220,180L220,408ZM220,780L489,780L489,468L220,468L220,780ZM160,840L160,180Q160,156 178,138Q196,120 220,120L489,120Q513,120 531,138Q549,156 549,180L549,468L614,468Q634.71,468 649.36,482.64Q664,497.29 664,518L664,737Q664,759 681.5,773.5Q699,788 722,788Q745,788 765,773.5Q785,759 785,737L785,350L770,350Q757.25,350 748.63,341.37Q740,332.75 740,320L740,230L760,230L760,180L790,180L790,230L830,230L830,180L860,180L860,230L880,230L880,320Q880,332.75 871.38,341.37Q862.75,350 850,350L835,350L835,736.69Q835,780 801,810Q767,840 721.82,840Q677.66,840 645.83,810Q614,780 614,737L614,518Q614,518 614,518Q614,518 614,518L549,518L549,840L160,840ZM489,780L220,780L220,780L489,780Z"/>
android:pathData="M220,408L489,408L489,180Q489,180 489,180Q489,180 489,180L220,180Q220,180 220,180Q220,180 220,180L220,408ZM160,840L160,180Q160,156 178,138Q196,120 220,120L489,120Q513,120 531,138Q549,156 549,180L549,468L614,468Q634.71,468 649.36,482.64Q664,497.29 664,518L664,737Q664,759 681.5,773.5Q699,788 722,788Q745,788 765,773.5Q785,759 785,737L785,350L770,350Q757.25,350 748.63,341.37Q740,332.75 740,320L740,230L760,230L760,180L790,180L790,230L830,230L830,180L860,180L860,230L880,230L880,320Q880,332.75 871.38,341.37Q862.75,350 850,350L835,350L835,736.69Q835,780 801,810Q767,840 721.82,840Q677.66,840 645.83,810Q614,780 614,737L614,518Q614,518 614,518Q614,518 614,518L549,518L549,840L160,840ZM337,746L425,606L372,606L372,501L285,641L337,641L337,746Z"/>
</vector>