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

Справочник

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

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

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

searchManager.searchById(id: id).sink { object in
    print(object?.title)
}

Если ID объекта не известен, то можно создать поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передать его в метод search(). Вызов вернёт отложенный результат SearchResult, содержащий список найденных объектов (DirectoryObject), разделенный на страницы.

let query = SearchQueryBuilder.fromQueryText(queryText: "пицца").setPageSize(pageSize: 10).build()

searchManager.search(query: query).sink{ searchResult in
// Получаем название первого объекта с первой страницы
    let directoryObjectTitle = searchResult.firstPage?.items?.first?.title ?? "NotFound"
    print(directoryObjectTitle)
}

Чтобы получить следующую страницу результатов поиска, нужно вызвать метод страницы fetchNextPage(), который вернёт отложенный результат Page.

firstPage?.fetchNextPage().sink{ nextPage in
    let directoryObject = nextPage?.items?.first
}

Также с помощью справочника можно получать подсказки при текстовом поиске объектов (см. Suggest API для демонстрации). Для этого нужно создать объект SuggestQuery с помощью SuggestQueryBuilder и передать его в метод suggest(). Вызов вернёт отложенный результат SuggestResult, содержащий список подсказок (Suggest).

let query = SuggestQueryBuilder.fromQueryText(queryText: "пицца").setLimit(limit: 10).build()

searchManager.suggest(query: query).sink{ suggestResult in
    // Получаем первую подсказку из списка
    let firstSuggestTitle = suggestResult.suggests.first ?? ""
    print(firstSuggestTitle)
}

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

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

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

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

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

func getMarkerPosition(directoryObject: DirectoryObject) -> GeoPoint?
{
    let entranceId = directoryObject.id?.entranceId ?? 0
    if (entranceId != 0)
    {
        let info = directoryObject.buildingEntrances.first(where: {info in
            info.id.entranceId == entranceId})
        return info?.geometry?.entrancePoints.first ?? directoryObject.markerPosition?.point
    }
    return directoryObject.markerPosition?.point
}