static void do_gml2_test_prefix(char * in, char * out, char * srs, int precision, const char *prefix) { LWGEOM *g; char *h; g = lwgeom_from_wkt(in, LW_PARSER_CHECK_NONE); h = lwgeom_to_gml2(g, srs, precision, prefix); if (strcmp(h, out)) fprintf(stderr, "\nIn: %s\nOut: %s\nTheo: %s\n", in, h, out); CU_ASSERT_STRING_EQUAL(h, out); lwgeom_free(g); lwfree(h); }
static void do_gml2_unsupported(char * in, char * out) { LWGEOM *g; char *h; g = lwgeom_from_wkt(in, LW_PARSER_CHECK_NONE); h = lwgeom_to_gml2(g, NULL, 0, ""); if (strcmp(cu_error_msg, out)) fprintf(stderr, "\nGML 2 - In: %s\nOut: %s\nTheo: %s\n", in, cu_error_msg, out); CU_ASSERT_STRING_EQUAL(out, cu_error_msg); cu_error_msg_reset(); lwfree(h); lwgeom_free(g); }
Datum geography_as_gml(PG_FUNCTION_ARGS) { LWGEOM *lwgeom = NULL; GSERIALIZED *g = NULL; char *gml; text *result; int version; char *srs; int srid = SRID_DEFAULT; int precision = OUT_MAX_DOUBLE_PRECISION; int option=0; int lwopts = LW_GML_IS_DIMS; static const char *default_prefix = "gml:"; const char *prefix = default_prefix; char *prefix_buf = ""; text *prefix_text, *id_text = NULL; const char *id=NULL; char *id_buf; /* Get the version */ version = PG_GETARG_INT32(0); if ( version != 2 && version != 3 ) { elog(ERROR, "Only GML 2 and GML 3 are supported"); PG_RETURN_NULL(); } /* Get the geography */ if ( PG_ARGISNULL(1) ) PG_RETURN_NULL(); g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1)); /* Convert to lwgeom so we can run the old functions */ lwgeom = lwgeom_from_gserialized(g); /* Retrieve precision if any (default is max) */ if (PG_NARGS() >2 && !PG_ARGISNULL(2)) { precision = PG_GETARG_INT32(2); if ( precision > OUT_MAX_DOUBLE_PRECISION ) precision = OUT_MAX_DOUBLE_PRECISION; else if ( precision < 0 ) precision = 0; } /* retrieve option */ if (PG_NARGS() >3 && !PG_ARGISNULL(3)) option = PG_GETARG_INT32(3); /* retrieve prefix */ if (PG_NARGS() >4 && !PG_ARGISNULL(4)) { prefix_text = PG_GETARG_TEXT_P(4); if ( VARSIZE(prefix_text)-VARHDRSZ == 0 ) { prefix = ""; } else { /* +2 is one for the ':' and one for term null */ prefix_buf = palloc(VARSIZE(prefix_text)-VARHDRSZ+2); memcpy(prefix_buf, VARDATA(prefix_text), VARSIZE(prefix_text)-VARHDRSZ); /* add colon and null terminate */ prefix_buf[VARSIZE(prefix_text)-VARHDRSZ] = ':'; prefix_buf[VARSIZE(prefix_text)-VARHDRSZ+1] = '\0'; prefix = prefix_buf; } } /* retrieve id */ if (PG_NARGS() >5 && !PG_ARGISNULL(5)) { prefix_text = PG_GETARG_TEXT_P(5); if ( VARSIZE(id_text)-VARHDRSZ == 0 ) { id = ""; } else { id_buf = palloc(VARSIZE(id_text)-VARHDRSZ+1); memcpy(id_buf, VARDATA(id_text), VARSIZE(id_text)-VARHDRSZ); prefix_buf[VARSIZE(id_text)-VARHDRSZ+1] = '\0'; id = id_buf; } } if (option & 1) srs = getSRSbySRID(srid, false); else srs = getSRSbySRID(srid, true); if (!srs) { elog(ERROR, "SRID %d unknown in spatial_ref_sys table", SRID_DEFAULT); PG_RETURN_NULL(); } /* Revert lat/lon only with long SRS */ if (option & 1) lwopts |= LW_GML_IS_DEGREE; if (option & 2) lwopts &= ~LW_GML_IS_DIMS; if (version == 2) gml = lwgeom_to_gml2(lwgeom, srs, precision, prefix); else gml = lwgeom_to_gml3(lwgeom, srs, precision, lwopts, prefix, id); lwgeom_free(lwgeom); PG_FREE_IF_COPY(g, 1); /* Return null on null */ if ( ! gml ) PG_RETURN_NULL(); /* Turn string result into text for return */ result = cstring2text(gml); lwfree(gml); PG_RETURN_TEXT_P(result); }