Reprojeter toutes les géométries dans la table PostGIS?

39

J'ai créé une table spatiale avec SRID: 4326. Maintenant, je veux changer la projection totale en SRID: 32644 dans une nouvelle table. L'ancienne table devrait rester inchangée.

Satya Chandra
la source
J'ajoute ceci comme commentaire plutôt que comme réponse car il devrait y avoir une méthode plus élégante. Mais vous pouvez copier la table, puis exécuter: UPDATE <table> SET the_geom = ST_Transform (the_geom, 32644); (En supposant que vous ayez l'entrée complète dans votre spatial_ref_sys pour 32644.)
L_Holcombe
J'ai essayé, mais j'ignore cette mise à jour d'erreur abc SET geom = ST_Transform (geom, 32644); nouvelle ligne pour la relation "abc" viole la contrainte de vérification "enforce_srid_geom"
Satya Chandra
1
abandonner cette contrainte. et son fixe
simplexio

Réponses:

62

Si vous utilisez PostGIS 2.0+, vous pouvez aller:

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 32644) 
  USING ST_Transform(geom, 32644);
Paul Ramsey
la source
Notez bien sûr que vous devez remplacer "Point" par le type de géométrie réelle de votre géométrie.
Paul Ramsey
Y at-il un moyen simple de remplacer Pointpar The same geometry type as it was?
Mohayemin
Non, pas peur.
Paul Ramsey
18
CREATE TABLE new_table AS 
  SELECT ST_Transform(the_geom,32644) AS the_geom 
  FROM original_table;

Il devrait y avoir un champ d’identification d’entier dans votre table spatiale afin de l’ajouter à QGIS.

Vladimir
la source
J'ai essayé comme ci-dessus et j'ai réussi, mais je ne parviens pas à exporter la table résultante dans qgis / udig même si elle apparaît dans la base de données?
Satya Chandra
Quel est votre problème exact?
Vladimir
2
Si vous utilisez une version de PostGIS antérieure à la version 2.0, vous devez ajouter un enregistrement à votre table Geometry_Columns pointant vers votre nouvelle table.
HeyOverThere
4

suivez cette voie:

  1. CREATE TABLE 'new_table' AS SELECT * FROM 'old_table';
  2. ALTER TABLE new_table DROP CONSTRAINT enforce_srid_the_geom;
  3. ALTER TABLE new_table DROP CONSTRAINT enforce_geotype_the_geom;
  4. UPDATE new_table SET the_geom = ST_SetSRID(the_geom, new_srid);
  5. ALTER TABLE new_table ADD CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = (new_srid));
  6. ALTER TABLE new_table ADD CONSTRAINT enforce_geotype_geom CHECK ((geometrytype(the_geom) = 'POINT'::text OR the_geom IS NULL);
  7. C'est ça!

si vous ne pouvez pas créer de nouvelle table dans les pls de première ligne, essayez les 2. et 3. premièrement, créez ensuite votre table avec le numéro 1.

J'espère que ça t'aide...

Aragon
la source
3
Cette solution ne reprojete pas les géométries. Si les géométries sont stockées à l'aide d'un autre SRID, les données seront incohérentes après une contrainte de modification. Vous devez utiliser st_trasnform.
angelcervera