Il arrive parfois que toutes les tables d’un schéma doivent être reprojetées. Pour cela, deux opérations doivent être menées :
- Modifier le modificateur de type de la colonne géométrique.
Par exemple degeometry(point, 2154)
versgeometry(point, 3857)
. - Reprojeter la donnée elle même grâce à la fonction
ST_Transform()
.
Voici une procédure qui permet d’effectuer toutes ces opérations d’un seul coup.
-- Procédure de reprojection à la volée de toutes les tables d'un schéma DO $CORPS$ DECLARE -- Nom du schéma à traiter schema_exe text := 'mon_schema'; -- SRID final à utiliser srid_final text := '2154'; -- Tables à traiter table_traite record; BEGIN -- Pour chaque table géométrique du schéma à traiter FOR table_traite IN -- Récupération de la liste des table et des colonnes geom EXECUTE $a$SELECT t1.table_schema, t1.table_name, t2.f_geometry_column as geometry_column, t2.srid, t2.type FROM information_schema."tables" AS t1 LEFT JOIN public.geometry_columns AS t2 ON t1.table_schema = t2.f_table_schema AND t1.table_name = t2.f_table_name WHERE t1.table_schema = '$a$ || schema_exe || $a$' AND t1.table_type = 'BASE TABLE' AND t2.f_geometry_column IS NOT NULL$a$ LOOP RAISE NOTICE USING MESSAGE = $a$ $a$ || chr(10) || $a$Colonne : $a$ || chr(10) || $a$ $a$ || quote_ident(table_traite.table_schema) || $b$.$b$ || quote_ident(table_traite.table_name) || $c$.$c$ || quote_ident(table_traite.geometry_column) ; -- On modifie la table que dans le cas où elle possède un système de coordonnées différent IF table_traite.srid::text <> srid_final THEN RAISE NOTICE USING MESSAGE = $a$ => Reprojection de $a$ || table_traite.srid || $b$ vers $b$ || srid_final; -- Création d'une transaction dédiée pour pouvoir récupérer les erreurs éventuelles BEGIN -- Modification de la table EXECUTE $a$ALTER TABLE $a$ || quote_ident(table_traite.table_schema) || $a$.$a$ || quote_ident(table_traite.table_name) || $a$ ALTER COLUMN $a$ || quote_ident(table_traite.geometry_column) || $a$ TYPE Geometry($a$ || table_traite.type || $a$, $a$ || srid_final || $a$) USING ST_Transform($a$ || quote_ident(table_traite.geometry_column) || $a$, $a$ || srid_final || $a$)$a$; -- Récupération des éventuelles erreurs (si la table est utilisée par une vue ou un trigger) EXCEPTION WHEN OTHERS THEN RAISE WARNING USING MESSAGE = ' /!\ Reprojection impossible' || chr(10) || ' ' || SQLSTATE || ' - ' || SQLERRM ; END; ELSE RAISE NOTICE USING MESSAGE = $a$ => Table déjà dans le système de coordonnées $a$ || srid_final; END IF; END LOOP; END; $CORPS$ ;
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 :
BDDPostGISPostgreSQLProgrammationSIGSQL reprojectionsrid