Eden Katabi
Eden Katabi

Reputation: 301

POSTGIS TopologyException: side location conflict

I'm trying to execute a simple st_intersects query:

select st_intersects('MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))','POLYGON((3 4.5,3 5,4 5,4 4,3 4.5))');

which crush the console and returns the following error:

Error: GEOSIntersects: TopologyException: side location conflict at: 6 4

Which is completely odd because the following query works:

select st_intersects('MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))','POLYGON((3 4,3 5,4 5,4 4,3 4))');

The only difference between the two is the 4 / 4.5 in the last polygon..

I use POSTGIS version 2.2.1 what am i missing here?

Upvotes: 8

Views: 21370

Answers (3)

Nikolai_Boravlev
Nikolai_Boravlev

Reputation: 1

I tried to compare a polygon and a collection of small polygons with ST_CoveredBy. I tried to collect my small polygons with ST_collect and got the same error. I validated them with st_IsValid, turned ST_collect(geom_1,geom_2...) >> ST_Union() and it worked.

Upvotes: 0

Eden Katabi
Eden Katabi

Reputation: 301

I found a relevant solution to my problem.

select st_intersects(st_buffer('MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))',0),'POLYGON((3 4.5,3 5,4 5,4 4,3 4.5))');

When i added the st_buffer it merge the two polygons of the multipolygon to one and solved the issue.

Upvotes: 14

ewcz
ewcz

Reputation: 13087

you can check that the MultiPolygon geometry in your query is not a valid MultiPolygon:

=> select st_isvalid(
    st_geomfromtext(
        'MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))'
));
NOTICE:  Self-intersection at or near point 6 6
 st_isvalid
------------
 f
(1 row)

the reason for this is that the Polygon (5 5,8 8,11 5,8 2,5 5) defining the "hole" (inner ring) intersects the outer ring (1 5,4 8,7 5,4 2,1 5).

It would be either necessary to fix the input manually, or one can use ST_MakeValid to do the job (it automatically detects and handles the overlapping parts):

=> select st_intersects(
    st_makevalid(
        'MULTIPOLYGON(((1 5,4 8,7 5,4 2,1 5)),((5 5,8 8,11 5,8 2,5 5)))'
    ),
    'POLYGON((3 4.5,3 5,4 5,4 4,3 4.5))'
);
 st_intersects 
---------------
 t
(1 row)

Upvotes: 6

Related Questions