Spec-Zone.ru › MapLibre GL JS

Введение

MapLibre GL JS — это библиотека TypeScript, которая использует WebGL для отображения интерактивных карт на основе векторных тайлов в браузере. Внешний вид карты задаётся документом стиля, структура и свойства которого определены в спецификации стилей MapLibre. Библиотека входит в экосистему MapLibre; для Android, iOS и других платформ существует аналог под названием MapLibre Native.

Быстрый старт

<link rel="stylesheet" href="https://unpkg.com/maplibre-gl@^6.9.0/dist/maplibre-gl.css" />
<div id="map" style="height: 400px"></div>
<script type="module">
    import * as maplibregl from 'https://unpkg.com/maplibre-gl@^6.9.0/dist/maplibre-gl.mjs';

    const map = new maplibregl.Map({
        container: 'map', // container id
        style: 'https://demotiles.maplibre.org/globe.json', // style URL
        center: [0, 0], // starting position [lng, lat]
        zoom: 2 // starting zoom
    });
</script>

Как читать эту документацию

Документация разделена на несколько разделов:

  • Основное — в основном разделе описаны следующие классы
    • Map — объект карты на вашей странице. Он предоставляет доступ к методам и свойствам для взаимодействия со стилем и слоями карты, обработки событий и управления перспективой с помощью камеры.
    • Global Functions позволяют задавать глобальные свойства и параметры, к которым может понадобиться доступ при инициализации карты или получении информации о её состоянии.
  • Маркеры и элементы управления — в этом разделе описаны элементы пользовательского интерфейса, которые можно добавить на карту. Элементы этого раздела находятся за пределами элемента canvas карты. К ним относятся Marker, Popup и все элементы управления.
  • География и геометрия — в этом разделе собраны общие утилиты и типы, предназначенные для работы с географической информацией и геометрическими объектами и их обработки.
  • Обработчики взаимодействия с пользователем — элементы этого раздела отвечают за реакцию карты на действия пользователя.
  • Источники — в этом разделе описаны типы источников, поддерживаемые MapLibre GL JS, помимо описанных в спецификации стилей MapLibre.
  • События — в этом разделе описаны различные типы событий, которые может генерировать MapLibre GL JS.

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

В примерах используются векторные тайлы из нашего репозитория демонстрационных тайлов и от MapTiler. Если вы хотите использовать данные MapTiler в своём проекте, получите собственный ключ API.

npm

Установите пакет MapLibre GL JS с помощью npm.

npm install maplibre-gl

Затем вы можете импортировать модуль MapLibre GL JS в свой проект.

<div id="map"></div>
import {Map} from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';

const map = new Map({
    container: 'map', // container id
    style: 'https://demotiles.maplibre.org/globe.json', // style URL
    center: [0, 0], // starting position [lng, lat]
    zoom: 1 // starting zoom
});

Инструкции по настройке URL-адреса воркера с помощью сборщика приведены ниже в разделе ESM.

ESM

MapLibre GL JS версии 6 распространяется только в виде ES-модулей (maplibre-gl.mjs). Поле "module" в package.json указывает на пакет ESM, поэтому сборщики обнаруживают его автоматически.

Минимальные запускаемые приложения для разных сборщиков (Vite, webpack, esbuild, Rollup, Turbopack) см. в test/integration/bundler/.

Обновляетесь с версии 5? См. руководство по миграции с версии 5 на версию 6.

Установка

Выберите свой вариант настройки:

Используйте запрос ?worker&url в Vite, чтобы получить URL-адрес упакованного автономного воркера:

import {Map, setWorkerUrl} from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';
import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url';

setWorkerUrl(workerUrl);

const map = new Map({/* … */});

Используйте ?worker&url вместо обычного ?url: воркер из dist импортирует соседний файл maplibre-gl-shared.mjs, а ?url в производственных сборках копирует файл воркера без изменений, не добавляя этот соседний файл — из-за этого при первом импорте воркер завершится с ошибкой, и векторные тайлы не загрузятся. ?worker&url пропускает файл через конвейер обработки воркеров Vite, создавая автономный фрагмент. В режиме разработки работают оба варианта.

Если при сборке используется SSR (TanStack Start, Astro и т. д.) и Vite разрешает точку входа CommonJS на сервере, также добавьте:

export default defineConfig({
    ssr: {noExternal: ['maplibre-gl']}
});
import {Map, setWorkerUrl} from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';

setWorkerUrl(new URL('maplibre-gl/dist/maplibre-gl-worker.mjs', import.meta.url).toString());

const map = new Map({/* … */});

В rspack и rsbuild используется тот же подход.

Next.js — исключение, в том числе в режиме next build --webpack. См. вкладку Turbopack.

import * as esbuild from 'esbuild';
import {copyFileSync} from 'fs';

await esbuild.build({
    entryPoints: ['src/main.ts'],
    bundle: true,
    outdir: 'dist',
    format: 'esm'
});

copyFileSync(
    'node_modules/maplibre-gl/dist/maplibre-gl-worker.mjs',
    'dist/maplibre-gl-worker.mjs'
);
import {Map, setWorkerUrl} from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';

setWorkerUrl(new URL('./maplibre-gl-worker.mjs', import.meta.url).toString());

const map = new Map({/* … */});
import copy from 'rollup-plugin-copy';

export default {
    plugins: [
        copy({
            targets: [
                {src: 'node_modules/maplibre-gl/dist/maplibre-gl-worker.mjs', dest: 'dist'}
            ]
        }),
        /* ... */
    ]
};
import {Map, setWorkerUrl} from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';

setWorkerUrl(new URL('./maplibre-gl-worker.mjs', import.meta.url).toString());

const map = new Map({/* … */});

Turbopack используется в качестве сборщика по умолчанию в Next.js, где вы, скорее всего, с ним и столкнётесь, поэтому приведённые ниже инструкции по настройке предназначены для приложения Next.js.

Turbopack преобразует new URL('maplibre-gl/dist/maplibre-gl-worker.mjs', import.meta.url) в ресурс с хешированным именем, но не помещает рядом с ним соседний файл воркера maplibre-gl-shared.mjs. При первом импорте воркер завершится с ошибкой, и карта отобразится, но не запросит ни одного тайла. Вместо этого разместите оба файла в public/ и укажите воркер в setWorkerUrl:

import {copyFileSync, mkdirSync} from 'node:fs';
import {createRequire} from 'node:module';
import path from 'node:path';

const dist = path.join(path.dirname(createRequire(import.meta.url).resolve('maplibre-gl/package.json')), 'dist');
const dest = path.join(process.cwd(), 'public', 'maplibre');

mkdirSync(dest, {recursive: true});
for (const file of ['maplibre-gl-worker.mjs', 'maplibre-gl-shared.mjs']) {
    copyFileSync(path.join(dist, file), path.join(dest, file));
}
{
    "scripts": {
        "prebuild": "node ./scripts/copy-maplibre-worker.mjs",
        "predev": "node ./scripts/copy-maplibre-worker.mjs"
    }
}
'use client';

import {Map, setWorkerUrl} from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';

setWorkerUrl('/maplibre/maplibre-gl-worker.mjs');

const map = new Map({/* … */});

Скрипт копирует оба файла, а не только воркер. Это необходимо, поскольку воркер импортирует maplibre-gl-shared.mjs по относительному пути, поэтому оба файла должны находиться в одном каталоге.

Копирование выполняется во время сборки из node_modules, поэтому используемая версия всегда соответствует установленной. Префиксы жизненного цикла npm соответствуют точному имени скрипта, поэтому prebuild и predev выполняются перед build и dev, но не перед пользовательским скриптом, например build:local. При необходимости добавьте для таких скриптов соответствующий хук pre. Одного postinstall недостаточно, поскольку менеджеры пакетов пропускают скрипты жизненного цикла, если во время установки ничего не требуется делать, а --ignore-scripts полностью их пропускает.

Это необходимо для обоих режимов сборщика Next.js: next build (Turbopack) и next build --webpack, поскольку описанная выше обработка ресурсов выполняется средствами Next.js, а не только Turbopack.

Загрузите MapLibre напрямую с UNPKG в виде ES-модуля с помощью тега <script type="module">. Инструкции по выбору конкретных версий и диапазонов semver см. на сайте unpkg.com.

<link rel="stylesheet" href="https://unpkg.com/maplibre-gl@^6.9.0/dist/maplibre-gl.css" />
<div id="map" style="height: 400px"></div>
<script type="module">
    import * as maplibregl from 'https://unpkg.com/maplibre-gl@^6.9.0/dist/maplibre-gl.mjs';

    const map = new maplibregl.Map({
        container: 'map',
        style: 'https://demotiles.maplibre.org/style.json',
        center: [0, 0],
        zoom: 1
    });
</script>

Воркер автоматически определяется по URL-адресу импортированного модуля и загружается через Blob URL того же источника, поэтому загрузка с CDN другого источника работает без дополнительной настройки.

Если строгая политика CSP запрещает blob: в worker-src, явно укажите URL-адрес воркера, размещённого на том же источнике:

maplibregl.setWorkerUrl('/path/to/maplibre-gl-worker.mjs');

Рабочий пример см. в разделе Отображение карты.

Директивы CSP

Для защиты от межсайтового скриптинга и других видов уязвимостей веб-безопасности можно использовать политику безопасности содержимого (CSP), чтобы задать политики безопасности для своего сайта. В этом случае MapLibre GL JS требуются следующие директивы CSP:

worker-src 'self' ;
img-src data: blob: 'self' ;

CSS MapLibre

CSS, упомянутый в разделе «Быстрый старт», используется для оформления DOM-элементов, создаваемых кодом MapLibre. Без этого CSS такие элементы, как всплывающие окна и маркеры, работать не будут.

Самый простой способ подключить CSS — добавить <link> в заголовок документа и загрузить файл через CDN UNPKG. Однако CSS также входит в пакет модуля MapLibre, поэтому, если ваш сборщик умеет обрабатывать CSS, его можно импортировать из maplibre-gl/dist/maplibre-gl.css.

Обратите также внимание: если CSS недоступен при первой отрисовке, DOM-элементы, зависящие от него, должны восстановить работу, как только CSS станет доступен.

© MapLibre contributors
Licensed under the 3-Clause BSD License.
https://maplibre.org/maplibre-gl-js/docs/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API