aboutsummaryrefslogtreecommitdiff
path: root/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2022-01-11 04:12:45 -0600
committerIván Ávalos <avalos@disroot.org>2022-01-11 04:12:45 -0600
commit8878254a4a3af9d15262fd2553c7b2db0a7bd8bc (patch)
tree4918c7ad01bf2c74bf5492f3c443408c733b0ab6 /androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt
parent7629861e4e2b7e52b93f817426cb940c8f075b59 (diff)
downloadetbsa-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.kt92
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