PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ 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 /*
295 SELECT
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
305 FROM spatial_ref_sys
306 WHERE srid = X
307 LIMIT 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:169
int rt_util_gdal_supported_sr(const char *srs)
Definition: rt_util.c:245
#define POSTGIS_RT_DEBUGF(level, msg,...)
Definition: rtpostgis.h:65
#define MAX_INT_CHARLEN
Definition: rtpostgis.h:76

References MAX_INT_CHARLEN, POSTGIS_RT_DEBUGF, rt_util_gdal_supported_sr(), rtgdalraster::sql, and TRUE.

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

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