Apakah ada fungsi PostGIS yang dapat mengubah tipe geometri untuk tabel yang ada?
Kita perlu mengubah dari POINT ke MULTIPOINT.
Tabel akan kosong ketika kita mengubah tipe geometri dan kita tidak bisa hanya menjatuhkan / membuat tabel.
Untuk PostGIS 2.x , Anda dapat menggunakan ALTER TABLE DDL menggunakan ekspresi .
Untuk mengkonversi dari geometri satu bagian ke banyak bagian, gunakan ST_Multi :
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);
Untuk mengkonversi dari multi-bagian ke geometri satu-bagian, ini sedikit lebih rumit karena Anda hanya dapat menggunakan satu bagian, dan abaikan semua bagian lainnya (jika ada). Periksa data Anda terlebih dahulu untuk melihat apakah Anda memiliki beberapa geometri dengan lebih dari satu bagian:
SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
COUNT(geom) AS total_geom
FROM my_table;
Jika Anda melihat multi_geom
lebih besar dari 0, maka Anda akan berisiko kehilangan data, dan Anda mungkin harus menyimpannya sebagai geometri multi-bagian. Jika Anda melihat 0, maka aman untuk menjadikannya geometri satu bagian dengan:
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);
Untuk PostGIS 1.x , ini sedikit lebih berantakan, karena ada beberapa langkah (terima kasih @ rec.thegeom!).
Dengan asumsi tabel my_table
dan kolom geometri geom
, berikut adalah langkah-langkah untuk mengonversi menjadi multi-bagian:
-- 1. Remove the geom_type constraint (if existing)
ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_geom;
-- 2. Update the geometry data to multi-part -- skip if it is an empty table
UPDATE my_table SET geom = ST_Multi(geom);
-- 3. Re-add a different geometry constraint for the new type
ALTER TABLE my_table ADD CONSTRAINT enforce_geotype_geom
CHECK (geometrytype(geom) = 'MULTIPOINT'::text OR geom IS NULL);
-- 4. Update the geometry_columns metadata table
UPDATE geometry_columns SET type = 'MULTIPOINT'
WHERE f_table_schema = 'public' AND f_table_name = 'my_table' AND f_geometry_column = 'geom';
GEOMETRYCOLLECTION (MULTIPOLYGON(...))
maka Anda mungkin ingin mengubah kueri untuk mendeteksi lebih dari satu geometri. Dengan centang sukaST_NumGeometries(ST_CollectionHomogenize(geom)) > 1
dan gunakan hal serupa untukUSING
dengan:ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)
atau serupa.Ubah, kurasa tidak. Tapi Anda bisa membuat tabel baru dengan struktur yang identik, kecuali untuk kolom geom, lalu jalankan:
sumber