PostGIS의 기존 테이블 내에서 지오메트리 유형을 점에서 다 지점으로 변경 하시겠습니까?


31

기존 테이블의 지오메트리 유형을 변경할 수있는 PostGIS 함수가 있습니까?

POINT에서 MULTIPOINT로 변경해야합니다.

지오메트리 유형을 변경하면 테이블이 비어 있으며 테이블을 삭제 / 생성 할 수 없습니다.

답변:


62

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_geom0보다 큰, 당신은 데이터를 잃어버린 위험합니다, 당신은 아마 여러 부분 형상으로 유지해야합니다. 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';

@Mike Toews (및 Ulrik) 안녕하세요. 이 경우 PostGIS 1.x의 두 번째 단계가 필요하다고 생각하지 않습니다. Mike. Ulrik 씨는 타입 변환 시점에 테이블이 비어있을 것이기 때문에 다음과 같은 에러가 발생하는 다중 값 이외의 값은 없을 것이라고 말했다. 1) ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_the_geom; 2) ALTER TABLE my_table ADD CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype (the_geom) = 'MULTIPOINT':: text 또는 the_geom이 NULL 임); 그런 다음 3) UPDATE geometry_columns SET type = 'MULTIPOINT'WHERE f_table_name = 'my_table'; (아마도 가장
부끄러운

@ rec.thegeom이 정확합니다. 빈 테이블을 사용하면 업데이트 할 것이 없습니다. 실제 명령을 게시 해 주셔서 감사합니다!
Mike T

다양한 형태의 복잡한 데이터가있는 GEOMETRYCOLLECTION (MULTIPOLYGON(...))경우 둘 이상의 지오메트리 감지를 위해 쿼리를 변경할 수 있습니다. 확인 ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1하고 USINGwith와 비슷한 것을 사용 하십시오 ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1).
Ravbaker

4

나는 그렇게 생각하지 않습니다. 그러나 geom 열을 제외하고 동일한 구조로 새 테이블을 만든 다음 다음을 실행할 수 있습니다.

SELECT AddGeometryColumn('new-pt_table','geom',<SRID>,'MULTIPOINT',2);

INSERT INTO new_pt_table (attr1, attr2, attr3, ..., geom) 
SELECT attr1, attr2, attr3, ... , ST_Multi(geom) FROM old_pt_table;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.