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

Справочник

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

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

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

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

Для поиска объектов в справочнике создайте объект 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(). Укажите ограничение области поиска в форме полигона с помощью метода setSpatialRestriction():

import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;

final SearchQuery searchQuery = searchManager.search(sdk.SearchQueryBuilder.fromQueryText(query)).setPageSize(15).build();

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

final geoRect = 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 searchQuery = searchManager.search(sdk.SearchQueryBuilder.fromQueryText(query)).setPageSize(15).setAreaOfInterest(geoRect).build();

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

final SearchQuery searchQuery = searchManager
    .search(sdk.SearchQueryBuilder.fromQueryText(query))
    .setPageSize(15)
    .setGeoPoint(sdk.GeoPoint(
        latitude: sdk.Latitude(12.12), longitude: sdk.Longitude(12.12)))
    .build();

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

final SearchQuery searchQuery = searchManager
    .search(sdk.SearchQueryBuilder.fromQueryText(query))
    .setPageSize(15)
    .setRadius(sdk.Meter(1000))
    .setGeoPoint(sdk.GeoPoint(
        latitude: sdk.Latitude(12.12), longitude: sdk.Longitude(12.12)))
    .build();

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

final SearchQuery searchQuery = searchManager
    .search(sdk.SearchQueryBuilder.fromQueryText(query))
    .setPageSize(15)
    .setAllowedResultTypes([
        sdk.ObjectType.admDivCity,
        sdk.ObjectType.admDivCountry,
        sdk.ObjectType.admDivRegion
      ])
    .build();

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

import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;

searchManager.searchByDirectoryObjectId(objectId);

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

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

final SearchResult result = await widget._searchManager.search(query).value;

final Page? searchPage = result.firstPage;

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

import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;

final Page? nextPage = await searchPage?.fetchNextPage()?.value;

Вы можете формировать подсказки при текстовом поиске объектов (см. Suggest API). Для этого создайте объект SuggestQuery с помощью SuggestQueryBuilder и передайте его в метод suggest():

import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;

final SuggestQuery suggestQuery = sdk.SuggestQueryBuilder.fromQueryText(query).build();

final SuggestQuery = await searchManager.suggest(suggestQuery).value;

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

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

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

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

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

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

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

import 'package:dgis_mobile_sdk_map/dgis.dart' as sdk;

sdk.GeoPoint? getMarkerPosition(sdk.DirectoryObject directoryObject) {
  final int entranceId = directoryObject.id?.entranceId ?? 0;
  if (entranceId != 0) {
    return directoryObject.entrances
            .firstWhere((entrance) => entrance.id.entranceId == entranceId)
            .geometry
            ?.entrancePoints
            .firstOrNull ??
        directoryObject.markerPosition?.point;
  }
  return null;
}