From 8163c759323d8314dfb37310d82b1a0a4ab53198 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Fri, 24 Mar 2023 16:33:08 +0100 Subject: [PATCH] Computing road between points --- app/build.gradle | 1 + .../geocaching/ui/fragment/Map.kt | 7 +++- .../geocaching/ui/overlay/AddMarkerOverlay.kt | 37 ++++++++++++++++--- .../geocaching/ui/overlay/PlaceMarker.kt | 9 +++-- settings.gradle | 2 +- 5 files changed, 44 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cc18ac3..92affa2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,5 +43,6 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' implementation "androidx.fragment:fragment-ktx:1.5.5" implementation 'org.osmdroid:osmdroid-android:6.1.14' + implementation 'com.github.MKergall:osmbonuspack:6.9.0' } \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt index a6a7cad..5f299b6 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt @@ -19,6 +19,8 @@ import android.location.LocationListener import android.util.Log import android.widget.ProgressBar import androidx.activity.result.contract.ActivityResultContracts +import org.osmdroid.bonuspack.routing.OSRMRoadManager +import org.osmdroid.bonuspack.routing.RoadManager import org.osmdroid.config.IConfigurationProvider import org.osmdroid.library.BuildConfig import org.osmdroid.tileprovider.tilesource.TileSourceFactory @@ -35,6 +37,7 @@ class Map : Fragment() { private lateinit var map : MapView private lateinit var spinner: ProgressBar private lateinit var locationManager: LocationManager + private val userAgent = "RoadTrip" val defaultPoint = GeoPoint(48.8583, 2.2944) var isMapCentered = false; @@ -54,7 +57,7 @@ class Map : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - Configuration.getInstance().userAgentValue = "RoadTrip" + Configuration.getInstance().userAgentValue = userAgent; } @@ -90,7 +93,7 @@ class Map : Fragment() { recenter.enableMyLocation() map.overlays.add(recenter); - val addMarker = AddMarkerOverlay() + val addMarker = AddMarkerOverlay(OSRMRoadManager(context, userAgent)) map.overlays.add(addMarker); } diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt index 7eff525..5f76388 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt @@ -1,31 +1,56 @@ package uca.baptistearthur.geocaching.ui.overlay -import android.graphics.Rect +import android.os.AsyncTask import android.util.Log import android.view.MotionEvent +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.osmdroid.bonuspack.routing.Road +import org.osmdroid.bonuspack.routing.RoadManager import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Overlay +import org.osmdroid.views.overlay.Polyline -class AddMarkerOverlay : Overlay() { - private var locations: MutableSet = mutableSetOf() +class AddMarkerOverlay(val roadManager: RoadManager) : Overlay() { + private var locations: MutableSet = mutableSetOf() + private lateinit var roadOverlay: Polyline override fun onDoubleTap(e: MotionEvent?, mapView: MapView?): Boolean { Log.d("GeoMap", "Longpress") val proj = mapView?.projection; if(proj!=null){ - val loc = proj.fromPixels(e?.x?.toInt()!!, e?.y?.toInt() !! ) as GeoPoint + val loc = proj.fromPixels(e?.x?.toInt()!!, e.y.toInt() ) as GeoPoint locations.add(loc) - val marker = PlaceMarker(mapView, locations) + val marker = PlaceMarker(mapView, locations, this) marker.position = loc marker.title = "Step " + locations.size mapView.overlays.add(marker) - mapView.invalidate() + computeRoad(mapView) } return true; } + fun computeRoad(mapView: MapView) { + mapView.overlays.remove(mapView.overlays.find { it is Polyline}) + if (locations.size > 1) { + CoroutineScope(Dispatchers.IO).launch { + val road = roadManager.getRoad(ArrayList(locations)) + withContext(Dispatchers.Main) { + roadOverlay = RoadManager.buildRoadOverlay(road) + roadOverlay.width=10.0f; + mapView.overlays.add(roadOverlay) + mapView.invalidate() + } + } + } + } + + + } \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/PlaceMarker.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/PlaceMarker.kt index df5d73d..d932ff3 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/PlaceMarker.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/PlaceMarker.kt @@ -1,17 +1,20 @@ package uca.baptistearthur.geocaching.ui.overlay import android.view.MotionEvent +import org.osmdroid.bonuspack.routing.OSRMRoadManager +import org.osmdroid.bonuspack.routing.RoadManager import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Marker -class PlaceMarker(val mapView: MapView, val locations: MutableSet) : Marker(mapView) { +class PlaceMarker(val mapView: MapView, val locations: MutableSet, val parent : AddMarkerOverlay) : Marker(mapView) { override fun onLongPress(e: MotionEvent?, mapView: MapView?): Boolean { - if(this.hitTest(e, mapView)) { + if(mapView!=null && this.hitTest(e, mapView)) { locations.remove(this.position) this.closeInfoWindow() - mapView?.overlays?.remove(this) + mapView.overlays.remove(this) + parent.computeRoad(mapView); return true } return false diff --git a/settings.gradle b/settings.gradle index 9087274..a4f8fc4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,7 +3,6 @@ pluginManagement { gradlePluginPortal() google() mavenCentral() - } } dependencyResolutionManagement { @@ -11,6 +10,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven { url "https://jitpack.io" } } } rootProject.name = "Geocaching"