Menambahkan kolom geometri tambahan di PostGIS?


10

Saya mengimpor banyak set geodata ke PostGIS, dan mereka berbeda SRID. (Beberapa memiliki EPSG:3857, beberapa EPSG:4326, beberapa hal lain).

Saya ingin membuat tambahan geometry column, mis. the_geom_mercatordengan SRID EPSG:3857, dan juga menyimpan geomkolom asli dalam apa pun SRIDitu masuk

Bagaimana saya bisa melakukan ini dengan fungsi PostGIS?

Jawaban:


18

Untuk menambahkan kolom ke tabel yang ada, gunakan ALTER TABLE DDL , mis:

ALTER TABLE my_table
  ADD COLUMN the_geom_mercator
    geometry(Geometry,3857);

yang dapat diisi dari kolom lain (the_geom) menggunakan:

UPDATE my_table SET
  the_geom_mercator = ST_Transform(the_geom, 3857)
FROM spatial_ref_sys
WHERE ST_SRID(the_geom) = srid;

(baris ketiga FROM spatial_ref_sys ...tidak diperlukan, tetapi menjaga transformasi upaya dengan proyeksi yang tidak diketahui atau tidak valid, yang menimbulkan kesalahan).

Dan jika tabel ini dipertahankan (ditambahkan / diperbarui), Anda dapat menggunakan fungsi pemicu untuk memperbarui the_geom_mercator, misalnya:

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();

Perhatikan bahwa ST_Transform seharusnya menjebak kesalahan dan menampilkan peringatan, misalnya:

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

Terima kasih atas jawaban yang bagus. Benar-benar rapi untuk menggunakan pemicu, saya akan mulai melakukannya. Bisakah saya menambahkan pemicu itu ke basis data, sehingga saya tidak perlu menambahkan pemicu ini untuk setiap tabel baru?
knutole

Saya menambahkan data ke postgis dengan shp2psqldan tabel dibuat ketika disalurkan melalui psql. Jadi saya tidak bisa menambahkan pemicu sebelum tabel ada?
knutole

1
Jika Anda menggunakan shp2pgsql, gunakan pernyataan pembaruan, lihat di atas. Pemicu berguna jika Anda perlu mempertahankan tabel, tetapi tidak untuk memuat.
Mike T

2

Pertama buat tabel non-spasial normal, yang sudah Anda miliki. Kedua, tambahkan kolom spasial ke tabel menggunakan fungsi OpenGIS "AddGeometryColumn".

Contoh:

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

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

1

Anda bisa membuat kolom geometri SRID yang tidak dibatasi untuk menahan bentuk asli dan kemudian mengubah ke yang sudah ada. Berikut adalah contoh yang dibuat dengan asumsi Anda memiliki poligon yang Anda salin dari tabel pementasan (jika Anda telah dicampur, Anda dapat mengatur tipe ke geometri misalnya geometri (Geometri, 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;

Terima kasih atas jawaban anda. Apakah ada cara untuk melakukan ini pada tabel yang sudah ada (mis. Tanpa menggunakan staging tables)? Katakanlah saya sudah punya tabel, dengan geomkolom, dan saya hanya ingin menambahkan the_geom_webmercatorkolom lain . Bagaimana saya melakukannya?
knutole
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.