[geos-commits] r3058 - in trunk/php: . test
svn_geos at osgeo.org
svn_geos at osgeo.org
Mon Jun 21 06:21:31 EDT 2010
Author: strk
Date: 2010-06-21 10:21:31 +0000 (Mon, 21 Jun 2010)
New Revision: 3058
Modified:
trunk/php/TODO
trunk/php/geos.c
trunk/php/test/test.php
Log:
area, length, distance, hausdorffDistance; fix leaks in pointN, startPoint and endPoint
Modified: trunk/php/TODO
===================================================================
--- trunk/php/TODO 2010-06-21 02:02:05 UTC (rev 3057)
+++ trunk/php/TODO 2010-06-21 10:21:31 UTC (rev 3058)
@@ -8,5 +8,6 @@
- Implement serialization/deserialization for Geometry
- Documentation !! (doxygen-based?)
- Add interfaces for WKBReader/WKBWriter ?
+- Add interface for algorithms (Orientation Index) ?
- Add interfaces for prepared geometries ?
- Add interfaces for STRTree ?
Modified: trunk/php/geos.c
===================================================================
--- trunk/php/geos.c 2010-06-21 02:02:05 UTC (rev 3057)
+++ trunk/php/geos.c 2010-06-21 10:21:31 UTC (rev 3058)
@@ -218,6 +218,10 @@
PHP_METHOD(Geometry, pointN);
PHP_METHOD(Geometry, startPoint);
PHP_METHOD(Geometry, endPoint);
+PHP_METHOD(Geometry, area);
+PHP_METHOD(Geometry, length);
+PHP_METHOD(Geometry, distance);
+PHP_METHOD(Geometry, hausdorffDistance);
static function_entry Geometry_methods[] = {
PHP_ME(Geometry, __construct, NULL, 0)
@@ -270,6 +274,10 @@
PHP_ME(Geometry, pointN, NULL, 0)
PHP_ME(Geometry, startPoint, NULL, 0)
PHP_ME(Geometry, endPoint, NULL, 0)
+ PHP_ME(Geometry, area, NULL, 0)
+ PHP_ME(Geometry, length, NULL, 0)
+ PHP_ME(Geometry, distance, NULL, 0)
+ PHP_ME(Geometry, hausdorffDistance, NULL, 0)
{NULL, NULL, NULL}
};
@@ -727,346 +735,7 @@
}
-/* -- class GEOSWKTReader -------------------- */
-
-PHP_METHOD(WKTReader, __construct);
-PHP_METHOD(WKTReader, read);
-
-static function_entry WKTReader_methods[] = {
- PHP_ME(WKTReader, __construct, NULL, 0)
- PHP_ME(WKTReader, read, NULL, 0)
- {NULL, NULL, NULL}
-};
-
-static zend_class_entry *WKTReader_ce_ptr;
-
-static zend_object_handlers WKTReader_object_handlers;
-
-static void
-WKTReader_dtor (void *object TSRMLS_DC)
-{
- Proxy *obj = (Proxy *)object;
- GEOSWKTReader_destroy((GEOSWKTReader*)obj->relay);
-
- zend_hash_destroy(obj->std.properties);
- FREE_HASHTABLE(obj->std.properties);
-
- efree(obj);
-}
-
-static zend_object_value
-WKTReader_create_obj (zend_class_entry *type TSRMLS_DC)
-{
- return Gen_create_obj(type, WKTReader_dtor, &WKTReader_object_handlers);
-}
-
-
-PHP_METHOD(WKTReader, __construct)
-{
- GEOSWKTReader* obj;
- zval *object = getThis();
-
- obj = GEOSWKTReader_create();
- if ( ! obj ) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR,
- "GEOSWKTReader_create() failed (didn't initGEOS?)");
- }
-
- setRelay(object, obj);
-}
-
-PHP_METHOD(WKTReader, read)
-{
- GEOSWKTReader *reader;
- GEOSGeometry *geom;
- char* wkt;
- int wktlen;
-
- reader = (GEOSWKTReader*)getRelay(getThis(), WKTReader_ce_ptr);
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
- &wkt, &wktlen) == FAILURE)
- {
- RETURN_NULL();
- }
-
- geom = GEOSWKTReader_read(reader, wkt);
- /* we'll probably get an exception if geom is null */
- if ( ! geom ) RETURN_NULL();
-
- /* return_value is a zval */
- object_init_ex(return_value, Geometry_ce_ptr);
- setRelay(return_value, geom);
-
-}
-
-/* -- class GEOSWKTWriter -------------------- */
-
-PHP_METHOD(WKTWriter, __construct);
-PHP_METHOD(WKTWriter, write);
-PHP_METHOD(WKTWriter, setTrim);
-PHP_METHOD(WKTWriter, setRoundingPrecision);
-PHP_METHOD(WKTWriter, setOutputDimension);
-PHP_METHOD(WKTWriter, setOld3D);
-
-static function_entry WKTWriter_methods[] = {
- PHP_ME(WKTWriter, __construct, NULL, 0)
- PHP_ME(WKTWriter, write, NULL, 0)
- PHP_ME(WKTWriter, setTrim, NULL, 0)
- PHP_ME(WKTWriter, setRoundingPrecision, NULL, 0)
- PHP_ME(WKTWriter, setOutputDimension, NULL, 0)
- PHP_ME(WKTWriter, setOld3D, NULL, 0)
- {NULL, NULL, NULL}
-};
-
-static zend_class_entry *WKTWriter_ce_ptr;
-
-static zend_object_handlers WKTWriter_object_handlers;
-
-static void
-WKTWriter_dtor (void *object TSRMLS_DC)
-{
- Proxy *obj = (Proxy *)object;
- GEOSWKTWriter_destroy((GEOSWKTWriter*)obj->relay);
-
- zend_hash_destroy(obj->std.properties);
- FREE_HASHTABLE(obj->std.properties);
-
- efree(obj);
-}
-
-static zend_object_value
-WKTWriter_create_obj (zend_class_entry *type TSRMLS_DC)
-{
- return Gen_create_obj(type, WKTWriter_dtor, &WKTWriter_object_handlers);
-}
-
-PHP_METHOD(WKTWriter, __construct)
-{
- GEOSWKTWriter* obj;
- zval *object = getThis();
-
- obj = GEOSWKTWriter_create();
- if ( ! obj ) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR,
- "GEOSWKTWriter_create() failed (didn't initGEOS?)");
- }
-
- setRelay(object, obj);
-}
-
-PHP_METHOD(WKTWriter, write)
-{
- GEOSWKTWriter *writer;
- zval *zobj;
- GEOSGeometry *geom;
- char* wkt;
- char* retstr;
-
- writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobj)
- == FAILURE)
- {
- RETURN_NULL();
- }
-
- geom = getRelay(zobj, Geometry_ce_ptr);
-
- wkt = GEOSWKTWriter_write(writer, geom);
- /* we'll probably get an exception if wkt is null */
- if ( ! wkt ) RETURN_NULL();
-
- retstr = estrdup(wkt);
- GEOSFree(wkt);
-
- RETURN_STRING(retstr, 0);
-
- /* return_value is a zval */
- object_init_ex(return_value, Geometry_ce_ptr);
- setRelay(return_value, geom);
-
-}
-
-PHP_METHOD(WKTWriter, setTrim)
-{
- GEOSWKTWriter *writer;
- zend_bool trimval;
- char trim;
-
- writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &trimval)
- == FAILURE)
- {
- RETURN_NULL();
- }
-
- trim = trimval;
- GEOSWKTWriter_setTrim(writer, trim);
-}
-
-PHP_METHOD(WKTWriter, setRoundingPrecision)
-{
- GEOSWKTWriter *writer;
- long int prec;
-
- writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &prec)
- == FAILURE)
- {
- RETURN_NULL();
- }
-
- GEOSWKTWriter_setRoundingPrecision(writer, prec);
-}
-
-PHP_METHOD(WKTWriter, setOutputDimension)
-{
- GEOSWKTWriter *writer;
- long int dim;
-
- writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &dim)
- == FAILURE)
- {
- RETURN_NULL();
- }
-
- GEOSWKTWriter_setOutputDimension(writer, dim);
-}
-
-PHP_METHOD(WKTWriter, setOld3D)
-{
- GEOSWKTWriter *writer;
- zend_bool bval;
- int val;
-
- writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &bval)
- == FAILURE)
- {
- RETURN_NULL();
- }
-
- val = bval;
- GEOSWKTWriter_setOld3D(writer, val);
-}
-
-/* -- Free functions ------------------------- */
-
/**
- * string GEOSVersion()
- */
-PHP_FUNCTION(GEOSVersion)
-{
- char *str;
-
- str = estrdup(GEOSversion());
- RETURN_STRING(str, 0);
-}
-
-/**
- * array GEOSPolygonize(GEOSGeometry $geom)
- *
- * The returned array contains the following elements:
- *
- * - 'rings'
- * Type: array of GEOSGeometry
- * Rings that can be formed by the costituent
- * linework of geometry.
- * - 'cut_edges' (optional)
- * Type: array of GEOSGeometry
- * Edges which are connected at both ends but
- * which do not form part of polygon.
- * - 'dangles'
- * Type: array of GEOSGeometry
- * Edges which have one or both ends which are
- * not incident on another edge endpoint
- * - 'invalid_rings'
- * Type: array of GEOSGeometry
- * Edges which form rings which are invalid
- * (e.g. the component lines contain a self-intersection)
- *
- */
-PHP_FUNCTION(GEOSPolygonize)
-{
- GEOSGeometry *this;
- GEOSGeometry *rings;
- GEOSGeometry *cut_edges;
- GEOSGeometry *dangles;
- GEOSGeometry *invalid_rings;
- zval *array_elem;
- zval *zobj;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobj)
- == FAILURE)
- {
- RETURN_NULL();
- }
- this = getRelay(zobj, Geometry_ce_ptr);
-
- rings = GEOSPolygonize_full(this, &cut_edges, &dangles, &invalid_rings);
- if ( ! rings ) RETURN_NULL(); /* should get an exception first */
-
- /* return value should be an array */
- array_init(return_value);
-
- MAKE_STD_ZVAL(array_elem);
- array_init(array_elem);
- dumpGeometry(rings, array_elem);
- GEOSGeom_destroy(rings);
- 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);
- 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);
- 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);
-
-}
-
-/**
- * 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);
-}
-
-/**
* GEOSGeometry GEOSGeometry::simplify(tolerance)
* GEOSGeometry GEOSGeometry::simplify(tolerance, preserveTopology)
*/
@@ -1776,8 +1445,7 @@
PHP_METHOD(Geometry, pointN)
{
GEOSGeometry *geom;
- const GEOSGeometry *c;
- GEOSGeometry *cc;
+ GEOSGeometry *c;
long int num;
geom = (GEOSGeometry*)getRelay(getThis(), Geometry_ce_ptr);
@@ -1789,11 +1457,9 @@
c = GEOSGeomGetPointN(geom, num);
if ( ! c ) RETURN_NULL(); /* should get an exception first */
- cc = GEOSGeom_clone(c);
- if ( ! cc ) RETURN_NULL(); /* should get an exception first */
object_init_ex(return_value, Geometry_ce_ptr);
- setRelay(return_value, cc);
+ setRelay(return_value, c);
}
/**
@@ -1802,18 +1468,15 @@
PHP_METHOD(Geometry, startPoint)
{
GEOSGeometry *geom;
- const GEOSGeometry *c;
- GEOSGeometry *cc;
+ GEOSGeometry *c;
geom = (GEOSGeometry*)getRelay(getThis(), Geometry_ce_ptr);
c = GEOSGeomGetStartPoint(geom);
if ( ! c ) RETURN_NULL(); /* should get an exception first */
- cc = GEOSGeom_clone(c);
- if ( ! cc ) RETURN_NULL(); /* should get an exception first */
object_init_ex(return_value, Geometry_ce_ptr);
- setRelay(return_value, cc);
+ setRelay(return_value, c);
}
/**
@@ -1822,20 +1485,445 @@
PHP_METHOD(Geometry, endPoint)
{
GEOSGeometry *geom;
- const GEOSGeometry *c;
- GEOSGeometry *cc;
+ GEOSGeometry *c;
geom = (GEOSGeometry*)getRelay(getThis(), Geometry_ce_ptr);
c = GEOSGeomGetEndPoint(geom);
if ( ! c ) RETURN_NULL(); /* should get an exception first */
- cc = GEOSGeom_clone(c);
- if ( ! cc ) RETURN_NULL(); /* should get an exception first */
object_init_ex(return_value, Geometry_ce_ptr);
- setRelay(return_value, cc);
+ setRelay(return_value, c);
}
+/**
+ * double GEOSGeometry::area()
+ */
+PHP_METHOD(Geometry, area)
+{
+ GEOSGeometry *geom;
+ double area;
+ int ret;
+
+ geom = (GEOSGeometry*)getRelay(getThis(), Geometry_ce_ptr);
+
+ ret = GEOSArea(geom, &area);
+ if ( ! ret ) RETURN_NULL(); /* should get an exception first */
+
+ RETURN_DOUBLE(area);
+}
+
+/**
+ * double GEOSGeometry::length()
+ */
+PHP_METHOD(Geometry, length)
+{
+ GEOSGeometry *geom;
+ double length;
+ int ret;
+
+ geom = (GEOSGeometry*)getRelay(getThis(), Geometry_ce_ptr);
+
+ ret = GEOSLength(geom, &length);
+ if ( ! ret ) RETURN_NULL(); /* should get an exception first */
+
+ RETURN_DOUBLE(length);
+}
+
+/**
+ * double GEOSGeometry::distance(GEOSGeometry)
+ */
+PHP_METHOD(Geometry, distance)
+{
+ GEOSGeometry *this;
+ GEOSGeometry *other;
+ zval *zobj;
+ double dist;
+ int ret;
+
+ this = (GEOSGeometry*)getRelay(getThis(), Geometry_ce_ptr);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o",
+ &zobj) == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ other = getRelay(zobj, Geometry_ce_ptr);
+
+ ret = GEOSDistance(this, other, &dist);
+ if ( ! ret ) RETURN_NULL(); /* should get an exception first */
+
+ RETURN_DOUBLE(dist);
+}
+
+/**
+ * double GEOSGeometry::hausdorffDistance(GEOSGeometry)
+ */
+PHP_METHOD(Geometry, hausdorffDistance)
+{
+ GEOSGeometry *this;
+ GEOSGeometry *other;
+ zval *zobj;
+ double dist;
+ int ret;
+
+ this = (GEOSGeometry*)getRelay(getThis(), Geometry_ce_ptr);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o",
+ &zobj) == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ other = getRelay(zobj, Geometry_ce_ptr);
+
+ ret = GEOSHausdorffDistance(this, other, &dist);
+ if ( ! ret ) RETURN_NULL(); /* should get an exception first */
+
+ RETURN_DOUBLE(dist);
+}
+
+
+/* -- class GEOSWKTReader -------------------- */
+
+PHP_METHOD(WKTReader, __construct);
+PHP_METHOD(WKTReader, read);
+
+static function_entry WKTReader_methods[] = {
+ PHP_ME(WKTReader, __construct, NULL, 0)
+ PHP_ME(WKTReader, read, NULL, 0)
+ {NULL, NULL, NULL}
+};
+
+static zend_class_entry *WKTReader_ce_ptr;
+
+static zend_object_handlers WKTReader_object_handlers;
+
+static void
+WKTReader_dtor (void *object TSRMLS_DC)
+{
+ Proxy *obj = (Proxy *)object;
+ GEOSWKTReader_destroy((GEOSWKTReader*)obj->relay);
+
+ zend_hash_destroy(obj->std.properties);
+ FREE_HASHTABLE(obj->std.properties);
+
+ efree(obj);
+}
+
+static zend_object_value
+WKTReader_create_obj (zend_class_entry *type TSRMLS_DC)
+{
+ return Gen_create_obj(type, WKTReader_dtor, &WKTReader_object_handlers);
+}
+
+
+PHP_METHOD(WKTReader, __construct)
+{
+ GEOSWKTReader* obj;
+ zval *object = getThis();
+
+ obj = GEOSWKTReader_create();
+ if ( ! obj ) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR,
+ "GEOSWKTReader_create() failed (didn't initGEOS?)");
+ }
+
+ setRelay(object, obj);
+}
+
+PHP_METHOD(WKTReader, read)
+{
+ GEOSWKTReader *reader;
+ GEOSGeometry *geom;
+ char* wkt;
+ int wktlen;
+
+ reader = (GEOSWKTReader*)getRelay(getThis(), WKTReader_ce_ptr);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
+ &wkt, &wktlen) == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ geom = GEOSWKTReader_read(reader, wkt);
+ /* we'll probably get an exception if geom is null */
+ if ( ! geom ) RETURN_NULL();
+
+ /* return_value is a zval */
+ object_init_ex(return_value, Geometry_ce_ptr);
+ setRelay(return_value, geom);
+
+}
+
+/* -- class GEOSWKTWriter -------------------- */
+
+PHP_METHOD(WKTWriter, __construct);
+PHP_METHOD(WKTWriter, write);
+PHP_METHOD(WKTWriter, setTrim);
+PHP_METHOD(WKTWriter, setRoundingPrecision);
+PHP_METHOD(WKTWriter, setOutputDimension);
+PHP_METHOD(WKTWriter, setOld3D);
+
+static function_entry WKTWriter_methods[] = {
+ PHP_ME(WKTWriter, __construct, NULL, 0)
+ PHP_ME(WKTWriter, write, NULL, 0)
+ PHP_ME(WKTWriter, setTrim, NULL, 0)
+ PHP_ME(WKTWriter, setRoundingPrecision, NULL, 0)
+ PHP_ME(WKTWriter, setOutputDimension, NULL, 0)
+ PHP_ME(WKTWriter, setOld3D, NULL, 0)
+ {NULL, NULL, NULL}
+};
+
+static zend_class_entry *WKTWriter_ce_ptr;
+
+static zend_object_handlers WKTWriter_object_handlers;
+
+static void
+WKTWriter_dtor (void *object TSRMLS_DC)
+{
+ Proxy *obj = (Proxy *)object;
+ GEOSWKTWriter_destroy((GEOSWKTWriter*)obj->relay);
+
+ zend_hash_destroy(obj->std.properties);
+ FREE_HASHTABLE(obj->std.properties);
+
+ efree(obj);
+}
+
+static zend_object_value
+WKTWriter_create_obj (zend_class_entry *type TSRMLS_DC)
+{
+ return Gen_create_obj(type, WKTWriter_dtor, &WKTWriter_object_handlers);
+}
+
+PHP_METHOD(WKTWriter, __construct)
+{
+ GEOSWKTWriter* obj;
+ zval *object = getThis();
+
+ obj = GEOSWKTWriter_create();
+ if ( ! obj ) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR,
+ "GEOSWKTWriter_create() failed (didn't initGEOS?)");
+ }
+
+ setRelay(object, obj);
+}
+
+PHP_METHOD(WKTWriter, write)
+{
+ GEOSWKTWriter *writer;
+ zval *zobj;
+ GEOSGeometry *geom;
+ char* wkt;
+ char* retstr;
+
+ writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobj)
+ == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ geom = getRelay(zobj, Geometry_ce_ptr);
+
+ wkt = GEOSWKTWriter_write(writer, geom);
+ /* we'll probably get an exception if wkt is null */
+ if ( ! wkt ) RETURN_NULL();
+
+ retstr = estrdup(wkt);
+ GEOSFree(wkt);
+
+ RETURN_STRING(retstr, 0);
+
+ /* return_value is a zval */
+ object_init_ex(return_value, Geometry_ce_ptr);
+ setRelay(return_value, geom);
+
+}
+
+PHP_METHOD(WKTWriter, setTrim)
+{
+ GEOSWKTWriter *writer;
+ zend_bool trimval;
+ char trim;
+
+ writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &trimval)
+ == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ trim = trimval;
+ GEOSWKTWriter_setTrim(writer, trim);
+}
+
+PHP_METHOD(WKTWriter, setRoundingPrecision)
+{
+ GEOSWKTWriter *writer;
+ long int prec;
+
+ writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &prec)
+ == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ GEOSWKTWriter_setRoundingPrecision(writer, prec);
+}
+
+PHP_METHOD(WKTWriter, setOutputDimension)
+{
+ GEOSWKTWriter *writer;
+ long int dim;
+
+ writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &dim)
+ == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ GEOSWKTWriter_setOutputDimension(writer, dim);
+}
+
+PHP_METHOD(WKTWriter, setOld3D)
+{
+ GEOSWKTWriter *writer;
+ zend_bool bval;
+ int val;
+
+ writer = (GEOSWKTWriter*)getRelay(getThis(), WKTWriter_ce_ptr);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &bval)
+ == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ val = bval;
+ GEOSWKTWriter_setOld3D(writer, val);
+}
+
+/* -- Free functions ------------------------- */
+
+/**
+ * string GEOSVersion()
+ */
+PHP_FUNCTION(GEOSVersion)
+{
+ char *str;
+
+ str = estrdup(GEOSversion());
+ RETURN_STRING(str, 0);
+}
+
+/**
+ * array GEOSPolygonize(GEOSGeometry $geom)
+ *
+ * The returned array contains the following elements:
+ *
+ * - 'rings'
+ * Type: array of GEOSGeometry
+ * Rings that can be formed by the costituent
+ * linework of geometry.
+ * - 'cut_edges' (optional)
+ * Type: array of GEOSGeometry
+ * Edges which are connected at both ends but
+ * which do not form part of polygon.
+ * - 'dangles'
+ * Type: array of GEOSGeometry
+ * Edges which have one or both ends which are
+ * not incident on another edge endpoint
+ * - 'invalid_rings'
+ * Type: array of GEOSGeometry
+ * Edges which form rings which are invalid
+ * (e.g. the component lines contain a self-intersection)
+ *
+ */
+PHP_FUNCTION(GEOSPolygonize)
+{
+ GEOSGeometry *this;
+ GEOSGeometry *rings;
+ GEOSGeometry *cut_edges;
+ GEOSGeometry *dangles;
+ GEOSGeometry *invalid_rings;
+ zval *array_elem;
+ zval *zobj;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobj)
+ == FAILURE)
+ {
+ RETURN_NULL();
+ }
+ this = getRelay(zobj, Geometry_ce_ptr);
+
+ rings = GEOSPolygonize_full(this, &cut_edges, &dangles, &invalid_rings);
+ if ( ! rings ) RETURN_NULL(); /* should get an exception first */
+
+ /* return value should be an array */
+ array_init(return_value);
+
+ MAKE_STD_ZVAL(array_elem);
+ array_init(array_elem);
+ dumpGeometry(rings, array_elem);
+ GEOSGeom_destroy(rings);
+ 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);
+ 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);
+ 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);
+
+}
+
+/**
+ * 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);
+}
+
/* ------ Initialization / Deinitialization / Meta ------------------ */
/* per-module initialization */
Modified: trunk/php/test/test.php
===================================================================
--- trunk/php/test/test.php 2010-06-21 02:02:05 UTC (rev 3057)
+++ trunk/php/test/test.php 2010-06-21 10:21:31 UTC (rev 3058)
@@ -1631,4 +1631,70 @@
}
}
+
+ public function testGeometry_area()
+ {
+ $reader = new GEOSWKTReader();
+ $writer = new GEOSWKTWriter();
+ $writer->setRoundingPrecision(0);
+
+ $g = $reader->read('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))');
+ $this->assertEquals( 1.0, $g->area() );
+
+ $g = $reader->read('POINT (0 0)');
+ $this->assertEquals( 0.0, $g->area() );
+
+ $g = $reader->read('LINESTRING (0 0 , 10 0)');
+ $this->assertEquals( 0.0, $g->area() );
+
+ }
+
+ public function testGeometry_length()
+ {
+ $reader = new GEOSWKTReader();
+
+ $g = $reader->read('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))');
+ $this->assertEquals( 4.0, $g->length() );
+
+ $g = $reader->read('POINT (0 0)');
+ $this->assertEquals( 0.0, $g->length() );
+
+ $g = $reader->read('LINESTRING (0 0 , 10 0)');
+ $this->assertEquals( 10.0, $g->length() );
+
+ }
+
+ public function testGeometry_distance()
+ {
+ $reader = new GEOSWKTReader();
+
+ $g = $reader->read('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))');
+
+ $g2 = $reader->read('POINT(0.5 0.5)');
+ $this->assertEquals( 0.0, $g->distance($g2) );
+
+ $g2 = $reader->read('POINT (-1 0)');
+ $this->assertEquals( 1.0, $g->distance($g2) );
+
+ $g2 = $reader->read('LINESTRING (3 0 , 10 0)');
+ $this->assertEquals( 2.0, $g->distance($g2) );
+
+ }
+
+ public function testGeometry_hausdorffDistance()
+ {
+ $reader = new GEOSWKTReader();
+
+ $g = $reader->read('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))');
+
+ $g2 = $reader->read('POINT(0 10)');
+ $this->assertEquals( 10.0, round($g->hausdorffDistance($g2)) );
+
+ $g2 = $reader->read('POINT (-1 0)');
+ $this->assertEquals( 2.0, round($g->hausdorffDistance($g2)) );
+
+ $g2 = $reader->read('LINESTRING (3 0 , 10 0)');
+ $this->assertEquals( 9.0, round($g->hausdorffDistance($g2)) );
+
+ }
}
More information about the geos-commits
mailing list