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

Reprojeter toutes les tables d’un schéma

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 de geometry(point, 2154) vers geometry(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

50%