Giao lộ của nhiều lớp trong PostGIS


9

Tôi cần phải viết thủ tục lưu sẵn PL / pgSQL để tính toán giao điểm của nhiều lớp. Ví dụ, đối với ba lớp A, B, C, hàm này sẽ trả về hình học ABC: nhập mô tả hình ảnh ở đây

Hàm lấy đầu vào là id của các lớp cần được giao nhau. Bất cứ ai có thể cho tôi lời khuyên để xây dựng chức năng này? Suy nghĩ của tôi về điều này tôi cần giao cắt lớp thứ nhất và thứ hai sau đó kết quả của giao điểm này giao với lớp thứ ba, v.v.


1
Câu hỏi này có giống với câu hỏi mà bạn đang tìm kiếm không: gis.stackexchange.com/q/83/97
Nathan W

Không, đây là câu hỏi khác nhau.
drnextgis

Câu trả lời:


3

Xin vui lòng cho tôi bất kỳ ý kiến ​​về giải pháp đề xuất của tôi:

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.