/** * Serializes a LWPOINT to a char*. This is a helper function that partially * writes the appropriate draw and fill commands used to generate an SVG image * using ImageMagick's "convert" command. * @param output a char reference to write the LWPOINT to * @param lwp a reference to a LWPOINT * @return the numbers of character written to *output */ static size_t drawPoint(char *output, LWPOINT *lwp, LAYERSTYLE *styles) { char x[MAX_DIGS_DOUBLE+MAX_DOUBLE_PRECISION+1]; char y1[MAX_DIGS_DOUBLE+MAX_DOUBLE_PRECISION+1]; char y2[MAX_DIGS_DOUBLE+MAX_DOUBLE_PRECISION+1]; char *ptr = output; POINTARRAY *pa = lwp->point; POINT2D p; getPoint2d_p(pa, 0, &p); LWDEBUGF(4, "%s", "drawPoint called"); LWDEBUGF( 4, "point = %s", lwgeom_to_ewkt((LWGEOM*)lwp,0) ); sprintf(x, "%f", p.x); trim_trailing_zeros(x); sprintf(y1, "%f", p.y); trim_trailing_zeros(y1); sprintf(y2, "%f", p.y + styles->pointSize); trim_trailing_zeros(y2); ptr += sprintf(ptr, "-fill %s -strokewidth 0 ", styles->pointColor); ptr += sprintf(ptr, "-draw \"circle %s,%s %s,%s", x, y1, x, y2); ptr += sprintf(ptr, "'\" "); return (ptr - output); }
static size_t assvg_point_buf(const LWPOINT *point, char * output, int circle, int precision) { char *ptr=output; char x[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; char y[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; POINT2D pt; getPoint2d_p(point->point, 0, &pt); if (fabs(pt.x) < OUT_MAX_DOUBLE) sprintf(x, "%.*f", precision, pt.x); else sprintf(x, "%g", pt.x); trim_trailing_zeros(x); /* SVG Y axis is reversed, an no need to transform 0 into -0 */ if (fabs(pt.y) < OUT_MAX_DOUBLE) sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1 : pt.y); else sprintf(y, "%g", fabs(pt.y) ? pt.y * -1 : pt.y); trim_trailing_zeros(y); if (circle) ptr += sprintf(ptr, "x=\"%s\" y=\"%s\"", x, y); else ptr += sprintf(ptr, "cx=\"%s\" cy=\"%s\"", x, y); return (ptr-output); }
static size_t pointArray_to_geojson(POINTARRAY *pa, char *output, int precision) { int i; char *ptr; #define BUFSIZE OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION char x[BUFSIZE+1]; char y[BUFSIZE+1]; char z[BUFSIZE+1]; assert ( precision <= OUT_MAX_DOUBLE_PRECISION ); /* Ensure a terminating NULL at the end of buffers * so that we don't need to check for truncation * inprint_double */ x[BUFSIZE] = '\0'; y[BUFSIZE] = '\0'; z[BUFSIZE] = '\0'; ptr = output; /* TODO: rewrite this loop to be simpler and possibly quicker */ if (!FLAGS_GET_Z(pa->flags)) { for (i=0; i<pa->npoints; i++) { const POINT2D *pt; pt = getPoint2d_cp(pa, i); lwprint_double(pt->x, precision, x, BUFSIZE); trim_trailing_zeros(x); lwprint_double(pt->y, precision, y, BUFSIZE); trim_trailing_zeros(y); if ( i ) ptr += sprintf(ptr, ","); ptr += sprintf(ptr, "[%s,%s]", x, y); } } else { for (i=0; i<pa->npoints; i++) { const POINT3DZ *pt; pt = getPoint3dz_cp(pa, i); lwprint_double(pt->x, precision, x, BUFSIZE); trim_trailing_zeros(x); lwprint_double(pt->y, precision, y, BUFSIZE); trim_trailing_zeros(y); lwprint_double(pt->z, precision, z, BUFSIZE); trim_trailing_zeros(z); if ( i ) ptr += sprintf(ptr, ","); ptr += sprintf(ptr, "[%s,%s,%s]", x, y, z); } } return (ptr-output); }
static size_t pointArray_svg_rel(POINTARRAY *pa, char *output, int close_ring, int precision) { int i, end; char *ptr; char x[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; char y[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; POINT2D pt, lpt; ptr = output; if (close_ring) end = pa->npoints; else end = pa->npoints - 1; /* Starting point */ getPoint2d_p(pa, 0, &pt); if (fabs(pt.x) < OUT_MAX_DOUBLE) sprintf(x, "%.*f", precision, pt.x); else sprintf(x, "%g", pt.x); trim_trailing_zeros(x); if (fabs(pt.y) < OUT_MAX_DOUBLE) sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1 : pt.y); else sprintf(y, "%g", fabs(pt.y) ? pt.y * -1 : pt.y); trim_trailing_zeros(y); ptr += sprintf(ptr,"%s %s l", x, y); /* All the following ones */ for (i=1 ; i < end ; i++) { lpt = pt; getPoint2d_p(pa, i, &pt); if (fabs(pt.x -lpt.x) < OUT_MAX_DOUBLE) sprintf(x, "%.*f", precision, pt.x -lpt.x); else sprintf(x, "%g", pt.x -lpt.x); trim_trailing_zeros(x); /* SVG Y axis is reversed, an no need to transform 0 into -0 */ if (fabs(pt.y -lpt.y) < OUT_MAX_DOUBLE) sprintf(y, "%.*f", precision, fabs(pt.y -lpt.y) ? (pt.y - lpt.y) * -1: (pt.y - lpt.y)); else sprintf(y, "%g", fabs(pt.y -lpt.y) ? (pt.y - lpt.y) * -1: (pt.y - lpt.y)); trim_trailing_zeros(y); ptr += sprintf(ptr," %s %s", x, y); } return (ptr-output); }
/** * Writes the coordinates of a POINTARRAY to a char* where ordinates are * separated by a comma and coordinates by a space so that the coordinate * pairs can be interpreted by ImageMagick's SVG draw command. * * @param output a reference to write the POINTARRAY to * @param pa a reference to a POINTARRAY * @return the numbers of character written to *output */ static size_t pointarrayToString(char *output, POINTARRAY *pa) { char x[MAX_DIGS_DOUBLE+MAX_DOUBLE_PRECISION+1]; char y[MAX_DIGS_DOUBLE+MAX_DOUBLE_PRECISION+1]; int i; char *ptr = output; for ( i=0; i < pa->npoints; i++ ) { POINT2D pt; getPoint2d_p(pa, i, &pt); sprintf(x, "%f", pt.x); trim_trailing_zeros(x); sprintf(y, "%f", pt.y); trim_trailing_zeros(y); if ( i ) ptr += sprintf(ptr, " "); ptr += sprintf(ptr, "%s,%s", x, y); } return (ptr - output); }
/** * Returns maximum size of rendered pointarray in bytes. */ static size_t pointArray_svg_abs(POINTARRAY *pa, char *output, int close_ring, int precision) { int i, end; char *ptr; char x[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; char y[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; POINT2D pt; ptr = output; if (close_ring) end = pa->npoints; else end = pa->npoints - 1; for (i=0 ; i < end ; i++) { getPoint2d_p(pa, i, &pt); if (fabs(pt.x) < OUT_MAX_DOUBLE) sprintf(x, "%.*f", precision, pt.x); else sprintf(x, "%g", pt.x); trim_trailing_zeros(x); /* SVG Y axis is reversed, an no need to transform 0 into -0 */ if (fabs(pt.y) < OUT_MAX_DOUBLE) sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1:pt.y); else sprintf(y, "%g", fabs(pt.y) ? pt.y * -1:pt.y); trim_trailing_zeros(y); if (i == 1) ptr += sprintf(ptr, " L "); else if (i) ptr += sprintf(ptr, " "); ptr += sprintf(ptr,"%s %s", x, y); } return (ptr-output); }
static size_t points_to_geojson(GEOSGeom geom, char *output, int precision) { uint32_t i; char *ptr; char x[BUFSIZE+1]; char y[BUFSIZE+1]; char z[BUFSIZE+1]; uint32_t npoints = 0; numPointsGeometry(&npoints, geom); assert ( precision <= OUT_MAX_DOUBLE_PRECISION ); x[BUFSIZE] = '\0'; y[BUFSIZE] = '\0'; z[BUFSIZE] = '\0'; ptr = output; if ( GEOS_getWKBOutputDims(geom) == 2) { for (i=0; i<npoints; i++) { GEOSGeom point = (GEOSGeom) GEOSGetGeometryN(geom, i); double pt_x, pt_y; GEOSGeomGetX(point, &pt_x); GEOSGeomGetY(point, &pt_y); print_double(pt_x, precision, x, BUFSIZE); trim_trailing_zeros(x); print_double(pt_y, precision, y, BUFSIZE); trim_trailing_zeros(y); if ( i ) ptr += sprintf(ptr, ","); ptr += sprintf(ptr, "[%s,%s]", x, y); } } else { for (i=0; i<npoints; i++) { GEOSGeom point = (GEOSGeom) GEOSGetGeometryN(geom, i); double pt_x, pt_y, pt_z; GEOSGeomGetX(point, &pt_x); GEOSGeomGetY(point, &pt_y); GEOSGeomGetZ(point, &pt_z); print_double(pt_x, precision, x, BUFSIZE); trim_trailing_zeros(x); print_double(pt_y, precision, y, BUFSIZE); trim_trailing_zeros(y); print_double(pt_z, precision, z, BUFSIZE); trim_trailing_zeros(z); if ( i ) ptr += sprintf(ptr, ","); ptr += sprintf(ptr, "[%s,%s,%s]", x, y, z); } } return (ptr-output); }
/** In X3D3, coordinates are separated by a space separator */ static size_t pointArray_toX3D3(POINTARRAY *pa, char *output, int precision, int opts, int is_closed) { int i; char *ptr; char x[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; char y[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; char z[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; ptr = output; if ( ! FLAGS_GET_Z(pa->flags) ) { for (i=0; i<pa->npoints; i++) { /** Only output the point if it is not the last point of a closed object or it is a non-closed type **/ if ( !is_closed || i < (pa->npoints - 1) ) { POINT2D pt; getPoint2d_p(pa, i, &pt); if (fabs(pt.x) < OUT_MAX_DOUBLE) sprintf(x, "%.*f", precision, pt.x); else sprintf(x, "%g", pt.x); trim_trailing_zeros(x); if (fabs(pt.y) < OUT_MAX_DOUBLE) sprintf(y, "%.*f", precision, pt.y); else sprintf(y, "%g", pt.y); trim_trailing_zeros(y); if ( i ) ptr += sprintf(ptr, " "); ptr += sprintf(ptr, "%s %s", x, y); } } } else { for (i=0; i<pa->npoints; i++) { /** Only output the point if it is not the last point of a closed object or it is a non-closed type **/ if ( !is_closed || i < (pa->npoints - 1) ) { POINT4D pt; getPoint4d_p(pa, i, &pt); if (fabs(pt.x) < OUT_MAX_DOUBLE) sprintf(x, "%.*f", precision, pt.x); else sprintf(x, "%g", pt.x); trim_trailing_zeros(x); if (fabs(pt.y) < OUT_MAX_DOUBLE) sprintf(y, "%.*f", precision, pt.y); else sprintf(y, "%g", pt.y); trim_trailing_zeros(y); if (fabs(pt.z) < OUT_MAX_DOUBLE) sprintf(z, "%.*f", precision, pt.z); else sprintf(z, "%g", pt.z); trim_trailing_zeros(z); if ( i ) ptr += sprintf(ptr, " "); ptr += sprintf(ptr, "%s %s %s", x, y, z); } } } return ptr-output; }
static size_t pointArray_to_geojson(POINTARRAY *pa, char *output, int precision) { int i; char *ptr; char x[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; char y[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; char z[OUT_MAX_DIGS_DOUBLE+OUT_MAX_DOUBLE_PRECISION+1]; ptr = output; if (!FLAGS_GET_Z(pa->flags)) { for (i=0; i<pa->npoints; i++) { POINT2D pt; getPoint2d_p(pa, i, &pt); if (fabs(pt.x) < OUT_MAX_DOUBLE) sprintf(x, "%.*f", precision, pt.x); else sprintf(x, "%g", pt.x); trim_trailing_zeros(x); if (fabs(pt.y) < OUT_MAX_DOUBLE) sprintf(y, "%.*f", precision, pt.y); else sprintf(y, "%g", pt.y); trim_trailing_zeros(y); if ( i ) ptr += sprintf(ptr, ","); ptr += sprintf(ptr, "[%s,%s]", x, y); } } else { for (i=0; i<pa->npoints; i++) { POINT4D pt; getPoint4d_p(pa, i, &pt); if (fabs(pt.x) < OUT_MAX_DOUBLE) sprintf(x, "%.*f", precision, pt.x); else sprintf(x, "%g", pt.x); trim_trailing_zeros(x); if (fabs(pt.y) < OUT_MAX_DOUBLE) sprintf(y, "%.*f", precision, pt.y); else sprintf(y, "%g", pt.y); trim_trailing_zeros(y); if (fabs(pt.z) < OUT_MAX_DOUBLE) sprintf(z, "%.*f", precision, pt.z); else sprintf(z, "%g", pt.z); trim_trailing_zeros(z); if ( i ) ptr += sprintf(ptr, ","); ptr += sprintf(ptr, "[%s,%s,%s]", x, y, z); } } return (ptr-output); }