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

◆ rtpg_getSR()

char * rtpg_getSR ( int32_t  srid)

Definition at line 282 of file rtpg_internal.c.

283{
284 int i = 0;
285 int len = 0;
286 char *sql = NULL;
287 int spi_result;
288 TupleDesc tupdesc;
289 SPITupleTable *tuptable = NULL;
290 HeapTuple tuple;
291 char *tmp = NULL;
292 char *srs = NULL;
293
294/*
295SELECT
296 CASE
297 WHEN (upper(auth_name) = 'EPSG' OR upper(auth_name) = 'EPSGA') AND length(COALESCE(auth_srid::text, '')) > 0
298 THEN upper(auth_name) || ':' || auth_srid
299 WHEN length(COALESCE(auth_name, '') || COALESCE(auth_srid::text, '')) > 0
300 THEN COALESCE(auth_name, '') || COALESCE(auth_srid::text, '')
301 ELSE ''
302 END,
303 proj4text,
304 srtext
305FROM spatial_ref_sys
306WHERE srid = X
307LIMIT 1
308*/
309
310 len = sizeof(char) * (strlen("SELECT CASE WHEN (upper(auth_name) = 'EPSG' OR upper(auth_name) = 'EPSGA') AND length(COALESCE(auth_srid::text, '')) > 0 THEN upper(auth_name) || ':' || auth_srid WHEN length(COALESCE(auth_name, '') || COALESCE(auth_srid::text, '')) > 0 THEN COALESCE(auth_name, '') || COALESCE(auth_srid::text, '') ELSE '' END, proj4text, srtext FROM spatial_ref_sys WHERE srid = LIMIT 1") + MAX_INT_CHARLEN + 1);
311 sql = (char *) palloc(len);
312 if (NULL == sql) {
313 elog(ERROR, "rtpg_getSR: Could not allocate memory for sql\n");
314 return NULL;
315 }
316
317 spi_result = SPI_connect();
318 if (spi_result != SPI_OK_CONNECT) {
319 pfree(sql);
320 elog(ERROR, "rtpg_getSR: Could not connect to database using SPI\n");
321 return NULL;
322 }
323
324 /* execute query */
325 snprintf(sql, len, "SELECT CASE WHEN (upper(auth_name) = 'EPSG' OR upper(auth_name) = 'EPSGA') AND length(COALESCE(auth_srid::text, '')) > 0 THEN upper(auth_name) || ':' || auth_srid WHEN length(COALESCE(auth_name, '') || COALESCE(auth_srid::text, '')) > 0 THEN COALESCE(auth_name, '') || COALESCE(auth_srid::text, '') ELSE '' END, proj4text, srtext FROM spatial_ref_sys WHERE srid = %d LIMIT 1", srid);
326 POSTGIS_RT_DEBUGF(4, "SRS query: %s", sql);
327 spi_result = SPI_execute(sql, TRUE, 0);
328 SPI_pfree(sql);
329 if (spi_result != SPI_OK_SELECT || SPI_tuptable == NULL || SPI_processed != 1) {
330 if (SPI_tuptable) SPI_freetuptable(tuptable);
331 SPI_finish();
332 elog(ERROR, "rtpg_getSR: Cannot find SRID (%d) in spatial_ref_sys", srid);
333 return NULL;
334 }
335
336 tupdesc = SPI_tuptable->tupdesc;
337 tuptable = SPI_tuptable;
338 tuple = tuptable->vals[0];
339
340 /* which column to use? */
341 for (i = 1; i < 4; i++) {
342 tmp = SPI_getvalue(tuple, tupdesc, i);
343
344 /* value AND GDAL supports this SR */
345 if (
346 SPI_result != SPI_ERROR_NOATTRIBUTE &&
347 SPI_result != SPI_ERROR_NOOUTFUNC &&
348 tmp != NULL &&
349 strlen(tmp) &&
351 ) {
352 POSTGIS_RT_DEBUGF(4, "Value for column %d is %s", i, tmp);
353
354 len = strlen(tmp) + 1;
355 srs = SPI_palloc(sizeof(char) * len);
356 if (NULL == srs) {
357 pfree(tmp);
358 if (SPI_tuptable) SPI_freetuptable(tuptable);
359 SPI_finish();
360 elog(ERROR, "rtpg_getSR: Could not allocate memory for spatial reference text\n");
361 return NULL;
362 }
363 strncpy(srs, tmp, len);
364 pfree(tmp);
365
366 break;
367 }
368
369 if (tmp != NULL)
370 pfree(tmp);
371 continue;
372 }
373
374 if (SPI_tuptable) SPI_freetuptable(tuptable);
375 SPI_finish();
376
377 /* unable to get SR info */
378 if (srs == NULL) {
379 if (SPI_tuptable) SPI_freetuptable(tuptable);
380 SPI_finish();
381 elog(ERROR, "rtpg_getSR: Could not find a viable spatial reference for SRID (%d)", srid);
382 return NULL;
383 }
384
385 return srs;
386}
#define TRUE
Definition dbfopen.c:73
int rt_util_gdal_supported_sr(const char *srs)
Definition rt_util.c:353
#define POSTGIS_RT_DEBUGF(level, msg,...)
Definition rtpostgis.h:69
#define MAX_INT_CHARLEN
Definition rtpostgis.h:80

References MAX_INT_CHARLEN, POSTGIS_RT_DEBUGF, rt_util_gdal_supported_sr(), and TRUE.

Referenced by RASTER_asGDALRaster(), RASTER_asRaster(), RASTER_Contour(), and RASTER_GDALWarp().

Here is the call graph for this function:
Here is the caller graph for this function: