Интеграция 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 дня. Стоимость рассчитывается индивидуально.







