[postgis-users] Problem with using ST_Intersects within a Function
rox
rox at tara-lu.com
Thu Sep 1 11:38:54 PDT 2011
I am fairly new to Postgres (1995-96, and now again) and totally new to
GIS.
We're working with an inherited database in which we know there are
invalid geometries.
Rather than continue to let various queries fail, I'm working on a way
to detect the specific entries so we can go clean them up.
I've been working on a function that will test a geometry for validity
within the following functions:
I have the following test scenario to demonstrate my current challenge:
Ubuntu 10.04.02
Postgres 8.4.7
Postgis 1.5.2
GEOS 3.2.2 [I think]
-- Sample data
drop table testloc;
create table testloc (
id integer,
loc geometry
);
insert into testloc values(
1,ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(( (-180 -90, -180 90, 180 90,
180 -90, -180 -90), (-90 -45, -90 45, 90 45, 90 -45, -90 -45)), ( (-60
-30, -60 30, 60 30, 60 -30, -60 -30))) ')
);
insert into testloc values(
2,ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-170 -80, -170 80, 170 80,
170 -80, -170 -80 ),( -80 -35, -80 35, 80 35, 80 -35, -80 -35 )), (( -50
-20, -50 20, 50 20, 50 -20, -50 -20 ))) ')
);
insert into testloc values(
3,ST_GeomFromEWKT('SRID=4326;MULTIPOLYGON(((-165 -75, -165 75, 165 75,
165 -75, -165 -75 ),( -75 -30, -75 30, 75 30, 75 -30, -75 -30 )), (( -35
-15, -35 15, 35 15, 35 -15, -35 -15 ))) ')
);
-- Type for return list... this is good 'nuff for demonstration
purposes
DROP TYPE temprec ;
CREATE TYPE temprec AS
(
func_name text,
table_id integer,
reason text,
stat text
);
-- Function which takes in a Key and a Geometry.
-- Tests the Geometry using various functions [starting with IsValid,
but that isn't at issue for this problem].
-- Returns a list of id's and the error's that are captured by
operations against the geometry
drop FUNCTION testint (keyid integer, loc geometry) ;
CREATE OR REPLACE FUNCTION testint (keyid integer, loc geometry)
RETURNS temprec[] AS $f$
DECLARE
junk geometry;
rec temprec;
arr1 temprec[];
BEGIN
rec.func_name := NULL;
rec.table_id := keyid;
rec.reason := NULL;
rec.stat := '00000';
BEGIN
rec.func_name := 'ST_Intersects';
junk := ST_Intersects(loc, loc);
EXCEPTION
WHEN OTHERS THEN
rec.reason := sqlerrm;
rec.stat := SQLSTATE;
arr1 := arr1 || ARRAY[rec];
END;
RETURN arr1 ;
END;
$f$ LANGUAGE plpgsql IMMUTABLE;
More information about the postgis-users
mailing list