Renommer la table postGIS et mettre à jour le GeoServer?

9

Je veux renommer une de mes tables postGIS. Cependant, quand je fais cela en appliquant un simple

ALTER TABLE old_name RENAME TO new_name;

Si je comprends bien, les données spatiales ne sont pas mises à jour avec le nouveau nom. Tout d'abord, ces références peuvent-elles être corrigées en exécutant la fonction:

SELECT probe_geometry_columns()

La table elle-même est-elle OK après cela? Ou faut-il également prendre d'autres mesures? Deuxièmement, comment mettre à jour GeoServer pour qu'il trouve cette nouvelle table? À partir de maintenant, si j'exécute les commandes ci-dessus et modifie les informations de couche sur le GeoServer pour pointer vers le nouveau nom ... J'obtiens toujours une erreur (GeoServer essaie toujours de le trouver sous l'ancien nom). Exactement, où faut-il changer le nom de la couche sur le GeoServer?

Mimo
la source

Réponses:

4

Pour renommer la table, vous devrez changer le nom dans les métadonnées de deux emplacements. D'abord sur PostGIS, puis sur la configuration Geoserver.

Pour changer celui de PostGIS, vous pouvez mettre à jour les geometry_columns directement. Bien que probe_geometries aura pour effet d'insérer cette entrée dans les colonnes de géométrie, il aura également pour effet de DÉCRIRE le schéma de toutes les tables et d'insérer toutes les entrées de colonnes de géométrie manquantes. Si vous avez beaucoup de tables, cela peut coûter cher, alors pourquoi ne pas simplement mettre à jour la table geometry_columns directement?

Pour mettre à jour le géoserveur, vous disposez de plusieurs options. Vous pouvez certainement le faire manuellement via l'interface graphique, mais j'ai le sentiment que vous souhaitez l'automatiser. Écrire un script shell qui édite les fichiers de configuration dans le dossier d'installation du geoserver et redémarrer le geoserver, mais c'est aussi le long chemin à parcourir. Je vous recommande d'utiliser l'API de configuration geoserver REST qui vous permet de manipuler les configurations de couche via des appels RESTful .

Mise à jour:

Dans le cas où la "mise à jour des colonnes de géométrie" n'est pas évidente, procédez comme suit:

UPDATE geometry_columns set f_table_name = 'my_new_table_name' where f_table_name = 'my_old_table_name';

Mise à jour 8 ans (!!!) plus tard (2018):

Comme certaines personnes mentionnées ci-dessous, après PostGIS 2.0, les tables de métadonnées sont mises à jour automatiquement après l'instruction ALTER.

Ragi Yaser Burhum
la source
Pardonnez mon ignorance, mais comme je suis très nouveau sur PostGIS. Comment mettre à jour exactement geometry_columns? Vous ai-je bien compris que l'exécution de la fonction probe_ (sans aucun paramètre) fait la même chose?
Mimo
1
Regardez l'implémentation à partir de probe_geometry_columns trac.osgeo.org/postgis/changeset/7548 Il parcourt chaque table de la base de données, recherche si le schéma a la chaîne "geometrytype" et insère un nouvel enregistrement si l'entrée requise n'existe pas dans geometry_columns. Néanmoins, les enregistrements orphelins sont laissés tels quels. Alors pourquoi ne pas simplement faire: METTRE À JOUR les colonnes_de_gométrie SET f_table_name = 'new_table_name' où f_table_name = 'old_table_name'
Ragi Yaser Burhum
cela montreNot Found The requested URL /latest/en/user/restconfig/rest-config-api.html was not found on this server.
Scaramouche
vous voulez regarder ceci maintenant: docs.geoserver.org/stable/en/user/rest/api/index.html
Ragi Yaser Burhum
7

Notez que dans PostGIS 2.0+, tout ce que vous avez à faire est la normale

ALTER TABLE old_name RENAME TO new_name;

L'entrée dans la vue geometry_columns (ou geography_columns) sera également mise à jour.

Shane
la source
3
SELECT Probe_Geometry_Columns();

est un utilitaire pratique.

Tout d'abord, lorsque nous ajoutons une colonne de géométrie à une table existante avec

SELECT AddGeometryColumn('my_table', 'geo_column', 1234, 'MULTIPOINT', 2);

nous alimentons la fonction tout ce dont elle a besoin pour clouer la colonne de type géométrie (geo_column) dans la table spécifiée (my_table) et écrire les détails importants comme SRID (1234), type de géométrie (MULTIPOINT) et nombre de dimensions (2) pour la table geometry_columns. En substance, c'est un ALTER et trois UPDATES.

La création de colonnes de géométrie par d'autres moyens (chargées à partir d'un fichier de formes, sélectionnées dans un CREATE TABLE AS, etc.) peut conduire à des tables spatiales invisibles pour les applications externes, bien qu'elles fonctionnent très bien dans la base de données. Sans les bons détails stockés dans geometry_columns, les valeurs de géométrie réelles apparaissent sous forme de chaînes de caractères absurdes pour les applications à la recherche de points, lignes ou polygones projetés.

L'appel de la fonction de sonde vérifie chaque colonne de type geometry, ajoutant de nouvelles valeurs à geometry_columns et signalant les conflits.

En revenant à votre question, GeoServer ne pense pas que la table renommée contient des données spatiales si le changement de nom n'est pas reflété dans geometry_columns. Une autre chose à considérer est que la fonction de sonde crée un enregistrement en double reflétant le nouveau nom de la table mais ne se débarrasse pas de l'enregistrement d'origine - un autre blocage potentiel pour GeoServer.

Cela dit, je vous suggère: 1) d'exécuter la sonde puis de supprimer immédiatement l'ancien enregistrement; ou 2) suivez votre changement de nom avec un ALTER sur geometry_columns pour changer la valeur f_table_name.

Désolé pour la verbosité, mais j'espère que cela aide.

rec.thegeom
la source
Merci pour votre réponse. Je commence à mieux comprendre postGIS maintenant. Pourtant, je ne suis pas certain des mesures nécessaires à prendre. Dois-je tout d'abord effectuer le changement de nom, puis la sonde ()? Comment modifier les geometry_columns?
Mimo
Le moyen le plus simple d'effectuer le changement dans geometry_columns est d'ouvrir pgAdmin, de cliquer avec le bouton droit sur la table, de sélectionner les données d'affichage, de sélectionner toutes les lignes, de cliquer dans la cellule contenant l'ancien nom de la table et de taper le nouveau nom de la table. ou, UPDATE geometry_columns SET f_table_name = 'new_table_name' WHERE f_schema_name = 'schema_name' AND f_table_name = 'old_table_name'
rec.thegeom
1

Je ne suis pas sûr de ce que fait SELECT probe_geometry_columns (), mais vous pouvez facilement vérifier la table geometry_columns pour voir si votre nouveau nom de table est là ou s'il pointe toujours vers l'ancien.

Je soupçonne que vous devez recharger le magasin GeoServer pour vous assurer qu'il "remarque" les changements. Alternativement, un arrêt et un démarrage le feront.

Ian Turton
la source
Qu'entendez-vous par «recharger la boutique GeoServer»?
Mimo
Sur la page d'état ( docs.geoserver.org/latest/en/user/webadmin/server/status.html ), il y a un bouton de rechargement.
Ian Turton
Merci. Cependant, le rechargement n'a pas fonctionné. Je reçois toujours une erreur GeoServer qui se plaint de ne pas trouver la couche renommée. Il essaie toujours de le trouver sous l'ancien nom.
Mimo
vous avez changé la définition de la couche pour pointer vers le nouveau nom de la table?
Ian Turton