Справочник
Вы можете искать объекты в справочнике 2ГИС, обрабатывать результаты поиска, а также использовать подсказки для уточнения поисковых запросов. В справочнике вы можете найти информацию по объектам следующих типов:
- компании и их филиалы;
- здания;
- парковки;
- остановки общественного транспорта и станции метро;
- дороги (улицы, перекрёстки, проезды);
- населённые пункты разного размера (страны, города, регионы, деревни, микрорайоны и т.д.);
- различные площадные объекты (парки, пляжи и т.д.).
Полный список доступных типов объектов см. в описании класса ObjectType.
Чтобы начать работу со справочником:
- Создайте поисковый движок.
- Сформируйте поисковый запрос.
- Получите, обработайте и отобразите на карте результаты поиска.
Создание поисковика
Для поиска объектов в справочнике создайте объект SearchManager и вызовите один из методов, который определяет режим работы справочника:
- SearchManager.createOnlineManager() — создаёт онлайн-справочник.
- SearchManager.createOfflineManager() — создаёт офлайн-справочник, работающий только с предзагруженными данными.
- SearchManager.createSmartManager() — создаёт комбинированный справочник, работающий с онлайн-данными при наличии сети и с предзагруженными данными при отсутствии сети.
Важно
Некоторые методы работают только в определённом режиме справочника.
Пример создания поисковика с онлайн-справочником:
import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;
final SearchManager searchManager = sdk.SearchManager.createOnlineManager(context);
Формирование поискового запроса
Чтобы отправить поисковый запрос, создайте объект SearchQuery с помощью SearchQueryBuilder и передайте его в метод search().
Поисковый запрос должен состоять из трёх логических компонентов:
-
Запрос для поиска объекта (что нужно искать?). Вы можете сформулировать запрос с помощью одного из методов ниже:
-
Из текстовой строки с помощью метода fromQueryText(). Вы можете сформулировать текстовый запрос для поиска конкретного объекта (
храм Василия Блаженного
) или для получения списка множества объектов по критерию (магазины музыкальных инструментов
). -
По идентификаторам рубрик с помощью метода fromRubricIds() или в сочетании с текстовой строкой с помощью метода fromQueryTextAndRubricIds(). Этот способ полезен для создания выборки объектов определённого типа.
-
По идентификатору:
- Организации с помощью метода fromOrgId(). Если у компании несколько филиалов, в ответе будут перечислены все точки.
- Здания с помощью метода fromBuildingId().
- Любого объекта с помощью метода поискового движка searchById().
-
-
Геоограничение поиска (где нужно искать?). Вы можете ограничить зону поиска с помощью одного из методов ниже:
-
Поиск внутри полигона: задайте координаты с помощью метода setSpatialRestriction().
-
Поиск в прямоугольной области интереса: задайте координаты с помощью метода setAreaOfInterest(). Этот метод задаёт приорите тную зону поиска, но не ограничивает поиск строго: если внутри области интереса результаты не найдены, поиск продолжится за пределами области.
-
Поиск в радиусе вокруг точки: задайте центр поиска с помощью метода setGeoPoint() или fromGeoPoint() и, если необходимо, радиус поиска с помощью метода setRadius().
Метод fromGeoPoint() работает только в режиме поиска онлайн.
-
Произвольный запрос: если запрос для поиска объекта сформирован с помощью метода fromQueryText(), вы можете в этом же тексте указать и геоограничение (
цветы у Бауманской
).
-
-
(Необязательный компонент) Дополнительные ограничения результатов поиска с помощью одного или нескольких методов ниже:
- Поиск объектов только определённого типа: перечислите интересующие вас типы объектов с помощью метода setAllowedResultTypes() (например, только здания).
- Фильтрация результатов: задайте критерий фильтрации с помощью метода setDirectoryFilter() (например, по времени работы).
- Сортировка результатов: задайте критерий сортировки с помощью метода setSortingType() (например, по рейтингу).
- Количество результатов на странице: задайте ограничение с помощью метода setPageSize().
- Локаль для поискового запроса: задайте язык и регион с помощью метода setLocale().
Примеры
-
Найти рестораны итальянской кухни в Пресненском районе Москвы, которые открыты сейчас, с сортировкой по рейтингу:
import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;
// Создаём фильтр по времени работы
final filter = sdk.DirectoryFilter(
workTime: sdk.WorkTimeFilter.isOpenNow(const sdk.IsOpenNow()), // оставить только открытые сейчас объекты
dynamic_: [],
);
final searchQuery = sdk.SearchQueryBuilder
.fromQueryText("рестораны итальянской кухни в Пресненском районе Москвы")
.setDirectoryFilter(filter) // фильтрация по времени работы
.setSortingType(sdk.SortingType.byRating) // сортировка по рейтингу
.setPageSize(10) // максимум 10 объектов на странице результатов
.build(); -
Найти все парковки в радиусе 1 км с сортировкой по удалённости:
import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;
final searchQuery = sdk.SearchQueryBuilder
.fromQueryText('Парковки')
.setAllowedResultTypes([sdk.ObjectType.parking]) // только парковки
.setGeoPoint(const sdk.GeoPoint(latitude: sdk.Latitude(59.936), longitude: sdk.Longitude(30.351))) // центр поиска
.setRadius(const sdk.Meter(1000)) // радиус поиска
.setSortingType(sdk.SortingType.byDistance) // сортировка по удалённости
.build(); -
Найти все населённые пункты (города, деревни, посёлки и т.д.) внутри полигона:
import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;
// Создаём область поиска в виде полигона
final polygon = [
const sdk.GeoPoint(
latitude: sdk.Latitude(55.751244),
longitude: sdk.Longitude(37.618423),
),
const sdk.GeoPoint(
latitude: sdk.Latitude(55.751244),
longitude: sdk.Longitude(37.618423),
),
const sdk.GeoPoint(
latitude: sdk.Latitude(55.751244),
longitude: sdk.Longitude(37.618423),
),
const sdk.GeoPoint(
latitude: sdk.Latitude(55.751244),
longitude: sdk.Longitude(37.618423),
),
];
final searchQuery = sdk.SearchQueryBuilder.fromQueryText('название города')
.setAllowedResultTypes([
sdk.ObjectType.admDivCity,
sdk.ObjectType.admDivSettlement,
]) // только города и мелкие населённые пункты
.setSpatialRestriction(polygon) // область поиска
.build(); -
Найти все объекты, которые оказывают услуги печати документов, в области интереса:
import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;
// Создаём прямоугольную область интереса по координатам двух углов
const areaOfInterest = sdk.GeoRect(
southWestPoint: sdk.GeoPoint(
latitude: sdk.Latitude(59.931),
longitude: sdk.Longitude(30.344),
), // юго-западный угол
northEastPoint: sdk.GeoPoint(
latitude: sdk.Latitude(59.936),
longitude: sdk.Longitude(30.351),
), // северо-восточный угол
);
final searchQuery =
sdk.SearchQueryBuilder.fromQueryText('печать документов')
.setAreaOfInterest(areaOfInterest)
.build(); -
Найти все компании по адресу «Новосибирск, площадь Карла Маркса, 7»:
import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;
final searchQuery = sdk.SearchQueryBuilder
.fromQueryText('Новосибирск, площадь Карла Маркса, 7')
.setAllowedResultTypes([sdk.ObjectType.branch]) // только компании
.setPageSize(10) // максимум 10 объектов на странице результатов
.build(); -
Найти все филиалы компании по известному идентификатору:
import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;
const id = 4504136498310300;
final searchQuery = sdk.SearchQueryBuilder
.fromOrgId(const sdk.OrgId(id))
.build(); -
Найти конкретный объект по известному идентификатору:
import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;
const id = 70000001035164789;
searchManager.searchById('id');