При попытке разобраться с GEOMETRYCOLLECTION в PostGIS я нашел here, что похоже на преобразование GEOMETRYCOLLECTION в простое GEOMETRY, но оно работает только с внутренней функцией ST_Intersect.Передача имени функции в качестве аргумента
Как я довольно ленив, я подумал, что было бы неплохо сделать его более мощным, если функция будет выполнена как аргумент, но это не работает.
CREATE OR REPLACE FUNCTION ST_GeoCollConv_(geofunction, geometry, geometry) RETURNS boolean AS $$
DECLARE
is1collection boolean;
is2collection boolean;
BEGIN
is1collection := GeometryType($1) = 'GEOMETRYCOLLECTION';
is2collection := GeometryType($2) = 'GEOMETRYCOLLECTION';
IF NOT is1collection AND NOT is2collection THEN
return PERFORM geofunction($1, $2);
END IF;
IF NOT is1collection THEN
FOR i IN 1..ST_NumGeometries($2) LOOP
IF PERFORM geofunction($1, ST_GeometryN($2, i)) THEN
RETURN true;
END IF;
END LOOP;
ELSIF NOT is2collection THEN
FOR i IN 1..ST_NumGeometries($1) LOOP
IF PERFORM geofunction(ST_GeometryN($1, i), $2) THEN
RETURN true;
END IF;
END LOOP;
ELSE
FOR i IN 1..ST_NumGeometries($1) LOOP
IF ST_GeoCollConv_(geofunction, $1, $2) THEN
RETURN true;
END IF;
END LOOP;
END IF;
RETURN false;
END;
$$ LANGUAGE 'plpgsql';
Как я могу это достичь?
Благодаря yieldsfalsehood, у меня больше успеха с вашим решением, чем с любым экспериментом, который я сделал до сих пор, особенно если я использую функцию ST_Overlaps. Я еще не знаю, как использовать мультиполигоны и буду исследовать в этом направлении. (недостаточно репутации для +1) – annoyed
Рад, что я мог помочь, и удачи! – yieldsfalsehood