PostGIS  2.5.7dev-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 511 of file lwin_wkb.c.

512 {
514  uint32_t i = 0;
515  LWPOLY *poly = lwpoly_construct_empty(s->srid, s->has_z, s->has_m);
516 
517  LWDEBUGF(4,"Polygon has %d rings", nrings);
518 
519  /* Empty polygon? */
520  if( nrings == 0 )
521  return poly;
522 
523  for( i = 0; i < nrings; i++ )
524  {
526  if( pa == NULL )
527  continue;
528 
529  /* Check for at least four points. */
530  if( s->check & LW_PARSER_CHECK_MINPOINTS && pa->npoints < 4 )
531  {
532  LWDEBUGF(2, "%s must have at least four points in each ring", lwtype_name(s->lwtype));
533  lwerror("%s must have at least four points in each ring", lwtype_name(s->lwtype));
534  return NULL;
535  }
536 
537  /* Check that first and last points are the same. */
538  if( s->check & LW_PARSER_CHECK_CLOSURE && ! ptarray_is_closed_2d(pa) )
539  {
540  LWDEBUGF(2, "%s must have closed rings", lwtype_name(s->lwtype));
541  lwerror("%s must have closed rings", lwtype_name(s->lwtype));
542  return NULL;
543  }
544 
545  /* Add ring to polygon */
546  if ( lwpoly_add_ring(poly, pa) == LW_FAILURE )
547  {
548  LWDEBUG(2, "Unable to add ring to polygon");
549  lwerror("Unable to add ring to polygon");
550  }
551 
552  }
553  return poly;
554 }
char * s
Definition: cu_in_wkt.c:23
#define LW_PARSER_CHECK_CLOSURE
Definition: liblwgeom.h:2002
#define LW_FAILURE
Definition: liblwgeom.h:79
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:218
#define LW_PARSER_CHECK_MINPOINTS
Parser check flags.
Definition: liblwgeom.h:2000
int ptarray_is_closed_2d(const POINTARRAY *pa)
Definition: ptarray.c:695
LWPOLY * lwpoly_construct_empty(int 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:275
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:337
uint32_t npoints
Definition: liblwgeom.h:374
unsigned int uint32_t
Definition: uthash.h:78

References integer_from_wkb_state(), LW_FAILURE, LW_PARSER_CHECK_CLOSURE, LW_PARSER_CHECK_MINPOINTS, LWDEBUG, LWDEBUGF, lwerror(), lwpoly_add_ring(), lwpoly_construct_empty(), lwtype_name(), POINTARRAY::npoints, 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: