Перейти к основному содержимому

Карта

Создание карты

Чтобы создать карту, создайте MapControllerOptions, получите состояние контроллера с помощью метода useMapController() и передайте его в MapView.

import React, { useEffect, useMemo } from 'react';
import { StyleSheet } from 'react-native';
import {
Bearing,
CameraPosition,
DGis,
GeoPoint,
Latitude,
Longitude,
MapControllerOptions,
MapView,
Tilt,
useMapController,
Zoom,
} from '@2gis/dgis-mobile-sdk-full';

function point(latitude: number, longitude: number) {
return new GeoPoint({
latitude: new Latitude({ value: latitude }),
longitude: new Longitude({ value: longitude }),
});
}

export function MapScreen() {
const context = useMemo(() => DGis.createContext(), []);
const options = useMemo(
() =>
new MapControllerOptions({
position: new CameraPosition({
point: point(55.7522, 37.6156),
zoom: new Zoom({ value: 14 }),
tilt: new Tilt({ value: 0 }),
bearing: new Bearing({ value: 0 }),
}),
}),
[],
);
const controllerState = useMapController(context, options);
const mapController =
controllerState.status === 'ready' ? controllerState.controller : null;

useEffect(() => {
if (mapController === null) {
return;
}

return () => {
mapController.destroy();
};
}, [mapController]);

useEffect(() => {
return () => DGis.releaseContext(context);
}, [context]);

return <MapView controllerState={controllerState} style={styles.map} />;
}

const styles = StyleSheet.create({
map: { flex: 1 },
});

Источники данных для карты

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

Типы источников данных: движущиеся маркеры, маршруты с отображением текущей загруженности дорог, произвольные геометрические фигуры и т. д. Для каждого типа данных существует свой класс. Список активных источников данных можно получить, используя свойство Map.sources.

Источники данных можно передать в MapControllerOptions при создании карты или добавить позже через map.addSource().

import {
DgisSource,
DgisSourceWorkingMode,
MapControllerOptions,
} from '@2gis/dgis-mobile-sdk-full';

const source = DgisSource.createDgisSource(
context,
DgisSourceWorkingMode.Online,
);

const options = new MapControllerOptions({
sources: [source],
});

Для реалистичных данных используйте метод DgisSource.createImmersiveDgisSource():

const immersiveSource = DgisSource.createImmersiveDgisSource(context);
map.addSource(immersiveSource);

Добавление объектов

Для добавления динамических объектов на карту (маркеров, линий, кругов, многоугольников) нужно создать менеджер объектов (MapObjectManager), указав объект карты. При удалении менеджера объектов удаляются все связанные с ним объекты на карте. Менеджер можно создать для слоя динамических объектов из стиля или передать null, чтобы разместить объекты поверх остальных слоёв.

import { MapObjectManager, type Map } from '@2gis/dgis-mobile-sdk-full';

const manager = new MapObjectManager(map, null);

Для добавления объектов используются методы addObject() и addObjects(). Для каждого динамического объекта можно указать поле userData, которое будет хранить произвольные данные, связанные с объектом. Настройки объектов можно менять после их создания.

Для удаления объектов используются методы removeObject() и removeObjects(). Чтобы удалить все объекты, можно использовать метод removeAll().

Сохранение объектов на карте

MapObjectManager — это контейнер объектов. Пока объекты нужны на карте, MapObjectManager необходимо сохранять на уровне класса.

Маркер

Чтобы добавить маркер на карту, нужно создать объект Marker, указав нужные настройки в MarkerOptions, и передать его в вызов addObject() менеджера объектов.

Единственный обязательный параметр — координаты маркера (position).

import {
GeoPointWithElevation,
Latitude,
LogicalPixel,
Longitude,
Marker,
MarkerOptions,
TextStyle,
} from '@2gis/dgis-mobile-sdk-full';

const marker = new Marker(
new MarkerOptions({
position: new GeoPointWithElevation({
latitude: new Latitude({ value: 55.7522 }),
longitude: new Longitude({ value: 37.6156 }),
}),
text: 'Офис',
textStyle: new TextStyle({ fontSize: new LogicalPixel({ value: 14 }) }),
}),
);

manager.addObject(marker);

Чтобы создать иконку маркера, нужно указать объект Image в качестве параметра icon. Создать Image можно с помощью основных функций:

Полный список функций см. в описании объекта ImageLoader.

Например, чтобы создать маркер с SVG-иконкой:

import {
GeoPointWithElevation,
ImageLoader,
Latitude,
Longitude,
Marker,
MarkerOptions,
} from '@2gis/dgis-mobile-sdk-full';

const imageLoader = new ImageLoader(context);
const icon = await imageLoader.loadSVGFromAsset('assets/icons/bridge.svg');

const marker = new Marker(
new MarkerOptions({
position: new GeoPointWithElevation({
latitude: new Latitude({ value: 55.7522 }),
longitude: new Longitude({ value: 37.6156 }),
}),
icon,
}),
);

Линия

Чтобы нарисовать на карте линию (полилинию), создайте объект Polyline, укажите настройки линии в PolylineOptions и передайте объект в метод addObject() менеджера объектов.

Вы можете указать координаты вершин линии и настроить её ширину, цвет и другие параметры.

import {
Color,
LogicalPixel,
Polyline,
PolylineOptions,
} from '@2gis/dgis-mobile-sdk-full';

const polyline = new Polyline(
new PolylineOptions({
points: [
point(55.7522, 37.6156),
point(55.758, 37.62),
point(55.764, 37.61),
],
width: new LogicalPixel({ value: 4 }),
color: new Color({ argb: 0xff1e88e5 }),
}),
);

manager.addObject(polyline);

Многоугольник

Чтобы нарисовать на карте многоугольник, нужно создать объект Polygon, указав нужные настройки в PolygonOptions, и передать его в вызов addObject() менеджера объектов.

Координаты для многоугольника указываются в виде двумерного списка. Первый вложенный список должен содержать координаты основных вершин многоугольника. Остальные вложенные списки не обязательны и могут быть заданы для того, чтобы создать вырез внутри многоугольника (один дополнительный список — один вырез в виде многоугольника).

import {
Color,
LogicalPixel,
Polygon,
PolygonOptions,
} from '@2gis/dgis-mobile-sdk-full';

const polygon = new Polygon(
new PolygonOptions({
contours: [[
point(55.751, 37.61),
point(55.755, 37.619),
point(55.748, 37.622),
]],
color: new Color({ argb: 0x5538bdf8 }),
strokeWidth: new LogicalPixel({ value: 2 }),
strokeColor: new Color({ argb: 0xff0284c7 }),
}),
);

manager.addObject(polygon);

Окружность

Чтобы нарисовать на карте окружность, создайте объект Circle, указав нужные настройки в CircleOptions, и передайте его в метод addObject() менеджера объектов:

import {
Circle,
CircleOptions,
Color,
LogicalPixel,
Meter,
} from '@2gis/dgis-mobile-sdk-full';

const circle = new Circle(
new CircleOptions({
position: point(55.7522, 37.6156),
radius: new Meter({ value: 150 }),
color: new Color({ argb: 0x44f97316 }),
strokeWidth: new LogicalPixel({ value: 2 }),
strokeColor: new Color({ argb: 0xffea580c }),
}),
);

manager.addObject(circle);

3D-модели

Требования и рекомендации

Для оптимальной производительности карты и корректного отображения трёхмерных моделей на карте следуйте требованиям и рекомендациям.

Обязательные требования:

  • Формат: glTF/GLB (файлы .gltf, .glb).

  • Меш: желательно, чтобы модель содержала один меш (геометрический объект на сцене). Использование моделей с несколькими мешами снижает производительность карты.

  • Текстура:

    • Меш может иметь текстуру или одноцветную заливку.
    • Разрешение текстуры должно быть кратно степени двойки (2, 4, 8, 16, 32, 64, 128 и 256). Текстуры высокого разрешения снижают производительность карты.
    • Поддерживаются форматы изображений .png, .jpg и .bmp.
    • Не поддерживается сжатие текстур.
  • Инстанцирование: расширения для инстанцирования не поддерживаются.


Рекомендации по использованию и производительности:

  • Размер: оптимальный размер уникальных моделей — не более 10 000 вершин; типовых моделей (например, деревьев) — от 200 до 2000 вершин.
  • Текстура: оптимальный размер текстур для уникальных моделей — 256×256; для типовых моделей — 64×64.
  • Цвета: если вы не настраиваете собственные стили карты, а просто загружаете модели, рекомендуется, чтобы цвета текстуры моделей сочетались с цветами карты 2ГИС.
  • Сжатие: рекомендуется использовать алгоритм Draco для сжатия моделей.
  • Матричные анимации: поддерживаются, но использование снижает производительность карты.
  • Модель освещения PBR: поддерживается, но использование снижает производительность карты.
  • Локальные трансформации: локальные трансформации (перемещения, вращения и масштабирования) поддерживаются, но снижают производительность карты.

Добавление моделей

Чтобы добавить на карту 3D-модель:

  1. Преобразуйте модель в объект ModelData, который будет использоваться в SDK, с помощью метода ModelLoader.loadFromAsset().

  2. Создайте объект ModelSize и укажите размер модели одним из способов:

    • Чтобы задать постоянный размер модели, который не будет изменяться при изменении масштаба карты, используйте метод logicalPixel() и укажите размер в логических пикселях.
    • Чтобы задать размер, который будет зависеть от масштаба карты (при отдалении модель будет становиться меньше и наоборот), используйте метод scale() и укажите коэффициент масштабирования модели ModelScale.
  3. Создайте объект ModelMapObject, указав нужные настройки в ModelMapObjectOptions, и передайте его в метод addObject() менеджера объектов.

import {
GeoPointWithElevation,
Latitude,
LogicalPixel,
Longitude,
ModelLoader,
ModelMapObject,
ModelMapObjectOptions,
ModelSize,
} from '@2gis/dgis-mobile-sdk-full';

const modelLoader = new ModelLoader(context);
const data = await modelLoader.loadFromAsset('map/model.glb');

const model = new ModelMapObject(
new ModelMapObjectOptions({
position: new GeoPointWithElevation({
latitude: new Latitude({ value: 55.7522 }),
longitude: new Longitude({ value: 37.6156 }),
}),
data,
size: ModelSize.logicalPixel(new LogicalPixel({ value: 80 })),
}),
);

manager.addObject(model);

Добавление нескольких объектов

Если на карту необходимо добавить коллекцию объектов, то добавление через метод addObject() в цикле по всей коллекции приведёт к потере производительности. Для добавления коллекции объектов нужно сначала подготовить всю коллекцию и добавить её через метод addObjects():

manager.addObjects([marker, polyline, polygon, circle]);
manager.removeObjects([polyline, polygon]);
manager.removeAll();

Кластеризация

Кластеризация — это визуальная группировка близко расположенных друг к другу объектов (маркеров) в один кластер при уменьшении масштаба карты. Группировка происходит постепенно: чем меньше масштаб карты, тем меньше кластеров. Кластер отображается как маркер с цифрой, соответствующей количеству объектов в кластере.

Чтобы добавить на карту маркеры в режиме кластеризации, создайте менеджер объектов (MapObjectManager) с помощью метода MapObjectManager.withClustering() и укажите следующие свойства:

  • Экземпляр карты (map).
  • Минимальное расстояние между маркерами в логических пикселях на уровнях масштабирования, при которых работает кластеризация (logicalPixel).
  • Уровень масштабирования, при котором и выше видны только отдельные маркеры, без кластеров (maxZoom).
  • Уровень масштабирования, при котором и ниже перестают формироваться новые кластеры (minZoom).
  • Пользовательскую реализацию протокола SimpleClusterRenderer, который используется для кастомизации кластеров в MapObjectManager.
import {
LogicalPixel,
MapObjectManager,
SimpleClusterOptions,
TextStyle,
Zoom,
type SimpleClusterObject,
type SimpleClusterRenderer,
} from '@2gis/dgis-mobile-sdk-full';

const clusterRenderer: SimpleClusterRenderer = {
renderCluster(cluster: SimpleClusterObject) {
return new SimpleClusterOptions({
icon: null,
text: String(cluster.objectCount),
textStyle: new TextStyle({ fontSize: new LogicalPixel({ value: 16 }) }),
});
},
};

const clusteredManager = MapObjectManager.withClustering(
map,
new LogicalPixel({ value: 80 }),
new Zoom({ value: 18 }),
clusterRenderer,
new Zoom({ value: 0 }),
null,
);

После создания менеджера объектов с кластеризацией вы можете добавлять маркеры обычными способами через addObject() или addObjects().

Генерализация

Генерализация — это визуальная группировка близко расположенных друг к другу объектов (маркеров) так, что при уменьшении масштаба карты вместо нескольких маркеров отображается один «ключевой». Группировка происходит постепенно: чем меньше масштаб карты, тем меньше групп.

Чтобы добавить на карту маркеры в режиме генерализации, создайте менеджер объектов (MapObjectManager) с помощью метода MapObjectManager.withGeneralization() и укажите следующие свойства:

  • Экземпляр карты (map).
  • Минимальное расстояние между маркерами в логических пикселях на уровнях масштабирования, при которых работает генерализация (logicalPixel).
  • Уровень масштабирования, при котором и выше видны только отдельные маркеры, без групп (maxZoom).
  • Уровень масштабирования, при котором и ниже перестают формироваться новые группы (minZoom).
const generalizedManager = MapObjectManager.withGeneralization(
map,
new LogicalPixel({ value: 80 }),
new Zoom({ value: 18 }),
new Zoom({ value: 0 }),
null,
);

После создания менеджера объектов с генерализацией вы можете добавлять маркеры обычными способами через addObject() или addObjects().

Изменение маркера геопозиции

Вы можете заменить стандартный маркер геопозиции на карте на пользовательскую 3D-модель. См. требования к загружаемым моделям в разделе 3D-модели.

Чтобы установить пользовательский маркер геопозиции:

  1. Создайте источник данных о геопозиции с помощью объекта MyLocationMapObjectSource и установите тип маркера Model в параметре markerType:
  2. Добавьте созданный источник на карту с помощью метода map.addSource().
import {
MyLocationControllerSettings,
MyLocationMapObjectMarkerType,
MyLocationMapObjectSource,
} from '@2gis/dgis-mobile-sdk-full';

const locationSource = new MyLocationMapObjectSource(
context,
new MyLocationControllerSettings({}),
MyLocationMapObjectMarkerType.Model,
);

map.addSource(locationSource);

Выделение объектов

Выделение объектов по нажатию на карту

  1. Получите информацию об объектах, попадающих в область нажатия, с помощью метода getRenderedObjects().
  2. Проверьте первый объект и вызовите метод setHighlighted(), который получает на вход список идентификаторов справочника изменяемых объектов DgisObjectId.
import {
DgisMapObject,
DgisSource,
ScreenDistance,
ScreenPoint,
} from '@2gis/dgis-mobile-sdk-full';

const connection = controller.gestureRecognizer.tap.subscribe(screenPoint => {
const future = map.getRenderedObjects(
new ScreenPoint({ x: screenPoint.x, y: screenPoint.y }),
new ScreenDistance({ value: 8 }),
);

future.onComplete(
objects => {
const info = objects[0];
const object = info?.item.item;
const source = info?.item.source;

if (object instanceof DgisMapObject && source instanceof DgisSource) {
source.setHighlighted([object.id], true);
}

future.destroy();
},
error => {
console.warn(error);
},
);
});

// Когда обработчик больше не нужен:
connection.disconnect();

Управление камерой

Для работы с камерой используется объект Camera, доступный через свойство map.camera.

Перелёт

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

  • position — конечная позиция камеры (координаты и уровень приближения). Дополнительно можно указать наклон и поворот камеры (CameraPosition).
  • time — продолжительность перелёта в секундах (Duration).
  • animationType — тип анимации (CameraAnimationType).

Функция moveToCameraPosition() возвращает объект Future, который можно использовать, чтобы обработать событие завершения перелёта.

import {
CameraAnimationType,
CameraPosition,
Duration,
Zoom,
} from '@2gis/dgis-mobile-sdk-full';

const future = map.camera.moveToCameraPosition(
new CameraPosition({
point: point(55.7522, 37.6156),
zoom: new Zoom({ value: 16 }),
}),
Duration.ofMilliseconds(600),
CameraAnimationType.Default,
);

future.onComplete(
() => future.destroy(),
error => {
console.warn(error);
},
);

Для более точного контроля над анимацией перелёта можно использовать контроллер перелёта, который будет определять позицию камеры в каждый конкретный момент времени. Для этого нужно реализовать интерфейс CameraMoveController и передать созданный объект в метод moveToCameraPosition() вместо параметров перелёта.

Получение состояния камеры

Текущее состояние камеры (находится ли камера в полёте) можно получить, используя свойство state. См. CameraState для списка возможных состояний камеры.

const cameraState = map.camera.state;

Получение позиции камеры

Текущую позицию камеры можно получить, используя свойство position (см. объект CameraPosition):

const cameraPosition = map.camera.position;

Расчёт позиции камеры

Чтобы отобразить на экране объект или группу объектов, используйте метод расчёта позиции камеры calcPositionForObjects() или calcPositionForGeometry():

import { calcPositionForObjects } from '@2gis/dgis-mobile-sdk-full';

const position = calcPositionForObjects(
map.camera,
[marker, polyline],
null,
null,
null,
null,
null,
);

map.camera.position = position;

Настройка точки позиции и обзора камеры

Вы можете управлять отображением карты на экране, например, менять размер области видимости карты, при этом сохраняя позицию обзора. Для этого используйте экранные точки: точку позиции камеры BaseCamera.positionPoint и точку обзора камеры BaseCamera.viewPoint.

Точка позиции камеры (BaseCamera.positionPoint) — точка экрана, к которой привязана камера, с учётом отступов BaseCamera.padding. Точка задаётся относительно области видимости карты:

import { CameraPositionPoint } from '@2gis/dgis-mobile-sdk-full';

map.camera.positionPoint = new CameraPositionPoint({ x: 0.5, y: 0.75 });

При изменении точки позиции камеры меняется область видимости карты и смещается точка наблюдения CameraPosition.point — точка на местности в географических координатах, которая находится в точке позиции камеры. Угол наклона CameraPosition.tilt и угол поворота камеры CameraPosition.bearing не меняются:


Точка обзора камеры (BaseCamera.viewPoint) — точка экрана, в которую направлен «взгляд» камеры. Точка задаётся относительно области видимости карты:

import { CameraViewPoint } from '@2gis/dgis-mobile-sdk-full';

map.camera.viewPoint = new CameraViewPoint({ x: 0.5, y: 0.5 });

При изменении точки обзора камеры меняется направление обзора относительно точки наблюдения. Точка наблюдения CameraPosition.point не смещается, также не меняется угол наклона CameraPosition.tilt и угол поворота камеры CameraPosition.bearing:

visibleArea и visibleRect

У камеры есть два свойства, которые описывают геометрию видимой области, но делают это по-разному. visibleRect имеет тип GeoRect и всегда является прямоугольником. visibleArea представляет собой произвольную геометрию. Проще всего увидеть на примере с разными углами наклона камеры относительно карты:

  • При наклоне 45° visibleRect и visibleArea не будут равны: visibleRect в данном случае будет больше, т.к. он должен быть прямоугольником и содержать в себе visibleArea.

    Синим цветом изображена visibleArea, красным — visibleRect.

  • При наклоне 0° visibleArea и visibleRect будут совпадать, как видно из изменения цвета.

Определение попадания объекта в видимую область камеры

С помощью свойства visibleArea можно получить область карты, которая попадает в камеру, в виде Geometry. С помощью метода intersects() можно получить пересечение видимой области камеры с нужной геометрией:

map.camera.visibleArea.intersects(geometry);

Поэтажные планы зданий

С помощью SDK вы можете отображать поэтажные планы зданий на карте и переключаться между этажами. Детальные поэтажные планы доступны только для определённых групп зданий (например, торговых центров). Чтобы начать работу, получите доступ к Places API и дополнительно к информации о поэтажных планах зданий. Подробнее см. в разделе Начало работы.

Основной объект для работы с поэтажными планами — класс IndoorManager, который доступен через свойство карты indoorManager.

Показ и скрытие поэтажных планов

Чтобы управлять отображением поэтажных планов, используйте метод setIndoorState() класса IndoorManager:

import { IndoorManagerState } from '@2gis/dgis-mobile-sdk-full';

// Показать поэтажные планы
map.indoorManager.setIndoorState(IndoorManagerState.Enabled);

// Скрыть поэтажные планы
map.indoorManager.setIndoorState(IndoorManagerState.Disabled);

Переключение между этажами

Чтобы получить информацию о поэтажных планах здания, которое в данный момент отображается на карте, используйте свойство focusedBuilding класса IndoorManager или подпишитесь на канал focusedBuildingChannel:

const connection = map.indoorManager.focusedBuildingChannel.subscribe(building => {
if (building !== null) {
console.log('Focused building:', building.id);
}
});

Чтобы переключаться между этажами, укажите индекс нужного этажа в свойстве activeLevelIndex объекта IndoorBuilding:

map.indoorManager.focusedBuilding.activeLevelIndex = 2;

Создание UI для управления этажами

Чтобы создать UI-элемент управления этажами, используйте готовый компонент IndoorControl:

import { IndoorControl } from '@2gis/dgis-mobile-sdk-full';

<IndoorControl map={map} showOverview />;

Выделение этажей

Для подсветки объектов на этажах используйте DgisSource.setHighlighted().

Пробки на карте

Чтобы отобразить слой пробок на карте, создайте источник данных TrafficSource и передайте его в метод карты addSource():

import { TrafficSource } from '@2gis/dgis-mobile-sdk-full';

const trafficSource = new TrafficSource(context);
map.addSource(trafficSource);

Дорожные события на карте

Вы можете настроить отображение на карте дорожных событий из данных 2ГИС, а также добавить собственные события.

Отображение событий на карте

Чтобы показать слой дорожных событий на карте, создайте источник данных RoadEventSource и добавьте его на карту с помощью метода карты addSource():

import { RoadEventSource } from '@2gis/dgis-mobile-sdk-full';

const roadEventSource = new RoadEventSource(context);
map.addSource(roadEventSource);

Чтобы удалить созданный источник данных и все связанные с ним объекты, вызовите метод карты removeSource():

map.removeSource(roadEventSource);

Добавление события

Вы можете добавить собственное дорожное событие на карту, которое смогут увидеть все пользователи карт 2ГИС. Вы можете разместить событие на карте только в радиусе 2 км от своего текущего местоположения.

  1. Создайте экземпляр менеджера объектов RoadEventManager.

  2. Добавьте событие одного из типов ниже (каждому типу соответствует своя иконка на карте):

    • ДТП. Вызовите метод createAccident() и укажите координаты события (GeoPoint), затронутые полосы движения (Lane) и текстовое описание события.
    • Камера ГИБДД. Вызовите метод createCamera() и укажите координаты события (GeoPoint) и текстовое описание.
    • Перекрытие дорожного движения. Вызовите метод createRoadRestriction() и укажите координаты события (GeoPoint) и текстовое описание:
    • Дорожные работы. Вызовите метод createRoadWorks() и укажите координаты события (GeoPoint), затронутые полосы движения (Lane) и текстовое описание события.
    • Комментарий. Вызовите метод createComment() и укажите координаты события (GeoPoint) и текстовое описание.
    • Другое событие. Вызовите метод createOther() и укажите координаты события (GeoPoint), затронутые полосы движения (Lane) и текстовое описание события.

Пример добавления дорожных работ:

import { EnumSet, Lane, RoadEventManager } from '@2gis/dgis-mobile-sdk-full';

const roadEventManager = RoadEventManager.instance(context);
const future = roadEventManager.createRoadWorks(
point(55.7522, 37.6156),
EnumSet.of(Lane),
'Ремонт дороги',
);

future.onComplete(
result => {
console.log('Road event created:', result);
future.destroy();
},
error => {
console.warn(error);
},
);

Получение объектов по экранным координатам

Информацию об объектах на карте можно получить, используя пиксельные координаты. Для этого нужно вызвать метод карты getRenderedObjects(), указав координаты в пикселях и радиус в экранных миллиметрах (не более 30). Метод вернет отложенный результат, содержащий информацию обо всех найденных объектах в указанном радиусе на видимой области карты (список List<RenderedObjectInfo>).

import { ScreenDistance, ScreenPoint } from '@2gis/dgis-mobile-sdk-full';

const future = map.getRenderedObjects(
new ScreenPoint({ x: 120, y: 240 }),
new ScreenDistance({ value: 12 }),
);

future.onComplete(
objects => {
console.log(objects[0]?.closestMapPoint);
future.destroy();
},
error => {
console.warn(error);
},
);

Работа с жестами управления картой

Вы можете кастомизировать работу с жестами управления картой через MapController.gestureRecognizer.

Из коробки управлять картой можно при помощи следующих жестов:

  • сдвиг карты в любом направлении одним пальцем;
  • сдвиг карты в любом направлении несколькими пальцами;
  • вращение карты двумя пальцами;
  • масштабирование карты двумя пальцами (щипок);
  • приближение карты двойным тапом;
  • отдаление карты тапом двумя пальцами;
  • масштабирование карты при помощи тап-тап-свайп жеста одним пальцем;
  • наклон камеры свайпом двумя пальцами вверх или вниз.

По умолчанию включены все жесты. При необходимости можно отключить какие-либо жесты при помощи GestureManager.

const tapConnection = controller.gestureRecognizer.tap.subscribe(point => {
console.log('Tap:', point.x, point.y);
});

const longTouchConnection = controller.gestureRecognizer.longTouch.subscribe(point => {
console.log('Long touch:', point.x, point.y);
});

Для жестов доступны методы:

  • enableGesture() — включение жестов;
  • disableGesture() — отключение жестов;
  • gestureEnabled() — проверка, включён или отключён жест.
import { TransformGesture } from '@2gis/dgis-mobile-sdk-full';

const gestureManager = controller.gestureRecognizer.gestureManager;

gestureManager?.disableGesture(TransformGesture.Rotation);
gestureManager?.enableGesture(TransformGesture.Scaling);

Для изменения настроек или получения информации о нескольких жестах за раз можно работать напрямую со свойством enabledGestures.

У некоторых жестов есть свой перечень настроек:

Подробнее о настройках можно прочитать на соответствующих страницах в документации. Объекты этих настроек доступны через свойства GestureManager.