From 29f91d6e4a5f39d292191725f30ff796cf355c1e Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 21 Feb 2012 14:32:59 +0000 Subject: [PATCH] Add a ptarray_transform function in liblwgeom API git-svn-id: http://svn.osgeo.org/postgis/trunk@9247 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/liblwgeom.h.in | 1 + liblwgeom/lwgeom_transform.c | 51 ++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/liblwgeom/liblwgeom.h.in b/liblwgeom/liblwgeom.h.in index 20f4b61ed..1623413d4 100644 --- a/liblwgeom/liblwgeom.h.in +++ b/liblwgeom/liblwgeom.h.in @@ -1871,6 +1871,7 @@ projPJ lwproj_from_string(const char* txt); * @param outpj the output (or destination) projection */ int lwgeom_transform(LWGEOM *geom, projPJ inpj, projPJ outpj) ; +int ptarray_transform(POINTARRAY *geom, projPJ inpj, projPJ outpj) ; int point4d_transform(POINT4D *pt, projPJ srcpj, projPJ dstpj) ; diff --git a/liblwgeom/lwgeom_transform.c b/liblwgeom/lwgeom_transform.c index 00853de2a..78c52cc27 100644 --- a/liblwgeom/lwgeom_transform.c +++ b/liblwgeom/lwgeom_transform.c @@ -32,6 +32,26 @@ to_dec(POINT4D *pt) pt->y *= 180.0/M_PI; } +/** + * Transform given POINTARRAY + * from inpj projection to outpj projection + */ +int +ptarray_transform(POINTARRAY *pa, projPJ inpj, projPJ outpj) +{ + int i; + POINT4D p; + + for ( i = 0; i < pa->npoints; i++ ) + { + getPoint4d_p(pa, i, &p); + if ( ! point4d_transform(&p, inpj, outpj) ) return LW_FAILURE; + ptarray_set_point4d(pa, i, &p); + } + + return LW_SUCCESS; +} + /** * Transform given SERIALIZED geometry @@ -40,16 +60,13 @@ to_dec(POINT4D *pt) int lwgeom_transform(LWGEOM *geom, projPJ inpj, projPJ outpj) { - int j, i; - int type = geom->type; - POINT4D p; - POINTARRAY *pa; + int i; /* No points to transform in an empty! */ if ( lwgeom_is_empty(geom) ) return LW_SUCCESS; - switch(type) + switch(geom->type) { case POINTTYPE: case LINETYPE: @@ -57,27 +74,15 @@ lwgeom_transform(LWGEOM *geom, projPJ inpj, projPJ outpj) case TRIANGLETYPE: { LWLINE *g = (LWLINE*)geom; - pa = g->points; - for ( i = 0; i < pa->npoints; i++ ) - { - getPoint4d_p(pa, i, &p); - point4d_transform(&p, inpj, outpj); - ptarray_set_point4d(pa, i, &p); - } + if ( ! ptarray_transform(g->points, inpj, outpj) ) return LW_FAILURE; break; } case POLYGONTYPE: { LWPOLY *g = (LWPOLY*)geom; - for ( j = 0; j < g->nrings; j++ ) + for ( i = 0; i < g->nrings; i++ ) { - pa = g->rings[j]; - for ( i = 0; i < pa->npoints; i++ ) - { - getPoint4d_p(pa, i, &p); - point4d_transform(&p, inpj, outpj); - ptarray_set_point4d(pa, i, &p); - } + if ( ! ptarray_transform(g->rings[i], inpj, outpj) ) return LW_FAILURE; } break; } @@ -95,18 +100,18 @@ lwgeom_transform(LWGEOM *geom, projPJ inpj, projPJ outpj) LWCOLLECTION *g = (LWCOLLECTION*)geom; for ( i = 0; i < g->ngeoms; i++ ) { - lwgeom_transform(g->geoms[i], inpj, outpj); + if ( ! lwgeom_transform(g->geoms[i], inpj, outpj) ) return LW_FAILURE; } break; } default: { - lwerror("lwgeom_transform: Cannot handle type '%s'", lwtype_name(type)); + lwerror("lwgeom_transform: Cannot handle type '%s'", + lwtype_name(geom->type)); return LW_FAILURE; } } return LW_SUCCESS; - } int -- 2.50.1