PostGIS  2.5.2dev-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 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);
512 
513  LWDEBUGF(4,"Polygon has %d rings", nrings);
514 
515  /* Empty polygon? */
516  if( nrings == 0 )
517  return poly;
518 
519  for( i = 0; i < nrings; i++ )
520  {
522  if( pa == NULL )
523  continue;
524 
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  }
532 
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  }
540 
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  }
547 
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
#define LW_PARSER_CHECK_MINPOINTS
Parser check flags.
Definition: liblwgeom.h:1999
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:695
#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:161
int lwpoly_add_ring(LWPOLY *poly, POINTARRAY *pa)
Add a ring, allocating extra space if necessary.
Definition: lwpoly.c:247
#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
#define LW_PARSER_CHECK_CLOSURE
Definition: liblwgeom.h:2001
uint32_t npoints
Definition: liblwgeom.h:373
Here is the call graph for this function:
Here is the caller graph for this function: