aboutsummaryrefslogtreecommitdiff
path: root/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt
diff options
context:
space:
mode:
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.kt85
1 files changed, 66 insertions, 19 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 60c8a47..a8478fd 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
@@ -11,12 +11,15 @@ import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.core.graphics.drawable.toBitmap
import com.mousebird.maply.*
+import com.soywiz.krypto.md5
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.client.models.MapLayer
+import mx.trackermap.TrackerMap.utils.MapCalculus
import mx.trackermap.TrackerMap.utils.MarkerType
typealias MarkerCallback = (Int?) -> Unit
@@ -56,17 +59,14 @@ class MapFragment : GlobeMapFragment() {
override fun controlHasStarted() {
Log.d("MapFragment", "controlHasStarted")
- val cacheDirName = "stamen_watercolor6"
- val cacheDir = File(activity!!.cacheDir, cacheDirName)
- cacheDir.mkdir()
-
if (tileInfo == null) {
- tileInfo = RemoteTileInfoNew(
- getString(R.string.maps_streets_tile_url),
- 0,
- 21
- )
- (tileInfo as RemoteTileInfoNew).cacheDir = cacheDir
+ // Load default map layer
+ val layer = resources.getStringArray(R.array.maps_streets_tile)
+ val tmpInfo = RemoteTileInfoNew(layer[0], layer[1].toInt(), layer[2].toInt())
+ tileInfo = tileInfoSetCacheDir(layer[0], tmpInfo)
+ tileInfo?.let {
+ setZoomLimits(it.minZoom, it.maxZoom)
+ }
}
val params = SamplingParams()
@@ -83,7 +83,16 @@ class MapFragment : GlobeMapFragment() {
val latitude = 23.191
val longitude = -100.36
- focusOn(latitude, longitude, zoom = 0.4, animated = false)
+ focusOn(latitude, longitude, height = 0.4, animated = false)
+ }
+
+ override fun mapDidStopMoving(
+ mapControl: MapController?,
+ corners: Array<out Point3d>?,
+ userMotion: Boolean
+ ) {
+ super.mapDidStopMoving(mapControl, corners, userMotion)
+ Log.d("MapFragment", "Height: ${mapControl?.height}")
}
override fun userDidSelect(
@@ -93,7 +102,6 @@ class MapFragment : GlobeMapFragment() {
screenLoc: Point2d?
) {
super.userDidSelect(mapControl, selObjs, loc, screenLoc)
-
selObjs?.forEach { selectedObject ->
if (selectedObject.selObj is ScreenMarker) {
val screenMarker = selectedObject.selObj as ScreenMarker
@@ -228,7 +236,8 @@ class MapFragment : GlobeMapFragment() {
mbr.expandByFraction(0.1)
mapControl.addPostSurfaceRunnable {
- val zoom = mapControl.findHeightToViewBounds(mbr, mbr.middle())
+ val zoom = mapControl.zoomLimitMax.coerceAtLeast(
+ mapControl.findHeightToViewBounds(mbr, mbr.middle()))
mapControl.setPositionGeo(mbr.middle(), zoom)
}
}
@@ -308,19 +317,57 @@ class MapFragment : GlobeMapFragment() {
))
}
- fun focusOn(latitude: Double, longitude: Double, zoom: Double = 0.0000144, animated: Boolean = true) {
+ fun focusOn(
+ latitude: Double,
+ longitude: Double,
+ height: Double? = 0.00001,
+ animated: Boolean = true
+ ) {
val lat = latitude * Math.PI / 180
val lon = longitude * Math.PI / 180
+ // Ensure height is equal or higher than bottom limit
+ val z = mapControl.zoomLimitMin.coerceAtLeast(height ?: 0.0)
if (animated) {
- mapControl.animatePositionGeo(lon, lat, zoom, 0.2)
+ mapControl.animatePositionGeo(lon, lat, z, 0.2)
} else {
- mapControl.setPositionGeo(lon, lat, zoom)
+ mapControl.setPositionGeo(lon, lat, z)
}
}
- fun updateTileInfo(tileInfo: TileInfoNew) {
- this.tileInfo = tileInfo
- loader?.changeTileInfo(tileInfo)
+ private fun tileInfoSetCacheDir(url: String, tileInfo: TileInfoNew): TileInfoNew? {
+ return context?.let {
+ val cacheDirName = url.toByteArray(Charsets.UTF_8).md5().hex
+ val cacheDirMap = File(it.cacheDir, cacheDirName)
+ cacheDirMap.mkdir()
+ Log.d("MapFragment", "Cache dir for $url = ${cacheDirMap.absolutePath}")
+
+ (tileInfo as? RemoteTileInfoNew)?.cacheDir = cacheDirMap
+ tileInfo
+ }
+ }
+
+ fun updateTile(layer: MapLayer) {
+ val tileInfo = RemoteTileInfoNew(layer.url, layer.minZoom, layer.maxZoom)
+ this.tileInfo = tileInfoSetCacheDir(layer.url, tileInfo)
+ this.tileInfo?.let {
+ loader?.changeTileInfo(it)
+ setZoomLimits(tileInfo.minZoom, tileInfo.maxZoom)
+ }
+ }
+
+ private fun setZoomLimits(minZoom: Int, maxZoom: Int) {
+ mapControl?.let {
+ it.setZoomLimits(
+ it.heightForMapScale(
+ MapCalculus.zoomLevelToScale(maxZoom)
+ ?: MapCalculus.zoomLevelToScale(21)!!
+ ),
+ it.heightForMapScale(
+ MapCalculus.zoomLevelToScale(minZoom)
+ ?: MapCalculus.zoomLevelToScale(1)!!
+ )
+ )
+ }
}
private fun getIcon(markerType: MarkerType): Bitmap {