PostGIS  2.5.0dev-r@@SVN_REVISION@@
static LWPOLY* lwpoly_from_wkb_state ( wkb_parse_state s)

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 507 of file lwin_wkb.c.

References wkb_parse_state::check, wkb_parse_state::has_m, wkb_parse_state::has_z, integer_from_wkb_state(), LW_FAILURE, LW_PARSER_CHECK_CLOSURE, LW_PARSER_CHECK_MINPOINTS, LWDEBUG, LWDEBUGF, lwerror(), lwpoly_add_ring(), lwpoly_construct_empty(), wkb_parse_state::lwtype, lwtype_name(), POINTARRAY::npoints, ptarray_from_wkb_state(), ptarray_is_closed_2d(), and wkb_parse_state::srid.

Referenced by lwgeom_from_wkb_state().

508 {
509  uint32_t nrings = integer_from_wkb_state(s);
510  uint32_t i = 0;
511  LWPOLY *poly = lwpoly_construct_empty(s->srid, s->has_z, s->has_m);
513  LWDEBUGF(4,"Polygon has %d rings", nrings);
515  /* Empty polygon? */
516  if( nrings == 0 )
517  return poly;
519  for( i = 0; i < nrings; i++ )
520  {
522  if( pa == NULL )
523  continue;
525  /* Check for at least four points. */
526  if( s->check & LW_PARSER_CHECK_MINPOINTS && pa->npoints < 4 )
527  {
528  LWDEBUGF(2, "%s must have at least four points in each ring", lwtype_name(s->lwtype));
529  lwerror("%s must have at least four points in each ring", lwtype_name(s->lwtype));
530  return NULL;
531  }
533  /* Check that first and last points are the same. */
535  {
536  LWDEBUGF(2, "%s must have closed rings", lwtype_name(s->lwtype));
537  lwerror("%s must have closed rings", lwtype_name(s->lwtype));
538  return NULL;
539  }
541  /* Add ring to polygon */
542  if ( lwpoly_add_ring(poly, pa) == LW_FAILURE )
543  {
544  LWDEBUG(2, "Unable to add ring to polygon");
545  lwerror("Unable to add ring to polygon");
546  }
548  }
549  return poly;
550 }
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:333
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:271
Parser check flags.
Definition: liblwgeom.h:1993
uint32_t lwtype
Definition: lwin_wkb.c:42
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
int ptarray_is_closed_2d(const POINTARRAY *pa)
Definition: ptarray.c:688
#define LW_FAILURE
Definition: liblwgeom.h:78
unsigned int uint32_t
Definition: uthash.h:78
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition: lwutil.c:218
uint32_t srid
Definition: lwin_wkb.c:43
LWPOLY * lwpoly_construct_empty(int srid, char hasz, char hasm)
Definition: lwpoly.c:159
int lwpoly_add_ring(LWPOLY *poly, POINTARRAY *pa)
Add a ring, allocating extra space if necessary.
Definition: lwpoly.c:245
#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
Definition: liblwgeom.h:1995
uint32_t npoints
Definition: liblwgeom.h:370

Here is the call graph for this function:

Here is the caller graph for this function: