476 ArrayIterator iterator;
481 int nelems = 0, geoms_size = 0, curgeom = 0,
count = 0;
485 GEOSGeometry *g = NULL;
486 GEOSGeometry *g_union = NULL;
487 GEOSGeometry **geoms = NULL;
494 if ( PG_ARGISNULL(0) )
497 array = PG_GETARG_ARRAYTYPE_P(0);
498 nelems = ArrayGetNItems(ARR_NDIM(array), ARR_DIMS(array));
501 if ( nelems == 0 ) PG_RETURN_NULL();
504 iterator = array_create_iterator(array, 0, NULL);
505 while (array_iterate(iterator, &
value, &isnull))
508 if (isnull)
continue;
511 array_free_iterator(iterator);
522 if (
count == 1 && nelems == 1 )
524 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
525 #pragma GCC diagnostic push
526 #pragma GCC diagnostic ignored "-Wsign-compare"
529 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
530 #pragma GCC diagnostic pop
532 srid = GEOSGetSRID(g);
533 g_union = GEOSUnaryUnion(g);
536 GEOSSetSRID(g_union, srid);
538 GEOSGeom_destroy(g_union);
539 PG_RETURN_POINTER(gser_out);
546 geoms = palloc(
sizeof(GEOSGeometry*) * geoms_size);
552 iterator = array_create_iterator(array, 0, NULL);
553 while (array_iterate(iterator, &
value, &isnull))
558 if (isnull)
continue;
576 if (gser_type > empty_type)
578 empty_type = gser_type;
579 POSTGIS_DEBUGF(4,
"empty_type = %d gser_type = %d", empty_type, gser_type);
590 "One of the geometries in the set "
591 "could not be converted to GEOS");
595 if ( curgeom == geoms_size )
598 geoms = repalloc( geoms,
sizeof(GEOSGeometry*) * geoms_size );
606 array_free_iterator(iterator);
614 g = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION, geoms, curgeom);
615 if (!g)
HANDLE_GEOS_ERROR(
"Could not create GEOS COLLECTION from geometry array");
617 g_union = GEOSUnaryUnion(g);
621 GEOSSetSRID(g_union, srid);
623 GEOSGeom_destroy(g_union);
629 if ( empty_type > 0 )
646 PG_RETURN_POINTER(gser_out);
void gserialized_error_if_srid_mismatch_reference(const GSERIALIZED *g1, const int32_t srid2, const char *funcname)
int32_t gserialized_get_srid(const GSERIALIZED *g)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
int gserialized_has_z(const GSERIALIZED *g)
Check if a GSERIALIZED has a Z ordinate.
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
void lwgeom_geos_error(const char *fmt,...)
#define SRID_UNKNOWN
Unknown SRID value.
LWGEOM * lwgeom_construct_empty(uint8_t type, int32_t srid, char hasz, char hasm)
#define HANDLE_GEOS_ERROR(label)
GSERIALIZED * GEOS2POSTGIS(GEOSGeom geom, char want3d)
GEOSGeometry * POSTGIS2GEOS(const GSERIALIZED *pglwgeom)