]> granicus.if.org Git - postgis/commitdiff
Add ptarray_merge function
authorOlivier Courtin <olivier.courtin@camptocamp.com>
Sat, 24 Oct 2009 16:35:31 +0000 (16:35 +0000)
committerOlivier Courtin <olivier.courtin@camptocamp.com>
Sat, 24 Oct 2009 16:35:31 +0000 (16:35 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@4679 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/liblwgeom.h
liblwgeom/ptarray.c

index 41eb0c198cc6032c9f37ba161329485688588f1f..a69fc2bf61e917f96e7e263e05dbdce373c77b57 100644 (file)
@@ -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);
index f478eb3aaec8ba12b620e4a872794cdf7ee459de..7babf35401855e2919749c35dc92d5270a4a466b 100644 (file)
@@ -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
  */