PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ lwpoly_from_wkb_state()

static LWPOLY* lwpoly_from_wkb_state ( wkb_parse_state s)
static

POLYGON Read a WKB polygon, starting just after the endian byte, type number and optional srid number.

Advance the parse state forward appropriately. First read the number of rings, then read each ring (which are structured as point arrays)

Definition at line 538 of file lwin_wkb.c.

539 {
540  uint32_t nrings = integer_from_wkb_state(s);
541  if (s->error)
542  return NULL;
543  uint32_t i = 0;
544  LWPOLY *poly = lwpoly_construct_empty(s->srid, s->has_z, s->has_m);
545 
546  LWDEBUGF(4,"Polygon has %d rings", nrings);
547 
548  /* Empty polygon? */
549  if( nrings == 0 )
550  return poly;
551 
552  for( i = 0; i < nrings; i++ )
553  {
555  if (pa == NULL)
556  {
557  lwpoly_free(poly);
558  return NULL;
559  }
560 
561  /* Check for at least four points. */
562  if (s->check & LW_PARSER_CHECK_MINPOINTS && pa->npoints < 4)
563  {
564  lwpoly_free(poly);
565  ptarray_free(pa);
566  LWDEBUGF(2, "%s must have at least four points in each ring", lwtype_name(s->lwtype));
567  lwerror("%s must have at least four points in each ring", lwtype_name(s->lwtype));
568  return NULL;
569  }
570 
571  /* Check that first and last points are the same. */
572  if( s->check & LW_PARSER_CHECK_CLOSURE && ! ptarray_is_closed_2d(pa) )
573  {
574  lwpoly_free(poly);
575  ptarray_free(pa);
576  LWDEBUGF(2, "%s must have closed rings", lwtype_name(s->lwtype));
577  lwerror("%s must have closed rings", lwtype_name(s->lwtype));
578  return NULL;
579  }
580 
581  /* Add ring to polygon */
582  if ( lwpoly_add_ring(poly, pa) == LW_FAILURE )
583  {
584  lwpoly_free(poly);
585  ptarray_free(pa);
586  LWDEBUG(2, "Unable to add ring to polygon");
587  lwerror("Unable to add ring to polygon");
588  return NULL;
589  }
590 
591  }
592  return poly;
593 }
char * s
Definition: cu_in_wkt.c:23
#define LW_PARSER_CHECK_CLOSURE
Definition: liblwgeom.h:2111
#define LW_FAILURE
Definition: liblwgeom.h:96
int lwpoly_add_ring(LWPOLY *poly, POINTARRAY *pa)
Add a ring, allocating extra space if necessary.
Definition: lwpoly.c:247
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition: lwutil.c:216
#define LW_PARSER_CHECK_MINPOINTS
Parser check flags.
Definition: liblwgeom.h:2109
void ptarray_free(POINTARRAY *pa)
Definition: ptarray.c:319
int ptarray_is_closed_2d(const POINTARRAY *pa)
Definition: ptarray.c:714
void lwpoly_free(LWPOLY *poly)
Definition: lwpoly.c:175
LWPOLY * lwpoly_construct_empty(int32_t srid, char hasz, char hasm)
Definition: lwpoly.c:161
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
static uint32_t integer_from_wkb_state(wkb_parse_state *s)
Int32 Read 4-byte integer and advance the parse state forward.
Definition: lwin_wkb.c:285
static POINTARRAY * ptarray_from_wkb_state(wkb_parse_state *s)
POINTARRAY Read a dynamically sized point array and advance the parse state forward.
Definition: lwin_wkb.c:347
uint32_t npoints
Definition: liblwgeom.h:427

References integer_from_wkb_state(), LW_FAILURE, LW_PARSER_CHECK_CLOSURE, LW_PARSER_CHECK_MINPOINTS, LWDEBUG, LWDEBUGF, lwerror(), lwpoly_add_ring(), lwpoly_construct_empty(), lwpoly_free(), lwtype_name(), POINTARRAY::npoints, ptarray_free(), ptarray_from_wkb_state(), ptarray_is_closed_2d(), and s.

Referenced by lwgeom_from_wkb_state().

Here is the call graph for this function:
Here is the caller graph for this function: