Introducción a la geolocalización y mapas en Kotlin
Kotlin es un lenguaje de programación moderno, ampliamente utilizado para el desarrollo de aplicaciones Android. Trabajar con geolocalización y mapas es una de las capacidades clave de las aplicaciones móviles. En este artículo, revisaremos las principales bibliotecas y herramientas para integrar mapas, obtener las coordenadas del usuario y construir rutas en Kotlin.
1. Google Maps SDK para Android
Google Maps es el servicio más popular para mostrar mapas. Para usarlo en Kotlin, es necesario agregar la dependencia en build.gradle:
dependencies { implementation 'com.google.android.gms:play-services-maps:18.2.0' implementation 'com.google.android.gms:play-services-location:21.0.1'}Después de agregar la clave API en el manifiesto, se puede mostrar el mapa en un fragmento:
import com.google.android.gms.maps.*import com.google.android.gms.maps.model.*
class MapsFragment : SupportMapFragment(), OnMapReadyCallback { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) getMapAsync(this) }
override fun onMapReady(googleMap: GoogleMap) { val sydney = LatLng(-33.852, 151.211) googleMap.addMarker(MarkerOptions().position(sydney).title("Sídney")) googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15f)) }}2. Obtención de la ubicación actual
Para trabajar con geolocalización se utiliza Fused Location Provider. Ejemplo de obtención de la última ubicación conocida:
import com.google.android.gms.location.*
class LocationHelper(private val context: Context) { private val fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
fun getLastLocation() { fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? -> location?.let { val lat = it.latitude val lng = it.longitude Log.d("Location", "Latitud: $lat, Longitud: $lng") } } }}Para el seguimiento continuo, use LocationRequest y LocationCallback:
val locationRequest = LocationRequest.Builder( Priority.PRIORITY_HIGH_ACCURACY, 10000L).build()
val locationCallback = object : LocationCallback() { override fun onLocationResult(locationResult: LocationResult) { for (location in locationResult.locations) { // Procesamiento de nuevas coordenadas } }}
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())3. OpenStreetMap y la biblioteca osmdroid
Si necesita una alternativa gratuita a Google Maps, use osmdroid. Configuración:
dependencies { implementation 'org.osmdroid:osmdroid-android:6.1.18'}Ejemplo de visualización de mapa y marcador:
import org.osmdroid.config.Configurationimport org.osmdroid.tileprovider.tilesource.TileSourceFactoryimport org.osmdroid.views.MapViewimport org.osmdroid.util.GeoPointimport org.osmdroid.views.overlay.Marker
class OsmMapActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Configuration.getInstance().userAgentValue = packageName setContentView(R.layout.activity_osm)
val mapView = findViewById(R.id.map) mapView.setTileSource(TileSourceFactory.MAPNIK) mapView.controller.setZoom(15.0) val startPoint = GeoPoint(55.7558, 37.6173) // Moscú mapView.controller.setCenter(startPoint)
val marker = Marker(mapView) marker.position = startPoint marker.title = "Moscú" marker.snippet = "Roja"