Оновлення бази даних правками з OpenStreetMap за допомогою PyOsmium⚓︎
Щодня зʼявляються мільйони нових оновлень на мапі, щоб не допустити, щоб ваша мапа стала «застарілою», ви можете регулярно оновлювати дані, які використовуються для створення тайлів.
З переходом на останню версію osm2pgsql (версія 1.4.2 та свіжіше) оновлювати дані стало на багато простіше ніж раніше. Відповідні версії розповсюджується в складі Ubuntu 22.04, 24.04 та Debian 12, їх можна встановити слідуючи інструкції з osm2pgsql.org.
Простіший, але менш гнучкий метод оновлення даних, – використання osm2pgsql-replication
(див тут). Тут для оновлення даних в нашій базі ми будемо використовувати PyOsmium
для оновлення даних, які ми отримали з Geofabrik хвилинними оновленнями з https://planet.openstreetmap.org.
Переконайтесь, що ви отримуєте повідомлення для відлагодження⚓︎
На цьому етапі було б дуже корисно побачити результат процесу генерації тайлів, щоб побачити, що тайли, позначені як dirty, обробляються. Типово в останніх версіях mod_tile це вимкнено. Для увімкнення відкрийте
Якщо немає, додайте наступний рядок
після “[Service]”. Далі:
Налаштування реплікації⚓︎
Візьміть до уваги, скрипт що перевіряє актуальність тайлів очікує що згенеровані тайли знаходяться в /var/cache/renderd/
. Якщо у /etc/renderd.conf
зазначене інше місце, внесіть відповідні зміни перед початком використання скрипту. Оскільки тека "/var/cache/renderd/" майже завжди присутня, ми також будемо використовувати її для потреб pyosmium
.
Для потреб цього керівництва ми вважатимемо, що ви завантажили дані до вашої бази наступним чином:
sudo -u _renderd \
osm2pgsql -d gis --create --slim -G --hstore \
--tag-transform-script \
~/src/openstreetmap-carto/openstreetmap-carto.lua \
-C 3000 --number-processes 4 \
-S ~/src/openstreetmap-carto/openstreetmap-carto.style \
~/data/greater-london-latest.osm.pbf
Дані для завантаження були отримані зі сторінки Greater London, на якій зазначено, щось схоже на "… and contains all OSM data up to 2023-07-02T20:21:43Z" (… містить всі дані OSM станом на …). Ми будемо використовувати цю дату для налаштування реплікації:
sudo mkdir /var/cache/renderd/pyosmium
sudo chown _renderd /var/cache/renderd/pyosmium
sudo mkdir /var/log/tiles
sudo chown _renderd /var/log/tiles
cd /var/cache/renderd/pyosmium
sudo apt install pyosmium
sudo -u _renderd pyosmium-get-changes -D 2023-07-02T20:21:43Z -f sequence.state -v
Останній рядок створює файл sequence.state
. Дата в цім рядку має збігатись з датою даних, завантажених раніше.
Використання "trim_osc.py" для обмеження завантаження тільки спеціально визначеною територією⚓︎
(рекомендується якщо вам потрібно оновлювати не всю планету, а тільки певний регіон)
Ми використовуватимемо скрипт trim_osc.py
для обрізання оновлень, які ми отримуємо з OpenStreetMap.org, так щоб залишались тільки оновлення для потрібної нам території. Це потрібно, щоб наша база postgres не розросталась через дані, які нам не потрібні. Встановимо потрібні залежності використовуючи будь-який обліковий запис вашої системи (не-root).
cd ~/src
git clone https://github.com/zverik/regional
chmod u+x ~/src/regional/trim_osc.py
sudo apt install python3-shapely python3-lxml
Оновлення даних⚓︎
Скрипт, який виконує оновлення даних ви можете взяти звідси. Ви можете покласти його до /usr/local/sbin
. Але він потребує певних змін:
-
Якщо ви не використовуєте
trim_osc.py
, вилучить відповідний розділ ("Trim the downloaded changes"). -
Якщо ви все ж таки використовуєте
trim_osc.py
, переконайтесь що змінна TRIM_BIN вказує на цей скрипт, а TRIM_REGION_OPTIONS містить параметри потрібної вам території (в скрипті зараз це Британія разом з Ірландією). -
Параметри для
osm2pgsql --append
потрібно змінити відповідно до потужності вашого сервера (розмір пам'яті, кількість потоків й таке інше) -
Параметри, що передаються до
render_expired
також мають бути налаштовані (скільки рівнів масштабування потрібно обробляти, і що робити ізdirty
тайлами на кожному рівні)
Скрипт, що показує відмінності між поточними даними у вашій базі з даними та даними на https://planet.openstreetmap.org/ можна знайти тут. Цей скрипт створено зі скрипту mod_tile
, який постачається у вигляді прикладу в сирцях mod_tile. pyosmium_replag
показує відставання від основної бази в секундах; pyosmium_replag -h
показує відставання від основної бази в годинах (якщо менше, то у хвилинах та секундах). Рекомендується його також покласти до /usr/local/sbin
. Не забудьте дати скриптам дозвіл на виконання.
Для запуску скрипту вручну:
Після запуску, скрипт створить робочі файли, також ви побачите докладну інформацію про його роботу у /var/cache/renderd/pyosmium
. По завершенню роботи ви маєте побачити такий звіт:
Pyosmium update started: Mon Jul 3 11:15:36 PM UTC 2023
Filtering newchange.osc.gz
Importing newchange.osc.gz
2023-07-03 23:17:44 osm2pgsql took 45s overall.
Expiring tiles
Total for all tiles rendered
Meta tiles rendered: Rendered 0 tiles in 1.54 seconds (0.00 tiles/s)
Total tiles rendered: Rendered 0 tiles in 1.54 seconds (0.00 tiles/s)
Total tiles in input: 2334224
Total tiles expanded from input: 305839
Total meta tiles deleted: 0
Total meta tiles touched: 0
Total tiles ignored (not on disk): 305839
Database Replication Lag: 1 day(s) and 1 hour(s)
Ви можете налаштувати обсяг даних, які завантажуються за один запит до сервера, параметром -s
в pyosmium-get-changes
. Розмір зазначається в Мб, типово скрипт завантажуватимете 20 Мб, якщо не зазначити обсяг явним чином – 100 Мб за раз.
Скрипт можна додати до розкладу crontab
облікового запису _renderd
:
вкажіть:
Буде виконуватись перевірка, чи працює скрипт, і якщо ні запускатись із вказаною частотою; тут кожні 5 хвилин.
Рекомендується очистити прапор "pyosmium is running" під час перезапуску renderd
. Щоб зробити це:
```sh sudo nano /usr/lib/systemd/system/renderd.service
до розділу "[Service]". Та перезапустіть службу:
Налаштування munin⚓︎
У разі використання munin для отримання звітів про активність mod_tile
та renderd
, ви можете налаштувати його для показу часу відставання ваших даних від даних з основної бази за допомогою pyosmium_replag.sh
:
Сам скрипт можна взяти тут. Тут використовується pyosmium_replag.sh
, який ми створили раніше. Після чого перезапустіть службу:
Після деякої паузи, оновіть http://ip.адреса.вашого.сервера/munin/renderd-day.html
, має показувати графік "Data import lag". Якщо ні, перевірте логи /var/log/munin
. Якщо вам потрібно більше контексту для розуміння того що відбувається ознайомтесь з документацією munin.