Opened 4 years ago
Last modified 4 years ago
#4765 new defect
ST_ClipByBox2D: Incorrect clipping of lines
Reported by: | Algunenano | Owned by: | pramsey |
---|---|---|---|
Priority: | medium | Milestone: | PostGIS GEOS |
Component: | postgis | Version: | master |
Keywords: | Cc: |
Description
It seems there is some kind of bug when clipping lines that are around the borders of the bbox in ST_ClipByBox2D.
Query:
WITH geom AS ( SELECT 'LINESTRING(0 0,0 10, 10 10,1 1)'::geometry as geom UNION ALL SELECT 'LINESTRING(0 0, 0 15, 15 15, 1 1)'::geometry as geom ), box AS ( SELECT ST_MakeEnvelope(0,0,10,10) AS box ) SELECT ST_AsText(geom) as geom, ST_AsText(box::box2d) as box, ST_AsText(ST_ClipByBox2D(geom, box)) as clip, ST_AsText(ST_Intersection(geom, box)) as intersection FROM geom, box
Output:
geom | box | clip | intersection --------------------------------+------------------------------------+--------------------------------+------------------------------------------------------ LINESTRING(0 0,0 10,10 10,1 1) | POLYGON((0 0,0 10,10 10,10 0,0 0)) | LINESTRING(0 0,0 10,10 10,1 1) | MULTILINESTRING((0 0,0 10),(0 10,10 10),(10 10,1 1)) LINESTRING(0 0,0 15,15 15,1 1) | POLYGON((0 0,0 10,10 10,10 0,0 0)) | LINESTRING(10 10,1 1) | MULTILINESTRING((0 0,0 10),(10 10,1 1)) (2 rows)
In the first case things look normal, both when you clip using ST_Intersect or ST_ClipByBox2D, but in the second case the ST_ClipByBox2D output is clearly wrong as it's missing a whole lien, while ST_Intersection is returning a valid value.
I haven't reproduced the issue with polygons, just lines.
It's likely a GEOS issue, but I haven't tried to isolate it yet to report it there if necessary. Tested with Postgis 3.0 and master, GEOS 3.8.2 and master (with and without overlayNG).
Change History (2)
comment:1 by , 4 years ago
comment:2 by , 4 years ago
Milestone: | PostGIS 3.0.3 → PostGIS GEOS |
---|
Reported upstream https://trac.osgeo.org/geos/ticket/1056
I have a vague feeling that this is in order to have ST_Subdivide left and right tiles not both have a single segment of line - it only goes to one side.