Intersección de múltiples capas en PostGIS


9

Necesito escribir el procedimiento almacenado PL / pgSQL para el cálculo de la intersección de múltiples capas. Por ejemplo, para tres capas A, B, C, esta función debería devolver la geometría ABC: ingrese la descripción de la imagen aquí

La función toma como entrada el id de las capas que necesitan ser intersectadas. ¿Alguien puede darme consejos para construir esta función? Mis pensamientos sobre esto necesito cruzar la primera capa y luego el resultado de esta intersección con la tercera capa, etc.


1
¿Es esta pregunta la misma que está buscando: gis.stackexchange.com/q/83/97
Nathan W

No, esta es una pregunta diferente.
drnextgis

Respuestas:


3

Por favor, dame algún comentario sobre mi solución propuesta:

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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.