[postgis-devel] [PostGIS] #1855: 'SQL/MM Spatial exception - curve not simple' exception at adding two polygons
PostGIS
trac at osgeo.org
Thu Jun 7 07:04:03 PDT 2012
#1855: 'SQL/MM Spatial exception - curve not simple' exception at adding two
polygons
----------------------+-----------------------------------------------------
Reporter: wimned | Owner: strk
Type: defect | Status: new
Priority: medium | Milestone: PostGIS 2.0.1
Component: topology | Version: 2.0.x
Keywords: |
----------------------+-----------------------------------------------------
The code:
{{{
CREATE OR REPLACE FUNCTION testerror0()
returns void AS
$$
declare geom0 geometry;
declare geom1 geometry;
BEGIN
perform CreateTopology('wimpy', 4326, 0.00001);
geom0 = ST_GeometryFromText(
'POLYGON((76.26727 9.85751,76.29001 9.90026,
76.29942 9.86257,76.26727 9.85751))' , 4326);
geom1 = ST_GeometryFromText(
'POLYGON((76.31988 9.89696,76.30482 9.88391,
76.2941 9.88391,76.29409 9.88391,76.29409 9.88392,
76.29001 9.90026,76.31988 9.89696))' , 4326);
perform topogeo_AddPolygon('wimpy', geom0);
perform topogeo_AddPolygon('wimpy', geom1);
END
$$
LANGUAGE plpgsql;
}}}
Raises the exception mentioned in the title.
The curve is:
{{{
LINESTRING(76.2940920774741 9.88391,76.29409 9.88391,76.2940920774741
9.88391)
}}}
Probable cause is a small triangular shaped overlap of the two polygons,
about the size of the tolerance.
Snapping leads to an edge of 3 points, begin and end point being the same.
I'm using a nightly build from launchpad on my ubuntu box:
deb http://ppa.launchpad.net/sharpie/postgis-nightly/ubuntu precise main
I managed to edit a workaround in
/usr/share/postgresql/9.1/contrib/postgis-2.1/topology.sql:
In function ST_AddEdgeModFace() at the test of the curve being simple
{{{
IF NOT ST_IsSimple(acurve) THEN
IF ST_NPoints(acurve) = 3 AND
ST_Equals(ST_PointN(acurve,1),ST_PointN(acurve,1))
THEN
return 0; -- skip spike
END IF;
RAISE EXCEPTION 'SQL/MM Spatial exception - curve not simple %',
ST_AsText(acurve);
END IF;
}}}
Inspecting the code calling ST_AddEdgeModFace the return value must be
checked, e.g. in TopoGeo_addLineString():
{{{
IF id IS NULL THEN
id := topology.ST_AddEdgeModFace(atopology,start_node, end_node,
snapped);
ELSE
END IF;
if id != 0
then
RETURN NEXT id; --value 0 means invalid curve to be skipped
end if;
}}}
These code changes result in the polygons to be entered into the topology
properly. (though there is a small face between the two polygons).
The change doesn't break much, the conversion would have been stopped
anyhow by the exception
--
Ticket URL: <http://trac.osgeo.org/postgis/ticket/1855>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.
More information about the postgis-devel
mailing list