PostGIS  2.1.10dev-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 463 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().

464 {
465  uint32_t nrings = integer_from_wkb_state(s);
466  int i = 0;
467  LWPOLY *poly = lwpoly_construct_empty(s->srid, s->has_z, s->has_m);
468 
469  /* Empty polygon? */
470  if( nrings == 0 )
471  return poly;
472 
473  for( i = 0; i < nrings; i++ )
474  {
476  if( pa == NULL )
477  continue;
478 
479  /* Check for at least four points. */
480  if( s->check & LW_PARSER_CHECK_MINPOINTS && pa->npoints < 4 )
481  {
482  LWDEBUGF(2, "%s must have at least four points in each ring", lwtype_name(s->lwtype));
483  lwerror("%s must have at least four points in each ring", lwtype_name(s->lwtype));
484  return NULL;
485  }
486 
487  /* Check that first and last points are the same. */
489  {
490  LWDEBUGF(2, "%s must have closed rings", lwtype_name(s->lwtype));
491  lwerror("%s must have closed rings", lwtype_name(s->lwtype));
492  return NULL;
493  }
494 
495  /* Add ring to polygon */
496  if ( lwpoly_add_ring(poly, pa) == LW_FAILURE )
497  {
498  LWDEBUG(2, "Unable to add ring to polygon");
499  lwerror("Unable to add ring to polygon");
500  }
501 
502  }
503  return poly;
504 }
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:312
int npoints
Definition: liblwgeom.h:327
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:250
#define LW_PARSER_CHECK_MINPOINTS
Parser check flags.
Definition: liblwgeom.h:1701
uint32_t lwtype
Definition: lwin_wkb.c:24
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:50
int ptarray_is_closed_2d(const POINTARRAY *pa)
Definition: ptarray.c:672
#define LW_FAILURE
Definition: liblwgeom.h:54
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:67
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition: lwutil.c:164
uint32_t srid
Definition: lwin_wkb.c:25
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
#define LW_PARSER_CHECK_CLOSURE
Definition: liblwgeom.h:1703

Here is the call graph for this function:

Here is the caller graph for this function: