7

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?

Eden Katabi
  • 271
  • 1
  • 2
  • 9

2 Answers2

12

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.

Eden Katabi
  • 271
  • 1
  • 2
  • 9
5

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)
ewcz
  • 12,819
  • 1
  • 25
  • 47