PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ wkt_parser_collection_finalize()

LWGEOM* wkt_parser_collection_finalize ( int  lwtype,
LWGEOM geom,
char *  dimensionality 
)

Definition at line 840 of file lwin_wkt.c.

841 {
842  lwflags_t flags = wkt_dimensionality(dimensionality);
843  int flagdims = FLAGS_NDIMS(flags);
844 
845  /* No geometry means it is empty */
846  if( ! geom )
847  {
849  }
850 
851  /* There are 'Z' or 'M' tokens in the signature */
852  if ( flagdims > 2 )
853  {
855  uint32_t i;
856 
857  for ( i = 0 ; i < col->ngeoms; i++ )
858  {
859  LWGEOM *subgeom = col->geoms[i];
860  if ( FLAGS_NDIMS(flags) != FLAGS_NDIMS(subgeom->flags) &&
861  ! lwgeom_is_empty(subgeom) )
862  {
863  lwgeom_free(geom);
865  return NULL;
866  }
867 
868  if ( lwtype == COLLECTIONTYPE &&
869  ( (FLAGS_GET_Z(flags) != FLAGS_GET_Z(subgeom->flags)) ||
870  (FLAGS_GET_M(flags) != FLAGS_GET_M(subgeom->flags)) ) &&
871  ! lwgeom_is_empty(subgeom) )
872  {
873  lwgeom_free(geom);
875  return NULL;
876  }
877  }
878 
879  /* Harmonize the collection dimensionality */
880  if( LW_FAILURE == wkt_parser_set_dims(geom, flags) )
881  {
882  lwgeom_free(geom);
884  return NULL;
885  }
886  }
887 
888  /* Set the collection type */
889  geom->type = lwtype;
890 
891  return geom;
892 }
#define PARSER_ERROR_MIXDIMS
Definition: liblwgeom.h:2172
LWGEOM * lwcollection_as_lwgeom(const LWCOLLECTION *obj)
Definition: lwgeom.c:309
#define COLLECTIONTYPE
Definition: liblwgeom.h:108
#define LW_FAILURE
Definition: liblwgeom.h:96
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1218
uint16_t lwflags_t
Definition: liblwgeom.h:299
#define PARSER_ERROR_OTHER
Definition: liblwgeom.h:2178
#define FLAGS_GET_Z(flags)
Definition: liblwgeom.h:165
#define FLAGS_NDIMS(flags)
Definition: liblwgeom.h:179
LWCOLLECTION * lwcollection_construct_empty(uint8_t type, int32_t srid, char hasz, char hasm)
Definition: lwcollection.c:92
#define FLAGS_GET_M(flags)
Definition: liblwgeom.h:166
LWCOLLECTION * lwgeom_as_lwcollection(const LWGEOM *lwgeom)
Definition: lwgeom.c:233
#define SRID_UNKNOWN
Unknown SRID value.
Definition: liblwgeom.h:215
#define SET_PARSER_ERROR(errno)
Definition: lwin_wkt.c:52
static int wkt_parser_set_dims(LWGEOM *geom, lwflags_t flags)
Force the dimensionality of a geometry to match the dimensionality of a set of flags (usually derived...
Definition: lwin_wkt.c:101
static lwflags_t wkt_dimensionality(char *dimensionality)
Definition: lwin_wkt.c:75
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
Definition: lwinline.h:199
uint32_t ngeoms
Definition: liblwgeom.h:580
LWGEOM ** geoms
Definition: liblwgeom.h:575
uint8_t type
Definition: liblwgeom.h:462
lwflags_t flags
Definition: liblwgeom.h:461

References COLLECTIONTYPE, LWGEOM::flags, FLAGS_GET_M, FLAGS_GET_Z, FLAGS_NDIMS, LWCOLLECTION::geoms, LW_FAILURE, lwcollection_as_lwgeom(), lwcollection_construct_empty(), lwgeom_as_lwcollection(), lwgeom_free(), lwgeom_is_empty(), LWCOLLECTION::ngeoms, PARSER_ERROR_MIXDIMS, PARSER_ERROR_OTHER, SET_PARSER_ERROR, SRID_UNKNOWN, LWGEOM::type, wkt_dimensionality(), and wkt_parser_set_dims().

Here is the call graph for this function: