Справочник
Вы можете искать объекты в справочнике 2ГИС, обрабатывать результаты поиска, а также использовать подсказки для уточнения поисковых запросов. В справочнике вы можете найти информацию по объектам следующих типов:
- компании и их филиалы;
- здания;
- парковки;
- остановки общественного транспорта и станции метро;
- дороги (улицы, перекрёстки, проезды);
- населённые пункты разного размера (страны, города, регионы, деревни, микрорайоны и т.д.);
- различные площадные объекты (парки, пляжи и т.д.).
Полный список доступных типов объектов см. в описании класса ObjectType.
Чтобы начать работу со справочником:
- Создайте поисковый движок.
- Сформируйте поисковый запрос.
- Получите, обработайте и отобразите на карте результаты поиска.
Создание поисковика
Для поиска объектов в справочнике создайте объект SearchManager и вызовите один из методов, который определяет режим работы справочника:
- SearchManager.createOnlineManager() — создаёт онлайн-справочник.
- SearchManager.createOfflineManager() — создаёт офлайн-справочник, работающий только с предзагруженными данными.
- SearchManager.createSmartManager() — создаёт комбинированный справочник, работающий с онлайн-данными при наличии сети и с предзагруженными данными при отсутствии сети.
Важно
Некоторые методы работают только в определённом режиме справочника.
Пример создания поисковика с комбинированным справочником:
val searchManager = SearchManager.createSmartManager(sdkContext)
Формирование поискового запроса
Чтобы отправить поисковый запрос, создайте объект SearchQuery с помощью SearchQueryBuilder и передайте его в метод search().
Поисковый запрос должен состоять из трёх логических компонентов:
-
Запрос для поиска объекта (что нужно искать?). Вы можете сформулировать запрос с помощью одного из методов ниже:
-
Из текстовой строки с помощью метода fromQueryText(). Вы можете сформулировать текстовый запрос для поиска конкретного объекта (
храм Василия Блаженного
) или для получения списка множества объектов по критерию (магазины музыкальных инструментов
). -
По идентификаторам рубрик с помощью метода fromRubricIds() или в сочетании с текстовой строкой с помощью м етода fromQueryTextAndRubricIds(). Этот способ полезен для создания выборки объектов определённого типа.
-
По идентификатору:
- Организации с помощью метода fromOrgId(). Если у компании несколько филиалов, в ответе будут перечислены все точки.
- Здания с помощью метода fromBuildingId().
- Любого объекта с помощью метода поискового движка searchById().
-
-
Геоограничение поиска (где нужно искать?). Вы можете ограничить зону поиска с помощью одного из методов ниже:
-
Поиск внутри полигона: задайте координаты с помощью метода setSpatialRestriction().
-
Поиск в прямоугольной области интереса: задайте координаты с помощью метода setAreaOfInterest(). Этот метод задаёт приоритетную зону поиска, но не ограничивает поиск строго: если внутри области интер еса результаты не найдены, поиск продолжится за пределами области.
-
Поиск в радиусе вокруг точки: задайте центр поиска с помощью метода setGeoPoint() или fromGeoPoint() и, если необходимо, радиус поиска с помощью метода setRadius().
Метод fromGeoPoint() работает только в режиме поиска онлайн.
-
Произвольный запрос: если запрос для поиска объекта сформирован с помощью метода fromQueryText(), вы можете в этом же тексте указать и геоограничение (
цветы у Бауманской
).
-
-
(Необязательный компонент) Дополнительные ограничения результатов поиска с помощью одного или нескольких методов ниже:
- Поиск объектов только определённого типа: перечислите интересующие вас типы объектов с помощью метода setAllowedResultTypes() (например, только здания).
- Фильтрация результатов: задайте критерий фильтрации с помощью метода setDirectoryFilter() (например, по времени работы).
- Сортировка результатов: задайте критерий сортировки с помощью метода setSortingType() (например, по рейтингу).
- Количество результатов на странице: задайте ограничение с помощью метода setPageSize().
- Локаль для поискового запроса: задайте язык и регион с помощью метода setLocale().
Примеры
-
Найти рестораны итальянской кухни в Пресненском районе Москвы, которые открыты сейчас, с сортировкой по рейтингу:
// Создаём фильтр по времени работы
val filter = DirectoryFilter(
WorkTimeFilter(IsOpenNow()), // оставить только открытые сейчас объекты
listOf<DynamicFilter>()
)
val searchQuery = SearchQueryBuilder
.fromQueryText("рестораны итальянской кухни в Пресненском районе Москвы")
.setDirectoryFilter(filter) // фильтрация по времени работы
.setSortingType(SortingType.BY_RATING) // сортировка по рейтингу
.setPageSize(10) // максимум 10 объектов на странице результатов
.build() -
Найти все парковки в радиусе 1 км с сортировкой по удалённости:
val searchQuery = SearchQueryBuilder
.fromQueryText("Парковки")
.setAllowedResultTypes(allowedResultTypes = listOf(ObjectType.PARKING)) // только парковки
.setGeoPoint(GeoPoint(59.936, 30.351)) // центр поиска
.setRadius(Meter(1000f)) // радиус поиска
.setSortingType(SortingType.BY_DISTANCE) // сортировка по удалённости
.build() -
Найти все населённые пункты (города, деревни, посёлки и т.д.) внутри полигона:
// Создаём область поиска в виде полигона
val polygon = listOf(
GeoPoint(55.751244, 37.618423),
GeoPoint(55.760244, 37.628423),
GeoPoint(55.770244, 37.618423),
GeoPoint(55.751244, 37.608423)
)
val searchQuery = SearchQueryBuilder
.fromQueryText("Название города")
.setAllowedResultTypes(allowedResultTypes = listOf(ObjectType.ADM_DIV_CITY, ObjectType.ADM_DIV_SETTLEMENT)) // только города и мелкие населённые пункты
.setSpatialRestriction(polygon) // область поиска
.build() -
Найти все объекты, которые оказывают услуги печати документов, в области интереса:
// Создаём прямоугольную область интереса по координатам двух углов
val areaOfInterest = GeoRect(
southWestPoint = GeoPoint(59.931, 30.344), // юго-западный угол
northEastPoint = GeoPoint(59.936, 30.351) // северо-восточный угол
)
val searchQuery = SearchQueryBuilder
.fromQueryText("печать документов")
.setAreaOfInterest(areaOfInterest)
.build() -
Найти все компании по адресу «Новосибирск, площадь Карла Маркса, 7»:
val searchQuery = SearchQueryBuilder
.fromQueryText("Новосибирск, площадь Карла Маркса, 7")
.setAllowedResultTypes(allowedResultTypes = listOf(ObjectType.BRANCH)) // только компании
.setPageSize(10) // максимум 10 объектов на странице результатов
.build() -
Найти все филиалы компании по известному идентификатору:
val id = 4504136498310300
val searchQuery = SearchQueryBuilder.fromOrgId(OrgId(id)).build() -
Найти конкретный объект по известному идентификатору:
val id = 70000001035164789
searchManager.searchById("id")
Геокодирование
С помощью SDK вы можете решать задачи геокодирования: определять координаты объекта на карте по его адресу (прямое геокодирование) и наоборот, определять адрес объекта на карте по его координатам (обратное геокодирование).
Прямое геокодирование
Чтобы получить координаты объекта по его адресу, сформируйте поисковый запрос, указав следующие данные:
-
Адрес в текстовом запросе с помощью метода fromQueryText().
Для более точных результатов укажите в тексте город (посёлок, деревню), где выполняется поиск. Название небольшого населённого пункта (например, деревни) рекомендуется указывать вместе с названием области и другими объединениями, к которым он относится (например, сельским или городским поселением).
-
(Рекомендуется) Тип объекта, координаты которого нужно получить, с помощью метода setAllowedResultTypes().
Например, чтобы получить координаты здания по адресу «Москва, ул. Тверская 19а»:
val searchQuery = SearchQueryBuilder
.fromQueryText("Москва, ул. Тверская 19а")
.setAllowedResultTypes(allowedResultTypes = listOf(ObjectType.BUILDING))
.build()
В результате поиска вы получите объект справочника DirectoryObject. Координаты объек та будут представлены в поле markerPosition
в виде объекта GeoPointWithElevation. Пример:
markerPosition: GeoPointWithElevation(
latitude=Latitude(value=55.7659),
longitude=Longitude(value=37.602827),
elevation=Elevation(value=18.0)
),
Подробнее о другой информации в результатах поиска см. в разделе Структура данных объекта.
Обратное геокодирование
Чтобы получить адрес объекта по его координатам, сформируйте поисковый запрос, указав координаты объекта с помощью метода setGeoPoint() или fromGeoPoint().
Например, найти адрес объекта по координатам 55.7659, 37.602827
:
val searchQuery = SearchQueryBuilder
.fromGeoPoint(GeoPoint(55.7659, 37.602827))
.build()
В результате поиска вы получите объект справочника DirectoryObject. Адрес объекта будет представлен в поле address
в виде объекта Address. Пример:
address: Address(
drillDown=[
AddressAdmDiv(type=country, name=Россия),
AddressAdmDiv(type=region, name=Москва),
AddressAdmDiv(type=city, name=Москва),
AddressAdmDiv(type=district, name=Тверской)
],
components=[
AddressComponent(AddressStreet(street=Тверская улица, number=19а, fiasCode=null))
],
buildingName=null,
buildingId=BuildingId(value=4504235282747324),
postCode=125009,
buildingCode=null,
fiasCode=null,
addressComment=1-2 этаж
),
Подробнее о другой информации в результатах поиска см. в разделе Структура данных объекта.
Изменение параметров поиска
Вы можете изменять или дополнять параметры уже созданного поискового запроса. Для этого создайте новый объект SearchQuery, укажите существу ющий запрос с помощью метода fromQuery() и укажите параметры, которые нужно дополнительно применить. Например, изменить тип сортировки результатов при поиске парковок:
// Создаём изначальный запрос
val searchQuery = SearchQueryBuilder
.fromQueryText("Парковки")
.setAllowedResultTypes(allowedResultTypes = listOf(ObjectType.PARKING))
.setGeoPoint(GeoPoint(59.936, 30.351))
.setRadius(Meter(1000f))
.setSortingType(SortingType.BY_DISTANCE) // сортировка по удалённости
.build()
// Создаём новый запрос с другим типом сортировки
val searchQueryUpdated = SearchQueryBuilder
.fromQuery(searchQuery) // указание на изначальный запрос
.setSortingType(SortingType.BY_RATING) // сортировка по рейтингу
.build()
Остальные параметры изначал ьного запроса сохраняются.
Получение результатов поиска
Вызов метода 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
}
Отображение результатов на карте
Координаты всех найденных объектов возвращаются в поле itemMarkerInfos
результата поиска SearchResult в виде списка элементов ItemMarkerInfo. Список может содержать не более 15000 элементов.
Чтобы отобразить на карте маркеры всех найденных объектов:
- Подготовьте список объектов Marker. Чтобы задать позицию маркера (параметр
position
), используйте координаты из поля ItemMarkerInfo.geoPoint. - Добавьте готовый набор маркеров на карту с помощью метода
addObjects()
менеджера объектов MapObjectManager. Подробнее см. в инструкции Добавление нескольких объектов на карту.
fun displaySearchResultMarkers(map: Map, searchResult: SearchResult) {
// Получаем список маркеров из результатов поиска
searchResult.itemMarkerInfos.onResult { markerInfos ->
if (markerInfos == null) return@onResult
// Создаём менеджер объектов для добавления маркеров на карту
val mapObjectManager = MapObjectManager(map)
// Подготавливаем список маркеров
val markers = markerInfos.mapNotNull { itemMarkerInfo ->
val position = itemMarkerInfo.geoPoint ?: return@mapNotNull null
Marker(
MarkerOptions(
position = position,
icon = imageFromResource(sdkContext, R.drawable.ic_marker)
)
)
}
// Добавляем маркеры на карту
mapObjectManager.addObjects(markers)
}
}
Структура данных объекта
Результаты поиска по справочнику представлены в виде списка объектов DirectoryObject с наборами свойств. В зависимости от типа объекта часть свойств может не содержать значений.
Важно
Получение некоторой информации об объектах в доступно только при дополнительной настройке ключа за отдельную плату: см. описания полей объектов DirectoryObject, Address и ItemMarkerInfo. Обратитесь в службу поддержки 2ГИС, чтобы обновить настройки вашего ключа доступа.
-
Основные свойства для классификации объекта:
- Тип объекта (
types
) из ObjectType. Один объект может относиться к нескольким типам (например, ТЦ Сан Сити — это одновременно и филиал организации, и здание). В этом случае все типы будут перечислены в списке, где первый элемент — основной тип объекта. - Название объекта (
title
) в зависимости от его типа: организации, достопримечательности, географического объекта. Для жилых домов без названия — адрес. - Подтип объекта (
subtitle
) для уточнения. Например, кофейня как подтип организации или жилой дом как подтип здания. - Описание объекта (
description
). - Категории, к которым относится объект (
rubricIds
). - Идентификатор организации в справочнике и информация о ней (
orgInfo
). Для компаний с множеством филиалов — информация о головной организации. - (Данные по запросу) Объединение объектов разного типа в одной карточке справочника (
group
). Подробнее см. ниже.
- Тип объекта (
-
Уникальный идентификатор объекта в справочнике (
id
). Для компаний с множеством филиалов — идентификатор конкретного филиала. -
Географические свойства:
- Координаты для размещения маркера на карте (
markerPosition
). - Полный адрес объекта (
address
). Некоторые компоненты адреса доступны только по запросу: см. описание объекта Address. - (Данные по запросу) Информация об этаже здания, на котором расположен объект (
levelId
иbuildingLevels
). Актуально для компаний, которые расположены на определённом этаже многоэтажного здания. - (Данные по запросу) Информация о входах в объект (
entrances
) с координатами и другими данными. Актуально как для компаний и зданий, так и для других объектов с физически обозначенными входами (например, парков). - (Данные по запросу) Дополнительная информация для уточнения адреса (
titleAddition
). Например, номер подъезда или номер квартиры.
- Координаты для размещения маркера на карте (
-
Время работы:
- Смещение локального времени объекта от UTC в виде временной метки (
timeZoneOffset
). Например,03:00:00
для часового пояса UTC+3. - Время работы (
openingHours
) в виде списка временных промежутков или флага круглосуточной работы. Актуально для компаний. - Текущий статус работы (
workStatus
).
- Смещение локального времени объекта от UTC в виде временной метки (
-
Прочие данные:
- (Данные по запросу) Информация о торговой лицензии организации (
tradeLicense
). - Контакты для связи с организацией (
contactInfos
): номер телефона, e-mail, ссылки на сайт и соцсети и другое. - Рейтинг объекта на основе отзывов пользователей (
reviews
). - Дополнительные свойства парковок (
parkingInfo
). - Дополнительные свойства электрозаправок (
chargingStation
). - Информация о здании (
buildingInfo
).
- (Данные по запросу) Информация о торговой лицензии организации (
Объединение объектов
Некоторые геообъекты в справочнике могут быть представлены в виде группы объектов разного типа. Например, здание суда — это одновременно и отдельно стоящее здание, и организация внутри этого здания, то есть, два разных DirectoryObject с характеристиками здания и организации соответственно. Но поскольку эти DirectoryObject
относятся к одному и тому же геообъекту, в их структуре данных содержатся ссылки друг на друга.
Информация о связанных объектах содержится в поле group
в виде списка элементов GroupItem. Для каждого связанного объекта представлен его тип и идентификатор (DgisObjectId), который вы можете в дальнейшем использовать для обращения к этому объекту.
Доступ к данным в поле
group
предоставляется только при дополнительной настройке ключа за отдельную плату. Обратитесь в службу поддержки 2ГИС.
Пример наполнения поля group
с одним связанным объектом:
group: [
GroupItem(
id=DgisObjectId(objectId=70030076538159915,
entranceId=0),
type=ATTRACTION
),
]
Примеры
Ниже представлены примеры DirectoryObject разных типов объектов справочника.
-
Филиал организации:
DirectoryObject
# Тип объекта — организация
types: [BRANCH]
# Название организации
title: Шоколадница
titleAddition:
# Подтип организации — кофейня
subtitle: Кофейня
# ID объекта ( данного филиала организации)
id: DgisObjectId(objectId=4504128908451067, entranceId=0)
# Координаты маркера для размещения на карте
markerPosition: GeoPointWithElevation(
latitude=Latitude(value=55.7659),
longitude=Longitude(value=37.602827),
elevation=Elevation(value=18.0)
)
# Адрес организации — Москва, ул. Тверская 19а
address: Address(
drillDown=[
AddressAdmDiv(type=country, name=Россия),
AddressAdmDiv(type=region, name=Москва),
AddressAdmDiv(type=city, name=Москва),
AddressAdmDiv(type=district, name=Тверской)
],
components=[
AddressComponent(AddressStreet(street=Тверская улица, number=19а, fiasCode=null))
],
buildingName=null,
buildingId=BuildingId(value=4504235282747324),
postCode=125009,
buildingCode=null,
fiasCode=null,
addressComment=1-2 этаж
)
attributes: []
contextAttributes: []
# Локальный часовой пояс — UTC+3
timeZoneOffset: 03:00:00
# Время работы филиала: воскресенье-четверг с 7:00 до 23:00, пятница с 7:00 до 24:00, суббота — круглосуточно
openingHours: OpeningHours(
weekOpeningHours=[
[WeekTimeInterval(
startTime=WeekTime(weekDay=MONDAY, time=DayTime(hours=7, minutes=0)),
finishTime=WeekTime(weekDay=MONDAY, time=DayTime(hours=23, minutes=0))
)],
[WeekTimeInterval(
startTime=WeekTime(weekDay=TUESDAY, time=DayTime(hours=7, minutes=0)),
finishTime=WeekTime(weekDay=TUESDAY, time=DayTime(hours=23, minutes=0))
)],
[WeekTimeInterval(
startTime=WeekTime(weekDay=WEDNESDAY, time=DayTime(hours=7, minutes=0)),
finishTime=WeekTime(weekDay=WEDNESDAY, time=DayTime(hours=23, minutes=0))
)],
[WeekTimeInterval(
startTime=WeekTime(weekDay=THURSDAY, time=DayTime(hours=7, minutes=0)),
finishTime=WeekTime(weekDay=THURSDAY, time=DayTime(hours=23, minutes=0))
)],
[WeekTimeInterval(
startTime=WeekTime(weekDay=FRIDAY, time=DayTime(hours=7, minutes=0)),
finishTime=WeekTime(weekDay=FRIDAY, time=DayTime(hours=24, minutes=0))
)],
[WeekTimeInterval(
startTime=WeekTime(weekDay=SATURDAY, time=DayTime(hours=0, minutes=0)),
finishTime=WeekTime(weekDay=SATURDAY, time=DayTime(hours=24, minutes=0))
)],
[WeekTimeInterval(
startTime=WeekTime(weekDay=SUNDAY, time=DayTime(hours=0, minutes=0)),
finishTime=WeekTime(weekDay=SUNDAY, time=DayTime(hours=23, minutes=0))
)]
],
isOpen24x7=false
)
contactInfos: []
# Рейтинг 3.4 на основе 85 отзывов
reviews: Reviews(rating=3.4, count=85)
parkingInfo: null
# В данный момент филиал открыт и работает до 23:00
workStatus: WorkStatus(isOpen=true, description=Открыто до 23:00)
levelId: null
buildingLevels: null
# У организации один вход
entrances: [
EntranceInfo(
id=DgisObjectId(objectId=4504128908451067, entranceId=70030076156031010),
buildingNumber=null,
porchName=null,
porchNumber=null,
apartmentRanges=[],
geometry=EntranceGeometry(
entrancePoints=[
GeoPoint(
latitude=Latitude(value=55.76590646318491),
longitude=Longitude(value=37.60283837242394)
)
],
entrancePolylines=[
[
GeoPoint(
latitude=Latitude(value=55.765971),
longitude=Longitude(value=37.602949)
),
GeoPoint(
latitude=Latitude(value=55.765906),
longitude=Longitude(value=37.602838)
)
]
]
)
)
]
chargingStation: null
# Объект относится к трём категориям
rubricIds: [
RubricId(value=162),
RubricId(value=1203),
RubricId(value=161)
]
# Информация о головной организации и общем количестве филиалов
orgInfo: OrgInfo(
branchCount=225,
id=OrgId(value=4504136498310300),
name=Шоколадница, кофейня
)
group: [] -
Жилое здани е:
DirectoryObject
# Тип объекта — здание
types: [BUILDING]
# Название объекта — адрес здания
title: 2-я Черногрязская улица, 1
titleAddition:
# Подтип объекта — жилой дом
subtitle: Жилой дом
# ID объекта
id: DgisObjectId(objectId=4504235282792806, entranceId=0)
# Координаты маркера для размещения на карте
markerPosition: GeoPointWithElevation(
latitude=Latitude(value=55.760651),
longitude=Longitude(value=37.545995),
elevation=Elevation(value=3.0)
)
# Адрес объекта — Москва, 2-я Черногрязская улица 1
address:
Address(
drillDown=[
AddressAdmDiv(type=country, name=Россия),
AddressAdmDiv(type=region, name=Москва),
AddressAdmDiv(type=city, name=Москва),
AddressAdmDiv(type=district, name=Пресненский)
],
components=[
AddressComponent(AddressStreet(street=2-я Черногрязская улица, number=1, fiasCode=91e0431b-5721-40b9-8bf0-5eb5377063a8))
],
buildingName=null,
buildingId=BuildingId(value=4504235282792806),
postCode=123100,
buildingCode=null,
fiasCode=null,
addressComment=null
)
attributes: []
contextAttributes: []
timeZoneOffset: null
openingHours: null
contactInfos: []
# Нет отзывов об объекте для подсчёта рейтинга
reviews: Reviews(rating=0.0, count=0)
parkingInfo: null
workStatus: WorkStatus(isOpen=false, description=)
levelId: null
buildingLevels: null
# У жилого здания два входа
entrances: [
EntranceInfo(
id=DgisObjectId(objectId=4504235282792806, entranceId=4504643304435799),
buildingNumber=null,
porchName=null,
porchNumber=null,
apartmentRanges=[],
geometry=EntranceGeometry(
entrancePoints=[
GeoPoint(
latitude=Latitude(value=55.76073452440514),
longitude=Longitude(value=37.54591428882596)
)
],
entrancePolylines=[
[
GeoPoint(
latitude=Latitude(value=55.760822),
longitude=Longitude(value=37.545949)
),
GeoPoint(
latitude=Latitude(value=55.760735),
longitude=Longitude(value=37.545914)
)
]
]
)
),
EntranceInfo(
id=DgisObjectId(objectId=4504235282792806, entranceId=70030076156588095),
buildingNumber=null,
porchName="1 подъезд",
porchNumber=1,
apartmentRanges=[
ApartmentRange(start=1, end=80)
],
geometry=EntranceGeometry(
entrancePoints=[
GeoPoint(
latitude=Latitude(value=55.7605167221199),
longitude=Longitude(value=37.54581996572112)
)
],
entrancePolylines=[
[
GeoPoint(
latitude=Latitude(value=55.760497),
longitude=Longitude(value=37.545975)
),
GeoPoint(
latitude=Latitude(value=55.760517),
longitude=Longitude(value=37.54582)
)
]
]
)
)
]
chargingStation: null
rubricIds: []
orgInfo: null
group: []