PostGIS에 추가 지오메트리 열을 추가 하시겠습니까?


10

PostGIS에 여러 지리 데이터를 가져오고 있는데 서로 다릅니다 SRID. (일부가 EPSG:3857일부 EPSG:4326, 다른 어떤 일을).

geometry column예를 들어 추가을 만들고 싶습니다 . the_geom_mercator와 함께 SRID EPSG:3857원래 geom열을 그대로 유지하십시오 SRID.

PostGIS 기능으로 어떻게 할 수 있습니까?

답변:


18

기존 테이블에 열을 추가하려면 다음과 같이 ALTER TABLE DDL을 사용하십시오 .

ALTER TABLE my_table
  ADD COLUMN the_geom_mercator
    geometry(Geometry,3857);

다음을 사용하여 다른 열 (the_geom)에서 채울 수 있습니다.

UPDATE my_table SET
  the_geom_mercator = ST_Transform(the_geom, 3857)
FROM spatial_ref_sys
WHERE ST_SRID(the_geom) = srid;

세 번째 줄 FROM spatial_ref_sys ...은 필요하지 않지만 알 수 없거나 유효하지 않은 투영으로 변환 시도를 보호하여 오류가 발생합니다.

이 테이블을 유지 관리 (추가 / 업데이트)하려는 경우 트리거 기능을 사용하여 _geom_mercator를 업데이트 할 수 있습니다. 예를 들면 다음과 같습니다.

CREATE OR REPLACE FUNCTION my_table_tg_fn() RETURNS trigger AS
$BODY$BEGIN
  IF TG_OP = 'INSERT' AND NEW.the_geom ISNULL THEN
    RETURN NEW; -- no new geometry
  ELSIF TG_OP = 'UPDATE' THEN
    IF NEW.the_geom IS NOT DISTINCT FROM OLD.the_geom THEN
      RETURN NEW; -- same old geometry
    END IF;
  END IF;
  -- Attempt to transform a geometry
  BEGIN
    NEW.the_geom_mercator := ST_Transform(NEW.the_geom, 3857);
  EXCEPTION WHEN SQLSTATE 'XX000' THEN
    RAISE WARNING 'the_geom_mercator not updated: %', SQLERRM;
  END;
  RETURN NEW;
END;$BODY$ LANGUAGE plpgsql;

CREATE TRIGGER my_table_tg BEFORE INSERT OR UPDATE
   ON my_table FOR EACH ROW
   EXECUTE PROCEDURE my_table_tg_fn();

ST_Transform은 오류를 포착하고 경고를 표시해야합니다. 예를 들면 다음과 같습니다.

postgis=# INSERT INTO my_table(the_geom)
postgis-# VALUES (ST_SetSRID(ST_MakePoint(0,1), 123))
postgis-# RETURNING the_geom, the_geom_mercator;
WARNING:  the_geom_mercator not updated: GetProj4StringSPI: Cannot find SRID (123) in spatial_ref_sys
-[ RECORD 1 ]-----+---------------------------------------------------
the_geom          | 01010000207B0000000000000000000000000000000000F03F
the_geom_mercator |

INSERT 0 1

좋은 답변 주셔서 감사합니다. 트리거를 사용하는 것이 정말 깔끔합니다. 시작하겠습니다. 대신 데이터베이스에 트리거를 추가하여 모든 새 테이블에 대해이 트리거를 추가 할 필요가 없습니까?
knutole

postgis에 데이터를 추가하고를 shp2psql통해 파이프를 만들 때 테이블이 생성됩니다 psql. 그래서 테이블이 존재하기 전에 트리거를 실제로 추가 할 수 없습니까?
knutole

1
shp2pgsql을 사용하는 경우 업데이트 명령문을 사용하십시오 (위 참조). 트리거는 테이블을 유지 관리해야하지만로드 할 수없는 경우에 유용합니다.
Mike T

2

먼저 기존의 비 공간 테이블을 작성하십시오. 두 번째로 OpenGIS "AddGeometryColumn"함수를 사용하여 테이블에 공간 열을 추가하십시오.

예:

CREATE TABLE terrain_points ( 
ogc_fid serial NOT NULL, 
elevation double precision,
);

SELECT AddGeometryColumn('terrain_points', 'wkb_geometry', 3725, 'POINT', 3 );

1

제한되지 않은 SRID 지오메트리 열을 생성하여 기본 형식을 유지 한 다음 기존 형식으로 변환 할 수 있습니다. 다음은 준비 테이블에서 복사하는 다각형이 있다고 가정 한 예입니다. 혼합 한 경우 유형을 기하학 (예 : geometry (Geometry, 3857))으로 설정할 수 있습니다.

CREATE TABLE poi(gid serial primary key, 
   geom_native geometry(POLYGON),  
   geom_mercator geometry(POLYGON,3857) );

INSERT INTO TABLE poi(geom_native, geom_mercator)
SELECT geom, ST_Transform(geom, 3857)
   FROM staging.imported_poly;

답변 주셔서 감사합니다. 기존 테이블 (예 : 준비 테이블을 사용하지 않음)에서이 작업을 수행 할 수있는 방법이 있습니까? 이미 geom열 이있는 테이블이 있고 다른 the_geom_webmercator열 을 추가하려고 한다고 가정 해 봅시다 . 어떻게해야합니까?
knutole
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.