package mx.trackermap.TrackerMap.android.map import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.mousebird.maply.ComponentObject import com.mousebird.maply.GlobeController import com.mousebird.maply.GlobeMapFragment import com.mousebird.maply.MapController import com.mousebird.maply.MarkerInfo import com.mousebird.maply.Point2d import com.mousebird.maply.QuadImageLoader import com.mousebird.maply.RemoteTileInfoNew import com.mousebird.maply.RenderController import com.mousebird.maply.RenderControllerInterface import com.mousebird.maply.SamplingParams import com.mousebird.maply.ScreenMarker import com.mousebird.maply.SelectedObject import com.mousebird.maply.SphericalMercatorCoordSystem import java.io.File import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.utils.MarkerType typealias MarkerCallback = (Int?) -> Unit @DelicateCoroutinesApi class MapFragment : GlobeMapFragment() { data class Marker( val id: Int, val latitude: Double, val longitude: Double, val type: MarkerType = MarkerType.DEFAULT ) var markerCallback: MarkerCallback? = null private val markers = mutableListOf>() override fun chooseDisplayType(): MapDisplayType { return MapDisplayType.Map } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { super.onCreateView(inflater, container, savedInstanceState) return baseControl.contentView!! } override fun controlHasStarted() { val cacheDirName = "stamen_watercolor6" val cacheDir = File(activity!!.cacheDir, cacheDirName) cacheDir.mkdir() val tileInfo = RemoteTileInfoNew( "https://mt0.google.com/vt/lyrs=m&hl=en&x={x}&y={y}&z={z}&s=Ga", 0, 21 ) tileInfo.cacheDir = cacheDir val params = SamplingParams() params.coordSystem = SphericalMercatorCoordSystem() params.coverPoles = true params.edgeMatching = true params.minZoom = tileInfo.minZoom params.maxZoom = tileInfo.maxZoom params.singleLevel = true val loader = QuadImageLoader(params, tileInfo, baseControl) loader.setImageFormat(RenderController.ImageFormat.MaplyImageUShort565) val latitude = 23.191 * Math.PI / 180 val longitude = -100.36 * Math.PI / 180 val zoom = 0.4 mapControl.setPositionGeo(longitude, latitude, zoom) } override fun userDidSelect( mapControl: MapController?, selObjs: Array?, loc: Point2d?, screenLoc: Point2d? ) { super.userDidSelect(mapControl, selObjs, loc, screenLoc) selObjs?.forEach { selectedObject -> if (selectedObject.selObj is ScreenMarker) { val screenMarker = selectedObject.selObj as ScreenMarker val markerId = screenMarker.userObject as Int Log.d("MapFragment", "Selected marker with id: $markerId") markerCallback?.let { it(markerId) } } } } override fun userDidTap(mapControl: MapController?, loc: Point2d?, screenLoc: Point2d?) { super.userDidTap(mapControl, loc, screenLoc) markerCallback?.let { it(null) } } fun clear() { mapControl.removeObjects( markers.map { it.second }, RenderControllerInterface.ThreadMode.ThreadAny ) } fun display(markers: Array) { Log.d("MapFragment", "Displaying markers") clear() val screenMarkers = markers.map { marker -> val screenMarker = ScreenMarker() val markerSize = Point2d(144.0, 144.0) screenMarker.loc = Point2d.FromDegrees(marker.longitude, marker.latitude) screenMarker.image = getIcon(marker.type) screenMarker.size = markerSize screenMarker.userObject = marker.id screenMarker.selectable = true screenMarker } mapControl.addScreenMarkers( screenMarkers, MarkerInfo(), RenderControllerInterface.ThreadMode.ThreadAny ) } fun focusOn(latitude: Double, longitude: Double) { val lat = latitude * Math.PI / 180 val lon = longitude * Math.PI / 180 val zoom = 0.000008 mapControl.setPositionGeo(lon, lat, zoom) } private fun getIcon(markerType: MarkerType): Bitmap { return BitmapFactory.decodeResource( activity!!.resources, when (markerType) { MarkerType.ANIMAL -> R.drawable.map_animal MarkerType.BICYCLE -> R.drawable.map_bicycle MarkerType.BOAT -> R.drawable.map_boat MarkerType.BUS -> R.drawable.map_bus MarkerType.CAR -> R.drawable.map_car MarkerType.CRANE -> R.drawable.map_crane MarkerType.DEFAULT -> R.drawable.map_default MarkerType.HELICOPTER -> R.drawable.map_helicopter MarkerType.MOTORCYCLE -> R.drawable.map_motorcycle MarkerType.OFFROAD -> R.drawable.map_offroad MarkerType.PERSON -> R.drawable.map_person MarkerType.PICKUP -> R.drawable.map_pickup MarkerType.PLANE -> R.drawable.map_plane MarkerType.SCOOTER -> R.drawable.map_scooter MarkerType.SHIP -> R.drawable.map_ship MarkerType.TRACTOR -> R.drawable.map_tractor MarkerType.TRAIN -> R.drawable.map_train MarkerType.TRAM -> R.drawable.map_tram MarkerType.TROLLEYBUS -> R.drawable.map_trolleybus MarkerType.TRUCK -> R.drawable.map_truck MarkerType.VAN -> R.drawable.map_van } ) } }