답변:
PostGIS 2.x의 경우 표현식을 사용하여 ALTER TABLE DDL을 사용할 수 있습니다 .
단일 부품에서 다중 부품 형상으로 변환하려면 ST_Multi를 사용 하십시오 .
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);
다중 파트에서 단일 파트 형상으로 변환하려면 한 파트 만 사용할 수 있고 다른 모든 파트 (있는 경우)는 무시할 수 있으므로 조금 더 까다 롭습니다. 두 개 이상의 부품이있는 형상이 있는지 먼저 데이터를 확인하십시오.
SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
COUNT(geom) AS total_geom
FROM my_table;
당신이 볼 경우 multi_geom
0보다 큰, 당신은 데이터를 잃어버린 위험합니다, 당신은 아마 여러 부분 형상으로 유지해야합니다. 0이 표시되면 다음을 사용하여 단일 부품 형상으로 만드는 것이 안전합니다.
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);
PostGIS 1.x의 경우 여러 단계가 있기 때문에 조금 더 지저분합니다 (@ rec.thegeom 감사합니다!).
테이블 my_table
및 지오메트리 열을 가정하면 geom
다음은 여러 부분으로 변환하는 단계입니다.
-- 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(...))
경우 둘 이상의 지오메트리 감지를 위해 쿼리를 변경할 수 있습니다. 확인 ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1
하고 USING
with와 비슷한 것을 사용 하십시오 ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)
.