回答:
既存のテーブルに列を追加するには、ALTER TABLE DDLを使用します。例:
ALTER TABLE my_table
ADD COLUMN the_geom_mercator
geometry(Geometry,3857);
これは、次を使用して別の列(the_geom)から入力できます。
UPDATE my_table SET
the_geom_mercator = ST_Transform(the_geom, 3857)
FROM spatial_ref_sys
WHERE ST_SRID(the_geom) = srid;
(3行目FROM spatial_ref_sys ...
は必須ではありませんが、不明または無効なプロジェクションで変換試行をガードし、エラーが発生します)。
そして、このテーブルを維持(追加/更新)する場合は、トリガー関数を使用してthe_geom_mercatorを更新できます。例:
CREATE OR REPLACE FUNCTION my_table_tg_fn() RETURNS trigger AS
$BODY$BEGIN
IF TG_OP = 'INSERT' AND NEW.the_geom ISNULL THEN
RETURN NEW; -- no new geometry
ELSIF TG_OP = 'UPDATE' THEN
IF NEW.the_geom IS NOT DISTINCT FROM OLD.the_geom THEN
RETURN NEW; -- same old geometry
END IF;
END IF;
-- Attempt to transform a geometry
BEGIN
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;
CREATE TRIGGER my_table_tg BEFORE INSERT OR UPDATE
ON my_table FOR EACH ROW
EXECUTE PROCEDURE my_table_tg_fn();
ST_Transformはエラーをトラップして警告を表示する必要があることに注意してください。例:
postgis=# INSERT INTO my_table(the_geom)
postgis-# VALUES (ST_SetSRID(ST_MakePoint(0,1), 123))
postgis-# RETURNING the_geom, the_geom_mercator;
WARNING: the_geom_mercator not updated: GetProj4StringSPI: Cannot find SRID (123) in spatial_ref_sys
-[ RECORD 1 ]-----+---------------------------------------------------
the_geom | 01010000207B0000000000000000000000000000000000F03F
the_geom_mercator |
INSERT 0 1
shp2psql
、パイプを介してテーブルが作成されpsql
ます。したがって、テーブルが存在する前にトリガーを実際に追加することはできませんか?
制約のないSRIDジオメトリ列を作成してネイティブフォームを保持し、既存のフォームに変換できます。これは、ステージングテーブルからコピーするポリゴンがあると想定した例です(混在している場合は、typeをgeometryに設定できます(例:geometry(Geometry、3857))。
CREATE TABLE poi(gid serial primary key,
geom_native geometry(POLYGON),
geom_mercator geometry(POLYGON,3857) );
INSERT INTO TABLE poi(geom_native, geom_mercator)
SELECT geom, ST_Transform(geom, 3857)
FROM staging.imported_poly;
geom
列を含むテーブルが既にあり、別のthe_geom_webmercator
列を追加したいとします。どうすればいいですか?