Hinzufügen einer zusätzlichen Geometriespalte in PostGIS?
10
Ich importiere viele Sätze von Geodaten in PostGIS und sie haben unterschiedliche SRID. (Einige haben EPSG:3857, einige EPSG:4326, andere etwas anderes).
Ich möchte ein zusätzliches erstellen geometry column, z. the_geom_mercatormit SRIDEPSG:3857, und behalten Sie auch die ursprüngliche geomSpalte in was auch immer SRIDes kam.
Wie kann ich das mit einer PostGIS-Funktion machen?
die aus einer anderen Spalte (the_geom) ausgefüllt werden kann mit:
UPDATE my_table SET
the_geom_mercator = ST_Transform(the_geom,3857)FROM spatial_ref_sysWHERE ST_SRID(the_geom)= srid;
(Die dritte Zeile FROM spatial_ref_sys ...ist nicht erforderlich, schützt jedoch Transformationsversuche mit unbekannten oder ungültigen Projektionen, die Fehler auslösen.)
Und wenn diese Tabelle gepflegt (hinzugefügt / aktualisiert) werden soll, können Sie eine Triggerfunktion verwenden, um den_geom_mercator zu aktualisieren, z.
CREATEOR REPLACE FUNCTION my_table_tg_fn() RETURNS triggerAS$BODY$BEGINIF TG_OP ='INSERT'AND NEW.the_geom ISNULL THENRETURN NEW;-- no new geometry
ELSIF TG_OP ='UPDATE'THENIF NEW.the_geom ISNOTDISTINCTFROM OLD.the_geom THENRETURN NEW;-- same old geometryENDIF;ENDIF;-- Attempt to transform a geometryBEGIN
NEW.the_geom_mercator := ST_Transform(NEW.the_geom,3857);
EXCEPTION WHEN SQLSTATE 'XX000'THEN
RAISE WARNING 'the_geom_mercator not updated: %', SQLERRM;END;RETURN NEW;END;$BODY$ LANGUAGE plpgsql;CREATETRIGGER my_table_tg BEFORE INSERTORUPDATEON my_table FOR EACH ROWEXECUTEPROCEDURE my_table_tg_fn();
Beachten Sie, dass ST_Transform Fehler abfangen und eine Warnung anzeigen sollte, z.
Danke für eine tolle Antwort. Es ist wirklich ordentlich, Trigger zu verwenden, ich werde damit beginnen. Könnte ich diesen Trigger stattdessen zur Datenbank hinzufügen, damit ich diesen Trigger nicht für jede neue Tabelle hinzufügen muss?
Knutole
Ich füge Daten zu Postgis hinzu shp2psqlund die Tabelle wird erstellt, wenn sie weitergeleitet wird psql. Ich kann also keinen Trigger hinzufügen, bevor eine Tabelle existiert?
Knutole
1
Wenn Sie shp2pgsql verwenden, verwenden Sie eine Update-Anweisung (siehe oben). Ein Trigger ist nützlich, wenn Sie eine Tabelle pflegen müssen, aber nicht zum Laden.
Mike T
2
Erstellen Sie zunächst eine normale nicht räumliche Tabelle, die Sie bereits haben. Zweitens fügen Sie der Tabelle mit der OpenGIS-Funktion "AddGeometryColumn" eine räumliche Spalte hinzu.
Beispiel:
CREATETABLE terrain_points (
ogc_fid serial NOTNULL,
elevation doubleprecision,);SELECT AddGeometryColumn('terrain_points','wkb_geometry',3725,'POINT',3);
Sie können eine uneingeschränkte SRID-Geometriespalte erstellen, um das native Formular zu speichern und dann in ein vorhandenes zu transformieren. In diesem Beispiel wird davon ausgegangen, dass Sie Polygone haben, die Sie aus einer Staging-Tabelle kopieren (wenn Sie gemischt haben, können Sie den Typ auf Geometrie festlegen, z. B. Geometrie (Geometry, 3857):
Danke für deine Antwort. Gibt es eine Möglichkeit, dies für bereits vorhandene Tabellen zu tun (dh ohne Staging-Tabellen zu verwenden)? Angenommen, ich habe bereits eine Tabelle mit einer geomSpalte und möchte einfach eine weitere the_geom_webmercatorSpalte hinzufügen . Wie würde ich das machen?
shp2psql
und die Tabelle wird erstellt, wenn sie weitergeleitet wirdpsql
. Ich kann also keinen Trigger hinzufügen, bevor eine Tabelle existiert?Erstellen Sie zunächst eine normale nicht räumliche Tabelle, die Sie bereits haben. Zweitens fügen Sie der Tabelle mit der OpenGIS-Funktion "AddGeometryColumn" eine räumliche Spalte hinzu.
Beispiel:
quelle
Sie können eine uneingeschränkte SRID-Geometriespalte erstellen, um das native Formular zu speichern und dann in ein vorhandenes zu transformieren. In diesem Beispiel wird davon ausgegangen, dass Sie Polygone haben, die Sie aus einer Staging-Tabelle kopieren (wenn Sie gemischt haben, können Sie den Typ auf Geometrie festlegen, z. B. Geometrie (Geometry, 3857):
quelle
geom
Spalte und möchte einfach eine weiterethe_geom_webmercator
Spalte hinzufügen . Wie würde ich das machen?