st_union(geom[]) does not union single-geometrycollection arrays

Paul Ramsey pramsey at cleverelephant.ca
Mon Feb 26 11:37:19 PST 2024


Yes, it was an oversight of sorts,

https://trac.osgeo.org/postgis/ticket/5677

On Sat, Feb 24, 2024 at 5:00 PM Regina Obe <lr at pcorp.us> wrote:
>
> This seems non-intuitive to me too.
>
> The ST_Union(ARRAY[..])   should be giving you the same results as ST_Union(set geom)
> But as you stated in your second example, I confirm it is not.
>
> Should be giving the same answer as
>
> SELECT  ST_AsText(ST_Union(f.geom))
> FROM (SELECT
>         st_geomfromtext(
>           'GEOMETRYCOLLECTION(
>             POLYGON((0 0,10 0,25 25,0 10,0 0)),
>             POLYGON((20 20,30 20,30 30,20 30,20 20))
>           )') ) AS f(geom);
>
> Which returns:   POLYGON((22 20,10 0,0 0,0 10,20 22,20 30,30 30,30 20,22 20))
>
> Anyone have thoughts on this, if we should flag as a bug.  I would say it's a bug.
>
> Thanks,
> Regina
>
> > -----Original Message-----
> > From: Dian Fay <di at nmfay.com>
> > Sent: Saturday, February 24, 2024 6:16 PM
> > To: postgis-devel at lists.osgeo.org
> > Subject: st_union(geom[]) does not union single-geometrycollection arrays
> >
> > Postgres 16.1
> > postgis_version: 3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
> >
> > I've produced some geometrycollection arrays from st_clusterintersecting.
> > Now I want to combine each cluster, to end up with as many simple
> > geometries as there were originally clusters. This turns out to work well as
> > long as I have multiple clusters. When the array contains only one
> > geometrycollection -- in other words, _all_ the original geometries overlapped
> > and should be combined -- it doesn't.
> > Here's a distilled example showing a successful cluster simplification with two
> > clusters:
> >
> > ```
> > select
> >   st_asewkt(
> >     st_union(
> >       array[
> >         st_geomfromtext(
> >           'GEOMETRYCOLLECTION(
> >             POLYGON((0 0,10 0,25 25,0 10,0 0)),
> >             POLYGON((20 20,30 20,30 30,20 30,20 20))
> >           )'
> >         ),
> >         st_geomfromtext(
> >           'GEOMETRYCOLLECTION(
> >             POLYGON((100 100, 110 100, 110 110, 100 100))
> >           )'
> >         )
> >       ]
> >     )
> >   );
> > ```
> >
> > The polygons in the first collection overlap and are merged:
> >
> > ```
> > MULTIPOLYGON((
> >   (10 0,0 0,0 10,20 22,20 30,30 30,30 20,22 20,10 0)),
> >   ((110 100,100 100,110 110,110 100))
> > )
> > ```
> >
> > However, remove the second geometrycollection:
> >
> > ```
> > select
> >   st_asewkt(
> >     st_union(
> >       array[
> >         st_geomfromtext(
> >           'GEOMETRYCOLLECTION(
> >             POLYGON((0 0,10 0,25 25,0 10,0 0)),
> >             POLYGON((20 20,30 20,30 30,20 30,20 20))
> >           )'
> >         )
> >       ]
> >     )
> >   );
> > ```
> >
> > And st_union doesn't touch it:
> >
> > ```
> > GEOMETRYCOLLECTION(
> >   POLYGON((0 0,10 0,25 25,0 10,0 0)),
> >   POLYGON((20 20,30 20,30 30,20 30,20 20))
> > )
> > ```
> >
> > Since this does pull it out of the array, I can get the result I'm after by nesting
> > `st_union(st_union(array[....]))`. But it's counterintuitive, at least to me, that
> > `pgis_union_geometry_array` skips these. Should the "one geom, good geom"
> > case really apply to geometrycollections or is it meant more for simple
> > geometries?
>


More information about the postgis-devel mailing list