PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

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

539{
540 uint32_t nrings = integer_from_wkb_state(s);
541 if (s->error)
542 return NULL;
543 uint32_t i = 0;
544 LWPOLY *poly = lwpoly_construct_empty(s->srid, s->has_z, s->has_m);
545
546 LWDEBUGF(4,"Polygon has %d rings", nrings);
547
548 /* Empty polygon? */
549 if( nrings == 0 )
550 return poly;
551
552 for( i = 0; i < nrings; i++ )
553 {
555 if (pa == NULL)
556 {
557 lwpoly_free(poly);
558 return NULL;
559 }
560
561 /* Check for at least four points. */
562 if (s->check & LW_PARSER_CHECK_MINPOINTS && pa->npoints < 4)
563 {
564 lwpoly_free(poly);
565 ptarray_free(pa);
566 LWDEBUGF(2, "%s must have at least four points in each ring", lwtype_name(s->lwtype));
567 lwerror("%s must have at least four points in each ring", lwtype_name(s->lwtype));
568 return NULL;
569 }
570
571 /* Check that first and last points are the same. */
572 if( s->check & LW_PARSER_CHECK_CLOSURE && ! ptarray_is_closed_2d(pa) )
573 {
574 lwpoly_free(poly);
575 ptarray_free(pa);
576 LWDEBUGF(2, "%s must have closed rings", lwtype_name(s->lwtype));
577 lwerror("%s must have closed rings", lwtype_name(s->lwtype));
578 return NULL;
579 }
580
581 /* Add ring to polygon */
582 if ( lwpoly_add_ring(poly, pa) == LW_FAILURE )
583 {
584 lwpoly_free(poly);
585 ptarray_free(pa);
586 LWDEBUG(2, "Unable to add ring to polygon");
587 lwerror("Unable to add ring to polygon");
588 return NULL;
589 }
590
591 }
592 return poly;
593}
char * s
Definition cu_in_wkt.c:23
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition lwutil.c:216
#define LW_PARSER_CHECK_CLOSURE
Definition liblwgeom.h:2146
#define LW_FAILURE
Definition liblwgeom.h:96
int lwpoly_add_ring(LWPOLY *poly, POINTARRAY *pa)
Add a ring, allocating extra space if necessary.
Definition lwpoly.c:247
#define LW_PARSER_CHECK_MINPOINTS
Parser check flags.
Definition liblwgeom.h:2144
void ptarray_free(POINTARRAY *pa)
Definition ptarray.c:327
int ptarray_is_closed_2d(const POINTARRAY *pa)
Definition ptarray.c:710
void lwpoly_free(LWPOLY *poly)
Definition lwpoly.c:175
LWPOLY * lwpoly_construct_empty(int32_t srid, char hasz, char hasm)
Definition lwpoly.c:161
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:101
#define LWDEBUGF(level, msg,...)
Definition lwgeom_log.h:106
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
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:285
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:347
uint32_t npoints
Definition liblwgeom.h:427

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