Оновлення бази даних правками з OpenStreetMap
Оновлення бази даних правками з OpenStreetMap за допомогою PyOsmium
Щодня зʼявляються мільйони нових оновлень на мапі, щоб не допустити, щоб ваша мапа стала «застарілою», ви можете регулярно оновлювати дані, які використовуються для створення тайлів.
З переходом на останню версію osm2pgsql (версія 1.4.2 та свіжіше) оновлювати дані стало на багато простіше ніж раніше. Ця версія розповсюджується в складі Ubuntu 22.04, її можна встановити слідуючи інструкції з osm2pgsql.org.
Простіший, але менш гнучкий метод оновлення даних, – використання osm2pgsql-replication
(див тут). Тут для оновлення даних в нашій базі ми будемо використовувати PyOsmium
для оновлення даних, які ми отримали з Geofabrik хвилинними оновленнями з https://planet.openstreetmap.org/.
Переконайтесь, що ви отримуєте повідомлення для відлагодження
На цьому етапі було б дуже корисно побачити результат процесу генерації тайлів, щоб побачити, що тайли, позначені як dirty, обробляються. Типово в останніх версіях mod_tile це вимкнено. Для увімкнення відкрийте
sudo nano /usr/lib/systemd/system/renderd.service
Якщо немає, додайте наступний рядок
Environment=G_MESSAGES_DEBUG=all
після “[Service]”. Далі:
sudo systemctl daemon-reload
sudo systemctl restart renderd
sudo systemctl restart apache2
Налаштування реплікації
Візьміть до уваги, скрипт що перевіряє актуальність тайлів очікує що згенеровані тайли знаходяться в /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 2022-06-15T20:21:49Z” (… містить всі дані 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 2022-06-15T20:21:49Z -f sequence.state -v
Останній рядок створює файл sequence.state
. Дата в цім рядку має збігатись з датою даних, завантажених раніше.
Використання “trim_osc.py” для обмеження завантаження тільки спеціально визначеною територією.
(рекомендується якщо вам потрібно оновлювати не всю планету, а тільки певний регіон)
Ми використовуватимемо скрипт trim_osc.py
для обрізання оновлень, які ми отримуємо з https://planet.openstreetmap.or/, так щоб залишались тільки оновлення для потрібної нам території. Це потрібно, щоб наша база 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_osc.py
у вашій системі, а TRIM_REGION_OPTIONS містить параметри потрібної вам території (в скриті зараз це Британія разом з Ірландією). -
Параметри для
osm2pgsql --append
потрібно змінити відповідно до потужності вашого сервера (розмір пам’яті, кількість потоків й таке інше) -
Параметри, що передаються до
render_expired
також мають бути налаштовані (скільки рівнів масштабування потрібно обробляти, і що робити ізdirty
тайлами на кожному рівні)
Скрипт, що показує відмінності між поточними даними у вашій базі з даними та даними на https://planet.openstreetmap.org/ можна знайти тут. Цей скрипт створено зі скрипту mod_tile
, який постачається у вигляді прикладу в сирцях mod_tile. pyosmium_replag
показує відставання від основної бази в секундах; pyosmium_replag -h
показує відставання від основної бази в годинах (якщо менше, то у хвилинах та секундах). Рекомендується його також покласти до /usr/local/sbin
. Не забудьте дати скриптам дозвіл на виконання.
Для запуска скрипту вручну:
sudo -u _renderd /usr/local/sbin/call_pyosmium.sh
Після запуску, скрипт створить робочі файли, також ви побачите докладну інформацію про його роботу у /var/cache/renderd/pyosmium
. По завершенню роботи ви маєте побачити такий звіт:
Pyosmium update started: Thu 16 Jun 09:26:14 UTC 2022
Filtering newchange.osc.gz
Importing newchange.osc.gz
2022-06-16 09:28:36 osm2pgsql took 61s (1m 1s) overall.
Expiring tiles
Total for all tiles rendered
Meta tiles rendered: Rendered 0 tiles in 0.15 seconds (0.00 tiles/s)
Total tiles rendered: Rendered 0 tiles in 0.15 seconds (0.00 tiles/s)
Total tiles in input: 11157
Total tiles expanded from input: 4563
Total meta tiles deleted: 0
Total meta tiles touched: 10
Total tiles ignored (not on disk): 4553
Database Replication Lag: 2 day(s) and 6 hour(s)
Ви можете налаштувати обсяг даних, які завантажуються за один запит до сервера, параметром -s
в pyosmium-get-changes
. Розмір зазначається в Мб, типово скрипт завантажуватимете 20 Мб, якщо не зазначити обсяг явним чином – 100 Мб за раз.
Скрипт можна додати до розкладу crontab
облікового запису _renderd
:
sudo -u _renderd crontab -e
вкажіть:
*/5 * * * * /usr/local/sbin/call_pyosmium.sh >> /var/log/tiles/run.log
Буде виконуватись перевірка, чи працює скрипт, і якщо ні запускатись із вказаною частотою; тут кожні 5 хвилин.
Рекомендується очистити прапор “pyosmium is running” під час перезапуску renderd. Щоб зробити це:
sudo nano /usr/lib/systemd/system/renderd.service
додайте:
ExecStartPre=rm -f /var/cache/renderd/pyosmium/call_pyosmium.running
до розділу “[Service]”. Та перезапустіть службу:
sudo systemctl daemon-reload
sudo systemctl restart renderd
Налаштування munin
У разі використання munin для отримання звітів про активність mod_tile
та renderd
, ви можете налаштувати його для показу часу відставання ваших даних від даних з основної бази за допомогою pyosmium_replag.sh
:
sudo nano /etc/munin/plugins/replication_delay
Сам скрипт можна взяти тут. Тут використовується pyosmium_replag.sh
, який ми створили раніше. Після чого перезапустіть службу:
sudo /etc/init.d/munin-node restart
Після деякої паузи, оновіть http://ip.адреса.вашого.сервера/munin/renderd-day.html
, має показувати графік “Data import lag”. Якщо ні, перевірте логи /var/log/munin
. Якщо вам потрібно більше контексту для розуміння того що відбувається ознайомтесь з документацією munin.