Memproyeksi ulang semua geometri dalam tabel PostGIS?


39

Saya membuat tabel spasial dengan SRID: 4326. Sekarang saya ingin mengubah proyeksi total ke SRID: 32644 menjadi tabel baru. Tabel lama harus tetap tidak berubah.


Saya menambahkan ini sebagai komentar alih-alih jawaban karena harus ada metode yang lebih elegan. Tapi Anda bisa menyalin tabel, dan kemudian jalankan: UPDATE <table> SET the_geom = ST_Transform (the_geom, 32644); (Dengan asumsi Anda memiliki entri lengkap di spatial_ref_sys Anda untuk 32644.)
L_Holcombe

saya mencoba tetapi igot pembaruan kesalahan ini abc SET geom = ST_Transform (geom, 32644); baris baru untuk relasi "abc" melanggar batasan periksa "cementce_srid_geom "
Satya Chandra

1
jatuhkan batasan itu. dan
perbaikannya

Jawaban:


62

Jika Anda menggunakan PostGIS 2.0+, Anda dapat mengunjungi:

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 32644) 
  USING ST_Transform(geom, 32644);

Memperhatikan tentu saja Anda harus mengganti "Point" dengan tipe geometri aktual dari geometri Anda.
Paul Ramsey

Apakah ada cara sederhana untuk mengganti Pointdengan The same geometry type as it was?
Mohayemin

Tidak, takut tidak.
Paul Ramsey

18
CREATE TABLE new_table AS 
  SELECT ST_Transform(the_geom,32644) AS the_geom 
  FROM original_table;

Seharusnya ada bidang ID integer di tabel spasial Anda untuk menambahkannya ke QGIS.


Saya mencoba seperti di atas dan berhasil, tetapi saya tidak dapat mengekspor tabel yang dihasilkan ke qgis / udig bahkan itu muncul dalam database?
Satya Chandra

Apa masalah sebenarnya Anda?
Vladimir

2
Jika Anda menggunakan versi PostGIS yang lebih lama dari versi 2.0, Anda harus menambahkan catatan ke tabel Geometry_Columns yang menunjuk ke tabel baru Anda.
HeyOverThere

4

ikuti cara ini:

  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. Hanya itu saja!

jika Anda tidak dapat membuat tabel baru di baris pertama, silakan coba 2. dan 3. lalu buat tabel Anda dengan nomor 1.

Saya harap ini membantu Anda ...


3
Solusi ini tidak memproyeksi ulang geometri. Jika geometri disimpan menggunakan SRID lain, data akan menjadi tidak konsisten setelah perubahan batasan. Anda perlu menggunakan st_trasnform.
angelcervera
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.