From: Sandro Santilli Date: Thu, 14 Apr 2011 11:07:33 +0000 (+0000) Subject: Implement SnapToGrid for CIRCULARSTRING and COMPOUNDCURVE. Just enough to fix #183. X-Git-Tag: 2.0.0alpha1~1773 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c7ec501ef9a65307029bd590de34f7983e2fbb27;p=postgis Implement SnapToGrid for CIRCULARSTRING and COMPOUNDCURVE. Just enough to fix #183. git-svn-id: http://svn.osgeo.org/postgis/trunk@7029 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/postgis/lwgeom_functions_analytic.c b/postgis/lwgeom_functions_analytic.c index 60d4fc3fd..e0e9e9fdc 100644 --- a/postgis/lwgeom_functions_analytic.c +++ b/postgis/lwgeom_functions_analytic.c @@ -242,6 +242,7 @@ LWCOLLECTION *lwcollection_grid(LWCOLLECTION *coll, gridspec *grid); LWPOINT * lwpoint_grid(LWPOINT *point, gridspec *grid); LWPOLY * lwpoly_grid(LWPOLY *poly, gridspec *grid); LWLINE *lwline_grid(LWLINE *line, gridspec *grid); +LWCIRCSTRING *lwcirc_grid(LWCIRCSTRING *line, gridspec *grid); POINTARRAY *ptarray_grid(POINTARRAY *pa, gridspec *grid); Datum LWGEOM_snaptogrid(PG_FUNCTION_ARGS); Datum LWGEOM_snaptogrid_pointoff(PG_FUNCTION_ARGS); @@ -336,6 +337,23 @@ lwline_grid(LWLINE *line, gridspec *grid) return oline; } +LWCIRCSTRING * +lwcirc_grid(LWCIRCSTRING *line, gridspec *grid) +{ + LWCIRCSTRING *oline; + POINTARRAY *opa; + + opa = ptarray_grid(line->points, grid); + + /* Skip line3d with less then 2 points */ + if ( opa->npoints < 2 ) return NULL; + + /* TODO: grid bounding box... */ + oline = lwcircstring_construct(line->srid, NULL, opa); + + return oline; +} + LWPOLY * lwpoly_grid(LWPOLY *poly, gridspec *grid) { @@ -474,7 +492,10 @@ lwgeom_grid(LWGEOM *lwgeom, gridspec *grid) case MULTILINETYPE: case MULTIPOLYGONTYPE: case COLLECTIONTYPE: + case COMPOUNDTYPE: return (LWGEOM *)lwcollection_grid((LWCOLLECTION *)lwgeom, grid); + case CIRCSTRINGTYPE: + return (LWGEOM *)lwcirc_grid((LWCIRCSTRING *)lwgeom, grid); default: elog(ERROR, "lwgeom_grid: Unsupported geometry type: %s", lwtype_name(lwgeom->type)); diff --git a/regress/tickets.sql b/regress/tickets.sql index 3675711e0..54581395b 100644 --- a/regress/tickets.sql +++ b/regress/tickets.sql @@ -90,7 +90,7 @@ SELECT '#113', ST_Locate_Along_Measure('LINESTRING(0 0 0, 1 1 1)', 0.5); SELECT '#116', ST_AsText('010300000000000000'); -- #122 -- -SELECT '#122', ST_SnapToGrid(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)'), 0.1); +SELECT '#122', ST_AsText(ST_SnapToGrid(ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)'), 0.1)); -- #124 -- SELECT '#124a', ST_AsText(ST_GeomFromEWKT('COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,30 5),CIRCULARSTRING(30 5,34 56,67 89))')); @@ -138,7 +138,7 @@ SELECT '#179a', ST_MakeLine(ARRAY[NULL,NULL,NULL,NULL]); SELECT '#179b', ST_MakeLine(ARRAY[NULL,NULL,NULL,NULL]); -- #183 -- -SELECT '#183', ST_AsText(ST_LineToCurve(ST_LineMerge(ST_Collect(ST_CurveToLine(ST_GeomFromEWKT('CIRCULARSTRING(0 0, 1 1, 1 0)')),ST_GeomFromEWKT('LINESTRING(1 0, 0 1)') )))); +SELECT '#183', ST_AsText(ST_SnapToGrid(ST_LineToCurve(ST_LineMerge(ST_Collect(ST_CurveToLine(ST_GeomFromEWKT('CIRCULARSTRING(0 0, 1 1, 1 0)')),ST_GeomFromEWKT('LINESTRING(1 0, 0 1)') ))), 1E-10)); -- #210 -- SELECT '#210a', ST_Union(ARRAY[NULL,NULL,NULL,NULL]) ; diff --git a/regress/tickets_expected b/regress/tickets_expected index 640d1b676..affef536e 100644 --- a/regress/tickets_expected +++ b/regress/tickets_expected @@ -18,7 +18,7 @@ ERROR: Unsupported geometry type: CircularString #112|GEOMETRYCOLLECTION(POINT(-10 50)) ERROR: Geometry argument does not have an 'M' ordinate #116|POLYGON EMPTY -ERROR: lwgeom_grid: Unsupported geometry type: CircularString +#122|CIRCULARSTRING(220268 150415,220227 150505,220227 150406) #124a|COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,30 5),CIRCULARSTRING(30 5,34 56,67 89)) ERROR: incontinuous compound curve HINT: "...0 6),CIRCULARSTRING(30 5,34 56,67 89)" <-- parse error at position 85 within geometry @@ -39,7 +39,7 @@ NOTICE: No points in input array #179a| NOTICE: No points in input array #179b| -#183|COMPOUNDCURVE(CIRCULARSTRING(0 0,0.500000000000184 1.20710678118655,1 0),(1 0,0 1)) +#183|COMPOUNDCURVE(CIRCULARSTRING(0 0,0.5 1.2071067812,1 0),(1 0,0 1)) #210a| NOTICE: No points in input array #210b|