Інтеграція 2ГІС SDK в мобільну програму
2ГІС SDK (DGis Mobile SDK) — розумний вибір, коли потрібні детальні дані про будинки, офіси, поверхи та організації в російських містах. Карти 2ГІС працюють офлайн з коробки — користувач може скачати регіон та навігувати без інтернету. Це відрізняє SDK від Google Maps та Яндекс у сценаріях, де зв'язок нестабільна.
Підключення SDK
API key видається через dev.2gis.ru. SDK доступен для Android та iOS, Flutter-обертка існує, але офіційно підтримується гірше.
Android (build.gradle):
repositories {
maven { url = uri("https://artifactory.2gis.dev/sdk-maven-release") }
}
dependencies {
implementation("ru.dgis.sdk:sdk-map:1.3.0")
// або sdk-full для пошуку та маршрутів
}
iOS (Swift Package Manager):
// Package.swift
.package(url: "https://github.com/2gis/mobile-sdk-full-swift-package", from: "1.3.0")
Android: ініціалізація та базова карта
import ru.dgis.sdk.DGis
class App : Application() {
lateinit var sdkContext: ru.dgis.sdk.Context
override fun onCreate() {
super.onCreate()
sdkContext = DGis.initialize(
appContext = this,
apiKey = ApiKeys(directory = "YOUR_DIRECTORY_KEY", map = "YOUR_MAP_KEY")
)
}
}
2ГІС потребує два різних ключі: directory — для пошуку організацій та довідника, map — для відображення карти. Переплутати або використовувати один ключ для обох — частова помилка при першій інтеграції.
class MapFragment : Fragment() {
private val mapObjectManager by lazy {
MapObjectManager(mapView.map)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val mapView: MapView = view.findViewById(R.id.mapView)
// Початкова позиція
mapView.map.move(
CameraPosition(
point = GeoPoint(54.9885, 82.9207), // Новосибірськ
zoom = Zoom(13f)
)
)
}
}
Пошук організацій
Довідник 2ГІС — головна перевага SDK. Пошук за назвою, категорією, адресою всередину видимої області:
val searchManager = SearchManager.createSmartSearchManager(sdkContext)
val searchQuery = QueryBuilder("кофейня")
.setSearchArea(mapView.map.visibleArea)
.build()
val searchTask = searchManager.search(searchQuery, object : SearchListener {
override fun onSearchCompleted(searchResult: SearchResult) {
for (item in searchResult.items) {
item.markerPosition?.let { pos ->
val marker = DgisMapObject.createMarker(
options = MarkerOptions(
position = pos,
icon = imageFromResource(R.drawable.ic_coffee)
)
)
mapObjectManager.addObject(marker)
}
}
}
override fun onSearchError(error: SearchError) {}
})
Результати пошуку містять багаті дані: назву, адресу, категорію, рейтинг, години роботи, контакти — все це з довідника 2ГІС без додаткових запитів.
Офлайн-карти
Завантаження регіону — через RegionManager:
val regionManager = sdkContext.getRegionManager()
regionManager.regions.onEach { regions ->
val novosibirsk = regions.find { it.name.contains("Новосибірськ") }
novosibirsk?.let { region ->
regionManager.downloadRegion(region.id)
}
}.launchIn(lifecycleScope)
Після завантаження карта, пошук та маршрути працюють без сіті. Розмір регіону для великого міста — 200-800 МБ. Попередьте користувача перед завантаженням через Wi-Fi.
Маршрути
val routeSearchManager = RouteSearchManager(sdkContext)
val routeSearchOptions = RouteSearchOptions(
startPoint = RouteSearchPoint(GeoPoint(54.9885, 82.9207)),
finishPoint = RouteSearchPoint(GeoPoint(54.9782, 82.8971)),
transportOptions = RouteSearchTransportOptions.Car
)
routeSearchManager.findRoute(routeSearchOptions, object : RouteSearchListener {
override fun onRoutesFound(routes: List<TrafficRoute>, routeSearchOptions: RouteSearchOptions) {
routes.firstOrNull()?.let { route ->
val routeMapObject = RouteMapObject(route)
mapObjectManager.addObject(routeMapObject)
}
}
override fun onError(error: SearchError) {}
})
Особливості та обмеження
2ГІС SDK тяжче за Google Maps: повна версія додає ~50-60 МБ до APK. Для програм з жорсткими вимогами до розміру використовуйте тільки sdk-map без довідника. Кастомізація стилів карти обмежена порівняно з Mapbox — не можна повністю перекрасити всі шари через JSON-стиль.
Часові рамки
1–3 дні. Карта з маркерами — 1 день. Пошук організацій + маршрути — 2–3 дні. Вартість розраховується індивідуально.







