]> granicus.if.org Git - postgis/commitdiff
Lots of fixes. TIN is about perfect, Point, multipoint about perfect too, LINESTRING...
authorRegina Obe <lr@pcorp.us>
Mon, 14 Mar 2011 17:00:53 +0000 (17:00 +0000)
committerRegina Obe <lr@pcorp.us>
Mon, 14 Mar 2011 17:00:53 +0000 (17:00 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@6899 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/lwout_x3d.c

index c495a1fec80026edd82cbbcac881a92f993ec460..fca8b9681c61d9d58edc2095f0df6f64aa7a578c 100644 (file)
@@ -1,5 +1,5 @@
 /**********************************************************************\r
- * $Id: lwout_x3d.c 6850 2011-02-22 14:25:15Z strk $\r
+ * $Id$\r
  *\r
  * PostGIS - Spatial Types for PostgreSQL\r
  * http://www.postgis.org\r
@@ -36,7 +36,7 @@ static char *asx3d3_psurface(const LWPSURFACE *psur, char *srs, int precision, i
 static char *asx3d3_tin(const LWTIN *tin, char *srs, int precision, int opts, const char *defid);\r
 static size_t asx3d3_collection_size(const LWCOLLECTION *col, char *srs, int precision, int opts, const char *defid);\r
 static char *asx3d3_collection(const LWCOLLECTION *col, char *srs, int precision, int opts, const char *defid);\r
-static size_t pointArray_toX3D3(POINTARRAY *pa, char *buf, int precision, int opts);\r
+static size_t pointArray_toX3D3(POINTARRAY *pa, char *buf, int precision, int opts, int type);\r
 \r
 static size_t pointArray_X3Dsize(POINTARRAY *pa, int precision);\r
 \r
@@ -113,7 +113,7 @@ asx3d3_point_buf(const LWPOINT *point, char *srs, char *output, int precision, i
        //ptr += sprintf(ptr, "%s", defid);\r
        \r
        //ptr += sprintf(ptr, "<%spos>", defid);\r
-       ptr += pointArray_toX3D3(point->point, ptr, precision, opts);\r
+       ptr += pointArray_toX3D3(point->point, ptr, precision, opts, point->type);\r
        //ptr += sprintf(ptr, "</%spos></%sPoint>", defid, defid);\r
 \r
        return (ptr-output);\r
@@ -163,7 +163,7 @@ asx3d3_line_buf(const LWLINE *line, char *srs, char *output, int precision, int
 \r
 \r
        ptr += sprintf(ptr, "<Coordinate point='");\r
-       ptr += pointArray_toX3D3(line->points, ptr, precision, opts);\r
+       ptr += pointArray_toX3D3(line->points, ptr, precision, opts, line->type);\r
 \r
        ptr += sprintf(ptr, "' />");\r
 \r
@@ -175,10 +175,9 @@ static size_t
 asx3d3_line_coords(const LWLINE *line, char *output, int precision, int opts)\r
 {\r
        char *ptr=output;\r
-       //int dimension=2;\r
-       POINTARRAY *pa;\r
-       pa = line->points;\r
-       ptr += pointArray_toX3D3(line->points, ptr, precision, opts);\r
+       \r
+       ptr += sprintf(ptr, "");\r
+       ptr += pointArray_toX3D3(line->points, ptr, precision, opts, line->type);\r
        return (ptr-output);\r
 }\r
 \r
@@ -188,7 +187,7 @@ asx3d3_line(const LWLINE *line, char *srs, int precision, int opts, const char *
        char *output;\r
        int size;\r
 \r
-       size = asx3d3_line_size(line, srs, precision, opts, defid);\r
+       size = sizeof("<LineSet><CoordIndex ='' /></LineSet>") + asx3d3_line_size(line, srs, precision, opts, defid);\r
        output = lwalloc(size);\r
        asx3d3_line_buf(line, srs, output, precision, opts, defid);\r
        return output;\r
@@ -202,9 +201,9 @@ asx3d3_poly_size(const LWPOLY *poly,  char *srs, int precision, int opts, const
        size_t defidlen = strlen(defid);\r
        int i;\r
 \r
-       size = ( sizeof("<PolygonPatch><exterior><LinearRing>///") + (defidlen*3) ) * 2;\r
-       size += ( sizeof("<interior><LinearRing>//") + (defidlen*2) ) * 2 * (poly->nrings - 1);\r
-       size += ( sizeof("<posList></posList>") + (defidlen*2) ) * poly->nrings;\r
+       size = ( sizeof("<IndexedFaceSet></IndexedFaceSet>") + (defidlen*3) ) * 2;\r
+       //size += ( sizeof("<interior><LinearRing>//") + (defidlen*2) ) * 2 * (poly->nrings - 1);\r
+       //size += ( sizeof("<posList></posList>") + (defidlen*2) ) * poly->nrings;\r
        //if (srs)     size += strlen(srs) + sizeof(" srsName=..");\r
        //if (IS_DIMS(opts)) size += sizeof(" srsDimension='x'") * poly->nrings;\r
 \r
@@ -222,36 +221,12 @@ asx3d3_poly_buf(const LWPOLY *poly, char *srs, char *output, int precision, int
        int dimension=2;\r
 \r
        if (FLAGS_GET_Z(poly->flags)) dimension = 3;\r
-       if (is_patch)\r
-       {\r
-               if (srs) ptr += sprintf(ptr, "<%sPolygonPatch srsName=\"%s\">", defid, srs);\r
-               else     ptr += sprintf(ptr, "<%sPolygonPatch>", defid);\r
-       }\r
-       else\r
-       {\r
-               if (srs) ptr += sprintf(ptr, "<%sPolygon srsName=\"%s\">", defid, srs);\r
-               else     ptr += sprintf(ptr, "<%sPolygon>", defid);\r
-       }\r
-\r
-       ptr += sprintf(ptr, "<%sexterior><%sLinearRing>", defid, defid);\r
-       if (IS_DIMS(opts)) ptr += sprintf(ptr, "<%sposList srsDimension=\"%d\">", defid, dimension);\r
-       else         ptr += sprintf(ptr, "<%sposList>", defid);\r
-\r
-       ptr += pointArray_toX3D3(poly->rings[0], ptr, precision, opts);\r
-       ptr += sprintf(ptr, "</%sposList></%sLinearRing></%sexterior>",\r
-                      defid, defid, defid);\r
+       ptr += pointArray_toX3D3(poly->rings[0], ptr, precision, opts, poly->type);\r
        for (i=1; i<poly->nrings; i++)\r
        {\r
-               ptr += sprintf(ptr, "<%sinterior><%sLinearRing>", defid, defid);\r
-               if (IS_DIMS(opts)) ptr += sprintf(ptr, "<%sposList srsDimension=\"%d\">", defid, dimension);\r
-               else         ptr += sprintf(ptr, "<%sposList>", defid);\r
-               ptr += pointArray_toX3D3(poly->rings[i], ptr, precision, opts);\r
-               ptr += sprintf(ptr, "</%sposList></%sLinearRing></%sinterior>",\r
-                              defid, defid, defid);\r
+               ptr += pointArray_toX3D3(poly->rings[i], ptr, precision, opts, poly->type);\r
+               ptr += sprintf(ptr, " ");\r
        }\r
-       if (is_patch) ptr += sprintf(ptr, "</%sPolygonPatch>", defid);\r
-       else ptr += sprintf(ptr, "</%sPolygon>", defid);\r
-\r
        return (ptr-output);\r
 }\r
 \r
@@ -275,11 +250,7 @@ asx3d3_triangle_size(const LWTRIANGLE *triangle, char *srs, int precision, int o
        size_t defidlen = strlen(defid);\r
 \r
        /** 6 for the 3 sides and space to separate each side **/ \r
-       size = sizeof("<IndexedTriangleSet coordIndex=''></IndexedTriangleSet>") + defidlen + 6; \r
-       //size +=   sizeof("<posList></posList>") + (defidlen*2);\r
-       //if (srs)     size += strlen(srs) + sizeof(" srsName=..");\r
-       //if (IS_DIMS(opts)) size += sizeof(" srsDimension='x'");\r
-\r
+       size = sizeof("<IndexedTriangleSet index=''></IndexedTriangleSet>") + defidlen + 6; \r
        size += pointArray_X3Dsize(triangle->points, precision);\r
 \r
        return size;\r
@@ -289,8 +260,7 @@ static size_t
 asx3d3_triangle_buf(const LWTRIANGLE *triangle, char *srs, char *output, int precision, int opts, const char *defid)\r
 {\r
        char *ptr=output;\r
-\r
-       ptr += pointArray_toX3D3(triangle->points, ptr, precision, opts);\r
+       ptr += pointArray_toX3D3(triangle->points, ptr, precision, opts, triangle->type);\r
 \r
        return (ptr-output);\r
 }\r
@@ -336,12 +306,12 @@ asx3d3_multi_size(const LWCOLLECTION *col, char *srs, int precision, int opts, c
                }\r
                else if (subgeom->type == LINETYPE)\r
                {\r
-                       size += ( sizeof("<curveMember>/") + defidlen ) * 2;\r
+                       //size += ( sizeof("<curveMember>/") + defidlen ) * 2;\r
                        size += asx3d3_line_size((LWLINE*)subgeom, 0, precision, opts, defid);\r
                }\r
                else if (subgeom->type == POLYGONTYPE)\r
                {\r
-                       size += ( sizeof("<surfaceMember>/") + defidlen ) * 2;\r
+                       //size += ( sizeof("<surfaceMember>/") + defidlen ) * 2;\r
                        size += asx3d3_poly_size((LWPOLY*)subgeom, 0, precision, opts, defid);\r
                }\r
        }\r
@@ -365,11 +335,12 @@ asx3d3_multi_buf(const LWCOLLECTION *col, char *srs, char *output, int precision
        ptr = output;\r
        x3dtype="";\r
        //numvertices = lwcollection_count_vertices(col)*col->ngeoms*20;\r
-       size = 1000;\r
-       coordIndex = lwalloc(size);\r
+       //size = 1000;\r
+       coordIndex = lwalloc(1000);\r
 \r
        for (i=0; i<col->ngeoms; i++){\r
-                       coordIndex += sprintf(coordIndex, "-1 ");\r
+               /** TODO: This is wrong, but haven't quite figured out how to correct. Involves ring order and bunch of other stuff **/\r
+               coordIndex += sprintf(coordIndex, "-1 ");\r
        }\r
                        \r
        if      (type == MULTIPOINTTYPE) {\r
@@ -378,43 +349,32 @@ asx3d3_multi_buf(const LWCOLLECTION *col, char *srs, char *output, int precision
        }\r
        else if (type == MULTILINETYPE) {\r
                x3dtype = "IndexedLineSet";\r
-               ptr += sprintf(ptr, "<%s %s coordIndex='%s'", x3dtype, defid, coordIndex);\r
+               ptr += sprintf(ptr, "<%s %s coordIndex='%s'>", x3dtype, defid, coordIndex);\r
        }\r
        else if (type == MULTIPOLYGONTYPE) {\r
                x3dtype = "IndexedFaceSet";\r
-               ptr += sprintf(ptr, "<%s %s coordIndex='%s'", x3dtype, defid, coordIndex);\r
-       }\r
-\r
-       \r
-       /* Open outmost tag */\r
-/*     if ( srs )\r
-       {\r
-               ptr += sprintf(ptr, "<%s%s srsName=\"%s\">", defid, x3dtype, srs);\r
+               ptr += sprintf(ptr, "<%s %s coordIndex='%s'>", x3dtype, defid, coordIndex);\r
        }\r
-       else*/\r
 \r
-       ptr += sprintf(ptr, "<%s>%s <Coordinate point='", x3dtype, defid);\r
+       ptr += sprintf(ptr, "<Coordinate point='");\r
 \r
        for (i=0; i<col->ngeoms; i++)\r
        {\r
                subgeom = col->geoms[i];\r
                if (subgeom->type == POINTTYPE)\r
                {\r
-                       //ptr += sprintf(ptr, " ");\r
                        ptr += asx3d3_point_buf((LWPOINT*)subgeom, 0, ptr, precision, opts, defid);\r
                        ptr += sprintf(ptr, " ");\r
                }\r
                else if (subgeom->type == LINETYPE)\r
                {\r
-                       for (i=0; i<col->ngeoms; i++)\r
                        ptr += asx3d3_line_coords((LWLINE*)subgeom, ptr, precision, opts);\r
                        ptr += sprintf(ptr, " ");\r
                }\r
                else if (subgeom->type == POLYGONTYPE)\r
                {\r
-                       ptr += sprintf(ptr, "<%ssurfaceMember>", defid);\r
                        ptr += asx3d3_poly_buf((LWPOLY*)subgeom, 0, ptr, precision, opts, 0, defid);\r
-                       ptr += sprintf(ptr, "</%ssurfaceMember>", defid);\r
+                       ptr += sprintf(ptr, " ");\r
                }\r
        }\r
 \r
@@ -448,11 +408,10 @@ asx3d3_psurface_size(const LWPSURFACE *psur, char *srs, int precision, int opts,
        size_t defidlen = strlen(defid);\r
 \r
        size = sizeof("<IndexedFaceSet coordIndex=''><Coordinate point='' />") + defidlen;\r
-       //if ( srs ) size += strlen(srs) + sizeof(" srsName=..");\r
-\r
+       \r
        for (i=0; i<psur->ngeoms; i++)\r
        {\r
-               size += asx3d3_poly_size(psur->geoms[i], 0, precision, opts, defid)*5; /** need to make spacked for coordIndex values too including -1 separating each poly**/\r
+               size += asx3d3_poly_size(psur->geoms[i], 0, precision, opts, defid)*5; /** need to make space for coordIndex values too including -1 separating each poly**/\r
        }\r
 \r
        return size;\r
@@ -489,7 +448,7 @@ asx3d3_psurface_buf(const LWPSURFACE *psur, char *srs, char *output, int precisi
                ptr += sprintf(ptr, "%d", (j + k));\r
            }\r
            if (i < (psur->ngeoms - 1) ){\r
-               ptr += sprintf(ptr, "-1 "); //separator for each subgeom\r
+               ptr += sprintf(ptr, " -1 "); //separator for each subgeom\r
            }\r
            j += k;\r
        }\r
@@ -531,13 +490,10 @@ asx3d3_tin_size(const LWTIN *tin, char *srs, int precision, int opts, const char
        size_t defidlen = strlen(defid);\r
        //int dimension=2;\r
 \r
-       //if (FLAGS_GET_Z(tin->flags)) dimension = 3;\r
        /** Need to make space for size of additional attributes, \r
-       ** the coordIndex has a value for each edge for each triangle plus apace to separate so we need at least that much extra room ***/\r
+       ** the coordIndex has a value for each edge for each triangle plus a space to separate so we need at least that much extra room ***/\r
        size = sizeof("<IndexedTriangleSet coordIndex=''></IndexedTriangleSet>") + defidlen + tin->ngeoms*12;\r
 \r
-       //if ( srs ) size += strlen(srs) + sizeof(" srsName=..");\r
-\r
        for (i=0; i<tin->ngeoms; i++)\r
        {\r
                size += (asx3d3_triangle_size(tin->geoms[i], 0, precision, opts, defid) * 20); /** 3 is to make space for coordIndex **/\r
@@ -560,15 +516,9 @@ asx3d3_tin_buf(const LWTIN *tin, char *srs, char *output, int precision, int opt
 \r
        ptr = output;\r
 \r
-       /* Open outmost tag */\r
-       //if (srs) ptr += sprintf(ptr, "<%sTin srsName=\"%s\"><%strianglePatches>",\r
-       //                              defid, srs, defid);\r
-       \r
-       //if (FLAGS_GET_Z(tin->flags)) dimension = 3;\r
-\r
-       ptr += sprintf(ptr, "<IndexedTriangleSet %s coordIndex='",defid);\r
+       ptr += sprintf(ptr, "<IndexedTriangleSet %s index='",defid);\r
        k = 0;\r
-       /** Fill in coordIndex **/\r
+       /** Fill in triangle index **/\r
        for (i=0; i<tin->ngeoms; i++)\r
        {\r
                ptr += sprintf(ptr, "%d %d %d", k, (k+1), (k+2));\r
@@ -579,11 +529,13 @@ asx3d3_tin_buf(const LWTIN *tin, char *srs, char *output, int precision, int opt
        }\r
        \r
        ptr += sprintf(ptr, "'><Coordinate point='");\r
-       /** TODO: I think we need to exclude the closing point **/\r
        for (i=0; i<tin->ngeoms; i++)\r
        {\r
                ptr += asx3d3_triangle_buf(tin->geoms[i], 0, ptr, precision,\r
                                           opts, defid);\r
+               if (i < (tin->ngeoms - 1) ){\r
+                   ptr += sprintf(ptr, " ");\r
+               }\r
        }\r
 \r
        /* Close outmost tag */\r
@@ -721,7 +673,7 @@ asx3d3_collection(const LWCOLLECTION *col, char *srs, int precision, int opts, c
  * In X3D3 also, lat/lon are reversed for geocentric data\r
  */\r
 static size_t\r
-pointArray_toX3D3(POINTARRAY *pa, char *output, int precision, int opts)\r
+pointArray_toX3D3(POINTARRAY *pa, char *output, int precision, int opts, int type)\r
 {\r
        int i;\r
        char *ptr;\r
@@ -735,53 +687,59 @@ pointArray_toX3D3(POINTARRAY *pa, char *output, int precision, int opts)
        {\r
                for (i=0; i<pa->npoints; i++)\r
                {\r
-                       POINT2D pt;\r
-                       getPoint2d_p(pa, i, &pt);\r
-\r
-                       if (fabs(pt.x) < OUT_MAX_DOUBLE)\r
-                               sprintf(x, "%.*f", precision, pt.x);\r
-                       else\r
-                               sprintf(x, "%g", pt.x);\r
-                       trim_trailing_zeros(x);\r
-\r
-                       if (fabs(pt.y) < OUT_MAX_DOUBLE)\r
-                               sprintf(y, "%.*f", precision, pt.y);\r
-                       else\r
-                               sprintf(y, "%g", pt.y);\r
-                       trim_trailing_zeros(y);\r
-\r
-                       if ( i ) ptr += sprintf(ptr, " ");\r
-                       ptr += sprintf(ptr, "%s %s", x, y);\r
+                       /** Only output the point if it is not the last point of a closed object or it is a non-closed type **/\r
+                       if (!(type == POLYGONTYPE || type == TRIANGLETYPE) || i < (pa->npoints - 1) ){\r
+                               POINT2D pt;\r
+                               getPoint2d_p(pa, i, &pt);\r
+       \r
+                               if (fabs(pt.x) < OUT_MAX_DOUBLE)\r
+                                       sprintf(x, "%.*f", precision, pt.x);\r
+                               else\r
+                                       sprintf(x, "%g", pt.x);\r
+                               trim_trailing_zeros(x);\r
+       \r
+                               if (fabs(pt.y) < OUT_MAX_DOUBLE)\r
+                                       sprintf(y, "%.*f", precision, pt.y);\r
+                               else\r
+                                       sprintf(y, "%g", pt.y);\r
+                               trim_trailing_zeros(y);\r
+       \r
+                               if ( i ) ptr += sprintf(ptr, " ");\r
+                               ptr += sprintf(ptr, "%s %s", x, y);\r
+                       }\r
                }\r
        }\r
        else\r
        {\r
                for (i=0; i<pa->npoints; i++)\r
                {\r
-                       POINT4D pt;\r
-                       getPoint4d_p(pa, i, &pt);\r
-\r
-                       if (fabs(pt.x) < OUT_MAX_DOUBLE)\r
-                               sprintf(x, "%.*f", precision, pt.x);\r
-                       else\r
-                               sprintf(x, "%g", pt.x);\r
-                       trim_trailing_zeros(x);\r
-\r
-                       if (fabs(pt.y) < OUT_MAX_DOUBLE)\r
-                               sprintf(y, "%.*f", precision, pt.y);\r
-                       else\r
-                               sprintf(y, "%g", pt.y);\r
-                       trim_trailing_zeros(y);\r
-\r
-                       if (fabs(pt.z) < OUT_MAX_DOUBLE)\r
-                               sprintf(z, "%.*f", precision, pt.z);\r
-                       else\r
-                               sprintf(z, "%g", pt.z);\r
-                       trim_trailing_zeros(z);\r
-\r
-                       if ( i ) ptr += sprintf(ptr, " ");\r
-                       \r
-                       ptr += sprintf(ptr, "%s %s %s", x, y, z);\r
+                       /** Only output the point if it is not the last point of a closed object or it is a non-closed type **/\r
+                       if (!(type == POLYGONTYPE || type == TRIANGLETYPE) || i < (pa->npoints - 1) ){\r
+                               POINT4D pt;\r
+                               getPoint4d_p(pa, i, &pt);\r
+       \r
+                               if (fabs(pt.x) < OUT_MAX_DOUBLE)\r
+                                       sprintf(x, "%.*f", precision, pt.x);\r
+                               else\r
+                                       sprintf(x, "%g", pt.x);\r
+                               trim_trailing_zeros(x);\r
+       \r
+                               if (fabs(pt.y) < OUT_MAX_DOUBLE)\r
+                                       sprintf(y, "%.*f", precision, pt.y);\r
+                               else\r
+                                       sprintf(y, "%g", pt.y);\r
+                               trim_trailing_zeros(y);\r
+       \r
+                               if (fabs(pt.z) < OUT_MAX_DOUBLE)\r
+                                       sprintf(z, "%.*f", precision, pt.z);\r
+                               else\r
+                                       sprintf(z, "%g", pt.z);\r
+                               trim_trailing_zeros(z);\r
+       \r
+                               if ( i ) ptr += sprintf(ptr, " ");\r
+                               \r
+                               ptr += sprintf(ptr, "%s %s %s", x, y, z);\r
+                       }\r
                }\r
        }\r
 \r