我要实现的是对来自表的记录数执行st_Intersection(clipper_geom,clipped_geom)。
https://postgis.net/docs/ST_Intersection.html
https://postgis.net/docs/ST_Intersects.html
POSTGIS交集与st_intersects()不同,POSTGIS交集本身不支持处理多个几何,因此我必须设计一个函数(返回表),该函数选择与st_intersects相交的所有要素与我的裁剪器区域,并循环遍历此结果在每条记录上查询并执行交集st_intersection,“ geom”字段和“ clipped_geom_wkt”是实际记录裁剪后的几何图形的对象。
该函数有效,但是我要生成剪裁的每个表都需要一个不同的函数。我想实现的是动态读取输入表(列名和类型)并在RETURN语句中进行定义。
所有字段的名称和类型都相同,唯一要更新的字段是geom,要添加的新字段是clipped_geom_wkt。
我尝试搜索Stack Overflow,并找到了有关如何创建动态表结构的示例,但没有发现任何内容,然后对第一个结果执行了后续LOOP,其中列名称必须匹配才能插入/更新新数据。
到目前为止,这是我要提出的内容,但是我对如何执行LOOP部分,添加clipped_geom_wkt字段和更新geom字段很有用。在这里的一些回复中,我认为建议将RETURN类型设置为TABLE。 如果将更多字段添加到SETOF
Easy way to have return type be SETOF table plus additional fields?
但是同时,我还看到只有在表定义返回为SETOF时才支持动态生成的列
Refactor a PL/pgSQL function to return the output of various SELECT queries
PostgreSQL: ERROR: 42601: a column definition list is required for functions returning "record"
CREATE OR REPLACE FUNCTION clip_palin_polygon_complete(clipped_table text,clipper_geom text, age_sequence VARCHAR)
RETURNS TABLE (rec clipped_table, clipped_geom_wkt text)) AS $$ --not sure if this is the right way to do it...
DECLARE var_r record;
BEGIN
FOR var_r IN (
SELECT * FROM clipped_table
WHERE clipped_table.seq IN (age_sequence)
AND ST_Intersects(ST_GeomFromText(clipper_geom,4326), clipped_table.geom)
)
LOOP
/*
these are the original table fields that I would like to keep and match
dynamically with any table I have as input (clipped_table)
objectid := var_r.objectid;
seq := var_r.seq;
age := var_r.age;
primary_lithology := var_r.primary_lithology;
confidence := var_r.confidence;
area_calculated := var_r.area_calculated;*/
--below there are the only two fields that need modifying
geom := (
SELECT ST_Intersection(ST_GeomFromText(clipper_geom, 4326), var_r.geom) AS geom);
clipped_geom_wkt := (
SELECT
ST_AsText(ST_Intersection(ST_GeomFromText(clipper_geom,4326), var_r.geom)) AS clipped_geom_wkt);
RETURN NEXT;
END LOOP;
END; $$
LANGUAGE 'plpgsql'