1238 static const double DEFAULT_MITRE_LIMIT = 5.0;
1239 static const int DEFAULT_JOIN_STYLE = JOIN_ROUND;
1240 double mitreLimit = DEFAULT_MITRE_LIMIT;
1241 int joinStyle = DEFAULT_JOIN_STYLE;
1243 char *paramstr = NULL;
1247 gser_input = PG_GETARG_GSERIALIZED_P(0);
1248 size = PG_GETARG_FLOAT8(1);
1251 if (size == 0) PG_RETURN_POINTER(gser_input);
1255 if ( ! lwgeom_input )
1256 lwpgerror(
"ST_OffsetCurve: lwgeom_from_gserialized returned NULL");
1260 PG_RETURN_POINTER(gser_input);
1265 text *wkttext = PG_GETARG_TEXT_P(2);
1266 paramstr = text_to_cstring(wkttext);
1268 POSTGIS_DEBUGF(3,
"paramstr: %s", paramstr);
1270 for ( param=paramstr; ; param=NULL )
1273 param = strtok(param,
" ");
1275 POSTGIS_DEBUGF(3,
"Param: %s", param);
1278 val = strchr(key,
'=');
1279 if (!val || *(val + 1) ==
'\0')
1281 lwpgerror(
"ST_OffsetCurve: Missing value for buffer parameter %s", key);
1287 POSTGIS_DEBUGF(3,
"Param: %s : %s", key, val);
1289 if ( !strcmp(key,
"join") )
1291 if ( !strcmp(val,
"round") )
1293 joinStyle = JOIN_ROUND;
1295 else if ( !(strcmp(val,
"mitre") && strcmp(val,
"miter")) )
1297 joinStyle = JOIN_MITRE;
1299 else if ( ! strcmp(val,
"bevel") )
1301 joinStyle = JOIN_BEVEL;
1306 "Invalid buffer end cap style: %s (accept: 'round', 'mitre', 'miter' or 'bevel')",
1311 else if ( !strcmp(key,
"mitre_limit") ||
1312 !strcmp(key,
"miter_limit") )
1315 mitreLimit = atof(val);
1317 else if ( !strcmp(key,
"quad_segs") )
1320 quadsegs = atoi(val);
1325 "Invalid buffer parameter: %s (accept: 'join', 'mitre_limit', 'miter_limit and 'quad_segs')",
1330 POSTGIS_DEBUGF(3,
"joinStyle:%d mitreLimit:%g", joinStyle, mitreLimit);
1334 lwgeom_result =
lwgeom_offsetcurve(lwgeom_input, size, quadsegs, joinStyle, mitreLimit);
1337 lwpgerror(
"ST_OffsetCurve: lwgeom_offsetcurve returned NULL");
1339 gser_result = geometry_serialize(lwgeom_result);
1342 PG_RETURN_POINTER(gser_result);
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
void lwgeom_free(LWGEOM *geom)
LWGEOM * lwgeom_offsetcurve(const LWGEOM *geom, double size, int quadsegs, int joinStyle, double mitreLimit)
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)