diff options
author | Iván Ávalos <avalos@disroot.org> | 2022-01-11 04:12:45 -0600 |
---|---|---|
committer | Iván Ávalos <avalos@disroot.org> | 2022-01-11 04:12:45 -0600 |
commit | 8878254a4a3af9d15262fd2553c7b2db0a7bd8bc (patch) | |
tree | 4918c7ad01bf2c74bf5492f3c443408c733b0ab6 /androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt | |
parent | 7629861e4e2b7e52b93f817426cb940c8f075b59 (diff) | |
download | etbsa-trackermap-mobile-8878254a4a3af9d15262fd2553c7b2db0a7bd8bc.tar.gz etbsa-trackermap-mobile-8878254a4a3af9d15262fd2553c7b2db0a7bd8bc.tar.bz2 etbsa-trackermap-mobile-8878254a4a3af9d15262fd2553c7b2db0a7bd8bc.zip |
Implemented polygon geofences
Diffstat (limited to 'androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt')
-rw-r--r-- | androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt | 92 |
1 files changed, 77 insertions, 15 deletions
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt index 41cfd50..fa0a56e 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt @@ -10,8 +10,12 @@ import android.view.ViewGroup import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.drawable.toBitmap import com.mousebird.maply.* +import mil.nga.sf.Polygon +import mil.nga.sf.util.SFException +import mil.nga.sf.wkt.GeometryReader import java.io.File import mx.trackermap.TrackerMap.android.R +import mx.trackermap.TrackerMap.client.models.Geofence import mx.trackermap.TrackerMap.utils.MarkerType typealias MarkerCallback = (Int?) -> Unit @@ -28,6 +32,7 @@ class MapFragment : GlobeMapFragment() { var markerCallback: MarkerCallback? = null private val objects = mutableListOf<ComponentObject>() + private val geofenceObjects = mutableListOf<ComponentObject>() override fun chooseDisplayType(): MapDisplayType { return MapDisplayType.Map @@ -95,12 +100,20 @@ class MapFragment : GlobeMapFragment() { markerCallback?.let { it(null) } } - private fun clear() { - mapControl.removeObjects( - objects, - ThreadMode.ThreadAny - ) - objects.clear() + private fun clear(geofences: Boolean = false) { + if (geofences) { + mapControl.removeObjects( + geofenceObjects, + ThreadMode.ThreadAny + ) + geofenceObjects.clear() + } else { + mapControl.removeObjects( + objects, + ThreadMode.ThreadAny + ) + objects.clear() + } } fun display(markers: Array<Marker>, isReport: Boolean) { @@ -108,6 +121,15 @@ class MapFragment : GlobeMapFragment() { clear() + val points = markers.map { marker -> + Point2d.FromDegrees(marker.longitude, marker.latitude) + }.toTypedArray() + + val vectorInfo = VectorInfo() + vectorInfo.setColor(Color.GREEN) + vectorInfo.setLineWidth(20.0f) + + /* Draw markers for positions */ val screenMarkers = markers.mapIndexed { i, marker -> val screenMarker = ScreenMarker() val markerSize = Point2d(144.0, 144.0) @@ -133,19 +155,11 @@ class MapFragment : GlobeMapFragment() { ThreadMode.ThreadAny )) - val points = markers.map { marker -> - Point2d.FromDegrees(marker.longitude, marker.latitude) - }.toTypedArray() - - // Draw polyline for report + /* Draw polyline for report */ if (isReport && markers.isNotEmpty()) { val vector = VectorObject() vector.addAreal(points) - val vectorInfo = VectorInfo() - vectorInfo.setColor(Color.GREEN) - vectorInfo.setLineWidth(25.0f) - objects.add(mapControl.addVector( vector, vectorInfo, @@ -168,6 +182,54 @@ class MapFragment : GlobeMapFragment() { } } + fun displayGeofences(geofences: Array<Geofence>) { + Log.d("MapFragment", "Displaying geofences") + + clear(true) + + val vectorInfoGeofence = VectorInfo() + vectorInfoGeofence.setColor(Color.BLUE) + vectorInfoGeofence.setLineWidth(10.0f) + + val shapes = mutableListOf<Shape>() + val vectors = mutableListOf<VectorObject>() + + geofences.forEach { geofence -> + geofence.area?.let { area -> + Log.d("MainFragment", "Geofence ${geofence.name} = ${geofence.area}") + try { + val geometry = GeometryReader.readGeometry(area) + if (!geometry.isEmpty) { + when (geometry) { + is Polygon -> { + val vector = VectorObject() + vector.addAreal(geometry.exteriorRing.points.map { + Point2d.FromDegrees(it.y, it.x) + }.toTypedArray()) + + vectors.add(vector) + } + } + } + } catch (e: SFException) { + e.printStackTrace() + } + } + } + + geofenceObjects.add(mapControl.addShapes( + shapes, + ShapeInfo(), + ThreadMode.ThreadAny + )) + + geofenceObjects.add(mapControl.addVectors( + vectors, + vectorInfoGeofence, + ThreadMode.ThreadAny + )) + } + fun focusOn(latitude: Double, longitude: Double, zoom: Double = 0.0000144, animated: Boolean = true) { val lat = latitude * Math.PI / 180 val lon = longitude * Math.PI / 180 |