Atasu Maps

Android SDK

com.atasumaps:atasu-maps-android на MapLibre Native: карта, язык и тема, поиск, маршруты до подъезда.

Предварительная версия. В пилоте Android SDK — внутренний модуль приложения Atasu Maps; публикация в Maven Central — в бета-версии. Способ доставки стиля для нативных карт в продакшене ещё решается, поэтому вне отладочных сборок карта пока не загружает стиль. Описанный ниже API стабилен на время пилота.

com.atasumaps:atasu-maps-android (пакет Kotlin com.atasumaps.sdk) построен на MapLibre Native. Открытый код (Apache-2.0). minSdk 26 (Android 8.0).

Подключение

Kotlin
// app/build.gradle.kts
dependencies {
    implementation("com.atasumaps:atasu-maps-android:0.1.0")
}

Нужен мобильный ключ из консоли, привязанный к имени пакета приложения (например kz.example.taxi). SDK отправляет имя пакета с каждым запросом; запросы других пакетов API отклоняет.

Настройка — один раз

Kotlin
// Application.onCreate
AtasuMaps.configure(this, apiKey = BuildConfig.ATASU_API_KEY, language = AtasuLanguage.KK, theme = AtasuTheme.AUTO)

Не храните ключ в репозитории (например, свойство Gradle → BuildConfig). Серверные ключи (atk_srv_…) отклоняются: их нельзя встраивать в приложение.

Карта

Kotlin
// Jetpack Compose
AtasuMap(Modifier.fillMaxSize()) { map ->
    map.maplibre.cameraPosition = CameraPosition.Builder().target(LatLng(43.24313, 76.95692)).zoom(14.0).build()
}

// or a View
AtasuMapView(context).apply { bindTo(lifecycle) }.getMapAsync { map -> /* … */ }

Карта ждёт первый токен тайлов, обновляет его в фоне и переживает смену конфигурации. Атрибуция рисуется на карте: при открытии развёрнута, затем сворачивается в ⓘ, которая снова её показывает; скрыть её нельзя.

Язык и тема

Kotlin
AtasuMaps.setLanguage(AtasuLanguage.RU)   // every map, no style reload
map.setTheme(AtasuTheme.NIGHT)            // one map, no style reload
map.addContent("my-layer") { style -> /* style.addSource(…); style.addLayerBelow(…, AtasuMap.firstLabelLayerId(style)) */ }

Содержимое, добавленное через addContent, возвращается после каждой перезагрузки стиля.

Поиск

Каждый вызов возвращает AtasuResult: Success со значением или Failure с типизированной AtasuError.

Kotlin
val session = AtasuMaps.search.autocompleteSession(viewModelScope)   // debounced, one session token per search
session.update("Минина 24", near = LngLat(76.94, 43.24))            // collect session.state for suggestions
val place = session.place(suggestion.id)                            // ends the session; 410 → AtasuError.PlaceRemoved

when (val r = AtasuMaps.search.search("Минина 24")) {
    is AtasuResult.Success -> r.value.forEach { println(it.name) }
    is AtasuResult.Failure -> println(r.error)
}

Маршрут до подъезда

Kotlin
val r = AtasuMaps.routing.route(
    RouteOptions(RouteWaypoint.Point(here), RouteWaypoint.Entrance(entrance.id), TravelMode.WALKING, alternatives = 1),
)
if (r is AtasuResult.Success) {
    RouteLayer(map).show(r.value, selected = 0, destination = entrance.lngLat)
    EntranceLayer(map).show(place.entrances, selected = entrance.id)
}

TravelMode.DRIVING, TAXI или WALKING; resolvedTo у каждой точки показывает, действительно ли маршрут заканчивается у подъезда.

Ошибки

AtasuError — это Network, PlaceRemoved (410), NotFound, RoutingUnavailable / SearchUnavailable (503, с retryAfterSeconds), NoRoute, UnresolvableWaypoint, OutsideCoverage, RateLimited или Http(status, code) для остального — см. коды ошибок.

Безопасность и приватность

Ключ и имя пакета уходят только на api.atasumaps.com, токен тайлов — только на tiles.atasumaps.com (точный хост, https, порт 443, в том числе после редиректов). В SDK нет аналитики, сбора сбоев и push.