From: Olivier Courtin Date: Sat, 24 Oct 2009 16:35:31 +0000 (+0000) Subject: Add ptarray_merge function X-Git-Tag: 1.5.0b1~344 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0365190e5a2aada534b4f87afa527846ac982e37;p=postgis Add ptarray_merge function git-svn-id: http://svn.osgeo.org/postgis/trunk@4679 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/liblwgeom.h b/liblwgeom/liblwgeom.h index 41eb0c198..a69fc2bf6 100644 --- a/liblwgeom/liblwgeom.h +++ b/liblwgeom/liblwgeom.h @@ -1370,6 +1370,7 @@ extern POINTARRAY *ptarray_construct(char hasz, char hasm, unsigned int npoints) extern POINTARRAY *ptarray_addPoint(POINTARRAY *pa, uchar *p, size_t pdims, unsigned int where); extern POINTARRAY *ptarray_removePoint(POINTARRAY *pa, unsigned int where); +extern POINTARRAY *ptarray_merge(POINTARRAY *pa1, POINTARRAY *pa2); extern int ptarray_isclosed2d(const POINTARRAY *pa); extern int ptarray_isclosed3d(const POINTARRAY *pa); diff --git a/liblwgeom/ptarray.c b/liblwgeom/ptarray.c index f478eb3aa..7babf3540 100644 --- a/liblwgeom/ptarray.c +++ b/liblwgeom/ptarray.c @@ -304,6 +304,7 @@ ptarray_addPoint(POINTARRAY *pa, uchar *p, size_t pdims, unsigned int where) return ret; } + /** * @brief Remove a point from a pointarray. * @param which - is the offset (starting at 0) @@ -350,6 +351,41 @@ ptarray_removePoint(POINTARRAY *pa, unsigned int which) return ret; } + +/** + * @brief Merge two given POINTARRAY and returns a pointer + * on the new aggregate one. + * Warning: this function free the two inputs POINTARRAY + * @return #POINTARRAY is newly allocated + */ +POINTARRAY * +ptarray_merge(POINTARRAY *pa1, POINTARRAY *pa2) +{ + POINTARRAY *pa; + size_t ptsize = pointArray_ptsize(pa1); + + if (TYPE_GETZM(pa1->dims) != TYPE_GETZM(pa2->dims)) + lwerror("ptarray_cat: Mixed dimension"); + + pa = ptarray_construct( TYPE_HASZ(pa1->dims), + TYPE_HASM(pa1->dims), + pa1->npoints + pa2->npoints); + + memcpy( getPoint_internal(pa, 0), + getPoint_internal(pa1, 0), + ptsize*(pa1->npoints)); + + memcpy( getPoint_internal(pa, pa1->npoints), + getPoint_internal(pa2, 0), + ptsize*(pa2->npoints)); + + lwfree(pa1); + lwfree(pa2); + + return pa; +} + + /** * @brief Clone a pointarray */