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.GlobeMapFragment 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.SphericalMercatorCoordSystem import java.io.File import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R @DelicateCoroutinesApi class MapFragment : GlobeMapFragment() { enum class MarkerType { ANIMAL, BICYCLE, BOAT, BUS, CAR, CRANE, DEFAULT, HELICOPTER, MOTORCYCLE, OFFROAD, PERSON, PICKUP, PLANE, SCOOTER, SHIP, TRACTOR, TRAIN, TRAM, TROLLEYBUS, TRUCK, VAN } data class Marker( val id: Int, val latitude: Double, val longitude: Double, val type: MarkerType = MarkerType.DEFAULT ) 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) } 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 } 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 } ) } }