PostGIS'de çoklu katmanların kesişimi


9

Birden çok katmanın kesişimini hesaplamak için PL / pgSQL saklı yordamı yazmak gerekiyor. Örneğin, üç A, B, C katmanı için bu işlev ABC geometrisini döndürmelidir: resim açıklamasını buraya girin

İşlev, kesişmesi gereken katmanların kimliğini girdi olarak alır. Birisi bana bu işlevi inşa etmek için tavsiyede bulunabilir mi? Bu konudaki düşüncelerim, birinci kat ile kesişiyor, sonra da bu kesişimin üçüncü kat ile kesişiyor.


1
Bu soru aradığınızla aynı mı: gis.stackexchange.com/q/83/97
Nathan W

Hayır, bu farklı bir soru.
drnextgis

Yanıtlar:


3

Lütfen bana önerilen çözümüm hakkında yorumda bulunun:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.