Vous appréciez mon travail ?
Je serais ravi de prendre un café !

Vous prenez du plaisir à lire mes articles ? Vous apprenez de nouvelles choses ? Je serais ravis que vous supportiez mon travail avec une petite participation

1 café Merci, vous financez ma dose quotidienne de théïne (oui, en vrai je ne bois pas de café).
5 cafés Génial, ça couvre mes frais de serveur mensuels.
10 cafés Fantastique, avec ça je peux investir dans du matériel et approfondir mes connaissances.
BazinGa's - Tips & tuto IT

PostgreSQL – Utilitaire – raster2pgsql

Raster2pgsql

PostgreSQL peut stocker tous types de médias et pour cela, il utilise le format binaire. Raster2pgsql tire partie de cette fonctionnalité pour importer des rasters directement dans Postgresql.

Voici un exemple de ligne de commande :

# Exemple d'import
raster2pgsql -s 4326 -I -C -M -F -t 100x100 monfichier.tif mon_schema.ma_table | psql -d ma_base

Voici la liste des options les plus courantes :

  • -? : Aide
  • -G : Format supportés

Options exclusives :

  • -c : Nouvelle table (mode par défaut)
  • -a : Ajout dans une table existante
  • -d : Supprime la table et en recréé une avec le raster
  • -p : Créé juste la table : prépare

Création du raster (paramètres optionnels) :

  • -s 3857 : Spécifier le SRID (si pas d’info, le SRID du raster d’origine est utilisé).
  • -b 1,3 : Bande à extraire du raster (si non spécifié, toutes les bandes sont extraites).
  • -t 100x100 : Taille des tuiles (largeurxhauteur). Cette option coupe le raster en tuiles, chacune insérée dans une ligne. « auto » permet d’avoir une taille automatique.
  • -P : Compléter les tuiles les plus à droite et les plus en bas pour s’assurer d’avoir la même largeur/hauteur pour toutes les tuiles.
  • -l 2,5,10 : Créé une ou plusieurs (séparé par des virgules) miniatures du raster avec le facteur de réduction indiqué. Le stockage de ces miniatures se fait dans des tables séparées nommées sur le motif suivant : o_facteur_table avec facteur, le facteur de réduction et table, le nom de la table contenant le raster de base.
  • -N NODATA : Valeur des NODATA lorsque celle-ci n’est pas définie dans le raster originel.
  • -C : Créer les contraintes raster (obligatoire pour utiliser le raster dans Qgis par exemple).
  • -R : Importer uniquement les métadonnées et l’emplacement des fichiers raster mais pas le fichier en lui même (les pixels).
    Ce mode permet d’avoir une gestion externalisée des rasters.

Paramètres optionnels pour manipuler les objets de la base

  • -q : Utiliser des appostrophe pour encadrer les identifiants PostgreSQL
  • -f ma_colonne : Nom de la colonne contenant le raster (par défaut ‘rast’).
  • -F : Ajouter une colonne contenant le nom du fichier.
  • -n ma_colonne : Indique le nom de la colonne contenant le nom du fichier. Implique -F.
  • -I : Créer un index GiST sur la colonne raster.
  • -M : Vacuum analyse sur la table raster.
  • -k : Sauter la vérification des valeur NODATA.
  • -T tablespace : Indiquer le tablespace pour la nouvelle table.
  • -X tablespace : Indiquer le tablespace pour le nouvel index. S’applique à la clé primaire et à l’index spatial si -I est utilisé.
  • -Y : Utiliser COPY au lien de INSERT. e transactions individuelles.
  • -e : Exécuter chaque requête individuellement au lieu d’utiliser une transaction.

Quelques tips :

  • Le raster ne peut faire plus de 65535px par 65535px.
  • Le tif donne du noir et blanc.

Quelques exemples :

# Exemple 1 :
raster2pgsql -s 4326 -I -C -M -F -t 100x100 monfichier.tif mon_schema.ma_table | psql -d ma_base

# Exemple 2 : Intégration de tous les fichiers .jpg du dossier rasterfiles
raster2pgsql -I -C -e -Y -F -s 26986 -t 128x128  -l 2,4 rasterfiles/*.jpg mon_schema.ma_table | psql -U postgres -d ma_base -h localhost -p 5432

# Exemple 3 :
raster2pgsql -C -c -e -I -l 2,4,8,16,32 -M -s 2154 -t 256x256 C:\Users\mon_user\document\mon_raster.tif raster.mon_raster | psql -h 127.0.0.1 -p 5432 -U postgres -d ma_base

Quelques notions supplémentaires

Format

Le stockage d’un raster avec l’utilitaire raster2pgsql se fait sous un format tuilé. En effet, le raster est beaucoup plus facilement et rapidement accessible s’il est tuilé que s’il est d’un seul bloc.

Ainsi, un table correspondra à un raster et chaque ligne de cette table à une tuile du raster.

Les miniatures générées avec l’option -l (et stockée dans les tables suivant le motif o_facteur_table) suivent également ce principe : une table par miniature contenant une tuile de cette miniature par ligne.

Rasters externalisés (out-db)

Par défaut, raseter2pgsql stocke le contenu du raster dans la base de données. Il s’agit du mode in-db : le raster est stocké dans la BDD.

Il est cependant possible de conserver les rasters sous forme de fichier plat tout en les référençant dans la base votre base PostgreSQL. Il s’agit du mode out-db. Pour cela, vous devez utiliser l’option -R lors de l’importation. Ainsi, seules les métadonnées du raster et le chemin vers son emplacement sont stockés en base.

L’intérêt est que vous pouvez utiliser les fonctions Postgis Raster (uniquement en lecture, pas d’écriture sur le raster) tout en conservant vos fichiers plats pour d’autres utilisations.

Contraintes

Lorsqu’un raster est stockées sous PostgreSQL, il est nécessaire de mettre en place plusieurs contraintes (au sens contraintes PostgreSQL) qui vont être utilisées pour afficher les informations relatives au raster dans la table raster_columns. Sans ces contraintes, il sera notamment impossible d’utiliser le raster avec un logiciel de SIG.

L’option -C de raster2pgsql permet de créer ces contraintes automatiquement. Il vous est cependant possible de créer ou de supprimer ces contraintes à postériori. Cela vous sera utile lorsque vous souhaiterez compléter votre raster par un import avec l’option -a (par exemple si vous souhaitez étendre votre raster avec de nouvelles images pour couvrir un plus grand territoire).

Voici quelques fonctions intéressantes :

-- Fonction d'ajout de toutes les contraintes raster
AddRasterConstraints('mon_schema'::name, 'ma_table_raster'::name, 'ma_colonne_raster'::name)

-- Spécification des contraintes à ajouter 
AddRasterConstraints('mon_schema'::name, 'ma_table_raster'::name, 'ma_colonne_raster'::name, 'ma_contrainte_1', 'ma_contrainte_2')

-- Contraintes à choisir parmi :
-- 	blocksize : contraindre la largeur et la largeur de chaque tuile en pixel
-- 	blocksize_x : contraindre la largeur de chaque tuile en pixel
-- 	blocksize_y : contraindre la hauteur de chaque tuile en pixel
-- 	extent : contraindre l'emprise maximal de la totalité des tuiles composant le raster
-- 	num_bands : nombre de bande
-- 	pixel_types : contraindre le type de pixel de chaque bande
-- 	regular_blocking : s'assure de l'unicité spatiale (il n'existe pas deux tuile identiques) et l'alignement des tuiles
-- 	same_alignment : s'assurer que toutes les tuiles possèdent le même alignement
-- 	srid : contraindre un même srid pour toutes les tuiles
-- Fonction d'ajout de toutes les contraintes raster
DropRasterConstraints('mon_schema'::name, 'ma_table_raster'::name, 'ma_colonne_raster'::name)

-- Spécification des contraintes à ajouter 
DropRasterConstraints('mon_schema'::name, 'ma_table_raster'::name, 'ma_colonne_raster'::name, 'ma_contrainte_1', 'ma_contrainte_2')

-- Contraintes à choisir parmi :
-- 	blocksize : contraindre la largeur et la largeur de chaque tuile en pixel
-- 	blocksize_x : contraindre la largeur de chaque tuile en pixel
-- 	blocksize_y : contraindre la hauteur de chaque tuile en pixel
-- 	extent : contraindre l'emprise maximal de la totalité des tuiles composant le raster
-- 	num_bands : nombre de bande
-- 	pixel_types : contraindre le type de pixel de chaque bande
-- 	regular_blocking : s'assure de l'unicité spatiale (il n'existe pas deux tuile identiques) et l'alignement des tuiles
-- 	same_alignment : s'assurer que toutes les tuiles possèdent le même alignement
-- 	srid : contraindre un même srid pour toutes les tuiles

Concernant les miniatures, il existe d’autres contraintes qui vont être utilisées pour afficher les informations relatives aux miniatures du raster dans la table raster_overviews.

-- Fonction d'ajout de contraintes de miniatures
AddOverviewConstraints('mon_schema_miniature', 'ma_table_raster_miniature', 'ma_colonne_raster_miniature', 'mon_schema_reference', 'ma_table_raster_reference', 'ma_colonne_raster_reference', facteur_reduction)

-- Le facteur de réduction est un nombre entier représentant le facteur diviseur de la miniature par rapport au raster référence (plus le chiffre est haut et plus basse est la résolution de la miniature)
-- Fonction de suppression de contraintes de miniatures
DropOverviewConstraints('mon_schema_miniature', 'ma_table_raster_miniature', 'ma_colonne_raster_miniature')

Pour aller plus loin

La documentation :

Cet article fait parti du cours sur PostgreSQL, partie 8 du Vade-mecum.


Cet article vous a plu ?

N'hésitez pas à le partager, il interessera surement certains de vos contacts.

Les thèmes suivants contiennent des articles en lien avec celui-ci, allez faire un tour :

BDDPostGISPostgreSQLSIG

50%