[postgis-users] ST_Split with Multilinestring

Marcin Mionskowski mionskowskimarcin at gmail.com
Wed Jun 15 02:27:42 PDT 2016


I think I finaly understand what you have and what you want to achieve - take a look at polygon and multiline definitions :)

If I'm right, this function should do the work:

create table polygon
(
id serial,
geom geometry,
done smallint default 0
);
create table multiline
(
id serial,
geom geometry,
done smallint default 0
);
create table line
(
id serial,
geom geometry,
done smallint default 0
);

insert into polygon (geom)
select ST_Buffer(ST_GeomFromText('POINT(10 10)'), 10);

insert into multiline (geom)
select ST_Union(
	(select ST_MakeLine(ST_MakePoint(0, 1),ST_MakePoint(20, 21))),
	(select ST_MakeLine(ST_MakePoint(1, 0),ST_MakePoint(20, 19)))
	);

create or replace function test() returns void as
$BODY$

	declare ln geometry;
		i int;

BEGIN
	truncate table line;
	
	insert into line (geom)
	select (ST_Dump(geom)).geom
	from multiline;

	loop
		select geom,id
		into ln,i
		from line
		where done=0
		limit 1;

		with
		del as (
			delete from polygon p
			where ST_Intersects(p.geom,ln)
			returning p.geom
			)
		insert into polygon (geom)
		select (st_dump(st_split(del.geom,ln))).geom
		from del;

		update line
		set done=1
		where id=i;
		
		exit when i is null;
	end loop;
end;
$BODY$
LANGUAGE plpgsql;

select test();



On Wed, 15 Jun 2016 11:10:33 +0200, Birgit Laggner <birgit.laggner at thuenen.de> wrote:

> Dear list,
>
> @Marcone: Unfortunately, the st_multi didn't change anything. The error
> message is still the same.
>
> Next, I will try some function from a user example from 2008
> (https://trac.osgeo.org/postgis/wiki/UsersWikiSplitPolygonWithLineString).
> Maybe this will be a workaround.
>
> But I am still wondering why I get the error message at all. I did find
> a PostGIS ticket addressing the same functionality
> (https://trac.osgeo.org/postgis/ticket/3097) and there is mentioned that
> the problem is fixed with PostGIS 2.2.0. My PostGIS version is
> "POSTGIS="2.2.1 r14555" GEOS="3.5.0-CAPI-1.9.0 r4084" PROJ="Rel. 4.9.1,
> 04 March 2015" GDAL="GDAL 1.11.2, released 2015/02/10" LIBXML="2.9.2"
> LIBJSON="0.11.99" TOPOLOGY RASTER". So, I would suppose I shouldn't have
> this problem.
>
> Any other ideas?
>
> Thanks and regards,
>
> Birgit
>
> Am 15.06.2016 um 10:01 schrieb Birgit Laggner:
>> Hi Marcin,
>>
>> thanks for your reply. I don't think, that will provide the results I
>> am looking for. I am deliberately aggregating all intersecting lines
>> with ST_Union because otherwise the query would result in several
>> collections per polygon, each collection containig the st_split result
>> for one of the intersecting lines (blades). But I want the polygon cut
>> with all blades.
>>
>> Currently I am trying Marcone's suggestion (although I cannot imagine
>> why this should solve anything - but you never know until you try,
>> right?).
>>
>> So, thank you both, Marcin and Marcone!
>>
>> Regards,
>>
>> Birgit
>>
>> Am 15.06.2016 um 09:24 schrieb Marcin Mionskowski:
>>> 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
>>> _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/postgis-users
>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/postgis-users
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/postgis-users


-- 
Using Opera's mail client: http://www.opera.com/mail/


More information about the postgis-users mailing list