[geos-commits] r3035 - in trunk/php: . test

svn_geos at osgeo.org svn_geos at osgeo.org
Sun Jun 20 13:00:29 EDT 2010


Author: strk
Date: 2010-06-20 17:00:29 +0000 (Sun, 20 Jun 2010)
New Revision: 3035

Modified:
   trunk/php/geos.c
   trunk/php/test/Makefile.am
   trunk/php/test/test.php
Log:
GEOSLineMerge


Modified: trunk/php/geos.c
===================================================================
--- trunk/php/geos.c	2010-06-20 09:13:13 UTC (rev 3034)
+++ trunk/php/geos.c	2010-06-20 17:00:29 UTC (rev 3035)
@@ -39,10 +39,12 @@
 PHP_MINFO_FUNCTION(geos);
 PHP_FUNCTION(GEOSVersion);
 PHP_FUNCTION(GEOSPolygonize);
+PHP_FUNCTION(GEOSLineMerge);
 
 static function_entry geos_functions[] = {
     PHP_FE(GEOSVersion, NULL)
     PHP_FE(GEOSPolygonize, NULL)
+    PHP_FE(GEOSLineMerge, NULL)
     {NULL, NULL, NULL}
 };
 
@@ -210,18 +212,20 @@
 static zend_object_handlers Geometry_object_handlers;
 
 /*
- * Return a newly created array zval containing
- * a clone of all components of given geometry
+ * Push components of the given geometry
+ * to the given array zval.
+ * Components geometries are cloned.
  * NOTE: collection components are not descended into
  */
-static zval*
-dumpGeometry(GEOSGeometry* g)
+static void
+dumpGeometry(GEOSGeometry* g, zval* array)
 {
-    zval *array;
     int ngeoms, i;
 
+    /*
     MAKE_STD_ZVAL(array);
     array_init(array);
+    */
 
     ngeoms = GEOSGetNumGeometries(g);
     for (i=0; i<ngeoms; ++i)
@@ -240,7 +244,7 @@
         add_next_index_zval(array, tmp); 
     }
 
-    return array;
+    //return array;
 }
 
 
@@ -944,10 +948,7 @@
     GEOSGeometry *cut_edges;
     GEOSGeometry *dangles;
     GEOSGeometry *invalid_rings;
-    zval *rings_array;
-    zval *cut_edges_array;
-    zval *dangles_array;
-    zval *invalid_rings_array;
+    zval *array_elem;
     zval *zobj;
 
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobj)
@@ -963,20 +964,55 @@
     /* return value should be an array */
     array_init(return_value);
 
-    rings_array = dumpGeometry(rings);
+    MAKE_STD_ZVAL(array_elem);
+    array_init(array_elem);
+    dumpGeometry(rings, array_elem);
     GEOSGeom_destroy(rings);
-    cut_edges_array = dumpGeometry(cut_edges);
+    add_assoc_zval(return_value, "rings", array_elem); 
+
+    MAKE_STD_ZVAL(array_elem);
+    array_init(array_elem);
+    dumpGeometry(cut_edges, array_elem);
     GEOSGeom_destroy(cut_edges);
-    dangles_array = dumpGeometry(dangles);
+    add_assoc_zval(return_value, "cut_edges", array_elem);
+
+    MAKE_STD_ZVAL(array_elem);
+    array_init(array_elem);
+    dumpGeometry(dangles, array_elem);
     GEOSGeom_destroy(dangles);
-    invalid_rings_array = dumpGeometry(invalid_rings);
+    add_assoc_zval(return_value, "dangles", array_elem);
+
+    MAKE_STD_ZVAL(array_elem);
+    array_init(array_elem);
+    dumpGeometry(invalid_rings, array_elem);
     GEOSGeom_destroy(invalid_rings);
+    add_assoc_zval(return_value, "invalid_rings", array_elem);
 
-    add_assoc_zval(return_value, "rings", rings_array); 
-    add_assoc_zval(return_value, "cut_edges", cut_edges_array);
-    add_assoc_zval(return_value, "dangles", dangles_array);
-    add_assoc_zval(return_value, "invalid_rings", invalid_rings_array);
+}
 
+/**
+ * array GEOSLineMerge(GEOSGeometry $geom)
+ */
+PHP_FUNCTION(GEOSLineMerge)
+{
+    GEOSGeometry *geom_in;
+    GEOSGeometry *geom_out;
+    zval *zobj;
+
+    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobj)
+        == FAILURE)
+    {
+        RETURN_NULL();
+    }
+    geom_in = getRelay(zobj, Geometry_ce_ptr);
+
+    geom_out = GEOSLineMerge(geom_in);
+    if ( ! geom_out ) RETURN_NULL(); /* should get an exception first */
+
+    /* return value should be an array */
+    array_init(return_value);
+    dumpGeometry(geom_out, return_value);
+    GEOSGeom_destroy(geom_out);
 }
 
 

Modified: trunk/php/test/Makefile.am
===================================================================
--- trunk/php/test/Makefile.am	2010-06-20 09:13:13 UTC (rev 3034)
+++ trunk/php/test/Makefile.am	2010-06-20 17:00:29 UTC (rev 3035)
@@ -39,7 +39,7 @@
 	chmod +x $@
 
 crashtest:
-	$(PHP) $(PHPOPTS) crashme.php
+	$(PHP) $(PHPOPTS) $(abs_srcdir)/crashme.php
 
 clean-local:
 	rm -f phpunit

Modified: trunk/php/test/test.php
===================================================================
--- trunk/php/test/test.php	2010-06-20 09:13:13 UTC (rev 3034)
+++ trunk/php/test/test.php	2010-06-20 17:00:29 UTC (rev 3035)
@@ -955,4 +955,30 @@
         $this->assertEquals(0, count($ret['invalid_rings']));
 
     }
+
+    public function testGeometry_lineMerge()
+    {
+        $reader = new GEOSWKTReader();
+        $writer = new GEOSWKTWriter();
+        $writer->setRoundingPrecision(0);
+
+        $g = $reader->read('MULTILINESTRING(
+            (0 0, 10 10),
+            (10 10, 10 0),
+            (5 0, 10 0),
+            (5 -5, 5 0)
+            )');
+
+        $ret = GEOSLineMerge($g);
+/*
+
+        $this->assertEquals('array', gettype($ret));
+        $this->assertEquals('1', count($ret));
+
+        $this->assertEquals(
+'LINESTRING (0 0, 10 10, 10 0, 5 0, 5 -5)'
+            , $writer->write($ret[0]));
+*/
+
+    }
 }



More information about the geos-commits mailing list