Справочник | Mobile SDK | 2GIS Documentation
Android SDK

Справочник

Вы можете искать объекты в справочнике, получать поисковые подсказки и результаты поиска.

Типовые сценарии работы со справочником:

Вы можете выполнять эти сценарии, формируя поисковый запрос разными способами:

  • В виде текстового запроса (метод fromQueryText()) с разной степенью уточнения: с названием конкретного места или интересующей вас категорией.
  • С указанием ID конкретной рубрики (метод fromRubricIds()), организации (метод fromOrgId()) или здания (метод fromBuildingId()).
  • С указанием координат центра поиска (метод fromGeoPoint()).

Для поиска объектов в справочнике создайте объект SearchManager и вызовите один из методов, который определяет режим работы справочника:

  • SearchManager.createOnlineManager() — создаёт онлайн-справочник.
  • SearchManager.createOfflineManager() — создаёт офлайн-справочник, работающий только с предзагруженными данными.
  • SearchManager.createSmartManager() — создаёт комбинированный справочник, работающий с онлайн-данными при наличии сети и с предзагруженными данными при отсутствии сети.

Пример создания поисковика с комбинированным справочником:

val searchManager = SearchManager.createSmartManager(sdkContext)

Для поиска объектов в определённой области создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите ограничение области поиска в форме полигона с помощью метода setSpatialRestriction():

val searchQuery = SearchQueryBuilder
    .fromQueryText("пицца")
    .setPageSize(10)
    .build()

Для поиска объектов в области интереса создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите координаты прямоугольной области интереса с помощью метода setAreaOfInterest():

val geoRect = GeoRect(
    GeoPoint(59.931, 30.344),
    GeoPoint(59.936, 30.351)
)
val searchQuery = SearchQueryBuilder
    .fromQueryText("text")
    .setAreaOfInterest(areaOfInterest)
    .build()

Для поиска объектов рядом с определённой точкой создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите координаты точки центра поиска с помощью метода setGeoPoint():

val searchQuery = SearchQueryBuilder
    .fromQueryText("text")
    .setGeoPoint(GeoPoint(59.936, 30.351))
    .build()

Для поиска объектов в радиусе точки создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите координаты точки центра поиска с помощью метода setGeoPoint() и радиус области поиска с помощью метода setRadius():

val searchQuery = SearchQueryBuilder
    .fromQueryText("text")
    .setGeoPoint(GeoPoint(59.936, 30.351))
    .setRadius(Meter(1000f))
    .build()

Для поиска объектов по типу создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите тип объекта с помощью метода setAllowedResultTypes():

val searchQuery = SearchQueryBuilder
    .fromQueryText("text")
    .setAllowedResultTypes(allowedResultTypes = listOf(ObjectType.BUILDING))
    .build()

Если идентификатор (ID) объекта в справочнике известен, то для получения информации об объекте используйте метод searchById():

searchManager.searchById(id).onResult { directoryObject ->
    Log.d("APP", "Название объекта: ${directoryObject.title}")
}

Метод вернёт отложенный результат DirectoryObject.

Вызов метода search() возвращает отложенный результат SearchResult, содержащий список найденных объектов (DirectoryObject), разделенный на страницы:

searchManager.search(searchQuery).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():

val query = SuggestQueryBuilder.fromQueryText("пицц").setLimit(10).build()

searchManager.suggest(query).onResult { suggestResult ->
    // Получаем первую подсказку из списка
    val firstSuggest = suggestResult.suggests?.getOrNull(0) ?: return
    Log.d("APP", "Заголовок подсказки: ${firstSuggest.title}")
}

Вызов вернёт отложенный результат SuggestResult, содержащий список подсказок (Suggest).

Вы можете искать адреса в справочнике с точностью до квартиры или подъезда.

Например, по запросу "Томск Кирова 17 кв 5" вы получите объект, который содержит информацию с точностью до подъезда.

DgisObjectId содержит два идентификатора:

  • objectId — стабильный числовой идентификатор объекта;
  • entranceId — стабильный числовой идентификатор входа/подъезда для объекта.

Если entranceId отличен от нуля, то результатом поиска является не просто дом, а конкретный подъезд в доме.

Если необходимо нарисовать маркер на конкретном подъезде или взять его координаты для построения маршрута, не используйте markerPosition. В этом свойстве будет располагаться позиция, относящаяся к маркеру дома. Для получения позиции подъезда используйте информацию из entrances:

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
}