2022-05-10 20:28:58
Ядро проекта Громада — интерактивная карта Украины.
За последний месяц я узнал об экосистеме OpenStreetMap чуть больше, чем мне хотелось бы. Кажется, что существует какой-то заговор, чтобы при формальной бесплатности и открытости OSM-данных self-hosting оставался уделом больших корпораций с большими мощностями, а все остальные могут пойти нахуй, то есть могут ежемесячно заносить деньги Mapbox или какому-нибудь Google за использование картографических API.
По факту, мне не нужна карта всего мира, к тому же постоянно скачивать 115 гиг данных и рендерить их целую неделю в надежде, что в процессе ничего не упадёт с segfault я себе позволить не могу. К счастью, Geofabrik, дай бох им здоровья, предлагает data extract по регионам и Украина весит всего 666 мегабайт. С тем только нюансом, что extract строго ограничен bounding box’ом региона, то есть я не получу даже контуры других стран, не говоря уже про всякие прочие реки-океаны.
Для дополнительных полигонов, чтобы вокруг Украины не было сплошного серого пятна, существует другой источник данных — Natural Earth. Оттуда скачиваются недостающие shape-файлы, которые участвуют в дальнейшем тяжеловесном процессинге.
Чтобы сырые данные превратились в красивую векторную карту, необходимо:
1. Сконвертировать shp-файлы в geojson-файлы с помощью инструмента ogr2ogr
2. Сконвертировать geojson-файлы в формат mbtiles через tippecanoe
3. Отрендерить основные osm.pbf данные в mbtiles с помощью tilemaker
4. Смёржить два mbtiles через tippecanoe
Возможен вариант подключения shp-файлов непосредственно в tilemaker, но для этого придётся изучить и модифицировать его конфиг на Lua, который занимается процессингом точек и полигонов. Из коробки, разумеется, ничего не работает, часть данных не отображается, требуется поправка на уровни масштабирования и прочее.
Вся процедура занимает минут 20 и частично автоматизирована. На выходе ожидаем примерно гигабайтный файл ukraine.mbtiles, который теперь нужно как-то отобразить в браузере.
Для этого готовим тайловый сервер, он будет резать всё на тайлы в реальном времени и порционно выдавать клиенту для рендеринга. После недолгих экспериментов я остановился на mbtileserver, потому что zero configuration и простое горизонтальное масштабирование.
Ну а чтобы отобразить тайлы в браузере с привычным look-and-feel, используем MapLibre, форк уже коммерческой Mapbox GL. Для работы ему нужна тема, которая описывает движку как именно отображать эти самые тайлы (шрифты, толщина линий, цвета и многое другое). В своём проекте я использую симпатичную, на мой вкус, OSM Bright.
Интересный факт, конфигурация темы не включает в себя нумерацию зданий, которую, как мне кажется, все хотят по-умолчанию. Также интересный факт, что иногда не понятно где зарыта собака — в процессинге или в рендеринге? Поэтому для анализа mbtiles приходится расчехлять полновесную QGIS.
Ну и на react-map-gl мы заканчиваем нашу цепочку преобразований сырых OSM-данных в красивые перелёты по карте в браузере.
414 viewsedited 17:28