g = lwgeom_from_wkt(in, LW_PARSER_CHECK_NONE);
h = lwgeom_extent_to_gml2(g, srs, precision, prefix);
- if ( ! h ) h = cu_error_msg;
+ if ( ! h ) h = strdup(cu_error_msg);
if (strcmp(h, out))
fprintf(stderr, "\nEXT GML 2 - In: %s\nObt: %s\nExp: %s\n",
g = lwgeom_from_wkt(in, LW_PARSER_CHECK_NONE);
h = lwgeom_extent_to_gml3(g, srs, precision, opts, prefix);
- if ( ! h ) h = cu_error_msg;
+ if ( ! h ) h = strdup(cu_error_msg);
if (strcmp(h, out))
fprintf(stderr, "\nEXT GML 3 - In: %s\nObt: %s\nExp: %s\n",
"<Box><coordinates>-2,-1 10,14</coordinates></Box>",
NULL, 15, "");
- /* GML2: empty (FIXME) */
+ /* GML2: empty */
do_gml2_extent_test(
"GEOMETRYCOLLECTION EMPTY",
- "<Box><coordinates>0,0 0,0</coordinates></Box>",
+ "<Box/>",
NULL, 15, "");
+ /* GML2: empty with srsName */
+ do_gml2_extent_test(
+ "GEOMETRYCOLLECTION EMPTY",
+ "<Box srsName=\"urn:ogc:def:crs:EPSG::4326\"/>",
+ "urn:ogc:def:crs:EPSG::4326", 15, "");
+
}
static void out_gml3_extent(void)
"<Envelope><lowerCorner>-2 -1</lowerCorner><upperCorner>10 14</upperCorner></Envelope>",
NULL, 15, 0, "");
- /* GML3: empty (FIXME) */
+ /* GML3: empty */
do_gml3_extent_test(
"GEOMETRYCOLLECTION EMPTY",
- "<Envelope><lowerCorner>0 0</lowerCorner><upperCorner>0 0</upperCorner></Envelope>",
+ "<Envelope/>",
NULL, 15, 0, "");
+ /* GML3: empty with srsName */
+ do_gml3_extent_test(
+ "GEOMETRYCOLLECTION EMPTY",
+ "<Envelope srsName=\"urn:ogc:def:crs:EPSG::4326\"/>",
+ "urn:ogc:def:crs:EPSG::4326", 15, 0, "");
+
}
void
lwgeom_add_bbox(LWGEOM *lwgeom)
{
+ /* an empty LWGEOM has no bbox */
+ if( lwgeom_is_empty(lwgeom) ) return;
+
if ( lwgeom->bbox ) return;
FLAGS_SET_BBOX(lwgeom->flags, 1);
lwgeom->bbox = gbox_new(lwgeom->flags);
char *ptr, *output;
size_t prefixlen = strlen(prefix);
+ if ( ! bbox ) {
+ size = ( sizeof("<Box>/") + (prefixlen*2) ) * 2;
+ if ( srs ) size += strlen(srs) + sizeof(" srsName=..");
+
+ ptr = output = lwalloc(size);
+
+ ptr += sprintf(ptr, "<%sBox", prefix);
+
+ if ( srs ) ptr += sprintf(ptr, " srsName=\"%s\"", srs);
+
+ ptr += sprintf(ptr, "/>");
+
+ return output;
+ }
+
pa = ptarray_construct_empty(FLAGS_GET_Z(bbox->flags), 0, 2);
pt.x = bbox->xmin;
size_t prefixlen = strlen(prefix);
int dimension = 2;
+ if ( ! bbox ) {
+ size = ( sizeof("<Envelope>/") + (prefixlen*2) ) * 2;
+ if ( srs ) size += strlen(srs) + sizeof(" srsName=..");
+
+ ptr = output = lwalloc(size);
+
+ ptr += sprintf(ptr, "<%sEnvelope", prefix);
+ if ( srs ) ptr += sprintf(ptr, " srsName=\"%s\"", srs);
+
+ ptr += sprintf(ptr, "/>");
+
+ return output;
+ }
+
if (FLAGS_GET_Z(bbox->flags)) dimension = 3;
pa = ptarray_construct_empty(FLAGS_GET_Z(bbox->flags), 0, 1);
lwgeom_extent_to_gml2(const LWGEOM *geom, const char *srs, int precision, const char *prefix)
{
const GBOX* bbox = lwgeom_get_bbox(geom);
+/*
if ( ! bbox ) {
lwerror("lwgeom_extent_to_gml2: empty geometry doesn't have a bounding box");
return NULL;
}
+*/
char *ret = gbox_to_gml2(bbox, srs, precision, prefix);
return ret;
}
lwgeom_extent_to_gml3(const LWGEOM *geom, const char *srs, int precision, int opts, const char *prefix)
{
const GBOX* bbox = lwgeom_get_bbox(geom);
+/*
if ( ! bbox ) {
lwerror("lwgeom_extent_to_gml3: empty geometry doesn't have a bounding box");
return NULL;
}
+*/
return gbox_to_gml3(bbox, srs, precision, opts, prefix);
}