PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ postgis_srs_search()

Datum postgis_srs_search ( PG_FUNCTION_ARGS  )

Search for projections given extent and (optional) auth_name returns TABLE(auth_name, auth_srid, srtext, proj4text, point_sw, point_ne)

Definition at line 702 of file postgis/lwgeom_transform.c.

703{
704 FuncCallContext *funcctx;
705 MemoryContext oldcontext;
706 struct srs_data *state;
707 Datum result;
708
709 /*
710 * On the first call, fill in the state with all
711 * of the auth_name/auth_srid pairings in the
712 * proj database. Then the per-call routine is just
713 * one isolated call per pair.
714 */
715 if (SRF_IS_FIRSTCALL())
716 {
717 GSERIALIZED *gbounds = PG_GETARG_GSERIALIZED_P(0);
718 LWGEOM *bounds = lwgeom_from_gserialized(gbounds);
719 text *auth_name = PG_GETARG_TEXT_P(1);
720
721 funcctx = SRF_FIRSTCALL_INIT();
722 oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
723
724 /*
725 * Could read all authorities from database, but includes
726 * authorities (IGN, OGC) that use non-integral values in
727 * auth_srid. So hand-coded list for now.
728 */
729 state = srs_state_init();
730
731 /* Run the Proj query */
732 srs_find_planar(text_to_cstring(auth_name), bounds, state);
733
734 /*
735 * Read the TupleDesc from the FunctionCallInfo. The SQL definition
736 * of the function must have the right number of fields and types
737 * to match up to this C code.
738 */
739 if (get_call_result_type(fcinfo, 0, &funcctx->tuple_desc) != TYPEFUNC_COMPOSITE)
740 {
741 ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
742 errmsg("%s called with incompatible return type", __func__)));
743 }
744
745 BlessTupleDesc(funcctx->tuple_desc);
746 funcctx->user_fctx = state;
747 MemoryContextSwitchTo(oldcontext);
748 }
749
750 /* Stuff done on every call of the function */
751 funcctx = SRF_PERCALL_SETUP();
752 state = funcctx->user_fctx;
753
754 /* Exit when we've read all entries */
755 if (!state->num_entries ||
756 state->current_entry == state->num_entries)
757 {
758 SRF_RETURN_DONE(funcctx);
759 }
760
761 /* Lookup the srtext/proj4text for this entry */
763 state->entries + state->current_entry++,
764 funcctx->tuple_desc);
765
766 if (result)
767 SRF_RETURN_NEXT(funcctx, result);
768
769 /* Stop if lookup fails drastically */
770 SRF_RETURN_DONE(funcctx);
771}
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition cu_print.c:267
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
static struct srs_data * srs_state_init()
static Datum srs_tuple_from_entry(const struct srs_entry *entry, TupleDesc tuple_desc)
static void srs_find_planar(const char *auth_name, const LWGEOM *bounds, struct srs_data *state)
struct srs_entry * entries

References srs_data::current_entry, srs_data::entries, lwgeom_from_gserialized(), srs_data::num_entries, result, srs_find_planar(), srs_state_init(), and srs_tuple_from_entry().

Here is the call graph for this function: