Skip to content

Commit f8ce799

Browse files
committed
Suppression parties commune avec tuto osm postgis
1 parent 930780d commit f8ce799

File tree

1 file changed

+21
-294
lines changed

1 file changed

+21
-294
lines changed

content/articles/2022/2022-06-07_ferrargis-carte-de-ferraris-qgis.md

Lines changed: 21 additions & 294 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,14 @@ authors:
55
categories:
66
- article
77
- tutoriel
8-
date: "2022-06-07 10:20"
8+
date: "2023-09-15 10:20"
99
description: "Description pour le SEO."
10+
icon: simple/ferrari
1011
image: "https://cdn.geotribu.fr/img/articles-blog-rdp/articles/qgis_ferraris/export_aix_large.png"
1112
license: default
1213
tags:
1314
- cartographie
1415
- OpenStreetMap
15-
- osm2pgsql
16-
- Osmium
17-
- PostgreSQL
1816
- QGIS
1917
---
2018

@@ -25,7 +23,7 @@ tags:
2523

2624
# FerrarGIS, un style de carte de Ferraris (1777) avec QGIS
2725

28-
:calendar: Date de publication initiale : 7 juin 2022
26+
:calendar: Date de publication initiale : 15 septembre 2023
2927

3028
Prérequis :
3129

@@ -54,230 +52,33 @@ L'occasion d'un petit tutoriel, non pas pour manipuler les styles de QGIS et bri
5452

5553
----
5654

57-
## Les outils
55+
### Configuration Base Postg
5856

59-
### Installer osm2pgsql
57+
Pour continuer, je dispose :
6058

61-
![logo osm2pgsql](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/osm2pgsql.png "logo osm2pgsql"){: .img-rdp-news-thumb }
59+
- [ ] d'un cluster PostgreSQL (15 en l'occurrence mais ça doit fonctionner avec des versions plus anciennes) sur le port `54352`
60+
- [ ] d'une base de données que j'ai appelée `osm_ferrargis`
61+
- [ ] sur laquelle j'ai activé les extensions `postgis` et `hstore`
62+
- [ ] à laquelle je me connecte de façon sécurisée à l'aide des fichiers `~/.pgpass` et `~/.pg_service.conf` dont je mets ci-dessous une idée de ce qu'il y a dedans :
6263

63-
Afin d'importer les données OpenStreetMap dans PostgreSQL, on va devoir utiliser [osm2pgsql](/?q=osm2pgsql*) qui est un outil en ligne de commande maintenu par la communauté OSM. Pour l'installation, rien de plus simple.
64-
65-
Sur Debian et dérivés comme Ubuntu :
66-
67-
```sh
68-
sudo apt install osm2pgsql
69-
```
70-
71-
Sur Windows, le [tutoriel de LearnOSM](https://learnosm.org/en/osm-data/osm2pgsql/) est très bien !
72-
73-
- Oui, une question Joséphine ?
74-
- Monsieur, il est en anglais votre tuto et dans plein d'autres langues sauf en Français !
75-
- Mon ange, c'est une excellente remarque que vous faites là ! C'est justement l'occasion de vous proposer pour contribuer à la traduction de ce merveilleux support !
76-
- Ah ouais, bonne idée, ça me fera un bon exercice pour travailler la [version en anglais](https://www.edulide.fr/blog/reussir-version-anglais/) !
77-
78-
[Faites chauffer DeepL et Transifex pour contribuer à LearnOSM :fontawesome-solid-language:](https://learnosm.org/en/contribute/translator/){: .md-button }
79-
{: align=middle }
80-
81-
### Installer et configurer PostgreSQL
82-
83-
![logo PostgreSQL](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/postgresql.png "logo PostgreSQL"){: .img-rdp-news-thumb }
84-
85-
Installer PostgreSQL n'a rien de sorcier, tant le travail de packaging et de distribution est remarquablement réalisé et documenté, comme en témoigne [la page de téléchargement](https://www.postgresql.org/download/). Mais c'est toujours bon de se noter les commandes à utiliser pour installer les versions depuis les dépôts communautaires.
86-
87-
Par exemple, sur les distributions Linux comme Ubuntu :
88-
89-
```sh
90-
# quelques dépendances communes
91-
sudo apt install curl gpg gnupg2 software-properties-common apt-transport-https lsb-release ca-certificates
92-
# on télécharge et on inscrit la clé permettant de certifier la provenance des paquets logiciels
93-
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
94-
# on référence le dépôt communautaire dans les sources logicielles du système
95-
echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
96-
# on installe PostgreSQL
97-
sudo apt install postgresql-14 postgresql-client-14 postgresql-14-postgis-3
98-
```
99-
100-
Le truc avec le packaging de PostgreSQL sur Debian et Ubuntu c'est que les scripts de post-installation créent par défaut un cluster `main`. C'est sympa de faire une partie du taf mais ce serait plus correct de demander avant quand même, en plus, le cluster est même pas optimisé !
101-
Quand je fais installer un four en terre chez moi, je ne m'attends pas à ce que l'artisan me fasse une calzone mal cuite juste après la dernière pierre posée ! :pizza:
102-
103-
#### Création d'un cluster optimisé
104-
105-
C'est parti pour la création d'un cluster aux ~~petits oignons~~ petites olives ! On commence par lister les versions installées et les ports respectifs :
106-
107-
```bash
108-
> grep -H '^port' /etc/postgresql/*/main/postgresql.conf
109-
/etc/postgresql/12/main/postgresql.conf:port = 5432 # (change requires restart)
110-
/etc/postgresql/14/main/postgresql.conf:port = 54342 # (change requires restart)
111-
```
112-
113-
Puis les clusters existants :
114-
115-
```bash
116-
> pg_lsclusters
117-
Ver Cluster Port Status Owner Data directory Log file
118-
12 main 5432 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log
119-
14 main 54342 online postgres /var/lib/postgresql/14/main /var/log/postgresql/postgresql-14-main.log
120-
```
121-
122-
L'objectif est donc de créer un cluster dédié avec des paramètres optimisés pour les tâches souhaitées (import de données OSM) et par rapport à l'ordinateur utilisé (un Dell XPS 15 7590 avec un Intel Core i7-9750H de 9e génération - voir la [fiche technique](https://www.dell.com/support/manuals/fr-fr/xps-15-7590-laptop/xps-15-7590-setup-and-specifications/processeurs?guid=guid-bfa52f40-8ad1-4df0-8d0f-942766bc2118&lang=fr-fr)).
123-
124-
Pour cela, on va s'appuyer sur deux éléments :
125-
126-
- la [documentation d'osm2pgsql](https://osm2pgsql.org/doc/manual.html#tuning-the-postgresql-server) qui recommande des paramètres de configuration
127-
- les outils comme [PGTune](https://pgtune.leopard.in.ua/) qui permettent de générer une configuration selon les capacités de la machine et le type d'application
128-
129-
[![PGTune - Dell XPS 15 7590](https://cdn.geotribu.fr/img/articles-blog-rdp/articles/qgis_ferraris/pgtune_dell-xps-15-7590_osm_data.png "PGTune - Dell XPS 15 7590"){: .img-center loading=lazy}](https://cdn.geotribu.fr/img/articles-blog-rdp/articles/qgis_ferraris/pgtune_dell-xps-15-7590_osm_data.png "PGTune - Dell XPS 15 7590"){: data-mediabox="lightbox-gallery" data-title="PGTune - Dell XPS 15 7590"}
130-
131-
C'est parti, on crée un cluster `ferrargis` en passant directement les options qui nous intéressent. Notez que je réduis certains paramètres pour garder la main sur mon interface graphique et qu'en cas de valeurs différentes entre PGTune et osm2pgsql, j'ai choisi de donner la priorité à ce dernier :
132-
133-
```bash title="Commande multi-ligne pour créer un cluster PostgreSQL"
134-
sudo pg_createcluster 14 ferrargis \
135-
--port=54342 \
136-
--pgoption autovacuum_work_mem='2GB' \
137-
--pgoption checkpoint_completion_target='0.9' \
138-
--pgoption checkpoint_timeout='60min' \
139-
--pgoption default_statistics_target='500' \
140-
--pgoption effective_cache_size='10GB' \
141-
--pgoption effective_io_concurrency='200' \
142-
--pgoption maintenance_work_mem='10GB' \
143-
--pgoption min_wal_size='4GB' \
144-
--pgoption max_connections='40' \
145-
--pgoption max_wal_size='12GB' \
146-
--pgoption max_worker_processes='10' \
147-
--pgoption max_parallel_workers_per_gather='6' \
148-
--pgoption max_parallel_workers='10' \
149-
--pgoption max_parallel_maintenance_workers='4' \
150-
--pgoption max_wal_senders='0' \
151-
--pgoption random_page_cost='1.1' \
152-
--pgoption shared_buffers='1GB' \
153-
--pgoption wal_buffers='16MB' \
154-
--pgoption wal_level='minimal' \
155-
--pgoption work_mem='50MB' \
156-
-- --data-checksums --lc-messages=C --auth-host=scram-sha-256 --auth-local=peer
157-
```
158-
159-
<!-- 1. Le port doit être différent de ceux déjà utilisés par les autres clusters. -->
160-
161-
<!-- markdownlint-disable MD046 -->
162-
??? example "Le détail de l'exécution sur ma machine"
163-
164-
```bash
165-
Creating new PostgreSQL cluster 14/ferrargis ...
166-
/usr/lib/postgresql/14/bin/initdb -D /var/lib/postgresql/14/ferrargis --no-instructions --data-checksums --lc-messages=C --data-checksums --lc-messages=C --auth-host=scram-sha-256 --auth-local=peer
167-
Les fichiers de ce système de bases de données appartiendront à l'utilisateur « postgres ».
168-
Le processus serveur doit également lui appartenir.
169-
170-
L'instance sera initialisée avec les locales
171-
COLLATE: fr_FR.UTF-8
172-
CTYPE: fr_FR.UTF-8
173-
MESSAGES: C
174-
MONETARY: fr_FR.UTF-8
175-
NUMERIC: fr_FR.UTF-8
176-
TIME: fr_FR.UTF-8
177-
L'encodage par défaut des bases de données a été configuré en conséquence
178-
avec « UTF8 ».
179-
La configuration de la recherche plein texte a été initialisée à « french ».
180-
181-
Les sommes de contrôle des pages de données sont activées.
182-
183-
correction des droits sur le répertoire existant /var/lib/postgresql/14/ferrargis... ok
184-
création des sous-répertoires... ok
185-
sélection de l'implémentation de la mémoire partagée dynamique...posix
186-
sélection de la valeur par défaut pour max_connections... 100
187-
sélection de la valeur par défaut pour shared_buffers... 128MB
188-
sélection du fuseau horaire par défaut... Europe/Paris
189-
création des fichiers de configuration... ok
190-
lancement du script bootstrap...ok
191-
exécution de l'initialisation après bootstrap... ok
192-
synchronisation des données sur disque... ok
193-
Ver Cluster Port Status Owner Data directory Log file
194-
14 ferrargis 54342 down postgres /var/lib/postgresql/14/ferrargis /var/log/postgresql/postgresql-14-ferrargis.log
195-
```
196-
<!-- markdownlint-enable MD046 -->
197-
198-
Il est évidemment possible de changer les paramètres du cluster par la suite, soit via une instuction SQL `ALTER SYSTEM`, soit en éditant le `postgresql.conf` :
199-
200-
```bash
201-
sudo nano /etc/postgresql/14/ferrargis/postgresql.conf
202-
# puis redémarrer le serveur
203-
sudo systemctl restart postgresql@14-ferrargis
204-
```
205-
206-
Démarrer l'instance :
207-
208-
```bash
209-
sudo systemctl start postgresql@14-ferrargis
210-
# ou
211-
sudo pg_ctlcluster 14 ferrargis start
64+
```conf title="Ligne dans le fichier ~/.pgpass (en CHMOD 0600)"
65+
localhost:54352:*:nom_utilisateur_session:mot_de_passe
21266
```
21367

214-
!!! tip "Astuce pour avoir une Calzone réussie à chaque installation"
215-
Il est possible de changer le comportement des scripts de post-installation du packaging PostgreSQL en modifiant le fichier `/etc/postgresql-common/createcluster.conf`, soit pour désactiver la création automatisée du cluster `main`, soit pour en modifier les paramètres par défaut (par exemple avec `initdb_options = '--data-checksums --lc-messages=C'`).
68+
Et cette section dans mon fichier `~/.pg`
21669

217-
#### Créer le rôle et gérer l'accès
218-
219-
Comme on travaille à la maison, on va se faciliter la vie et créer un rôle en base correspondant à l'utilisateur système (trouvable avec la commande `whoami`) de façon à utiliser le mode d'authentification `peer`) :
220-
221-
```bash
222-
sudo -u postgres createuser -p 54342 --createdb --pwprompt --superuser "$(whoami)"
223-
```
224-
225-
De façon à ne pas stocker de mot de passe en clair dans les applications clientes comme QGIS et pour se faciliter la vie, on se crée un fichier `.pgpass` dans le répertoire personnel de l'utilisateur :
226-
227-
```bash
228-
echo "localhost:54342:*:$(whoami):motdepasse_assigned_a_mon_utilisateur" >> ~/.pgpass
229-
```
230-
231-
De même, de façon à garder la connexion la plus générique possible dans le but de rendre la suite le plus facilement reproductible possible, on stocke les paramètres de connexion dans le fichier `PGSERVICE` (voir [la doc officielle de PostgreSQL](https://www.postgresql.org/docs/current/libpq-pgservice.html) et [celle de QGIS](https://docs.qgis.org/3.22/fr/docs/user_manual/managing_data_source/opening_data.html#pg-service-file)) :
232-
233-
- emplacement par défaut : `~/.pg_service.conf` (Linux) ou `%APPDATA%/postgresql/.pg_service.conf` (Windows)
234-
- ou personnalisable via une variable d'environnement `PGSERVICEFILE` pointant sur le fichier directement (nommage libre) ou `PGSYSCONFDIR` pointant sur le répertoire où trouver le fichier (qui doit forcément être nommé `pg_service.conf`)
235-
236-
```ini
70+
```ini title="Section dans le fichier ~/.pg_service.conf"
23771
[local_ferrargis]
238-
dbname=osm
72+
dbname=osm_ferrargis
23973
host=localhost
240-
port=54342
241-
```
242-
243-
#### Créer et configurer la base de données
244-
245-
![logo PostGIS](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/postgis.png "logo PostGIS"){: .img-rdp-news-thumb }
246-
247-
Créer la base de données :
248-
249-
```bash
250-
createdb --owner $(whoami) --port 54342 --encoding=UTF8 osm
251-
```
252-
253-
S'y connecter pour tester puis ressortir :
254-
255-
```bash
256-
> psql -p 54342 -U $(whoami) osm
257-
psql (14.3 (Ubuntu 14.3-1.pgdg20.04+1))
258-
Saisissez « help » pour l'aide.
259-
260-
osm=# \q
261-
>
262-
```
263-
264-
Activer PostGIS :
265-
266-
```bash
267-
psql -p 54342 -U $(whoami) osm -c "CREATE EXTENSION postgis;"
268-
```
269-
270-
Activer HSTore :
271-
272-
```bash
273-
psql -p 54342 -U $(whoami) osm -c "CREATE EXTENSION hstore;"
74+
port=54352
27475
```
27576

27677
----
27778

27879
## Les données
27980

280-
### Télécharger OSM sur la Belgique
81+
### Télécharger OSM sur Aix-en-Provence
28182

28283
![logo OpenStreetMap](https://cdn.geotribu.fr/img/logos-icones/OpenStreetMap/Openstreetmap.png "logo OpenStreetMap"){: .img-rdp-news-thumb }
28384

@@ -287,17 +88,10 @@ Un petit tour par GeoFabrik pour télécharger les données de la Belgique : <ht
28788

28889
On peut également utiliser un outil en ligne de commande, par exemple `wget` avec l'option `-N` qui permet de télécharger uniquement si le fichier distant (ici le serveur GeoFabrik) est plus récent par rapport à la version locale (sur votre machine) :
28990

290-
```bash
291-
wget -N https://download.geofabrik.de/europe/belgium-latest.osm.pbf -P /tmp/osmdata/belgium
91+
```sh
92+
wget -N http://download.geofabrik.de/europe/france/provence-alpes-cote-d-azur-latest.osm.pbf -P /tmp/osmdata/paca
29293
```
29394

294-
<video width="100%" controls>
295-
<!-- markdownlint-disable MD033 -->
296-
<source src="https://cdn.geotribu.fr/img/articles-blog-rdp/articles/qgis_ferraris/wget_osm_geofabrik_belgium.webm" type="video/webM">
297-
Votre navigateur ne supporte pas la balise video HTML 5.
298-
<!-- markdownlint-enable MD033 -->
299-
</video>
300-
30195
### Optionnel : découper les données
30296

30397
![logo Osmium Tool](https://cdn.geotribu.fr/img/logos-icones/logiciels_librairies/osmium.svg "logo Osmium Tool"){: .img-rdp-news-thumb }
@@ -310,10 +104,10 @@ On installe [Osmium](https://osmcode.org/osmium-tool/) :
310104
sudo apt install osmium-tool
311105
```
312106

313-
Et on découpe sur la zone qui nous intéresse, par exemple Bruxelles :
107+
Et on découpe sur la zone qui nous intéresse, par exemple Aix-en-Provence :
314108

315109
```sh
316-
osmium extract -b 4.29,50.815,4.47,50.90 /tmp/osmdata/belgium/belgium-latest.osm.pbf -o /tmp/osmdata/belgium/brussels.osm.pbf
110+
osmium extract -b 5.21,43.42,5.72,43.66 /tmp/osmdata/paca/provence-alpes-cote-d-azur-latest.osm.pbf -o /tmp/osmdata/paca/aixenprovence.osm.pbf
317111
```
318112

319113
!!! tip "Vigilance"
@@ -322,76 +116,9 @@ osmium extract -b 4.29,50.815,4.47,50.90 /tmp/osmdata/belgium/belgium-latest.osm
322116
### Import des données
323117

324118
```bash
325-
osm2pgsql --create --database osm --port 54342 --cache 1000 --number-processes 4 /tmp/osmdata/belgium/belgium-latest.osm.pbf
326-
# si vous avez utilisez la commande osmium pour découper les données sur Bruxelles
327-
# osm2pgsql --create --database osm --port 54342 --cache 1000 --number-processes 4 /tmp/osmdata/belgium/brussels.osm.pbf
119+
osm2pgsql --create --database osm_ferrargis --port 54352 --cache 1000 --number-processes 4 /tmp/osmdata/paca/aixenprovence.osm.pbf
328120
```
329121

330-
Détail des options :
331-
332-
- `--create` : créer les données, quitte à les écraser si elles existent déjà dans la base
333-
- `--database` : nom de la base de données
334-
- `--port` : port de connexion à la base de données
335-
- `--cache` : gère la taille du cache (en MB) à allouer pour l'import des noeuds OSM. Je pensais au début que la valeur par défaut (800) suffirait mais j'ai eu l'erreur : *Node cache size is too small to fit all nodes. Please increase cache size*. Dépend de la RAM de votre machine.
336-
- `--number-processes` : nom de processus à utiliser pour paralléliser les tâches qui peuvent l'être
337-
338-
Pour celles et ceux que ça intéresse, voici le détail de l'exécution sur mon ordinateur qui a pris 187 secondes :
339-
340-
<!-- markdownlint-disable MD046 -->
341-
??? example "Le détail de l'exécution sur ma machine"
342-
343-
```bash
344-
> osm2pgsql --create --database osm --port 54342 --cache 1000 --number-processes 4 /tmp/osmdata/belgium/belgium-latest.osm.pbf
345-
osm2pgsql version 1.2.1 (64 bit id space)
346-
347-
Allocating memory for dense node cache
348-
Allocating dense node cache in one big chunk
349-
Allocating memory for sparse node cache
350-
Sharing dense sparse
351-
Node-cache: cache=1000MB, maxblocks=16000*65536, allocation method=3
352-
Using built-in tag processing pipeline
353-
Using projection SRS 3857 (Spherical Mercator)
354-
Setting up table: planet_osm_point
355-
Setting up table: planet_osm_line
356-
Setting up table: planet_osm_polygon
357-
Setting up table: planet_osm_roads
358-
359-
Reading in file: /tmp/osmdata/belgium/belgium-latest.osm.pbf
360-
Using PBF parser.
361-
Processing: Node(53962k 8993.7k/s) Way(8267k 145.05k/s) Relation(81920 11702.86/s) parse time: 70s
362-
Node stats: total(53962322), max(9777797946) in 6s
363-
Way stats: total(8267595), max(1064657400) in 57s
364-
Relation stats: total(87197), max(14192617) in 7s
365-
node cache: stored: 53962322(100.00%), storage efficiency: 50.16% (dense blocks: 170, sparse nodes: 53094157), hit rate: 100.00%
366-
Sorting data and creating indexes for planet_osm_point
367-
Sorting data and creating indexes for planet_osm_line
368-
Sorting data and creating indexes for planet_osm_roads
369-
Sorting data and creating indexes for planet_osm_polygon
370-
Copying planet_osm_roads to cluster by geometry finished
371-
Creating geometry index on planet_osm_roads
372-
Copying planet_osm_point to cluster by geometry finished
373-
Creating geometry index on planet_osm_point
374-
Creating indexes on planet_osm_roads finished
375-
All indexes on planet_osm_roads created in 5s
376-
Completed planet_osm_roads
377-
Creating indexes on planet_osm_point finished
378-
All indexes on planet_osm_point created in 15s
379-
Completed planet_osm_point
380-
Copying planet_osm_line to cluster by geometry finished
381-
Creating geometry index on planet_osm_line
382-
Creating indexes on planet_osm_line finished
383-
Copying planet_osm_polygon to cluster by geometry finished
384-
Creating geometry index on planet_osm_polygon
385-
All indexes on planet_osm_line created in 44s
386-
Completed planet_osm_line
387-
Creating indexes on planet_osm_polygon finished
388-
All indexes on planet_osm_polygon created in 117s
389-
Completed planet_osm_polygon
390-
391-
Osm2pgsql took 187s overall
392-
```
393-
<!-- markdownlint-enable MD046 -->
394-
395122
----
396123

397124
## La carto sur QGIS

0 commit comments

Comments
 (0)