чего я хотел бы добиться, так это выполнить st_Intersection (clipper_geom, clipped_geom) для числа записей из таблицы.
https://postgis.net/docs/ST_Intersection.html
https://postgis.net/docs/ST_Intersects.html
POSTGIS Intersection не поддерживает исходную обработку нескольких геометрий, в отличие от st_intersects (), и мне пришлось разработать функцию (возвращающую таблицу), которая выбирает все объекты, пересекающиеся с st_intersects, в моей области отсечения, просматривая каждый результат этого запросаи выполнить пересечение st_intersection для каждой отдельной записи, поле "geom" и "clipped_geom_wkt" - это те, которые фактически записывают обрезанную геометрию.
Функция работает, но мне нужна другая для каждой таблицы, которую мы хотимпроизвести отсечение.Чего я хотел бы добиться, так это динамически читать входную таблицу (имя и тип столбца) и определять оба в операторе RETURN.
Все имена и типы полей одинаковы. Единственное, что будет обновлено, это geom, и будет добавлено новое, это clipped_geom_wkt.
Я попытался выполнить поиск переполнения стека и нашел примеры накак создать динамическую структуру таблицы, но ничего из того, что я нашел, затем выполнить последующую LOOP над первыми результатами, где имена столбцов должны совпадать, чтобы вставить / обновить новые данные.
Это то, что у меня естьПоднимитесь, но я уверен, как выполнить часть LOOP, добавить поле clipped_geom_wkt и обновить поле geom.В некоторых ответах здесь я вижу, что рекомендуется установить тип RETURN в TABLE, если в SETOF добавлено больше полей
Простой способ иметь тип возвращаемого значения - таблица SETOF плюс дополнительные поля?
Но в то же время я также вижу, что динамически генерируемые столбцы поддерживаются только в том случае, если определение таблицы возвращается как SETOF
Рефакторинг функции PL / pgSQL для возврата выходных данныхразличные запросы SELECT
PostgreSQL: ОШИБКА: 42601: список функций необходим для функций, возвращающих «запись»
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'