[postgis-users] simplifying (homogenize) a polygon

Denis Rouzaud denis.rouzaud at gmail.com
Thu Nov 21 04:50:59 PST 2013


Hi Nicolas,

I edit my multi polygons in QGIS, and you're right the geometry becomes 
invalid if some parts have adjacent segments.

In a simple case, I would have a multi polygons with 3 parts with 2 
parts adjacent.
http://imgur.com/zvxPFeR

Although the geometry is invalid, my intention is to make it valid, and 
therefore merge the two parts, which is impossible in QGIS - AFAIK.

So my intention was to save the geometry as this, and make it valid by a 
command.

I could achieve this with a function:
CREATE OR REPLACE FUNCTION distribution.simplemultipoly(geom geometry) 
RETURNS geometry AS
$BODY$
     DECLARE
         num_geom integer;
     BEGIN
         SELECT ST_NumGeometries(geom) into num_geom;
         SELECT 
ST_Multi(ST_CollectionHomogenize(ST_Union(ST_GeometryN(geom,n))))
             FROM generate_series(1,num_geom) n
             INTO geom;
         RETURN geom;
     END;
$BODY$
LANGUAGE plpgsql;

But I wondered if there was a more direct way.

Cheers,

Denis

On 21. 11. 13 12:42, Nicolas Ribot wrote:
> Hi Denis,
>
> In your example, I don't understand how the parts of your
> multipolygons can be adjacent. Are they valid ?
> Do you have a visual example ?
>
> Thank you
>
> Nicolas
>
>
> On 21 November 2013 07:32, Denis Rouzaud <denis.rouzaud at gmail.com> wrote:
>> Hello Rémi,
>>
>> I was hoping a simplest request without enabling topology but thanks anyway!
>>
>> Cheers,
>>
>> Denis
>>
>>
>> On 20. 11. 13 18:26, Rémi Cura wrote:
>>
>>
>>  From what I understand of your needs, Postigs topology was designed for
>> this.
>> Cheers,
>>
>> Rémi-C
>>
>>
>> 2013/11/20 Denis Rouzaud <denis.rouzaud at gmail.com>
>>> Hi all,
>>>
>>> I am drawing some multipolygons in QGIS and sometimes, I have parts of
>>> them which are adjacent and I'd like to homogenize them to have less parts
>>> and no adjacent parts.
>>>
>>> I could do this with a quite complex method:
>>>
>>> 1. get the number of parts Z:
>>> SELECT ST_NumGeometries(geometry) FROMmytable WHERE id=123;
>>>
>>> 2. do the simplification using ST_CollectionHomogenize:
>>> SELECT
>>> ST_Multi(ST_CollectionHomogenize(ST_Union(ST_GeometryN(geometry,n)))) FROM
>>> mytable CROSS JOIN generate_series(1,Z) n WHERE id = 123;
>>>
>>> 3. update manually the result in the table (copy paste).
>>>
>>>
>>> Does someone has something more straightforward???
>>>
>>> Thanks a lot!
>>>
>>> Best regards,
>>>
>>> Denis
>>> _______________________________________________
>>> 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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20131121/e0943ae6/attachment.html>


More information about the postgis-users mailing list