PostGISにジオメトリ列を追加しますか?


10

多くの地理データセットをPostGISにインポートしていますが、それらのセットは異なりSRIDます。(あるものEPSG:3857、あるものEPSG:4326、あるもの)。

追加を作成したいgeometry columnです。the_geom_mercatorを使用しSRID EPSG:3857、元のgeom列を元の列のSRIDままにします。

PostGIS関数でこれを行うにはどうすればよいですか?

回答:


18

既存のテーブルに列を追加するには、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

素晴らしい答えをありがとう。トリガーを使用するのは本当に便利です。私はそうします。代わりにそのトリガーをデータベースに追加して、すべての新しいテーブルにこのトリガーを追加する必要がないようにできますか?
knutole

を使用してpostgisにデータを追加しshp2psql、パイプを介してテーブルが作成されpsqlます。したがって、テーブルが存在する前にトリガーを実際に追加することはできませんか?
knutole

1
shp2pgsqlを使用している場合は、更新ステートメントを使用してください。上記を参照してください。トリガーは、テーブルを保守する必要があるが、ロードする必要がない場合に役立ちます。
マイクT

2

まず、すでに持っている通常の非空間テーブルを作成します。次に、OpenGISの「AddGeometryColumn」関数を使用して、空間列をテーブルに追加します。

例:

CREATE TABLE terrain_points ( 
ogc_fid serial NOT NULL, 
elevation double precision,
);

SELECT AddGeometryColumn('terrain_points', 'wkb_geometry', 3725, 'POINT', 3 );

1

制約のない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列を追加したいとします。どうすればいいですか?
knutole
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.