[postgis-users] Odd st_buffer behaviour

James David Smith james.david.smith at gmail.com
Mon Nov 25 10:05:51 PST 2013


Steve,

Thanks, you are of course right. I hadn't thought of that. Makes sense.

James

On 25 November 2013 17:58, Stephen Woodbridge <woodbri at swoodbridge.com> wrote:
> This is because lines shaped like say an Omega character, will create an
> island inside the character at a certain offset and this can not be
> represented as a simple polygon. Well maybe it can but the algorithm
> probably does not try to reduce them to their most simple features. While
> the lines may not intersect, the offset lines may intersect and it is a
> function of how these are dealt with.
>
> -Steve
>
>
> On 11/25/2013 12:49 PM, James David Smith wrote:
>>
>> Hi Remi/all,
>>
>> I realise I'm digressing slightly from the point, but this seems
>> related. This seems strange to me:
>>
>> I check the geometry type of a table of what I think are linestrings
>> (roads):
>>
>> ukroads=# SELECT COUNT(*), geometrytype(geom) FROM ukrds GROUP BY
>> geometrytype(geom);
>> 395356 | LINESTRING
>>
>> Great. They are all linestrings. Now I check that none of them are
>> self-intersecting:
>>
>> ukroads=# SELECT COUNT(*), st_issimple(geom) FROM ukrds GROUP BY
>> st_issimple(geom);
>>   395356 | t
>>
>> Ok. That's fine. They are all ok.
>>
>> Now I check that they are all valid:
>>
>> ukroads=# SELECT COUNT(*), st_isvalid(geom) FROM ukrds GROUP BY
>> st_isvalid(geom);
>>   395356 | t
>>
>> So now I buffer them all by 1000 metres wanting to make a polygon out
>> of each line:
>>
>> ukroads=# SELECT COUNT(a.*), geometrytype(a.the_geom) FROM (SELECT
>> st_buffer(geom,1000) as the_geom FROM ukrds) AS a GROUP BY
>> geometrytype(a.the_geom);
>> 392255 | POLYGON
>> 3101 | MULTIPOLYGON
>>
>> However I am returned with 3101 multipolygons (and the rest polygons).
>> Why is that? Should they not all be polygons? Why do some of them
>> become a multipolygon?
>>
>> Thanks
>>
>> James
>>
>> On 25 November 2013 17:25, Rémi Cura <remi.cura at gmail.com> wrote:
>>>
>>> You could use the default ending (which is well defined),
>>> then split the resulting with the line like endcap=flat (easy to build,
>>> translate endpoint by radius and -radius in normal direction)
>>>
>>> I still fail to understand why you would need this kind of ending.
>>>
>>> Cheers,
>>>
>>> Rémi C
>>>
>>>
>>> 2013/11/25 Rémi Cura <remi.cura at gmail.com>
>>>>
>>>>
>>>> Does  offset curve gives the same result?
>>>> (seems lile offsetting both side have same behavior)
>>>>
>>>> Maybe you can try several buffers with increasing size?
>>>> (default appears wau before 1000)
>>>>
>>>> Also, can you try to simplify your line : each coordinates uses 15
>>>> digits,
>>>> surely you don't need all of this !
>>>> (simplifying to 8 digits doesn't help).
>>>>
>>>> It seems like a bad design in algorithm ?
>>>>
>>>> Cheers,
>>>> Rémi-C
>>>>
>>>>
>>>> 2013/11/25 James David Smith <james.david.smith at gmail.com>
>>>>>
>>>>>
>>>>> Hi there,
>>>>>
>>>>> Some code to illustrate my problem:
>>>>>
>>>>> 1) A linestring (SRID: 27700)
>>>>>
>>>>> 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)
>>>>>
>>>>> 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');
>>>>>
>>>>> 3) The result is attached as a jpg (line thickness increased to aid
>>>>> viewing).
>>>>>
>>>>> Any ideas please? This is related to an ongoing discussion I was
>>>>> having with Remi a while ago. Basically I'm buffering loads of road
>>>>> centrelines to create polygons. But when I do it, a small number end
>>>>> up with really strange buffers like this attached example. I'm at a
>>>>> loss as to why.
>>>>>
>>>>> Thanks
>>>>>
>>>>> James
>>>>>
>>>>> _______________________________________________
>>>>> postgis-users mailing list
>>>>> postgis-users at lists.osgeo.org
>>>>> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>>>
>>>>
>>>>
>>>
>>>
>>> _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at lists.osgeo.org
>>> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at lists.osgeo.org
>> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users
>>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at lists.osgeo.org
> http://lists.osgeo.org/cgi-bin/mailman/listinfo/postgis-users


More information about the postgis-users mailing list