PostGIS  2.2.7dev-r@@SVN_REVISION@@
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 485 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().

486 {
487  uint32_t nrings = integer_from_wkb_state(s);
488  int i = 0;
489  LWPOLY *poly = lwpoly_construct_empty(s->srid, s->has_z, s->has_m);
490 
491  LWDEBUGF(4,"Polygon has %d rings", nrings);
492 
493  /* Empty polygon? */
494  if( nrings == 0 )
495  return poly;
496 
497  for( i = 0; i < nrings; i++ )
498  {
500  if( pa == NULL )
501  continue;
502 
503  /* Check for at least four points. */
504  if( s->check & LW_PARSER_CHECK_MINPOINTS && pa->npoints < 4 )
505  {
506  LWDEBUGF(2, "%s must have at least four points in each ring", lwtype_name(s->lwtype));
507  lwerror("%s must have at least four points in each ring", lwtype_name(s->lwtype));
508  return NULL;
509  }
510 
511  /* Check that first and last points are the same. */
513  {
514  LWDEBUGF(2, "%s must have closed rings", lwtype_name(s->lwtype));
515  lwerror("%s must have closed rings", lwtype_name(s->lwtype));
516  return NULL;
517  }
518 
519  /* Add ring to polygon */
520  if ( lwpoly_add_ring(poly, pa) == LW_FAILURE )
521  {
522  LWDEBUG(2, "Unable to add ring to polygon");
523  lwerror("Unable to add ring to polygon");
524  }
525 
526  }
527  return poly;
528 }
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:315
int npoints
Definition: liblwgeom.h:355
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:253
#define LW_PARSER_CHECK_MINPOINTS
Parser check flags.
Definition: liblwgeom.h:1864
uint32_t lwtype
Definition: lwin_wkb.c:27
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:50
int ptarray_is_closed_2d(const POINTARRAY *pa)
Definition: ptarray.c:694
#define LW_FAILURE
Definition: liblwgeom.h:64
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition: lwutil.c:188
uint32_t srid
Definition: lwin_wkb.c:28
LWPOLY * lwpoly_construct_empty(int srid, char hasz, char hasm)
Definition: lwpoly.c:66
int lwpoly_add_ring(LWPOLY *poly, POINTARRAY *pa)
Add a ring, allocating extra space if necessary.
Definition: lwpoly.c:154
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:55
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:74
#define LW_PARSER_CHECK_CLOSURE
Definition: liblwgeom.h:1866

Here is the call graph for this function:

Here is the caller graph for this function: