Справочник
Справочник объектов
Для поиска объектов в справочнике нужно создать объект SearchManager, вызвав один из следующих методов:
- SearchManager.createOnlineManager() - создаёт онлайн-справочник.
- SearchManager.createOfflineManager() - создаёт офлайн-справочник, работающий только с предзагруженными данными.
- SearchManager.createSmartManager() - создаёт комбинированный справочник, работающий с онлайн-данными при наличии сети и с предзагруженными данными при отсутствии сети.
val searchManager = SearchManager.createSmartManager(sdkContext)
Если идентификатор (ID) объекта известен, то для получения информации о нём нужно вызвать метод searchById(). Метод вернёт отложенный результат DirectoryObject.
searchManager.searchById(id).onResult { directoryObject ->
Log.d("APP", "Название объекта: ${directoryObject.title}")
}
Если ID объекта не известен, то можно создать поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передать его в метод search(). Вызов вернёт отложенный результат SearchResult, содержащий список найденных объектов (DirectoryObject), разделенный на страницы.
val query = SearchQueryBuilder.fromQueryText("пицца").setPageSize(10).build()
searchManager.search(query).onResult { searchResult ->
// Получаем первый объект с первой страницы
val directoryObject = searchResult.firstPage?.items?.getOrNull(0) ?: return
Log.d("APP", "Название объекта: ${directoryObject.title}")
}
Чтобы получить следующую страницу результатов поиска, нужно вызвать метод страницы fetchNextPage(), который вернёт отложенный результат Page.
firstPage.fetchNextPage().onResult { nextPage
val directoryObject = nextPage?.items?.getOrNull(0) ?: return
}
Также с помощью справочника можно получать подсказки при текстовом поиске объектов (см. Suggest API для демонстрации). Для этого нужно создать объект SuggestQuery с помощью SuggestQueryBuilder и передать его в метод suggest(). Вызов вернёт отложенный результат SuggestResult, содержащий список подсказок (Suggest).
val query = SuggestQueryBuilder.fromQueryText("пицц").setLimit(10).build()
searchManager.suggest(query).onResult { suggestResult ->
// Получаем первую подсказку из списка
val firstSuggest = suggestResult.suggests?.getOrNull(0) ?: return
Log.d("APP", "Заголовок подсказки: ${firstSuggest.title}")
}
Информация о подъездах
Справочник предоставляет возможность искать адреса с точностью до квартиры/подъезда.
Например, по запросу "Томск Кирова 17 кв 5" мы можем получить объект, который содержит информацию с точностью до подъезда.
DgisObjectId содержит два идентификатора:
Если entranceId отличен от нуля, то результатом поиска является не просто дом, а конкретный подъезд в доме.
Если необходимо нарисовать маркер на конкретном подъезде или взять его координаты для построения маршрута, то использование markerPosition будет ошибкой. В этом свойстве будет располагаться позиция, относящаяся к маркеру дома. Для получения позиции подъезда необходимо использовать информацию из buildingEntrances.
fun getMarkerPosition(directoryObject: DirectoryObject?) : GeoPoint?
{
val entranceId = directoryObject?.id?.entranceId ?: 0L
if (entranceId != 0L) {
directoryObject?.buildingEntrances?.find { info -> info.id.entranceId == entranceId }?.let {
return it.geometry?.entrancePoints?.firstOrNull() ?: directoryObject.markerPosition?.point
}
}
return directoryObject?.markerPosition?.point
}