Alle Geometrien in der PostGIS-Tabelle neu projizieren?

39

Ich habe eine räumliche Tabelle mit der SRID 4326 erstellt. Jetzt möchte ich die Gesamtprojektion in SRID: 32644 in eine neue Tabelle ändern. Die alte Tabelle sollte unverändert bleiben.

Satya Chandra
quelle
Ich füge dies als Kommentar anstelle einer Antwort hinzu, da es eine elegantere Methode geben sollte. Sie können die Tabelle jedoch kopieren und dann ausführen: UPDATE <Tabelle> SET the_geom = ST_Transform (the_geom, 32644); (Vorausgesetzt, Sie haben den vollständigen Eintrag in Ihrem spatial_ref_sys für 32644.)
L_Holcombe
Ich habe versucht, aber igot dieses Fehler-Update abc SET Geom = ST_Transform (Geom, 32644); Neue Zeile für die Relation "abc" verletzt die Prüfbedingung "enforce_srid_geom"
Satya Chandra
1
lassen Sie diese Einschränkung fallen. und seine feste
simplexio

Antworten:

62

Wenn Sie mit PostGIS 2.0+ arbeiten, können Sie:

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 32644) 
  USING ST_Transform(geom, 32644);
Paul Ramsey
quelle
Natürlich sollten Sie "Point" durch den tatsächlichen Geometrietyp Ihrer Geometrie ersetzen.
Paul Ramsey
Gibt es eine einfache Möglichkeit zum Ersetzen Pointdurch The same geometry type as it was?
Mohayemin
Nein, fürchte nicht.
Paul Ramsey
18
CREATE TABLE new_table AS 
  SELECT ST_Transform(the_geom,32644) AS the_geom 
  FROM original_table;

In Ihrer räumlichen Tabelle sollte sich ein Feld mit einer Ganzzahl-ID befinden, damit Sie es zu QGIS hinzufügen können.

Vladimir
quelle
Ich habe es wie oben versucht und es ist mir gelungen, aber ich kann die resultierende Tabelle nicht nach qgis / udig exportieren, auch wenn sie in der Datenbank angezeigt wird.
Satya Chandra
Was ist Ihr genaues Problem?
Vladimir
2
Wenn Sie eine ältere PostGIS-Version als Version 2.0 verwenden, müssen Sie Ihrer Geometry_Columns-Tabelle einen Datensatz hinzufügen, der auf Ihre neue Tabelle verweist.
HeyOverThere
4

folge diesem Weg:

  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. Das ist es!

Wenn Sie in der ersten Zeile keine neue Tabelle erstellen können, versuchen Sie bitte zuerst 2. und 3. und erstellen Sie dann Ihre Tabelle mit der Nummer 1.

ich hoffe es hilft dir ...

Aragon
quelle
3
Diese Lösung projiziert Geometrien nicht neu. Wenn Geometrien mit einer anderen SRID gespeichert werden, sind die Daten nach Änderungseinschränkungen inkonsistent. Sie müssen st_trasnform verwenden.
Angelcervera