PostGIS에서 여러 레이어의 교차


9

여러 계층의 교차를 계산하려면 PL / pgSQL 저장 프로 시저를 작성해야합니다. 예를 들어 A, B, C의 세 레이어에 대해이 함수는 ABC 형상을 반환해야합니다. 여기에 이미지 설명을 입력하십시오

함수는 교차해야하는 레이어의 id를 입력으로받습니다. 누구 든지이 기능을 구축하는 데 조언을 줄 수 있습니까? 이것에 대한 내 생각은 첫 번째 레이어를 교차 한 다음 두 번째 교차와 같은 교차점의 결과를 교차해야합니다.


1
이 질문이 당신이 찾고있는 것과 같은 것입니까? gis.stackexchange.com/q/83/97
Nathan W

아니요, 이것은 다른 질문입니다.
drnextgis

답변:


3

제안 된 솔루션에 대한 의견을 알려주십시오.

CREATE OR REPLACE FUNCTION fp_intersect(lids varchar)
    RETURNS integer AS
$$
DECLARE
    lid_new  integer;
    lndx     integer := 1;
    lids_arr integer[];
BEGIN

IF regexp_replace(lids, E'\\s+', '', 'g') ~ E'^-?\\d+$' THEN
    RETURN -1;
END IF;

SELECT nextval ('g_layer_lid_seq') INTO lid_new; 

lids_arr := string_to_array(regexp_replace(lids, E'\\s+', '', 'g'), ',');
DROP TABLE IF EXISTS tmp_intersect;
CREATE TEMPORARY TABLE tmp_intersect AS SELECT geom FROM g_lgeom WHERE lid = lids_arr[1];

WHILE lndx < array_length(lids_arr, 1) LOOP
    DROP TABLE IF EXISTS tmp;
    CREATE TEMPORARY TABLE tmp AS SELECT ST_Intersection(geom, g_next) AS geom
    FROM tmp_intersect
    JOIN (
        SELECT geom AS g_next
        FROM g_lgeom
        WHERE lid = lids_arr[lndx+1]
    ) AS _
    ON ST_Intersects(geom, g_next);
    lndx := lndx+1;
    DROP TABLE IF EXISTS tmp_intersect;
    CREATE TEMPORARY TABLE tmp_intersect AS SELECT geom FROM tmp;
END LOOP;

INSERT INTO g_lgeom(lid, geom) SELECT lid_new, (_.p_geom).geom FROM (SELECT ST_Dump(geom) AS p_geom FROM tmp_intersect) AS _;

RETURN lid_new;
END
$$
LANGUAGE plpgsql;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.