[postgis-users] ST_Split with Multilinestring

Marcin Mionskowski mionskowskimarcin at gmail.com
Wed Jun 15 00:24:54 PDT 2016


On Tue, 14 Jun 2016 15:37:40 +0200, Marcone <marconeperes at gmail.com> wrote:

>
> 2016-06-14 9:52 GMT-03:00 Birgit Laggner <birgit.laggner at thuenen.de>:
>> I would like to use the ST_Split function to split polygons from one
>>    table with all intersecting lines from another table. Unfortunately,
>>    I get the following error:
>>
>>    
>>    ERROR: Splitting a Polygon by a MultiLineString is unsupported
>>
>>    SQL Status:XX000
>>
>>    
>>    This is my query:
>>
>>    
>>    select betr_id, (cut).path[1], (cut).geom from (select betr_id,
>>    st_dump(st_split) as cut from (select a.betr_id, ST_Split(a.geom,
>>    st_union(b.geom)) from p_sam.nihb_2013_convex_hull_betr a left join
>>    p_sam.ni_dlm13_aaa_gew_sie_ver_l b on st_intersects(a.geom, b.geom)
>>    group by a.betr_id, a.geom) sel1) sel2;
>>
>>    
>>    The Manual contains the following info regarding this problem:
>>
>>    
>>    "The function supports splitting a line by (multi)point, (multi)line
>>    or (multi)polygon boundary, a (multi)polygon by line."
>>
>>    
>>    This might mean that I would be able to split a line by
>>    multilinestrings, but a polygon only by single linestrings - is that
>>    correct? Does anyone has a suggestion how I could work around this
>>    problem (aside from looping the ST_Split with some function, DO
>>    block or pgScript after selecting all intersecting linestrings per
>>    polygon)?
>>
>>    
>>    Thanks a lot for any helpful suggestions!
>
> I'm not sure if I understand your problem, but try use ST_Split(st_multi(a.geom),
>    st_union(b.geom)). I'm not test this, but I think that will solve your problem.
>
> Best regards.
>
>
>
Have you tried to ST_Dump multilinestrings first?
Using CTE this could look like:

with
a as ( --polygon
	select ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50) a
	),
b as ( --multilinestring
	select ST_Union(
		(select ST_MakeLine(ST_MakePoint(10, 10),ST_MakePoint(190, 190))),
		(select ST_MakeLine(ST_MakePoint(191, 191),ST_MakePoint(200, 200)))
	) b
	),
c as ( --multilinestring dump -> 2 separate linestrings
	select (ST_Dump(b)).geom c
	from b
	)

SELECT ST_AsText(ST_Split(a, c))
 from a,c
where ST_Intersects(a,c)

Intersection check is done here on line parts.

Regards


More information about the postgis-users mailing list