Tippecanoe

Работа с MapLibre GL JS практически всегда опирается на векторные тайлы формата MVT (Mapbox Vector Tile). Эти тайлы представляют собой компактное разбиение геоданных по сетке XYZ и позволяют клиенту отрисовывать карты на GPU с высокой производительностью.

Одним из ключевых инструментов подготовки таких данных является утилита Tippecanoe, предназначенная для преобразования GeoJSON в набор векторных тайлов или файл MBTiles.

Основная задача инструмента — преобразовать потенциально «тяжёлые» наборы геометрий в масштабируемую структуру, оптимизированную под разные уровни зума.


Принцип работы генерации тайлов

Tippecanoe строит иерархию представления данных:

  • исходные геометрии анализируются и упрощаются;
  • объекты распределяются по уровням зума;
  • выполняется обрезка по тайловой сетке;
  • создаются оптимизированные векторные фрагменты.

Ключевая идея заключается в том, что каждый уровень масштаба содержит разную детализацию данных, а не один универсальный набор.


Базовое преобразование GeoJSON

Типичный сценарий начинается с GeoJSON-файла:

tippecanoe -o tiles.mbtiles input.geojson

Результатом является файл MBTiles, содержащий все тайлы.

При этом автоматически применяются:

  • генерация уровней зума;
  • упрощение геометрии;
  • распределение объектов по тайлам;
  • упаковка в SQLite-контейнер.

Управление уровнями масштабирования

Одной из ключевых возможностей является контроль диапазона зумов:

tippecanoe \
  -o tiles.mbtiles \
  -Z 0 -z 14 \
  input.geojson

Параметры:

  • -Z — минимальный уровень зума;
  • -z — максимальный уровень зума.

Это напрямую влияет на:

  • детализацию объектов;
  • размер итогового набора;
  • скорость отрисовки в MapLibre GL JS.

Управление именами слоёв и структурой данных

GeoJSON может содержать различные типы объектов, но в MapLibre GL JS они отображаются как слои vector tile source.

Tippecanoe позволяет задавать слой:

tippecanoe -o tiles.mbtiles -l buildings input.geojson

В MapLibre это затем используется так:

map.addSource('buildings', {
  type: 'vector',
  url: 'mbtiles://tiles'
});

map.addLayer({
  id: 'buildings-fill',
  type: 'fill',
  source: 'buildings',
  'source-layer': 'buildings',
  paint: {
    'fill-color': '#888',
    'fill-opacity': 0.5
  }
});

Снижение детализации и упрощение геометрии

Одной из важнейших задач является контроль плотности данных.

Tippecanoe автоматически упрощает геометрию, но поведение можно регулировать:

tippecanoe \
  -o tiles.mbtiles \
  --drop-densest-as-needed \
  --extend-zooms-if-still-dropping \
  input.geojson

Механизмы:

  • drop-densest-as-needed — удаление наиболее плотных объектов при перегрузке тайла;
  • extend-zooms-if-still-dropping — увеличение диапазона зумов при нехватке места.

Это особенно важно для:

  • городских слоёв зданий;
  • дорожных сетей;
  • точечных данных высокой плотности.

Управление свойствами объектов

GeoJSON свойства автоматически переносятся в атрибуты тайлов. Однако можно управлять включением данных:

tippecanoe \
  -o tiles.mbtiles \
  --exclude=name \
  input.geojson

Или наоборот — ограничивать набор свойств:

tippecanoe \
  -o tiles.mbtiles \
  --attribute-type=population:integer \
  input.geojson

В MapLibre GL JS эти свойства используются напрямую в стилях:

paint: {
  'circle-radius': [
    'interpolate',
    ['linear'],
    ['get', 'population'],
    0, 2,
    1000000, 10
  ]
}

Оптимизация плотных данных

При работе с большими датасетами критичны параметры балансировки:

tippecanoe \
  -o tiles.mbtiles \
  --maximum-tile-bytes=2000000 \
  --buffer=64 \
  input.geojson

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

  • maximum-tile-bytes — ограничение размера тайла;
  • buffer — расширение области выборки за границы тайла;
  • автоматическое распределение нагрузки между зумами.

Фильтрация объектов по зумам

Tippecanoe позволяет задавать условия отображения объектов:

tippecanoe \
  -o tiles.mbtiles \
  --minimum-zoom=5 \
  --maximum-zoom=12 \
  input.geojson

Также возможно разделение логики:

  • крупные объекты — видимы на малых зумах;
  • детальные объекты — только при увеличении масштаба.

Работа с точками, линиями и полигонами

Разные типы геометрий обрабатываются по-разному:

Точки:

  • группируются при высокой плотности;
  • могут агрегироваться или отбрасываться.

Линии:

  • упрощаются алгоритмами редукции вершин;
  • разрезаются по границам тайлов.

Полигоны:

  • обрезаются по тайловой сетке;
  • могут разделяться на несколько фрагментов.

Генерация тайлов с приоритетами

Можно управлять важностью объектов:

tippecanoe \
  -o tiles.mbtiles \
  --layer-order=roads,buildings,landuse \
  input.geojson

Приоритет влияет на:

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

Интеграция с MapLibre GL JS

После генерации MBTiles возможны разные сценарии публикации:

Через Tile Server

map.addSource('data', {
  type: 'vector',
  tiles: [
    'https://example.com/tiles/{z}/{x}/{y}.pbf'
  ]
});

Через локальный сервер

map.addSource('local', {
  type: 'vector',
  url: 'http://localhost:8080/data.json'
});

Структура source-layer

Векторные тайлы могут содержать несколько слоёв. MapLibre GL JS обращается к ним через source-layer:

map.addLayer({
  id: 'roads',
  type: 'line',
  source: 'data',
  'source-layer': 'transportation',
  paint: {
    'line-color': '#ff0000',
    'line-width': 2
  }
});

Структура слоя формируется на этапе Tippecanoe и является критическим элементом архитектуры.


Управление масштабируемостью данных

При больших объёмах данных важны:

  • агрегация объектов на низких зумах;
  • распределение по слоям;
  • минимизация количества тайлов;
  • контроль плотности через параметры генерации.

Tippecanoe фактически определяет, насколько эффективно MapLibre GL JS будет использовать GPU-рендеринг.


Поведение при конфликте объектов

При перегрузке тайла происходит:

  • удаление менее приоритетных объектов;
  • упрощение геометрии;
  • перенос объектов на более высокие зумы;
  • агрегация точек.

Эти механизмы позволяют сохранить визуальную целостность карты даже при экстремально плотных данных.


Подготовка данных для стилизации

Ключевая особенность Tippecanoe — сохранение семантики данных.

Поля объектов становятся основой для динамического стиля:

  • фильтрация по атрибутам;
  • условная стилизация;
  • интерполяция значений;
  • отображение категорий.

Это позволяет MapLibre GL JS работать не с геометрией, а с данными как с источником визуальной логики.