Schnittmenge mehrerer Schichten in PostGIS


9

Ich muss eine gespeicherte PL / pgSQL-Prozedur für die Berechnung des Schnittpunkts mehrerer Schichten schreiben. Für drei Ebenen A, B, C sollte diese Funktion beispielsweise die ABC-Geometrie zurückgeben: Geben Sie hier die Bildbeschreibung ein

Die Funktion verwendet als Eingabe die ID der Ebenen, die geschnitten werden müssen. Kann mir jemand einen Rat zum Aufbau dieser Funktion geben? Meine Gedanken darüber, dass ich die erste Schicht und die zweite, dann das Ergebnis dieser Überschneidung mit der dritten Schicht usw. schneiden muss


1
Ist diese Frage die gleiche wie das, wonach Sie suchen: gis.stackexchange.com/q/83/97
Nathan W

Nein, das ist eine andere Frage.
Drnextgis

Antworten:


3

Bitte geben Sie mir Kommentare zu meiner vorgeschlagenen Lösung:

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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.