/* * Construct a LWLINE from an array of LWPOINTs * LWLINE dimensions are large enough to host all input dimensions. */ LWLINE * lwline_from_lwpointarray(int SRID, unsigned int npoints, LWPOINT **points) { int zmflag=0; unsigned int i; POINTARRAY *pa; uchar *newpoints, *ptr; size_t ptsize, size; /* * Find output dimensions, check integrity */ for (i=0; i<npoints; i++) { if ( TYPE_GETTYPE(points[i]->type) != POINTTYPE ) { lwerror("lwline_from_lwpointarray: invalid input type: %s", lwgeom_typename(TYPE_GETTYPE(points[i]->type))); return NULL; } if ( TYPE_HASZ(points[i]->type) ) zmflag |= 2; if ( TYPE_HASM(points[i]->type) ) zmflag |= 1; if ( zmflag == 3 ) break; } if ( zmflag == 0 ) ptsize=2*sizeof(double); else if ( zmflag == 3 ) ptsize=4*sizeof(double); else ptsize=3*sizeof(double); /* * Allocate output points array */ size = ptsize*npoints; newpoints = lwalloc(size); memset(newpoints, 0, size); ptr=newpoints; for (i=0; i<npoints; i++) { size=pointArray_ptsize(points[i]->point); memcpy(ptr, getPoint_internal(points[i]->point, 0), size); ptr+=ptsize; } pa = pointArray_construct(newpoints, zmflag&2, zmflag&1, npoints); return lwline_construct(SRID, NULL, pa); }
/* find length of this deserialized circularstring */ size_t lwcircstring_serialize_size(LWCIRCSTRING *curve) { size_t size = 1; /* type */ LWDEBUG(2, "lwcircstring_serialize_size called"); if (curve->SRID != -1) size += 4; /* SRID */ if (curve->bbox) size += sizeof(BOX2DFLOAT4); size += 4; /* npoints */ size += pointArray_ptsize(curve->points) * curve->points->npoints; LWDEBUGF(3, "lwcircstring_serialize_size returning %d", size); return size; }
/* find length of this deserialized line */ size_t lwline_serialize_size(LWLINE *line) { size_t size = 1; /* type */ LWDEBUG(2, "lwline_serialize_size called"); if ( line->SRID != -1 ) size += 4; /* SRID */ if ( line->bbox ) size += sizeof(BOX2DFLOAT4); size += 4; /* npoints */ size += pointArray_ptsize(line->points)*line->points->npoints; LWDEBUGF(3, "lwline_serialize_size returning %d", size); return size; }
/* * Convert this point into its serialize form writing it into * the given buffer, and returning number of bytes written into * the given int pointer. * result's first char will be the 8bit type. See serialized form doc */ void lwpoint_serialize_buf(LWPOINT *point, uchar *buf, size_t *retsize) { int size=1; char hasSRID; uchar *loc; int ptsize = pointArray_ptsize(point->point); if ( TYPE_GETZM(point->type) != TYPE_GETZM(point->point->dims) ) lwerror("Dimensions mismatch in lwpoint"); LWDEBUGF(2, "lwpoint_serialize_buf(%p, %p) called", point, buf); /*printLWPOINT(point); */ hasSRID = (point->SRID != -1); if (hasSRID) size +=4; /*4 byte SRID */ if (point->bbox) size += sizeof(BOX2DFLOAT4); /* bvol */ size += sizeof(double)*TYPE_NDIMS(point->type); buf[0] = (uchar) lwgeom_makeType_full( TYPE_HASZ(point->type), TYPE_HASM(point->type), hasSRID, POINTTYPE, point->bbox?1:0); loc = buf+1; if (point->bbox) { memcpy(loc, point->bbox, sizeof(BOX2DFLOAT4)); loc += sizeof(BOX2DFLOAT4); } if (hasSRID) { memcpy(loc, &point->SRID, sizeof(int32)); loc += 4; } /* copy in points */ memcpy(loc, getPoint_internal(point->point, 0), ptsize); if (retsize) *retsize = size; }
/* * convert this circularstring into its serialized form writing it into * the given buffer, and returning number of bytes written into * the given int pointer. * result's first char will be the 8bit type. See serialized form doc */ void lwcircstring_serialize_buf(LWCIRCSTRING *curve, uchar *buf, size_t *retsize) { char hasSRID; uchar *loc; int ptsize; size_t size; LWDEBUGF(2, "lwcircstring_serialize_buf(%p, %p, %p) called", curve, buf, retsize); if (curve == NULL) { lwerror("lwcircstring_serialize:: given null curve"); return; } if (TYPE_GETZM(curve->type) != TYPE_GETZM(curve->points->dims)) { lwerror("Dimensions mismatch in lwcircstring"); return; } ptsize = pointArray_ptsize(curve->points); hasSRID = (curve->SRID != -1); buf[0] = (uchar)lwgeom_makeType_full( TYPE_HASZ(curve->type), TYPE_HASM(curve->type), hasSRID, CIRCSTRINGTYPE, curve->bbox ? 1 : 0); loc = buf+1; LWDEBUGF(3, "lwcircstring_serialize_buf added type (%d)", curve->type); if (curve->bbox) { memcpy(loc, curve->bbox, sizeof(BOX2DFLOAT4)); loc += sizeof(BOX2DFLOAT4); LWDEBUG(3, "lwcircstring_serialize_buf added BBOX"); } if (hasSRID) { memcpy(loc, &curve->SRID, sizeof(int32)); loc += sizeof(int32); LWDEBUG(3, "lwcircstring_serialize_buf added SRID"); } memcpy(loc, &curve->points->npoints, sizeof(uint32)); loc += sizeof(uint32); LWDEBUGF(3, "lwcircstring_serialize_buf added npoints (%d)", curve->points->npoints); /* copy in points */ size = curve->points->npoints * ptsize; memcpy(loc, getPoint_internal(curve->points, 0), size); loc += size; LWDEBUGF(3, "lwcircstring_serialize_buf copied serialized_pointlist (%d bytes)", ptsize * curve->points->npoints); if (retsize) *retsize = loc-buf; LWDEBUGF(3, "lwcircstring_serialize_buf returning (loc: %p, size: %d)", loc, loc-buf); }
/* * convert this line into its serialize form writing it into * the given buffer, and returning number of bytes written into * the given int pointer. * result's first char will be the 8bit type. See serialized form doc */ void lwline_serialize_buf(LWLINE *line, uchar *buf, size_t *retsize) { char hasSRID; uchar *loc; int ptsize; size_t size; LWDEBUGF(2, "lwline_serialize_buf(%p, %p, %p) called", line, buf, retsize); if (line == NULL) lwerror("lwline_serialize:: given null line"); if ( TYPE_GETZM(line->type) != TYPE_GETZM(line->points->dims) ) lwerror("Dimensions mismatch in lwline"); ptsize = pointArray_ptsize(line->points); hasSRID = (line->SRID != -1); buf[0] = (uchar) lwgeom_makeType_full( TYPE_HASZ(line->type), TYPE_HASM(line->type), hasSRID, LINETYPE, line->bbox ? 1 : 0); loc = buf+1; LWDEBUGF(3, "lwline_serialize_buf added type (%d)", line->type); if (line->bbox) { memcpy(loc, line->bbox, sizeof(BOX2DFLOAT4)); loc += sizeof(BOX2DFLOAT4); LWDEBUG(3, "lwline_serialize_buf added BBOX"); } if (hasSRID) { memcpy(loc, &line->SRID, sizeof(int32)); loc += sizeof(int32); LWDEBUG(3, "lwline_serialize_buf added SRID"); } memcpy(loc, &line->points->npoints, sizeof(uint32)); loc += sizeof(uint32); LWDEBUGF(3, "lwline_serialize_buf added npoints (%d)", line->points->npoints); /*copy in points */ size = line->points->npoints*ptsize; memcpy(loc, getPoint_internal(line->points, 0), size); loc += size; LWDEBUGF(3, "lwline_serialize_buf copied serialized_pointlist (%d bytes)", ptsize * line->points->npoints); if (retsize) *retsize = loc-buf; /*printBYTES((uchar *)result, loc-buf); */ LWDEBUGF(3, "lwline_serialize_buf returning (loc: %p, size: %d)", loc, loc-buf); }