Справочник
Вы можете искать объекты в справочнике, получать поисковые подсказки и результаты поиска.
Сценарии использования
Типовые сценарии работы со справочником:
- Поиск в определённой области. Пример: найти все кофейни внутри определённого полигона на карте.
- Поиск в области интереса. Пример: найти все цветочные магазины в области видимости карты.
- Поиск рядом с определённой точкой. Пример: найти остановки общественного транспорта рядом с местоположением пользователя.
- Поиск в радиусе точки. Пример: найти все заправочные станции в радиусе 1000 м от места назначения автомобиля.
- Поиск по типу объекта. Пример: найти парковки по текстовому запросу
парковки
в радиусе 1000 м от места назначения автомобиля. - Поиск по идентификатору объекта в справочнике.
Вы можете выполнять эти сценарии, формируя поисковый запрос разными способами:
- В виде текстового запроса (метод fromQueryText()) с разной степенью уточнения: с названием конкретного места или интересующей вас категорией.
- С указанием ID конкретной рубрики (метод fromRubricIds()), организации (метод fromOrgId()) или здания (метод fromBuildingId()).
- С указанием координат центра поиска (метод fromGeoPoint()).
Создание поисковика
Для поиска объектов в справочнике создайте объект SearchManager и вызовите один из методов, который определяет режим работы справочника:
- SearchManager.createOnlineManager() — создаёт онлайн-справочник.
- SearchManager.createOfflineManager() — создаёт офлайн-справочник, работающий только с предзагруженными данными.
- SearchManager.createSmartManager() — создаёт комбинированный справочник, работающий с онлайн-данными при наличии сети и с предзагруженными данными при отсутствии сети.
Пример создания поисковика с онлайн-справочником:
let searchManager = SearchManager.createOnlineManager(context: sdk.context)
Формирование поискового запроса
Поиск в определённой области
Для поиска объектов в определённой области создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите ограничение области поиска в форме полигона с помощью метода setSpatialRestriction():
let query = SearchQueryBuilder.fromQueryText(queryText: "пицца").setPageSize(pageSize: 10).build()
Поиск в области интереса
Для поиска объектов в области интереса создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите координаты прямоугольной области интереса с помощью метода setAreaOfInterest():
let geoRect = GeoRect(
southWestPoint: GeoPoint(latitude: 59.931, longitude: 30.344),
northEastPoint: GeoPoint(latitude: 59.936, longitude: 30.351)
)
let searchQuery = SearchQueryBuilder
.fromQueryText(queryText: "text")
.setAreaOfInterest(rect: areaOfInterest)
.build()
Поиск рядом с определённой точкой
Для поиска объектов рядом с определённой точкой создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите координаты точки центра поиска с помощью метода setGeoPoint():
let searchQuery = SearchQueryBuilder
.fromQueryText(queryText: "text")
.setGeoPoint(geoPoint: GeoPoint(latitude: 59.936, longitude: 30.351))
.build()
Поиск в радиусе точки
Для поиска объектов в радиусе точки создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите координаты точки центра поиска с помощью метода setGeoPoint() и радиус области поиска с помощью метода setRadius():
let searchQuery = SearchQueryBuilder
.fromQueryText(queryText: "text")
.setGeoPoint(geoPoint: GeoPoint(latitude: 59.936, longitude: 30.351))
.setRadius(radius: Meter(value: 1000))
.build()
Поиск по типу объекта
Для поиска объектов по типу создайте поисковый запрос (объект SearchQuery) с помощью SearchQueryBuilder и передайте его в метод search(). Укажите тип объекта с помощью метода setAllowedResultTypes():
let searchQuery = SearchQueryBuilder
.fromQueryText(queryText: "text")
.setAllowedResultTypes(allowedResultTypes: [.building])
.build()
Поиск по идентификатору объекта
Если идентификатор (ID) объекта в справочнике известен, то для получения информации об объекте используйте метод searchById():
searchManager.searchById(id: id).sink { object in
print(object?.title)
}
Метод вернёт отложенный результат DirectoryObject.
Получение результатов поиска
Вызов метода search() возвращает отложенный результат SearchResult, содержащий список найденных объектов (DirectoryObject), разделенный на страницы:
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():
let query = SuggestQueryBuilder.fromQueryText(queryText: "пицц").setLimit(limit: 10).build()
searchManager.suggest(query: query).sink{ suggestResult in
// Получаем первую подсказку из списка
let firstSuggestTitle = suggestResult.suggests.first ?? ""
print(firstSuggestTitle)
}
Вызов вернёт отложенный результат SuggestResult, содержащий список подсказок (Suggest).
Информация о подъездах в справочнике
Вы можете искать адреса в справочнике с точностью до квартиры или подъезда.
Например, по запросу "Томск Кирова 17 кв 5"
вы получите объект, который содержит информацию с точностью до подъезда.
DgisObjectId содержит два идентификатора:
- objectId — стабильный числовой идентификатор объекта;
- entranceId — стабильный числовой идентификатор входа/подъезда для объекта.
Если entranceId отличен от нуля, то результатом поиска является не просто дом, а конкретный подъезд в доме.
Если необходимо нарисовать маркер на конкретном подъезде или взять его координаты для построения маршрута, не используйте markerPosition. В этом свойстве будет располагаться позиция, относящаяся к маркеру дома. Для получения позиции подъезда используйте информацию из entrances:
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
}