]> granicus.if.org Git - postgis/commitdiff
Implement SnapToGrid for CIRCULARSTRING and COMPOUNDCURVE. Just enough to fix #183.
authorSandro Santilli <strk@keybit.net>
Thu, 14 Apr 2011 11:07:33 +0000 (11:07 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 14 Apr 2011 11:07:33 +0000 (11:07 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@7029 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/lwgeom_functions_analytic.c
regress/tickets.sql
regress/tickets_expected

index 60d4fc3fd1b8ba6063960717cc0395069a0ca3a1..e0e9e9fdcf933175be26dae31bbd8bf124ce0341 100644 (file)
@@ -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));
index 3675711e05c37f6c6828428506918e8e3f308735..54581395b2ef370c7c2eff108202eda0ddc85199 100644 (file)
@@ -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]) ;
index 640d1b67696ff5a6455cdd5ed5ef4558d2b61bb0..affef536e74fa5e4c3d3f7e7cb8c14ffa2e9bcce 100644 (file)
@@ -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|