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.

Satya Chandra
sumber
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);
Paul Ramsey
sumber
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.

Vladimir
sumber
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 ...

Aragon
sumber
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