{"id":48178393,"url":"https://github.com/rok4/pregeneration","last_synced_at":"2026-04-04T17:40:43.502Z","repository":{"id":78085727,"uuid":"465220594","full_name":"rok4/pregeneration","owner":"rok4","description":"Outils de pré-génération des pyramides de données","archived":false,"fork":false,"pushed_at":"2025-10-24T14:44:29.000Z","size":1374,"stargazers_count":0,"open_issues_count":1,"forks_count":2,"subscribers_count":5,"default_branch":"develop","last_synced_at":"2025-10-24T16:29:05.306Z","etag":null,"topics":["parallelization","prework"],"latest_commit_sha":null,"homepage":"","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rok4.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-03-02T08:33:34.000Z","updated_at":"2025-10-24T14:42:19.000Z","dependencies_parsed_at":"2024-11-21T10:21:31.293Z","dependency_job_id":"04aab7c0-dac2-4824-bdda-dc5d33765d8d","html_url":"https://github.com/rok4/pregeneration","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/rok4/pregeneration","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rok4%2Fpregeneration","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rok4%2Fpregeneration/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rok4%2Fpregeneration/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rok4%2Fpregeneration/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rok4","download_url":"https://codeload.github.com/rok4/pregeneration/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rok4%2Fpregeneration/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31407648,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["parallelization","prework"],"created_at":"2026-04-04T17:40:42.877Z","updated_at":"2026-04-04T17:40:43.496Z","avatar_url":"https://github.com/rok4.png","language":"Perl","readme":"# Outils de pré-génération\n\nLes outils de pré-génération font partie du projet open-source ROK4 (sous licence CeCILL-C) développé par les équipes du projet [Géoportail](https://www.geoportail.gouv.fr)([@Geoportail](https://twitter.com/Geoportail)) de l’[Institut National de l’Information Géographique et Forestière](https://ign.fr) ([@IGNFrance](https://twitter.com/IGNFrance)). Ils sont écrits en perl et travaillent en amont lors de la génération d'une pyramide raster ([BE4](#be4), [JOINCACHE](#joincache)) ou vecteur ([4ALAMO](#4alamo)), d'une recopie de pyramide ([PYR2PYR](#pyr2pyr)) ou du recalcul de tête d'une pyramide raster ([4HEAD](#4head))\n\nCes outils identifient le travail à réaliser et le répartissent dans des scripts BASH, selon un niveau de parallélisation choisi. C'est l'exécution de ces derniers qui écrit les dalles des pyramides.\n\nCes scripts utilisent les outils de [génération du projet](https://github.com/rok4/generation), ainsi que des commandes externes.\n\nIl est possible que les scripts BASH sachent faire de la reprise sur erreur. Dans chaque dossier temporaire individuel, un fichier liste contient le travail déjà réalisé. Au lancement du script, si ce fichier liste existe déjà, il identifie la dernière dalle générée et ignorera toutes les instructions jusqu'à retomber sur cette dalle. On peut donc en cas d'erreur relancer le script sans paramétrage et reprendre où il en était à l'exécution précédente.\n\nDe même, un fichier .prog à côté du script peut être mis à jour avec le pourcentage de progression (calculé à partir des lignes du script).\n\n## Installation depuis le paquet debian\n\nTélécharger les paquets sur GitHub : \n\n* [Les librairies Core](https://github.com/rok4/core-perl/releases/)\n* [Les outils](https://github.com/rok4/pregeneration/releases/)\n\n```\napt install ./librok4-core-perl-\u003cversion\u003e-linux-all.deb\napt install ./rok4-pregeneration-\u003cversion\u003e-linux-all.deb\n```\n\n## Installation depuis les sources\n\nDépendances (paquets debian) :\n\n* perl-base\n* [librok4-core-perl](https://github.com/rok4/core-perl/releases/)\n* libfindbin-libs-perl\n* libmath-bigint-perl\n* liblog-log4perl-perl\n* libjson-parse-perl\n* libjson-perl\n\n```\nperl Makefile.PL INSTALL_BASE=/usr VERSION=0.0.1 PREREQ_FATAL=1\nmake\nmake injectversion\nmake install\n```\n\n## Variables d'environnement utilisées dans les librairies ROK4::Core\n\nLeur définition est contrôlée à l'usage.\n\n* `ROK4_TMS_DIRECTORY` pour y chercher les Tile Matrix Sets. Ces derniers peuvent être téléchargés sur [GitHub](https://github.com/rok4/tilematrixsets/releases/), installés depuis le paquet debian et seront alors dans le dossier `/usr/share/rok4/tilematrixsets`.\n* Pour le stockage CEPH\n    - `ROK4_CEPH_CONFFILE`\n    - `ROK4_CEPH_USERNAME`\n    - `ROK4_CEPH_CLUSTERNAME`\n* Pour le stockage S3\n    - `ROK4_S3_URL`\n    - `ROK4_S3_KEY`\n    - `ROK4_S3_SECRETKEY`\n* Pour le stockage SWIFT\n    - `ROK4_SWIFT_AUTHURL`\n    - `ROK4_SWIFT_USER`\n    - `ROK4_SWIFT_PASSWD`\n    - `ROK4_SWIFT_PUBLICURL`\n    - Si authentification via Swift\n        - `ROK4_SWIFT_ACCOUNT`\n    - Si connection via keystone (présence de `ROK4_KEYSTONE_DOMAINID`)\n        - `ROK4_KEYSTONE_DOMAINID`\n        - `ROK4_KEYSTONE_PROJECTID`\n* Pour configurer l'agent de requête (intéraction SWIFT et S3)\n    - `ROK4_SSL_NO_VERIFY`\n    - `HTTP_PROXY`\n    - `HTTPS_PROXY`\n    - `NO_PROXY`\n\n## Présentation des outils\n\n### BE4\n\nL'outil BE4 génère une pyramide raster à partir d'images géoréférencées ou d'un service WMS. Il permet de mettre à jour une pyramide raster existante. Si des images sont en entrée, elles peuvent être converties à la volée dans le format de la pyramide en sortie. Il est également possible d'appliquer aux images en entrée un style, comme le calcul de pente à partir de données MNT.\n\nStockages gérés : FICHIER, CEPH, S3, SWIFT\n\nParallélisable, reprise sur erreur, progression.\n\nOutils de génération utilisés :\n\n* cache2work\n* checkWork\n* composeNtiff\n* decimateNtiff\n* merge4tiff\n* mergeNtiff\n* work2cache\n\nOutils externes utilisés :\n\n* wget\n\n#### Usage\n\n`be4.pl --conf /home/IGN/conf.json [--help|--usage|--version]`\n\n* `--help` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--usage` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--version` Affiche la version de l'outil et quitte\n* `--conf \u003cfile path\u003e` Execute l'outil en prenant en compte ce fichier de configuration\n\n#### Détails\n\n_Étape 1_\n![BE4 étape 1](./docs/images/be4_part1.png)\n\n_Étape 2 (QTree)_\n![BE4 étape 2 QTree](./docs/images/be4_part2_qtree.png)\n\n_Étape 2 (NNGraph)_\n![BE4 étape 2 NNGraph](./docs/images/be4_part2_nngraph.png)\n\n\n#### Exemples de configuration\n\nGénération d'une nouvelle pyramide depuis des images géoréférencées type MNT, avec application d'un style de pente. Les styles peuvent être téléchargés sur [GitHub](https://github.com/rok4/styles/releases/), installés depuis le paquet debian et seront alors dans le dossier `/etc/rok4/styles`.\n\n```json\n{\n    \"logger\": {\n        \"level\": \"INFO\",\n        \"layout\": \"%5p : %m (%M) %n\"\n    },\n    \"datasources\": [\n        {\n            \"top\": \"0\",\n            \"bottom\": \"\u003cAUTO\u003e\",\n            \"source\": {\n                \"type\": \"IMAGES\",\n                \"directory\": \"/data/RGEALTI5M\",\n                \"srs\": \"IGNF:LAMB93\"\n            }\n        }\n    ],\n    \"pyramid\": {\n        \"type\": \"GENERATION\",\n        \"name\": \"RGEALTI\",\n        \"compression\": \"zip\",\n        \"tms\": \"LAMB93_1M_MNT.json\",\n        \"storage\": {\n            \"type\": \"FILE\",\n            \"root\": \"/data/tsatabin/PYRAMIDS\"\n        },\n        \"nodata\": [0,0,0,0],\n        \"pixel\": {\n            \"sampleformat\": \"UINT8\",\n            \"samplesperpixel\": 4\n        }\n    },\n    \"process\": {\n        \"directories\": {\n            \"scripts\": \"/scripts\",\n            \"local_tmp\": \"/tmp\",\n            \"shared_tmp\": \"/share\"\n        },\n        \"parallelization\": 1,\n        \"style\": \"/etc/rok4/styles/montagne.json\"\n    }\n}\n```\n\nMise à jour par référence d'une pyramide S3 par moissonnage d'un service WMS\n\n```json\n{\n    \"logger\": {\n        \"level\": \"INFO\",\n        \"layout\": \"%5p : %m (%M) %n\"\n    },\n    \"datasources\": [\n        {\n            \"top\": \"\u003cAUTO\u003e\",\n            \"bottom\": \"8\",\n            \"source\": {\n                \"type\": \"WMS\",\n                \"area\": {\n                    \"bbox\": [5,45,6,46],\n                    \"srs\": \"EPSG:4326\"\n                },\n                \"layers\": \"GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2\",\n                \"url\": \"https://wxs.ign.fr/essentiels/geoportail/r/wms\"\n            }\n        },\n        {\n            \"top\": \"\u003cAUTO\u003e\",\n            \"bottom\": \"12\",\n            \"source\": {\n                \"type\": \"WMS\",\n                \"area\": {\n                    \"bbox\": [5,45,6,46],\n                    \"srs\": \"EPSG:4326\"\n                },\n                \"layers\": \"GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2\",\n                \"url\": \"https://wxs.ign.fr/essentiels/geoportail/r/wms\"\n            }\n        }\n    ],\n    \"pyramid\": {\n        \"type\": \"UPDATE\",\n        \"name\": \"PLANIGNV2_UPDATED\",\n        \"pyramid_to_update\": \"s3://bucket/pyramides/PLANIGNV2.json\",\n    },\n    \"process\": {\n        \"directories\": {\n            \"scripts\": \"/scripts\",\n            \"local_tmp\": \"/tmp\",\n            \"shared_tmp\": \"/share\"\n        },\n        \"parallelization\": 1\n    }\n}\n```\n\n### JOINCACHE\n\nL'outil JOINCACHE génèrent une pyramide raster à partir d'autres pyramide raster compatibles (même TMS, dalles de même dimensions, canaux au même format). La composition se fait verticalement (choix des pyramides sources par niveau) et horizontalement (choix des pyramides source par zone au sein d'un niveau). La fusion de plusieurs dalles sources peut se faire selon plusieurs méthodes (masque, alpha top, multiplication)\n\nStockages gérés : FICHIER, CEPH, S3, SWIFT\n\nParallélisable, reprise sur erreur, progression.\n\nOutils de génération utilisés :\n\n* cache2work\n* overlayNtiff\n* work2cache\n\n#### Usage\n\n`joincache.pl --conf /home/IGN/conf.json [--help|--usage|--version]`\n\n* `--help` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--usage` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--version` Affiche la version de l'outil et quitte\n* `--conf \u003cfile path\u003e` Execute l'outil en prenant en compte ce fichier de configuration principal\n\n#### Détails\n\n_Étape 1_\n![JOINCACHE étape 1](./docs/images/joinCache_part1.png)\n\n_Étape 2_\n![JOINCACHE étape 2](./docs/images/joinCache_part2.png)\n\n\n#### Exemples de configuration\n\nGénération d'une pyramide par fusion de 2 pyramides CEPH, avec conversion des canaux\n\n```json\n{\n    \"logger\": {\n        \"level\": \"WARN\",\n        \"layout\": \"%5p : %m (%M) %n\",\n        \"file\": \"/var/log/joincache.log\"\n    },\n    \"datasources\": [\n        {\n            \"top\": \"0\",\n            \"bottom\": \"10\",\n            \"source\": {\n                \"type\": \"PYRAMIDS\",\n                \"area\": {\n                    \"bbox\": [\n                        -572324.2901945519,\n                        5061666.243846581,\n                        1064224.752260841,\n                        6637050.045897862\n                    ]\n                },\n                \"descriptors\": [\n                    \"ceph:///pool/pyramids/NORD.json\",\n                    \"ceph:///pool/pyramids/SUD.json\"\n                ]\n            }\n        }\n    ],\n    \"pyramid\": {\n        \"name\": \"ENTIER\",\n        \"root\": \"pool\",\n        \"pixel\": {\n            \"samplesperpixel\": 1,\n            \"sampleformat\": \"UINT8\"\n        },\n        \"nodata\": [255],\n        \"compression\": \"png\"\n    },\n    \"process\": {\n        \"directories\": {\n            \"scripts\": \"/scripts\",\n            \"local_tmp\": \"/tmp\",\n            \"shared_tmp\": \"/share\"\n        },\n        \"parallelization\": 1,\n        \"merge_method\": \"TOP\",\n        \"mask\": true\n    }\n}\n```\n\n### 4ALAMO\n\nL'outil 4ALAMO génèrent une pyramide vecteur à partir d'une base de données PostgreSQL ou de fichiers vecteurs. Ils permettent de mettre à jour une pyramide vecteur existante.\n\nStockages gérés : FICHIER, CEPH, S3, SWIFT\n\nParallélisable, reprise sur erreur, progression.\n\nOutils de génération utilisés :\n\n* pbf2cache\n\nOutils externes utilisés :\n\n* ogr2ogr\n* tippecanoe\n\n#### Usage\n\n`4alamo.pl --conf /home/IGN/conf.json [--help|--usage|--version]`\n\n* `--help` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--usage` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--version` Affiche la version de l'outil et quitte\n* `--conf \u003cfile path\u003e` Execute l'outil en prenant en compte ce fichier de configuration\n\n#### Détails\n\n_Étape 1_\n![4ALAMO étape 1](./docs/images/4alamo_part1.png)\n\n_Étape 2_\n![4ALAMO étape 2](./docs/images/4alamo_part2.png)\n\n#### Exemples de configuration\n\nMise à jour par injection d'une pyramide SWIFT à partir de tables PostgreSQL\n\n```json\n{\n   \"logger\": {\n      \"level\": \"ERROR\",\n      \"layout\": \"%5p : %m (%M) %n\"\n   },\n   \"datasources\": [\n      {\n         \"top\": \"4\",\n         \"bottom\": \"9\",\n         \"source\": {\n            \"type\": \"POSTGRESQL\",\n            \"area\": {\n               \"bbox\": [10,45,15,50]\n            },\n            \"srs\": \"EPSG:4326\",\n            \"db\" : {\n               \"user\" : \"reader\",\n               \"password\" : \"reader\",\n               \"database\" : \"geodata\",\n               \"host\" : \"postgresql.internal\"\n            },\n            \"tables\" : [\n               {\n                  \"schema\" : \"essentiels\",\n                  \"native_name\" : \"region\",\n                  \"attributes\" : [\"*\"]\n               }\n            ]\n         }\n      },\n      {\n         \"top\": \"10\",\n         \"bottom\": \"12\",\n         \"source\": {\n            \"type\": \"POSTGRESQL\",\n            \"area\": {\n               \"bbox\": [10,45,15,50]\n            },\n            \"srs\": \"EPSG:4326\",\n            \"db\" : {\n               \"user\" : \"reader\",\n               \"password\" : \"reader\",\n               \"database\" : \"geodata\",\n               \"host\" : \"postgresql.internal\"\n            },\n            \"tables\" : [\n               {\n                  \"schema\" : \"essentiels\",\n                  \"native_name\" : \"departement\",\n                  \"attributes\" : [\"*\"]\n               },\n               {\n                  \"schema\" : \"essentiels\",\n                  \"native_name\" : \"region\",\n                  \"attributes\" : [\"*\"]\n               }\n            ]\n         }\n      }\n   ],\n   \"pyramid\": {\n      \"type\": \"INJECTION\",\n      \"pyramid_to_inject\": \"swift:///container/pyramids/LIMADM.json\"\n   },\n    \"process\": {\n        \"directories\": {\n            \"scripts\": \"/scripts\",\n            \"local_tmp\": \"/tmp\",\n            \"shared_tmp\": \"/share\"\n        },\n        \"parallelization\": 10\n    }\n}\n```\n\n### 4HEAD\n\nCet outil permet de regénérer des niveaux de la pyramide en partant d'un de ses niveaux. La pyramide est modifiée et sa liste, qui fait foi en terme de contenu de la pyramide, est mise à jour pour toujours correspondre au contenu final de la pyramide. L'outil perl modifie la liste et le descripteur et génère des script shell dont l'exécution modifiera les dalles de la pyramide. Seuls les niveaux entre celui de référence (non inclus) et le niveau du haut fournis (inclus) sont modifiés. Potentiellement des nouveaux niveaux sont ajoutés (lorsque l'outil est utilisé pour construire la tête de la pyramide qui n'existait pas).\n\nPar défaut, l'outil génère deux scripts (`SCRIPT_1.sh` et `SCRIPT_FINISHER.sh`). Si on précise un niveau de parallélisation (via l'option `--parallel`) de N, on aura alors N scripts `SCRIPT_X.sh` et toujours `SCRIPT_FINISHER.sh` pour regénérer l'ensemble des dalles. Tous les scripts `SCRIPT_X.sh` peuvent être exécuter en parallèle, mais il faut attendre la fin de tous ces scripts pour lancer `SCRIPT_FINISHER.sh`.\n\nLe script `main.sh` permet de lancer proprement tous ces scripts sur la même machine. Il ne permet donc pas de répartir les exécutions sur un pool de machine. L'appel à faire est loggé en fin d'exécution de `4head.pl`.\n\nStockages gérés : FICHIER, CEPH, S3, SWIFT\n\nParallélisable.\n\nTypes de pyramides gérés : RASTER QTREE\n\n##### Commande\n\n`4head.pl --pyr file:///home/ign/PYRAMID.pyr --tmsdir /home/ign/TMS/ --reference-level 19 --top-level 4 --tmp /home/ign/tmp/ --scripts /home/ign/scripts/ [--parallel 10] [--help|--usage|--version]`\n\n##### Options\n\n* `--help` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--usage` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--version` Affiche la version de l'outil et quitte\n* `--pyr` Précise le chemin vers le descripteur de la pyramide à modifier. Ce chemin est préfixé par le type de stockage du descripteur : `file://`, `s3://`, `ceph://` ou `swift://`\n* `--tmsdir` Précise le dossier contenant au moins le TMS utilisé par la pyramide à modifier\n* `--reference-level` Précise le niveau de la pyramide d'où partir pour regénérer les niveaux supérieurs\n* `--top-level` Précise le niveau jusqu'auquel regénérer les dalles\n* `--tmp` Précise un dossier à utiliser comme espace temporaire de génération. Il doit être partagé entre tous les scripts\n* `--script` Précise un dossier où écrire les scripts\n* `--parallel` Précise le nombre de scripts pour modifier les dalles du niveau au dessus du niveau de référence (Optionnel, 1 par défaut)\n\n### PYR2PYR\n\nOutil : `pyr2pyr.pl`\n\nCet outil copie une pyramide d'un stockage à un autre.\n\nConversions possibles :\n\n* FICHIER -\u003e FICHIER, CEPH, S3, SWIFT\n* CEPH -\u003e FICHIER, CEPH, S3, SWIFT\n* S3 -\u003e FICHIER\n\nParallélisable, reprise sur erreur, progression.\n\n#### Usage\n\n`pyr2pyr.pl --conf /home/IGN/conf.json [--help|--usage|--version]`\n\n* `--help` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--usage` Affiche le lien vers la documentation utilisateur de l'outil et quitte\n* `--version` Affiche la version de l'outil et quitte\n* `--conf \u003cfile path\u003e` Execute l'outil en prenant en compte ce fichier de configuration\n\n#### Détails\n\n_Étape 1_\n![PYR2PYR étape 1](./docs/images/pyr2pyr_part1.png)\n\n_Étape 2_\n![PYR2PYR étape 2](./docs/images/pyr2pyr_part2.png)\n\n\n#### Exemples de configuration\n\nRecopie d'une pyramide CEPH -\u003e SWIFT\n\n```json\n{\n    \"logger\": {\n        \"level\": \"DEBUG\",\n        \"layout\": \"%5p : %m (%M) %n\"\n    },\n    \"from\": {\n        \"descriptor\": \"ceph:///pool/pyramids/SCAN1000.json\"\n    },\n    \"to\": {\n        \"name\": \"pyramids/SCAN1000\",\n        \"storage\": {\n            \"type\": \"SWIFT\",\n            \"root\": \"container\"\n        }\n    },\n    \"process\": {\n        \"directories\": {\n            \"scripts\": \"/scripts\",\n            \"local_tmp\": \"/tmp\",\n            \"shared_tmp\": \"/share\"\n        },\n        \"parallelization\": 32,\n        \"follow_links\": true\n    }\n}\n```\n\n\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frok4%2Fpregeneration","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frok4%2Fpregeneration","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frok4%2Fpregeneration/lists"}