ทางแยกหลายชั้นใน 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.