RU:Osmium
Состав пакета программ
быстрый и гибкий пакет утилит на C++ и наборы функций для работы с данными OSM (libosmium)
утилита командной строки для использования библиотеки C++ libosmoium (osmium-tool)
обёртка Python для использования библиотеки C++ libosmoium (PyOsmium)
обёртка NodeJS для использования библиотеки C++ libosmoium (node-osmium) (не обноляется и заброшена)
Надстройки над osmium
Существует большое количество дополнительных наборов программ с использорванием libosmium, некоторые из которых представлены по адресу https://osmcode.org/ и https://github.com/osmcode/.
Некоторые основные возможности osmium
- Подготовка данных для загрузки в PostGIS на основе файла данных OSM (как минимум, OSM XML и OSM PBF)
- Получить сводку по файлу данных OSM
- Преобразовать файл данных OSM из одного формата в другой. Поддерживаются форматы PBF, XML, OPL, o5m, специальный debug формат.
- Сливать и применять файлы измнений (разностные файлы) OsmChange с файлами данных OSM file (включая или исключая историю измнений)
- Выделять данные некоторой географической области из файлов данных OSM или файлов истории измнений OSM
- Фильтровать данные по ключам и тегам
- Восстанавливать историческое состояние из файлов полного протокола измнений (разностей) OSM (Planet.osm/full) на некоторое время или в пределах некоторого диапазона времени
Требования к модели данных PostGIS для приёма данных от программы osmium
Все данные принимаются в единственную таблицу, состав полей которой может разниться в зависимости от потребностей экспорта, отражённых в osmium.conf
Пример минимальной таблицы для принятия данных
CREATE TABLE public."OSM образец" (
"Гео" geometry NULL,
"Теги" jsonb NULL
);
Пример таблицы для полного экспорта всех данных
CREATE TABLE public."OSM образец" (
"Гео" geometry NULL,
"Тип OSM объекта" varchar(8) NULL,
"Код OSM объекта" int8 NULL,
"Версия" int4 NULL,
"Пакет изменений" int4 NULL,
"Код последнего пользователя" int4 NULL,
"Ник последнего пользователя" varchar(256) NULL,
"Дата редактирования" timestamptz(0) NULL,
"Точки и пути" _int8 NULL,
"Теги" jsonb NULL
);
osmium.conf для полного экспорта
{
"attributes": {
"type": true,
"id": true,
"version": true,
"changeset": true,
"timestamp": true,
"uid": true,
"user": true,
"way_nodes": true
},
"linear_tags": true,
"area_tags": true,
"exclude_tags": [],
"include_tags": []
}
Пример упрощённой загрузки данных по прямогугольной области из overpass API -> osm xml файл -> osmium -> pg COPY SQL скрипт-> Таблица в PostGIS
Пример использует для скачивания данных сайт overpass api, но их источник может быть любым
#!/bin/bash
database='Геоинформационная система'; #название базы данных
import_name='Павловский парк'; #название или описание области для экспорта
bbox='59.676538598055224,30.431184768676758,59.70876380776066,30.49152374267578'; # прямогугольник для скачивания
apiadr="http://overpass-api.de/api/interpreter?data=[out:xml];(++node($bbox);++%3C;);out+meta;";
s=$(date '+%s');
f="$import_name $s"; # общая часть имён файлов с разным расширением
# скачиваем данные
wget "$apiadr" -O "$f.osm";
# экспортируем в скрипт pg COPY
osmium export --config='osmium.conf' -f pg "$f.osm" -o "$f.pg" && echo "osmium ✔";
# Показываем размер экспорта в записях для таблицы в PostGIS
echo "PostGIS geom: "$(wc -l "$f.pg");
# Чистим таблицу в PostGIS от существующих данных
echo "truncate table \"public\".\"OSM $import_name\";" | psql -e -d "$database";
# Экспортируем новые данные в таблицу в PostGIS
echo "\\copy \"public\".\"OSM $import_name\" FROM '$f.pg';" | psql -e -d "$database";
r=$?;
#Если есть материализованные представления. зависимые от таблицы \"OSM $import_name\" то их нужно обновить здесь
# echo " refresh materialized view \"$2\".\"∀\";" | psql -e -d "$database";
if [ $r == 0 ]; then
echo "postgis ✔";
xz -z -9 "$f.osm"; # архивируем постуившие данные osm
rm -v "$f.osm"; # удаляем постуившие данные osm
rm -v "$f.pg"; # удаляем скрипт PostGIS COPY, созданный из поступивших данных
fi;