PostGIS  2.5.7dev-r@@SVN_REVISION@@

◆ lwpoint_from_wkb_state()

static LWPOINT* lwpoint_from_wkb_state ( wkb_parse_state s)
static

POINT Read a WKB point, starting just after the endian byte, type number and optional srid number.

Advance the parse state forward appropriately. WKB point has just a set of doubles, with the quantity depending on the dimension of the point, so this looks like a special case of the above with only one point.

Definition at line 397 of file lwin_wkb.c.

398 {
399  static uint32_t npoints = 1;
400  POINTARRAY *pa = NULL;
401  size_t pa_size;
402  uint32_t ndims = 2;
403  const POINT2D *pt;
404 
405  /* Count the dimensions. */
406  if( s->has_z ) ndims++;
407  if( s->has_m ) ndims++;
408  pa_size = ndims * WKB_DOUBLE_SIZE;
409 
410  /* Does the data we want to read exist? */
411  wkb_parse_state_check(s, pa_size);
412 
413  /* If we're in a native endianness, we can just copy the data directly! */
414  if( ! s->swap_bytes )
415  {
416  pa = ptarray_construct_copy_data(s->has_z, s->has_m, npoints, (uint8_t*)s->pos);
417  s->pos += pa_size;
418  }
419  /* Otherwise we have to read each double, separately */
420  else
421  {
422  uint32_t i = 0;
423  double *dlist;
424  pa = ptarray_construct(s->has_z, s->has_m, npoints);
425  dlist = (double*)(pa->serialized_pointlist);
426  for( i = 0; i < ndims; i++ )
427  {
428  dlist[i] = double_from_wkb_state(s);
429  }
430  }
431 
432  /* Check for POINT(NaN NaN) ==> POINT EMPTY */
433  pt = getPoint2d_cp(pa, 0);
434  if ( isnan(pt->x) && isnan(pt->y) )
435  {
436  ptarray_free(pa);
437  return lwpoint_construct_empty(s->srid, s->has_z, s->has_m);
438  }
439  else
440  {
441  return lwpoint_construct(s->srid, NULL, pa);
442  }
443 }
char * s
Definition: cu_in_wkt.c:23
POINTARRAY * ptarray_construct_copy_data(char hasz, char hasm, uint32_t npoints, const uint8_t *ptlist)
Construct a new POINTARRAY, copying in the data from ptlist.
Definition: ptarray.c:307
POINTARRAY * ptarray_construct(char hasz, char hasm, uint32_t npoints)
Construct an empty pointarray, allocating storage and setting the npoints, but not filling in any inf...
Definition: ptarray.c:62
LWPOINT * lwpoint_construct(int srid, GBOX *bbox, POINTARRAY *point)
Definition: lwpoint.c:129
void ptarray_free(POINTARRAY *pa)
Definition: ptarray.c:328
LWPOINT * lwpoint_construct_empty(int srid, char hasz, char hasm)
Definition: lwpoint.c:151
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
Definition: lwgeom_api.c:374
#define WKB_DOUBLE_SIZE
Well-Known Binary (WKB) Output Variant Types.
static void wkb_parse_state_check(wkb_parse_state *s, size_t next)
Check that we are not about to read off the end of the WKB array.
Definition: lwin_wkb.c:130
static double double_from_wkb_state(wkb_parse_state *s)
Double Read an 8-byte double and advance the parse state forward.
Definition: lwin_wkb.c:305
double y
Definition: liblwgeom.h:331
double x
Definition: liblwgeom.h:331
uint8_t * serialized_pointlist
Definition: liblwgeom.h:369
unsigned int uint32_t
Definition: uthash.h:78
unsigned char uint8_t
Definition: uthash.h:79

References double_from_wkb_state(), getPoint2d_cp(), lwpoint_construct(), lwpoint_construct_empty(), ptarray_construct(), ptarray_construct_copy_data(), ptarray_free(), s, POINTARRAY::serialized_pointlist, WKB_DOUBLE_SIZE, wkb_parse_state_check(), POINT2D::x, and POINT2D::y.

Referenced by lwgeom_from_wkb_state().

Here is the call graph for this function:
Here is the caller graph for this function: