From 0db75f0372339223ff801195559b265723e85422 Mon Sep 17 00:00:00 2001 From: Martin Wilkerson Date: Thu, 4 Jan 2018 12:02:27 +0000 Subject: [PATCH 01/12] create php class for ogr geometry factory --- ogrgeometryfactory.cc | 69 +++++++++++++++++++++++++++++++++++++++++++ ogrgeometryfactory.h | 20 +++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 ogrgeometryfactory.cc create mode 100644 ogrgeometryfactory.h diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc new file mode 100644 index 0000000..2374ac1 --- /dev/null +++ b/ogrgeometryfactory.cc @@ -0,0 +1,69 @@ +#include "php.h" +#include "php_gdal.h" +#include +#include +#include +#include "ogrexception.h" +#include "ogrspatialreference.h" +#include "ogrgeometry.h" +#include "ogrgeometryfactory.h" + +zend_class_entry *gdal_ogrgeometryfactory_ce; +zend_object_handlers ogrgeometryfactory_object_handlers; + + +void ogrgeometryfactory_free_storage(void *object TSRMLS_DC) +{ + php_ogrgeometryfactory_object *obj = (php_ogrgeometryfactory_object *)object; + //delete obj->geometry; // TODO + zend_hash_destroy(obj->std.properties); + FREE_HASHTABLE(obj->std.properties); + efree(obj); +} + + +zend_object_value ogrgeometryfactory_create_handler(zend_class_entry *type TSRMLS_DC) +{ + zval *tmp; + zend_object_value retval; + + php_ogrgeometryfactory_object *obj = + (php_ogrgeometryfactory_object *)emalloc(sizeof(php_ogrgeometryfactory_object)); + memset(obj, 0, sizeof(php_ogrgeometryfactory_object)); + obj->std.ce = type; + + ALLOC_HASHTABLE(obj->std.properties); + zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); +#if PHP_VERSION_ID < 50399 + zend_hash_copy(obj->std.properties, &type->default_properties, + (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *)); +#else + object_properties_init(&obj->std, type); +#endif + + retval.handle = zend_objects_store_put(obj, NULL, + ogrgeometryfactory_free_storage, NULL TSRMLS_CC); + retval.handlers = &ogrgeometryfactory_object_handlers; + + return retval; +} + +zend_function_entry ogrgeometryfactory_methods[] = { + {NULL, NULL, NULL} +}; + + +void php_gdal_ogrgeometryfactory_startup(INIT_FUNC_ARGS) +{ + zend_class_entry ce; + INIT_CLASS_ENTRY(ce, "OGRGeometryFactory", ogrgeometryfactory_methods); + gdal_ogrgeometryfactory_ce = zend_register_internal_class(&ce TSRMLS_CC); + gdal_ogrgeometryfactory_ce->create_object = ogrgeometryfactory_create_handler; + memcpy(&ogrgeometryfactory_object_handlers, + zend_get_std_object_handlers(), sizeof(zend_object_handlers)); + ogrgeometryfactory_object_handlers.clone_obj = NULL; +} + + +/* VIM settings */ +/* ex: set tabstop=2 expandtab shiftwidth=2 smartindent */ diff --git a/ogrgeometryfactory.h b/ogrgeometryfactory.h new file mode 100644 index 0000000..0f70160 --- /dev/null +++ b/ogrgeometryfactory.h @@ -0,0 +1,20 @@ +// +// ogrgeometry.h +// + +#ifndef PHP_OGRGEOMETRYFACTORY_H +#define PHP_OGRGEOMETRYFACTORY_H + +#include +#include "php.h" + +extern zend_class_entry *gdal_ogrgeometryfactory_ce; + +struct php_ogrgeometryfactory_object { + zend_object std; + OGRGeometryFactory *geometryFactory; +}; + +void php_gdal_ogrgeometryfactory_startup(INIT_FUNC_ARGS); + +#endif /* PHP_OGRGEOMETRYFACTORY_H */ From 0d70397da90557c131b6c9152788b12401dc33d7 Mon Sep 17 00:00:00 2001 From: Martin Wilkerson Date: Thu, 4 Jan 2018 12:02:40 +0000 Subject: [PATCH 02/12] include ogrgeometryfactory.cc in build --- config.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.m4 b/config.m4 index 68c98db..bb4ea04 100644 --- a/config.m4 +++ b/config.m4 @@ -84,7 +84,7 @@ if test "$PHP_GDAL" != "no"; then PHP_SUBST(GDAL_SHARED_LIBADD) PHP_ADD_LIBRARY(stdc++, 1, GDAL_SHARED_LIBADD) PHP_NEW_EXTENSION(gdal, php_gdal.cc gdal_main.cc cpl.cc ogr.cc ogrsfdriverregistrar.cc ogrsfdriver.cc \ - ogrdatasource.cc ogrlayer.cc ogrgeometry.cc ogrfeaturedefn.cc ogrfielddefn.cc ogrenvelope.cc \ + ogrdatasource.cc ogrlayer.cc ogrgeometry.cc ogrgeometryfactory.cc ogrfeaturedefn.cc ogrfielddefn.cc ogrenvelope.cc \ ogrspatialreference.cc ogrcoordtransform.cc ogrfeature.cc gdaldrivermanager.cc gdaldriver.cc \ gdaldataset.cc gdalrasterband.cc ogrexception.cc, $ext_shared) fi From cca0071c1648490a8ab8ced60920faece4408d37 Mon Sep 17 00:00:00 2001 From: Martin Wilkerson Date: Thu, 4 Jan 2018 12:03:01 +0000 Subject: [PATCH 03/12] call php_gdal_ogrgeometryfactory_startup during PHP_MINIT_FUNCTION --- php_gdal.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/php_gdal.cc b/php_gdal.cc index 27eb7e0..cb333d0 100644 --- a/php_gdal.cc +++ b/php_gdal.cc @@ -47,6 +47,7 @@ #include "ogrfielddefn.h" #include "ogrenvelope.h" #include "ogrgeometry.h" +#include "ogrgeometryfactory.h" #include "ogrspatialreference.h" #include "ogrcoordtransform.h" #include "ogrfeature.h" @@ -178,6 +179,7 @@ PHP_MINIT_FUNCTION(gdal) php_gdal_ogrfielddefn_startup(INIT_FUNC_ARGS_PASSTHRU); php_gdal_ogrenvelope_startup(INIT_FUNC_ARGS_PASSTHRU); php_gdal_ogrgeometry_startup(INIT_FUNC_ARGS_PASSTHRU); + php_gdal_ogrgeometryfactory_startup(INIT_FUNC_ARGS_PASSTHRU); php_gdal_ogrspatialreference_startup(INIT_FUNC_ARGS_PASSTHRU); php_gdal_ogrcoordtransform_startup(INIT_FUNC_ARGS_PASSTHRU); php_gdal_ogrfeature_startup(INIT_FUNC_ARGS_PASSTHRU); From 2b482fb452e519247c1195aab8ee37646e0489ed Mon Sep 17 00:00:00 2001 From: Martin Wilkerson Date: Thu, 4 Jan 2018 13:26:48 +0000 Subject: [PATCH 04/12] add createFromWkt method fetching string and spatial ref parameters spatial ref can be null --- ogrgeometryfactory.cc | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc index 2374ac1..8bf96d9 100644 --- a/ogrgeometryfactory.cc +++ b/ogrgeometryfactory.cc @@ -48,6 +48,30 @@ zend_object_value ogrgeometryfactory_create_handler(zend_class_entry *type TSRML return retval; } +/** + * OGRGeometryFactory::createFromWkt(char **wkt, OGRSpatialReference *sref, OGRGeometry **outGeom) + */ +PHP_METHOD(OGRGeometryFactory, createFromWkt) +{ + char *wkt; + int wkt_len; + zval *srefp; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (char *)"sO!", + &wkt, &wkt_len, + &srefp, gdal_ogrspatialreference_ce) == FAILURE) + { + return; + } + + OGRSpatialReference *sref = NULL; + if(srefp != NULL) { + php_ogrspatialreference_object *sref_obj = (php_ogrspatialreference_object*)zend_object_store_get_object(srefp); + sref = sref_obj->spatialreference; + } + +} + zend_function_entry ogrgeometryfactory_methods[] = { {NULL, NULL, NULL} }; From 1e147bcd52027c896347c4278a05a51990392d63 Mon Sep 17 00:00:00 2001 From: Martin Wilkerson Date: Thu, 4 Jan 2018 13:40:34 +0000 Subject: [PATCH 05/12] include zend exceptions --- ogrgeometryfactory.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc index 8bf96d9..5159348 100644 --- a/ogrgeometryfactory.cc +++ b/ogrgeometryfactory.cc @@ -1,5 +1,6 @@ #include "php.h" #include "php_gdal.h" +#include #include #include #include From cd1081a69ebe7a6443fd4faef0b3d3a0bdebaeb0 Mon Sep 17 00:00:00 2001 From: Martin Wilkerson Date: Thu, 4 Jan 2018 13:40:56 +0000 Subject: [PATCH 06/12] detach string in case it is changed --- ogrgeometryfactory.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc index 5159348..bfddac1 100644 --- a/ogrgeometryfactory.cc +++ b/ogrgeometryfactory.cc @@ -58,7 +58,7 @@ PHP_METHOD(OGRGeometryFactory, createFromWkt) int wkt_len; zval *srefp; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (char *)"sO!", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (char *)"s\O!", &wkt, &wkt_len, &srefp, gdal_ogrspatialreference_ce) == FAILURE) { From 9a4e5dcc2f817d93499dea0bba10d9a517e541c5 Mon Sep 17 00:00:00 2001 From: Martin Wilkerson Date: Thu, 4 Jan 2018 13:41:19 +0000 Subject: [PATCH 07/12] create a geometry from the wkt and check for errors --- ogrgeometryfactory.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc index bfddac1..455907e 100644 --- a/ogrgeometryfactory.cc +++ b/ogrgeometryfactory.cc @@ -71,6 +71,31 @@ PHP_METHOD(OGRGeometryFactory, createFromWkt) sref = sref_obj->spatialreference; } + OGRGeometry *geometry; + OGRErr error = OGRGeometryFactory::createFromWkt(&wkt, sref, &geometry); + + if (error != OGRERR_NONE) + { + switch (error) + { + case OGRERR_NOT_ENOUGH_DATA: + zend_throw_exception(NULL, (char *)"OGR: Not enough data", 0 TSRMLS_CC); + break; + case OGRERR_UNSUPPORTED_GEOMETRY_TYPE: + zend_throw_exception(NULL, (char *)"OGR: Unsupported geometry type", 0 TSRMLS_CC); + break; + case OGRERR_CORRUPT_DATA: + zend_throw_exception(NULL, (char *)"OGR: Corrupt data", 0 TSRMLS_CC); + break; + default: + zend_throw_exception(NULL, (char *)"OGR: Unknown error deserializing WKT", 0 TSRMLS_CC); + } + } + + if (!geometry) + { + RETURN_NULL(); + } } zend_function_entry ogrgeometryfactory_methods[] = { From e52bc31178774b9ca0566b39fcef01622be4e905 Mon Sep 17 00:00:00 2001 From: Martin Wilkerson Date: Thu, 4 Jan 2018 13:41:29 +0000 Subject: [PATCH 08/12] return the created geometry --- ogrgeometryfactory.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc index 455907e..157b711 100644 --- a/ogrgeometryfactory.cc +++ b/ogrgeometryfactory.cc @@ -29,7 +29,7 @@ zend_object_value ogrgeometryfactory_create_handler(zend_class_entry *type TSRML zend_object_value retval; php_ogrgeometryfactory_object *obj = - (php_ogrgeometryfactory_object *)emalloc(sizeof(php_ogrgeometryfactory_object)); + (php_ogrgeometryfactory_object *)emalloc(sizeof(php_ogrgeometryfactory_object)); memset(obj, 0, sizeof(php_ogrgeometryfactory_object)); obj->std.ce = type; @@ -96,6 +96,13 @@ PHP_METHOD(OGRGeometryFactory, createFromWkt) { RETURN_NULL(); } + if (object_init_ex(return_value, gdal_ogrgeometry_ce) != SUCCESS) { + OGRGeometryFactory::destroyGeometry(geometry); + RETURN_NULL(); + } + php_ogrgeometry_object *geometry_obj = (php_ogrgeometry_object*) + zend_object_store_get_object(return_value TSRMLS_CC); + geometry_obj->geometry = geometry; } zend_function_entry ogrgeometryfactory_methods[] = { From 56500c9bf781531b395bdffd8ab8219156182a43 Mon Sep 17 00:00:00 2001 From: Martin Wilkerson Date: Thu, 4 Jan 2018 13:44:57 +0000 Subject: [PATCH 09/12] expose createFromWkt as method on OGRGeometryFactory --- ogrgeometryfactory.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc index 157b711..7cbc37e 100644 --- a/ogrgeometryfactory.cc +++ b/ogrgeometryfactory.cc @@ -106,6 +106,7 @@ PHP_METHOD(OGRGeometryFactory, createFromWkt) } zend_function_entry ogrgeometryfactory_methods[] = { + PHP_ME(OGRGeometryFactory, createFromWkt, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) {NULL, NULL, NULL} }; From 42ea4d5036171ea4f523e78c2577b91d5a22d42a Mon Sep 17 00:00:00 2001 From: James Holder Date: Tue, 15 Jan 2019 11:20:17 +0000 Subject: [PATCH 10/12] Add static method for DestroyGeometry --- ogrgeometryfactory.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc index 7cbc37e..8ef37f7 100644 --- a/ogrgeometryfactory.cc +++ b/ogrgeometryfactory.cc @@ -105,7 +105,26 @@ PHP_METHOD(OGRGeometryFactory, createFromWkt) geometry_obj->geometry = geometry; } +PHP_METHOD(OGRGeometryFactory, DestroyGeometry) +{ + OGRGeometry *geometry; + php_ogrgeometry_object *obj; + zval *p; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (char*)"O", + &p, gdal_ogrgeometry_ce) == FAILURE) { + return; + } + + obj = (php_ogrgeometry_object *)zend_object_store_get_object(p); + if (obj) { + geometry = obj->geometry; + OGRGeometryFactory::DestroyGeometry(geometry); + } +} + zend_function_entry ogrgeometryfactory_methods[] = { + PHP_ME(OGRGeometryFactory, DestroyGeometry, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_ME(OGRGeometryFactory, createFromWkt, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) {NULL, NULL, NULL} }; From 883894ed34aa7d419a055dbaecea9d823052628c Mon Sep 17 00:00:00 2001 From: James Holder Date: Tue, 15 Jan 2019 11:36:35 +0000 Subject: [PATCH 11/12] Remove erroneous escape. Fix method casing --- ogrgeometryfactory.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc index 8ef37f7..23e896b 100644 --- a/ogrgeometryfactory.cc +++ b/ogrgeometryfactory.cc @@ -58,7 +58,7 @@ PHP_METHOD(OGRGeometryFactory, createFromWkt) int wkt_len; zval *srefp; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (char *)"s\O!", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (char *)"O", &wkt, &wkt_len, &srefp, gdal_ogrspatialreference_ce) == FAILURE) { @@ -119,7 +119,7 @@ PHP_METHOD(OGRGeometryFactory, DestroyGeometry) obj = (php_ogrgeometry_object *)zend_object_store_get_object(p); if (obj) { geometry = obj->geometry; - OGRGeometryFactory::DestroyGeometry(geometry); + OGRGeometryFactory::destroyGeometry(geometry); } } From e21162e68ffdab873c899afde9b7f5f760765561 Mon Sep 17 00:00:00 2001 From: James Holder Date: Wed, 6 Feb 2019 11:17:11 +0000 Subject: [PATCH 12/12] re-add detatchment using correct slash --- ogrgeometryfactory.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ogrgeometryfactory.cc b/ogrgeometryfactory.cc index 23e896b..7eb191b 100644 --- a/ogrgeometryfactory.cc +++ b/ogrgeometryfactory.cc @@ -58,7 +58,7 @@ PHP_METHOD(OGRGeometryFactory, createFromWkt) int wkt_len; zval *srefp; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (char *)"O", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (char *)"s/O!", &wkt, &wkt_len, &srefp, gdal_ogrspatialreference_ce) == FAILURE) {