- PVSM.RU - https://www.pvsm.ru -
[1]Каждый веб-разработчик знает о OpenStreetMap [3] (OSM), свободной альтернативе Google Maps. Несмотря на всеобщую известность OSM, у некоторых всё-таки возникают вопросы: как сделать веб-карту с открытыми данными OSM, как самостоятельно публиковать карты?
На эту тему есть популярные руководства [4], в том числе по работе с базами PostGIS и запуску тайлсерверов для реализации бесшовных карт OSM. Но есть принципиально иной подход — векторные карты Protomaps [2], которые обеспечивают более высокое разрешение, настройку внешнего вида и наложение произвольных меток. Они изначально предполагают максимальную простоту в создании своих карт. А главное, что разместить тайлы можно на своём или в облаке.
Векторные карты Protomaps [2] — это простая в использовании система базовых карт. Всего за пару минут можно выбрать любую область и получить автономную карту, работающую локально на вашем сервере/хостинге или без сервера (на S3).

Другими словами, если у нас сайт интернет-магазина, и мы хотим показать посетителям маршрут на карте, то больше не надо платить за использование Google Maps API, можно абсолютно бесплатно захостить тайлы Protomaps (OSM) на своём сервере, и это довольно несложно делается [6].
Карты Protomaps состоят из трёх основных частей:
Вся пирамида тайлов хранится в одном компактном файле PMTiles, который кодирует данные подобно видеокодекам [9].

Разработчик говорит, что PMTiles для векторных данных во многом основан на формате GeoTIFF (COG) [10] — это растровый TIFF-файл с особой внутренней организацией, которая позволяет удалённо считывать его из облачного хранилища. PMTiles точно так же оптимизирован для облачных хостингов, хотя имеет несколько ключевых отличий от COG. Он хранит произвольные тайлы, а не только изображения TIFF, и обратно совместим с программами, которые могут читать GeoTIFF. Тем не менее, есть смысл рассматривать PMTiles как «COG для векторных тайлов».
Все библиотеки и форматы Protomaps опубликованы с открытым исходным кодом под свободными лицензиями, включая спецификации и реализации PMTiles, генератор базовых карт, векторный рендерер Leaflet [11] и движок хранения данных OSM Express [12].

Вот краткая инструкция, как установить Protomaps на своём сервере или на виртуальной машине:
pmtiles show https://build.protomaps.com/20240114.pmtiles

Этот файл размером примерно 110 ГиБ содержит все данные, которые распространяет проект OSM (карта всего мира).
Обычно нам не нужна карта всей планеты, а только небольшой участок.
Для визуального определения координат можно воспользоваться сервисом Bboxfinder [15].

Это координаты области вокруг Санкт-Петербурга. Извлекаем его из общего файла:
pmtiles extract https://build.protomaps.com/20240114.pmtiles my_area.pmtiles --bbox=58.847859,27.443848,60.802064,33.310547

В результате создаётся файл my_area.pmtiles размером всего 18 МБ — и это мы начертили очень большой прямоугольник. В принципе, если ограничиться только городом, то размер будет в районе 2−3 МБ.
В большинстве случаев для рендеринга рекомендуется Leaflet: это легковесный движок с простым API и большой экосистемой плагинов для UI и визуализации карт. В базовых картах Protomaps используется плагин Leaflet собственной разработки protomaps-leaflet [11].
В случае более сложных веб-карт с «плавным масштабированием» на базе WebGL рекомендуется MapLibre GL JS [19]. Это более крупная библиотека с более мощным API для стилизации.
OpenLayers [20] — ещё один продвинутый фронтенд с максимальным функционалом по части GIS. В профессиональных компаниях по разработке геоинформационных сервисов наверняка используют именно его. Поддержка PMTiles в OpenLayers пока считается экспериментальной (неофициальной).
Можно сравнить [21] Protomaps с популярными картографическими сервисами: Google Maps API, OpenStreetMap [22] и Mapbox.
Первое отличие — цена. Google Maps API предлагает щедрый бесплатный тариф в 30 000 загрузок [23], но затем взимает довольно высокую плату. В отличие от него, Protomaps изначально спроектирован как система на
Условия предоставления услуг Google запрещают кэширование данных или использование тайлов в сочетании с другими сервисами, такими как поиск. Protomaps предлагает полную свободу действий, поскольку никак не привязан ни к какому вендору или корпорации.
Наконец, Google Maps API приходится использовать через проприетарный Javascript SDK с ограниченными возможностями настройки. Protomaps можно использовать с любой опенсорсной библиотекой, включая Leaflet [11], MapLibre GL JS [19] и OpenLayers [20].
Но если мы укладываемся в бесплатный лимит, а сценарий использования не предполагает ничего сложного, то Google Maps API кажется более предпочтительным вариантом, чем Protomaps.
OpenStreetMap работает по лицензии Open Database License [24]. Еженедельно на сайте Planet OSM [25] выкладывают новый файл. Это просто набор данных с метками для создания карт. Важно понимать, что проект OSM официально не распространяет карты и не оказывает услуги по поиску и навигации.
У OpenStreetMap есть стандартный слой тайлов openstreetmap-carto [26], который отображается на главной странице. Он основан на динамическом рендеринге растровых изображений. В отличие от векторных тайлов, его нельзя настраивать на стороне клиента, он обязательно требует наличия многих вспомогательных программ, таких как PostgreSQL, Apache и Mapnik. Это вспомогательный слой для участников проекта, и по официальным правилам [27] запрещено его интенсивное внешнее использование или массовая загрузка.
Проект Protomaps как раз и создан, чтобы преодолеть эти ограничения. Он предоставляет базовые наборы тайлов (basemap) из OSM. Базовый набор включает самые распространённые элементы для фона, такие как водные объекты, океаны, здания и дороги. Это результат обработки тайлов OSM для эффективного интерактивного отображения с помощью генерализации [28], организации слоёв [29], вычисление яркости и положения меток.

Mapbox — коммерческий провайдер карт на базе OpenStreetMap. Также как в случае Google Maps API, доступ осуществляется через API с оплатой за фактическое использование. В этом и главное отличие от Protomaps, где объём использования не ограничен, а ключи API не требуются. Тут пользователь оплачивает только
Кроме того, данные Mapbox из OSM не всегда актуальные, в то время как Protomaps может обновляться из последних версий датасета OSM сразу после их выхода.
В то же время Protomaps поддерживает совместимость с форматами Mapbox, которые сейчас считаются открытыми стандартами: это библиотека рендеринга фронтенда Mapbox GL (конкретно, форк MapLibre GL [19]), а также формат векторных тайлов Mapbox Vector Tile [30] (его называют MVT или PBF, ссылаясь на формат сериализации Protocol Buffers [31]). Он поддерживается многими GIS-системами, такими как PostGIS [32].
Компания Protomaps LLC (на самом деле это один человек [33]) зарабатывает на
Но при интенсивном использовании лучше разместить тайлы на своём
Для сокращения издержек даже издание The Washington Post предпочло заменить Mapbox на опенсорсные решения [37]. Они использовали набор технологий: OpenMapTiles [38] для генерации тайлов, Maputnik [39] для оформления, PMTiles [2] для

Оформление карт в Maputnik
Leaflet [41] — популярная опенсорсная библиотека для публикации интерактивных карт. С размером всего 42 КБ на JS она эффективно работает на всех мобильных устройствах. Движок protomaps.js [42] добавляет к ней векторный рендеринг высокого разрешения с системой картографической символики на основе кода [18] (создание меток и маркеров, прямой доступ к Canvas 2D).
В целом, формат MBTiles [43] отлично подходит для
Автор: Анатолий Ализар
Источник [44]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/leaflet/389853
Ссылки в тексте:
[1] Image: https://habr.com/ru/companies/ruvds/articles/786698/
[2] Protomaps: https://protomaps.com/
[3] OpenStreetMap: https://openstreetmap.org/
[4] руководства: https://switch2osm.org/
[5] хостинге: https://www.reg.ru/?rlink=reflink-717
[6] довольно несложно делается: https://protomaps.com/docs/pmtiles
[7] запросы HTTP Range: https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
[8] реализации PMTiles на Python и JS: https://github.com/protomaps/PMTiles
[9] подобно видеокодекам: https://protomaps.com/blog/dynamic-maps-static-storage
[10] GeoTIFF (COG): https://www.cogeo.org/
[11] Leaflet: https://protomaps.com/docs/frontends/leaflet
[12] OSM Express: https://github.com/protomaps/OSMExpress
[13] pmtiles: https://github.com/protomaps/go-pmtiles/releases
[14] https://maps.protomaps.com/builds/: https://maps.protomaps.com/builds/
[15] Bboxfinder: http://bboxfinder.com/#58.847859,27.443848,60.802064,33.310547
[16] пример: https://til.simonwillison.net/gis/pmtiles
[17] protomaps-leaflet: https://github.com/protomaps/protomaps-leaflet
[18] документацию: https://docs.protomaps.com/pmtiles/leaflet
[19] MapLibre GL JS: https://protomaps.com/docs/frontends/maplibre
[20] OpenLayers: https://protomaps.com/docs/frontends/openlayers
[21] сравнить: https://protomaps.com/faq
[22] OpenStreetMap: http://openstreetmap.org/
[23] 30 000 загрузок: https://mapsplatform.google.com/pricing/
[24] Open Database License: http://openstreetmap.org/copyright
[25] Planet OSM: https://planet.openstreetmap.org/
[26] openstreetmap-carto: https://github.com/gravitystorm/openstreetmap-carto
[27] официальным правилам: https://operations.osmfoundation.org/policies/tiles/
[28] генерализации: https://en.wikipedia.org/wiki/Cartographic_generalization
[29] слоёв: https://protomaps.com/docs/frontends/basemap-layers
[30] Mapbox Vector Tile: https://github.com/mapbox/vector-tile-spec
[31] Protocol Buffers: https://developers.google.com/protocol-buffers
[32] PostGIS: https://postgis.net/docs/ST_AsMVT.html
[33] один человек: https://github.com/bdon
[34] ключ API: https://protomaps.com/dashboard
[35] спонсором проекта на GitHub: https://github.com/sponsors/protomaps
[36] рекомендуют платформу Cloudflare R2: https://docs.protomaps.com/pmtiles/cloud-storage#cloudflare-r2
[37] заменить Mapbox на опенсорсные решения: https://www.kschaul.com/post/2023/02/16/how-the-post-is-replacing-mapbox-with-open-source-solutions/
[38] OpenMapTiles: https://github.com/openmaptiles/openmaptiles
[39] Maputnik: https://github.com/maputnik/editor
[40] Maplibre-gl-js: https://github.com/maplibre/maplibre-gl-js/
[41] Leaflet: https://leafletjs.com/
[42] protomaps.js: https://github.com/protomaps/protomaps.js
[43] MBTiles: https://github.com/mapbox/mbtiles-spec
[44] Источник: https://habr.com/ru/companies/ruvds/articles/786698/?utm_source=habrahabr&utm_medium=rss&utm_campaign=786698
Нажмите здесь для печати.