[postgis-users] ST_Split with Multilinestring
Birgit Laggner
birgit.laggner at thuenen.de
Wed Jun 15 02:38:30 PDT 2016
Yes, this function will probably work - that's similar to what I meant
with "looping the ST_Split with some function, DO block or pgScript
after selecting all intersecting linestrings per polygon" in my original
mail. If my current approach fails, too, I will revert to some sort of
looping approach like the one you suggested. Thanks again for taking the
time to analyze my problem!
Regards,
Birgit
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Achtung: Das Thünen-Institut hat die Domain gewechselt.
Bitte ändern Sie meine Mailadresse in Ihrem Adressbuch!
Notice: Thünen Institute has changed its domain.
Please change my email address in your address book!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Dipl.-Geoökol. Birgit Laggner
Thünen-Institut für Ländliche Räume / Thünen Institute of Rural Studies
Bundesallee 50
38116 Braunschweig (Germany)
Tel: +49 531 596-5240
Mail: birgit.laggner at thuenen.de
Web: www.thuenen.de
Am 15.06.2016 um 11:27 schrieb Marcin Mionskowski:
> 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
>
>
More information about the postgis-users
mailing list