[postgis-users] Odd st_buffer behaviour

Mike Toews mwtoews at gmail.com
Tue Nov 26 00:46:11 PST 2013


On 26 November 2013 06:04, James David Smith
<james.david.smith at gmail.com> wrote:
> 2) Now I buffer it:
>
> SELECT ST_Buffer(
>  ST_GeomFromText(
>   'LINESTRING(555936.152 200920.582000002,555938.312000002
> 200908.102000002,555943.112000001 200883.142000001,555953.192000001
> 200839.702,555964.471999999 200798.181999998,555974.312
> 200764.342000002,555983.912 200744.182000002,555990.554
> 200733.721000003,555993.512 200729.062000005,555995.778000002
> 200726.756000001,556006.952000001 200715.382000001,556024.232
> 200698.822000002,556036.597999999 200687.931,556050.392000001
> 200675.782000002,556055.914 200671.265000002,556071.512
> 200658.502000002,556094.915000001 200640.537000002,556095.451000001
> 200640.152000001,556113.992000001 200628.742000001,556138.472000001
> 200616.502000004,556159.112000002 200605.942000002,556180.232000001
> 200589.862000002,556207.592 200568.022000002,556217.912000002
> 200558.182,556228.472000001 200545.702,556240.472
> 200527.702000003,556251.992000001 200509.221999999,556253.237000001
> 200506.732000003,556258.952 200495.302000001,556268.000000001
> 200478.000000002,556279.592 200458.582000002,556300
> 200431.000000002,556351.000000002 200364,556349.253
> 200366.234000001)'), 1000, 'endcap=flat join=round');

Hi James,

I just had a spin with this geometry in JTS TestBuilder, in Buffer >
BufferWithParams. This graphical tool has similar controls as
ST_Buffer, but is slightly more interactive. I get pretty much the
same result, with anomalies on both ends of the linestring. GEOS (used
by PostGIS) is a C++ port of JTS, so this is no surprise to see the
same results. Only buffers less than 200 look normal.

The oddness at the bottom is explained by a small J-shaped kink at the
end of the linestring, which has a short and very sharp angle (nearly
360 degrees or 0 degrees), which makes the last segment go upwards and
nearly parallel to the second-to-last segment of the linestring.
Removing the last coordinate fixes things on the lower part. This is
most likely a digitization error.

If you have heaps of these geometries that need cleaning up, you could
write a function to return the maximum vertex angle in a linestring,
and filter out the sharp ones, e.g. > 350 degrees or < 10 degrees,
then check and fix these up manually.

On the upper-right part of the buffer, the polygon is clearly buffered
by the correct distance from the middle of the line, but the clip from
the top cap carves it a bit funny. I've seen this before too, and I'm
not sure if anything can be done about this part.

-Mike


More information about the postgis-users mailing list