В этом руководстве подробно рассматриваются веб-компоненты 3D-карт и особенности их интеграции с вашим приложением.

Вопросы производительности
Для обеспечения плавной и отзывчивой работы интерактивных и визуальных элементов рассмотрите следующие подходы.
Загрузить карту
Первоначальная загрузка и настройка отрисовки 3D-карт сочетают в себе методы конфигурации браузера и лучшие практики пользовательского интерфейса для обеспечения оптимального взаимодействия с пользователем.
- Загрузка API : Используйте асинхронную динамическую загрузку 3D-карт для загрузки JavaScript API карт при первоначальной загрузке страницы.
- Библиотеки : Загружайте библиотеки программно там, где это необходимо, например, с помощью
google.maps.importLibrary("maps3d"). В качестве альтернативы, если вы используете веб-компоненты, такие как<gmp-map-3d>, непосредственно на вашей HTML-странице с прямой загрузкой скриптов , библиотеки будут загружаться автоматически в соответствующее время. - Управление функциями базовой карты: используйте пользовательский mapId для фильтрации точек интереса на базовой карте (гибридный режим) и управления их плотностью, особенно если приложение имеет собственный набор пользовательских элементов, таких как маркеры или полилинии. Это предотвращает визуальный беспорядок и потенциальное наложение. В качестве альтернативы вы можете отключить такие функции векторных тайлов базовой карты, как точки интереса, полилинии дорог, названия дорог, названия улиц (спутниковый режим).
- События : Отслеживайте события gmp-steadystate или gmp-error , чтобы построить последующую логику, например, загрузку маркеров или анимацию камеры.

Взаимодействие с пользователем: Дождитесь события gmp-steadystate, прежде чем вносить изменения в содержимое карты. Если пользователь начинает взаимодействовать с картой (панорамировать, масштабировать) до первоначального события gmp-steadystate, то событие сработает только после того, как пользователь прекратит взаимодействие. Избегайте отображения или обновления наложенного контента (например, маркеров или полигонов) во время панорамирования или масштабирования карты пользователем; избегайте отображения или обновления наложенного контента (например, маркеров или полигонов), отслеживая события gmp-centerchange , gmp-headingchange , gmp-rangechange, gmp-rollchange, gmp-tiltchange .
Используйте
requestAnimationFrame()(rAF) для непрерывного обновления и строго разделяйте ресурсоемкие вычисления и вызовы отрисовки.- Используйте rAF: синхронизирует обновления с частотой обновления экрана браузера для плавной анимации с частотой 60 кадров в секунду и снижения энергопотребления.
- Избегайте интенсивной работы с рисованием: не выполняйте ресурсоемкие задачи, не связанные с рисованием, во время финального обновления.
- Разделение логики: Выполняйте всю ресурсоемкую логику перед минимальными вызовами обновления веб-компонента в цикле rAF.
Начальные настройки сцены :
<gmp-map-3d>Настройки камеры, такие как наклон, повлияют на скорость загрузки. Чем сильнее масштаб или наклон сцены, тем более детализированные полигоны будут отображаться и потребуют загрузки. Уровень детализации также будет зависеть от местоположения (например, город с множеством зданий или сельская местность только с природными особенностями).Визуализация прелоадера : Хотя
<gmp-map-3d>загружается очень быстро, для пользователей с устройствами низкой производительности (слабый графический процессор) или низкой пропускной способностью (медленный 4G) отображение в полном разрешении может занять некоторое время. В этом случае вы можете создать прелоадер с изображением, анимацией или текстом, при этом 3D-сцена будет загружаться в фоновом режиме. См. ключевые события для использования ниже:

// create the map in the background and wait for gmp-steadystate event async function initMap() { await google.maps.importLibrary("maps3d"); const map = document.querySelector('gmp-map-3d'); const div = document.querySelector('div'); // preloader " map.addEventListener('gmp-steadystate', ({isSteady}) => { if (isSteady) { div.style.display = 'none'; } }); } initMap();
- Двумерная карта:
- Альтернативная двухмерная карта ( спутниковая ) может быть предоставлена этим пользователям, при этом сохраняя ваши географические данные, такие как маркеры.

- В качестве альтернативы, для визуализации заданного места во время загрузки может отображаться дополнительная статическая двухмерная карта в спутниковом режиме.
Производительность и управление визуальными элементами
3D-карты предлагают несколько способов отображения визуальных элементов, таких как маркеры, полилинии и 3D-модели, с оптимальной производительностью и минимальным временем рендеринга, даже для больших объемов визуализации.
Маркеры

- Оптимальный вариант персонализации :
- PinElement: Для базовых изменений маркеров (цвет, масштаб, рамка, текстовый глиф) используйте элемент
<gmp-pin>или классPinElement. Это наиболее производительный метод настройки. - Используйте маркеры HTMLImageElement или SVGElement с осторожностью: используйте их для более гибкой настройки, например, для добавления прозрачности или внедрения изображения, такого как значок, в SVGElement (требуется кодирование base64 ). Они будут растрированы при загрузке и приведут к снижению производительности. HTMLImageElement и SVGElement необходимо обернуть в элемент
<template>перед присвоением значения слоту по умолчанию Marker3DElement. - В настоящее время добавление обычного HTML или CSS недоступно.
- PinElement: Для базовых изменений маркеров (цвет, масштаб, рамка, текстовый глиф) используйте элемент
- Управление поведением при столкновениях : Воспользуйтесь свойством collisionBehavior маркера. Для важных маркеров, которые всегда должны быть видимы, настройте поведение соответствующим образом. Для менее важных маркеров разрешите им скрываться, чтобы карта выглядела чище и менее загроможденной, особенно при высоком уровне масштабирования.
- Только для критически важных точек интереса : используйте drawsWhenOccluded (или установите это свойство программно) только для маркеров, которые обязательно должны быть видны сквозь здания или местность (например, цель для спасательной операции, подземная линия электропередач или аватар пользователя).
- Проверка на окклюзию: Поскольку карта трехмерная, маркеры могут быть визуально скрыты (затенены) зданиями или рельефом местности. Протестируйте различные ракурсы камеры и высоту маркеров, чтобы убедиться, что важные точки интереса остаются видимыми, или реализуйте логику для корректировки видимости и высоты при окклюзии.
- Учитывайте высоту: на 3D-картах маркеры должны использовать положение со значением высоты. Для маркеров, связанных с рельефом местности или зданиями, используйте параметры altitudeMode: 'RELATIVE_TO_GROUND', 'RELATIVE_TO_MESH' или аналогичные, чтобы обеспечить правильную привязку маркера при наклоне или повороте карты.
Многоугольники и ломаные линии

- Упрощение геометрии : Перед рендерингом примените алгоритм упрощения к данным пути. Это уменьшит количество вершин, сохраняя при этом общую форму, что значительно повысит скорость рендеринга, особенно для сложных границ или маршрутов.
- Уменьшение детализации в зависимости от уровня масштабирования : Для очень больших наборов данных рекомендуется загружать геометрию с более высокой детализацией только тогда, когда пользователь увеличивает масштаб области. При низком уровне масштабирования достаточно лишь сильно упрощенной версии полилинии или многоугольника.
- Предварительный расчет для экструдированных полигонов : если ваши полигоны экструдированы (
extruded: true), данные пути определяют трехмерный объем (сетку). Обработка сложных полигонов с большим количеством вершин требует значительных вычислительных ресурсов. Убедитесь, что исходные данные для ваших полигонов максимально просты. - Проверьте производительность полилиний и полигонов: при добавлении многочисленных или сложных полилиний/полигонов, особенно при их выдавливании для 3D-моделирования, убедитесь, что это не приводит к падению частоты кадров. Ограничьте количество вершин или используйте алгоритмы упрощения, если это необходимо.
- При обновлении фигуры изменяйте весь массив путей за одну операцию, а не циклически изменяйте отдельные элементы. Одна операция присваивания (например, polyline.path = newPathArray;) гораздо эффективнее, чем многократные итеративные обновления.
- По возможности избегайте выдавливаемых полилиний : хотя полилинии могут использовать значение высоты для размещения в трехмерном пространстве, выдавливание полилинии (например, задавание ей толщины и большого диапазона высот) может быть ресурсоемким с точки зрения графики. По возможности используйте двумерные полилинии на земле (относительно земли) или с минимальной толщиной линии для повышения производительности.
- Используйте drawsOccludedSegments только для критически важных элементов маршрутизации. Для фоновых или контекстных фигур разрешите им естественное перекрытие трехмерной геометрией карты. Отображение некритичной скрытой геометрии добавляет ненужную сложность рендеринга.
3D-модели
В программе <gmp-map-3d> рендеринг 3D-моделей в формате .glb и интерактивность, например, обработка события gmp-click, выполняются очень быстро.

- Минимизация размера файлов с помощью сжатия : для обеспечения быстрой загрузки, особенно в мобильных сетях, размер сложных файлов моделей .glb не должен превышать 5 МБ (в идеале — меньше). Основной способ достижения этой цели — применение сжатия Draco к данным сетки в ваших файлах .glb, что может значительно уменьшить размер файла (часто более чем на 50%) с минимальной потерей визуального качества.
- Центрирование начала координат модели: Убедитесь, что программное обеспечение для 3D-моделирования экспортирует модель с центром в точке (0, 0, 0) относительно основания модели. Это упрощает позиционирование и вращение на карте, обеспечивая правильную привязку модели к координатам широты и долготы.
- Управление CORS : Если файлы вашей модели размещены на другом домене или CDN, чем ваше веб-приложение, необходимо настроить хостинг-сервер для включения необходимых заголовков Cross-Origin Resource Sharing (CORS) (например, Access-Control-Allow-Origin: *). В противном случае карта не сможет загрузить модель.