/**********************************************************************\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
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
//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
\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
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
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
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
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
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
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
}\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
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
}\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
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
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
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
\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
}\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
* 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
{\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