Геолокация и карты в Kotlin: обзор библиотек и инструментов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Геолокация и карты в Kotlin: полный обзор инструментов

Kotlin, будучи современным языком программирования для Android и серверной разработки, предоставляет разработчикам мощные средства для работы с геолокацией и картами. В этой статье мы рассмотрим основные библиотеки и инструменты, которые позволят вам легко интегрировать картографические сервисы и функции определения местоположения в ваши проекты на Kotlin.

1. Google Maps SDK для Android (Kotlin)

Google Maps SDK — это самый популярный и функциональный инструмент для работы с картами в Android-приложениях. Он предоставляет полный набор API для отображения карт, добавления маркеров, полигонов, управления камерой и получения информации о местоположении.

Для начала работы добавьте зависимость в build.gradle.kts:

dependencies {
    implementation("com.google.android.gms:play-services-maps:18.2.0")
    implementation("com.google.android.gms:play-services-location:21.0.1")
}

Пример добавления карты в Activity с использованием SupportMapFragment:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions

class MapsActivity : AppCompatActivity(), OnMapReadyCallback {

    private lateinit var googleMap: GoogleMap

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_maps)

        val mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }

    override fun onMapReady(map: GoogleMap) {
        googleMap = map
        val sydney = LatLng(-33.852, 151.211)
        googleMap.addMarker(MarkerOptions()
            .position(sydney)
            .title("Маркер в Сиднее"))
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 12f))
    }
}

2. Yandex Maps SDK для Android (Kotlin)

Yandex Maps SDK — отличная альтернатива для проектов, ориентированных на русскоязычную аудиторию. Он предлагает детальные карты России и СНГ, а также уникальные функции, такие как визуализация пробок и маршруты общественного транспорта.

Подключение библиотеки:

dependencies {
    implementation("com.yandex.android:maps.mobile:4.3.1-lite")
}

Пример отображения карты с маркером:

import com.yandex.mapkit.MapKitFactory
import com.yandex.mapkit.mapview.MapView
import com.yandex.mapkit.geometry.Point
import com.yandex.mapkit.map.MapObjectCollection
import com.yandex.runtime.image.ImageProvider

class MainActivity : AppCompatActivity() {
    private lateinit var mapview: MapView

    override fun onCreate(savedInstanceState: Bundle?) {
        MapKitFactory.initialize(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        mapview = findViewById(R.id.mapview)
        mapview.map.move(
            CameraPosition(Point(55.751244, 37.618423), 11f, 0f, 0f)
        )
        
        val mapObjects: MapObjectCollection = mapview.map.mapObjects
        mapObjects.addPlacemark(
            Point(55.751244, 37.618423),
            ImageProvider.fromResource(this, R.drawable.marker)
        )
    }

    override fun onStop() {
        mapview.onStop()
        MapKitFactory.getInstance().onStop()
        super.onStop()
    }
}

3. OpenStreetMap (OSMDroid) для Kotlin

OSMDroid — это библиотека с открытым исходным кодом, которая использует данные OpenStreetMap. Она не требует API-ключей и позволяет работать с картами офлайн, что делает её идеальной для проектов с ограниченным доступом к интернету.

Добавьте зависимость:

dependencies {
    implementation("org.osmdroid:osmdroid-android:6.1.18")
    implementation("org.osmdroid:osmdroid-wms:6.1.18")
}

Пример использования в Activity:

import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
import org.osmdroid.util.GeoPoint
import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.Marker

class OsmdroidActivity : AppCompatActivity() {
    private lateinit var mapView: MapView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Configuration.getInstance().load(this, getSharedPreferences("osmdroid", MODE_PRIVATE))
        setContentView(R.layout.activity_osmdroid)

        mapView = findViewById(R.id.map)
        mapView.setTileSource(TileSourceFactory.MAPNIK)
        mapView.controller.setZoom(10.0)
        
        val startPoint = GeoPoint(48.8583, 2.2945) // Париж
        mapView.controller.setCenter(startPoint)

        val marker = Marker(mapView)
        marker                    

Рекомендаций