Карта
Создание карты
Чтобы создать карту, создайте 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 можно с помощью основных функций:
- loadLottieFromAsset()
- loadLottieFromFile()
- loadPngFromAsset()
- loadPngFromFile()
- loadSVGFromAsset()
- loadSVGFromFile()
Полный список функций см. в описании объекта 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-модель:
-
Преобразуйте модель в объект ModelData, который будет использоваться в SDK, с помощью метода ModelLoader.loadFromAsset().
-
Создайте объект ModelSize и укажите размер модели одним из способов:
- Чтобы задать постоянный размер модели, который не будет изменяться при изменении масштаба карты, используйте метод
logicalPixel()и укажите размер в логических пикселях. - Чтобы задать размер, который будет зависеть от масштаба карты (при отдалении модель будет становиться меньше и наоборот), используйте метод
scale()и укажите коэффициент масштабирования модели ModelScale.
- Чтобы задать постоянный размер модели, который не будет изменяться при изменении масштаба карты, используйте метод
-
Создайте объект 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-модели.
Чтобы установить пользовательский маркер геопозиции:
- Создайте источник данных о геопозиции с помощью объекта MyLocationMapObjectSource и установите тип маркера
Modelв параметреmarkerType: - Добавьте созданный источник на карту с помощью метода
map.addSource().
import {
MyLocationControllerSettings,
MyLocationMapObjectMarkerType,
MyLocationMapObjectSource,
} from '@2gis/dgis-mobile-sdk-full';
const locationSource = new MyLocationMapObjectSource(
context,
new MyLocationControllerSettings({}),
MyLocationMapObjectMarkerType.Model,
);
map.addSource(locationSource);
Выделение объектов
Выделение объектов по нажатию на карту
- Получите информацию об объектах, попадающих в область нажатия, с помощью метода getRenderedObjects().
- Проверьте первый объект и вызовите метод 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 км от своего текущего местоположения.
-
Создайте экземпляр менеджера объектов RoadEventManager.
-
Добавьте событие одного из типов ниже (каждому типу соответствует своя иконка на карте):
- ДТП. Вызовите метод 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.
У некоторых жестов есть свой перечень настроек:
- MultiTouchRecognizeSettings для сдвига несколькими пальцами;
- RotationRecognizeSettings для вращения;
- ScalingRecognizeSettings для масштабирования;
- TiltRecognizeSettings для наклона.
Подробнее о настройках можно прочитать на соответствующих страницах в документации. Объекты этих настроек доступны через свойства GestureManager.