]> granicus.if.org Git - postgis/commitdiff
Making the changes from r4244 and r4245 onto trunk, addressing ticket 212.
authorMark Leslie <mark.leslie@lisasoft.com>
Thu, 2 Jul 2009 08:31:24 +0000 (08:31 +0000)
committerMark Leslie <mark.leslie@lisasoft.com>
Thu, 2 Jul 2009 08:31:24 +0000 (08:31 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@4246 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/lwgparse.c
postgis/lwgeom_ogc.c
regress/sql-mm-circularstring.sql
regress/sql-mm-circularstring_expected
regress/sql-mm-compoundcurve.sql
regress/sql-mm-compoundcurve_expected
regress/sql-mm-curvepoly.sql
regress/sql-mm-curvepoly_expected

index 87827f99d576798e3e1f558e61a5f537f56dcc4d..cb131457488d82cd28b9c570565bdeca4f32df68 100644 (file)
@@ -770,8 +770,8 @@ check_curvepolygon_minpoints()
        tuple *tp = the_geom.stack->next; /* Current tuple */
        int i, j, k; /* Loop counters */
        int num, mum, lum; /* subgeom, point counts */
+       int minpoints;
        int count = 0; /* Running counter for compound curve */
-       int minpoints = 4;
        num = tp->uu.nn.num;
 
        LWDEBUG(3, "check_curvepolygon_minpoints");
@@ -779,6 +779,7 @@ check_curvepolygon_minpoints()
        /* Check each sub-geom for minpoints */
        for (i = 0; i < num; i++)
        {
+               minpoints = 3;
                tp = tp->next;
                LWDEBUGF(5, "Subgeom type %d: %p", tp->uu.nn.type, tp);
                switch (TYPE_GETTYPE(tp->uu.nn.type))
@@ -808,6 +809,7 @@ check_curvepolygon_minpoints()
                        }
                        break;
                case LINETYPE:
+                       minpoints = 4;
                case CIRCSTRINGTYPE:
                        tp = tp->next;
                        mum = tp->uu.nn.num;
@@ -818,7 +820,7 @@ check_curvepolygon_minpoints()
                        if (mum < minpoints)
                        {
                                LWDEBUGF(5, "Minpoint check failed: needed %d, got %d",
-                                        minpoints, count);
+                                        minpoints, mum);
                                LWGEOM_WKT_VALIDATION_ERROR(PARSER_ERROR_MOREPOINTS, tp->uu.nn.parse_location);
                        }
                        break;
index 440d4ec20cba5e955b4ce29a730e250b05e644e1..eea2311752b2b5266432c30004132170a3b3c1b0 100644 (file)
@@ -177,6 +177,16 @@ lwgeom_numpoints_linestring_recursive(const uchar *serialized)
 
        LWDEBUG(2, "lwgeom_numpoints_linestring_recursive called.");
 
+       /* 
+        * CURVEPOLY and COMPOUND have no concept of numpoints but look like
+        * collections once inspected.  Fast-fail on these here.
+        */
+       if (lwgeom_getType(inspected->type) == COMPOUNDTYPE ||
+                       lwgeom_getType(inspected->type) == CURVEPOLYTYPE)
+       {
+               return -1;
+       }
+
        for (i=0; i<inspected->ngeometries; i++)
        {
                int32 npoints;
@@ -192,6 +202,10 @@ lwgeom_numpoints_linestring_recursive(const uchar *serialized)
                {
                        return ((LWLINE *)geom)->points->npoints;
                }
+               else if (lwgeom_getType(geom->type) == CIRCSTRINGTYPE)
+               {
+                       return ((LWCIRCSTRING *)geom)->points->npoints;
+               }
 
                subgeom = lwgeom_getsubgeometry_inspected(inspected, i);
                if ( subgeom == NULL )
index 56c4231da151fb7ec2635ba588e66f6e3da48e24..c62bde515f1a59c205b89816bbb831193d0d3f70 100644 (file)
@@ -385,3 +385,4 @@ SELECT DropGeometryColumn('public', 'circularstring', 'the_geom_3dm');
 SELECT DropGeometryColumn('public', 'circularstring', 'the_geom_2d');\r
 DROP TABLE public.circularstring;\r
 SELECT ST_asText(ST_box2d('CIRCULARSTRING(220268.439465645 150415.359530563,220227.333322076 150505.561285879,220227.353105332 150406.434743975)'::geometry));\r
+SELECT ST_NumPoints(ST_GeomFromEWKT('CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3)'));\r
index e023d76450448c2a03cf2a6ab292fbf16b49ff8b..2ba6cca744df0ca6b2f9c08a4f262c981082a582 100644 (file)
@@ -155,3 +155,4 @@ public.circularstring.the_geom_3dz effectively removed.
 public.circularstring.the_geom_3dm effectively removed.
 public.circularstring.the_geom_2d effectively removed.
 POLYGON((220187.375 150406.421875,220187.375 150506.71875,220288.828125 150506.71875,220288.828125 150406.421875,220187.375 150406.421875))
+5
index ca5f2a1faa2ed8a92b021065672f6f3e8b83c632..4dfed88eda98f2ff4d48bbbd5c3fca74136ae792 100644 (file)
@@ -315,4 +315,4 @@ SELECT 'valid wkb compound curve 2', ST_asEWKT(ST_GeomFromEWKB(decode('010900000
 SELECT 'valid wkb compound curve 3', ST_asEWKT(ST_GeomFromEWKB(decode('0109000000010000000102000000030000000CE586D73CF36240BBC46888F0523BC0102E91C951E76240DF90A1BEC0F841C0F970C100FFD7624074ADE6CE86CD3BC0', 'hex')));\r
 SELECT 'valid wkb compound curve 4', ST_asEWKT(ST_GeomFromEWKB(decode('0109000000020000000102000000030000009FE5797057376340E09398B1B2373BC05AAE0A165F0963409F6760A2493D3DC0DB6286DFB057634082D8A1B32F843EC0010800000005000000DB6286DFB057634082D8A1B32F843EC0DB6286DFB057634082D8A1B32F843EC075B4E4D0C60C634031FA5D1A371540C0D7197CED9B636340A3CB59A7630A41C050F4A72AC0FB6240974769FCE3CF41C0', 'hex')));\r
 SELECT 'valid wkb compound curve 5', ST_asEWKT(ST_GeomFromEWKB(decode('010900000003000000010800000003000000468280E724BC6340BF4B46210B973BC0F890AEA18D8063402D9664151D483CC0EED64BB6EE726340903CA5BDA0863AC0010200000004000000EED64BB6EE726340903CA5BDA0863AC09FE5797057376340E09398B1B2373BC05AAE0A165F0963409F6760A2493D3DC0DB6286DFB057634082D8A1B32F843EC0010800000005000000DB6286DFB057634082D8A1B32F843EC0DB6286DFB057634082D8A1B32F843EC075B4E4D0C60C634031FA5D1A371540C0D7197CED9B636340A3CB59A7630A41C050F4A72AC0FB6240974769FCE3CF41C0', 'hex')));\r
-\r
+SELECT 'null response', ST_NumPoints(ST_GeomFromEWKT('COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0))'));\r
index 49029f0bbc8b8fac4fad4998d1f17491013bb390..b6c4c30e82d793c7064d75c7948281f1e7eaf919 100644 (file)
@@ -106,3 +106,4 @@ valid wkb compound curve 2|COMPOUNDCURVE((153.72942375 -27.2175704,152.29285719
 valid wkb compound curve 3|COMPOUNDCURVE((151.60117699 -27.32398274,151.22873381 -35.9433821,150.74987829 -27.80283826))
 valid wkb compound curve 4|COMPOUNDCURVE((153.72942375 -27.2175704,152.29285719 -29.23940482,154.74034096 -30.51635287),CIRCULARSTRING(154.74034096 -30.51635287,154.74034096 -30.51635287,152.39926953 -32.16574411,155.11278414 -34.08116619,151.86720784 -35.62414508))
 valid wkb compound curve 5|COMPOUNDCURVE(CIRCULARSTRING(157.87950492 -27.59001358,156.01728901 -28.28169378,155.59163966 -26.52589021),(155.59163966 -26.52589021,153.72942375 -27.2175704,152.29285719 -29.23940482,154.74034096 -30.51635287),CIRCULARSTRING(154.74034096 -30.51635287,154.74034096 -30.51635287,152.39926953 -32.16574411,155.11278414 -34.08116619,151.86720784 -35.62414508))
+null response|
index d66a670bc97e8f91fd9d6d6411dc26442405d758..24e1b91fcd2435121da5b74551d185c7d27b12a8 100644 (file)
@@ -501,4 +501,7 @@ SELECT 'valid ewkb curve polygon 2', ST_asEWKT(ST_GeomFromEWKB(decode('010d00000
 SELECT 'valid ewkb curve polygon 3', ST_asEWKT(ST_GeomFromEWKB(decode('010d00000001000000010800000007000000ccdf061ad9f3614054093e6d99093ec0ab9085dbb6dd614081540229216040c0ebd7a828c33e62409bf026782a7e41c0000000c06bb2624000000020adb440c08e632f616ead6240c9f7b0bf1dd33dc09011eec0de4362407dd6672f76323ec0ccdf061ad9f3614054093e6d99093ec0', 'hex')));\r
 SELECT 'valid ewkb curve polygon 4', ST_asEWKT(ST_GeomFromEWKB(decode('010d00000002000000010800000007000000ccdf061ad9f3614054093e6d99093ec0ab9085dbb6dd614081540229216040c0ebd7a828c33e62409bf026782a7e41c0000000c06bb2624000000020adb440c08e632f616ead6240c9f7b0bf1dd33dc09011eec0de4362407dd6672f76323ec0ccdf061ad9f3614054093e6d99093ec00102000000060000006844c4fe011b6240342e2993e0423fc0d45daf9d93066240c4a0c305d62240c000000080ac31624000000020fbbe40c0000000e0107f6240000000c0a10440c04e1c0c14624c6240bf3fb6405c793fc06844c4fe011b6240342e2993e0423fc0', 'hex')));\r
 SELECT 'valid ewkb curve polygon 5', ST_asEWKT(ST_GeomFromEWKB(decode('010d00000002000000010200000007000000ccdf061ad9f3614054093e6d99093ec0ab9085dbb6dd614081540229216040c0ebd7a828c33e62409bf026782a7e41c0000000c06bb2624000000020adb440c08e632f616ead6240c9f7b0bf1dd33dc09011eec0de4362407dd6672f76323ec0ccdf061ad9f3614054093e6d99093ec00109000000030000000108000000030000006844c4fe011b6240342e2993e0423fc0d45daf9d93066240c4a0c305d62240c000000080ac31624000000020fbbe40c001020000000200000000000080ac31624000000020fbbe40c0000000e0107f6240000000c0a10440c0010800000003000000000000e0107f6240000000c0a10440c04e1c0c14624c6240bf3fb6405c793fc06844c4fe011b6240342e2993e0423fc0', 'hex')));\r
-\r
+SELECT ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)), CIRCULARSTRING(1.7 1, 1.4 0.4, 1.7 1) )');\r
+SELECT ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)), (1.7 1, 1.4 0.4, 1.7 1) )');\r
+SELECT ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 0 0)), CIRCULARSTRING(1.7 1, 1.4 0.4, 1.7 1) )');\r
+SELECT 'null response', ST_NumPoints(ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)), CIRCULARSTRING(1.7 1, 1.4 0.4, 1.7 1) )'));\r
index 16edeee8b48746016f262e501fe83190513397c6..c327e53ff7f7b8c5b1b8e2248f5e9978e010c830 100644 (file)
@@ -157,3 +157,8 @@ valid ewkb curve polygon 2|CURVEPOLYGON((143.620251668383 -30.0374973560768,142.
 valid ewkb curve polygon 3|CURVEPOLYGON(CIRCULARSTRING(143.620251668383 -30.0374973560768,142.928571472997 -32.751011968744,145.961323098919 -34.9856710615288,149.575653076172 -33.4115333557129,149.419724075848 -29.8246726805735,146.120941605547 -30.1971158627043,143.620251668383 -30.0374973560768))
 valid ewkb curve polygon 4|CURVEPOLYGON(CIRCULARSTRING(143.620251668383 -30.0374973560768,142.928571472997 -32.751011968744,145.961323098919 -34.9856710615288,149.575653076172 -33.4115333557129,149.419724075848 -29.8246726805735,146.120941605547 -30.1971158627043,143.620251668383 -30.0374973560768),(144.843993552527 -31.2612392402209,144.205519526017 -32.2721564488616,145.552307128906 -33.4920387268066,147.970809936523 -32.0361862182617,146.386972449926 -31.4740639157242,144.843993552527 -31.2612392402209))
 valid ewkb curve polygon 5|CURVEPOLYGON((143.620251668383 -30.0374973560768,142.928571472997 -32.751011968744,145.961323098919 -34.9856710615288,149.575653076172 -33.4115333557129,149.419724075848 -29.8246726805735,146.120941605547 -30.1971158627043,143.620251668383 -30.0374973560768),COMPOUNDCURVE(CIRCULARSTRING(144.843993552527 -31.2612392402209,144.205519526017 -32.2721564488616,145.552307128906 -33.4920387268066),(145.552307128906 -33.4920387268066,147.970809936523 -32.0361862182617),CIRCULARSTRING(147.970809936523 -32.0361862182617,146.386972449926 -31.4740639157242,144.843993552527 -31.2612392402209)))
+010D0000000200000001090000000200000001080000000500000000000000000000000000000000000000000000000000004000000000000000000000000000000040000000000000F03F00000000000000400000000000000840000000000000104000000000000008400102000000040000000000000000001040000000000000084000000000000010400000000000001440000000000000F03F000000000000104000000000000000000000000000000000010800000003000000333333333333FB3F000000000000F03F666666666666F63F9A9999999999D93F333333333333FB3F000000000000F03F
+ERROR:  geometry requires more points
+HINT:  "..., 1 4, 0 0)), (1.7 1, 1.4 0.4, 1.7 1)" <-- parse error at position 112 within geometry
+010D0000000200000001090000000200000001080000000500000000000000000000000000000000000000000000000000004000000000000000000000000000000040000000000000F03F00000000000000400000000000000840000000000000104000000000000008400102000000020000000000000000001040000000000000084000000000000000000000000000000000010800000003000000333333333333FB3F000000000000F03F666666666666F63F9A9999999999D93F333333333333FB3F000000000000F03F
+null response|