band_reference.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*!
  2. * \file lib/raster/band_reference.c
  3. *
  4. * \brief Raster Library - Band reference managenent
  5. *
  6. * (C) 2019 by the GRASS Development Team
  7. *
  8. * This program is free software under the GNU General Public
  9. * License (>=v2). Read the file COPYING that comes with GRASS
  10. * for details.
  11. *
  12. * \author Martin Landa (with financial support by mundialis, Bonn, for openEO EU H2020 grant 776242, https://openeo.org)
  13. */
  14. #include <string.h>
  15. #include <grass/gis.h>
  16. #include <grass/raster.h>
  17. #include <grass/glocale.h>
  18. static const char *_band_file = "band_reference";
  19. /*!
  20. \brief Check if band reference for raster map exists
  21. \param name map name
  22. \param mapset mapset name
  23. \return 1 on success
  24. \return 0 no band reference present
  25. */
  26. int Rast_has_band_reference(const char *name, const char *mapset)
  27. {
  28. if (!G_find_file2_misc("cell_misc", _band_file, name, mapset))
  29. return 0;
  30. return 1;
  31. }
  32. /*!
  33. \brief Read raster map band reference identifier.
  34. Note that output arguments should be freed by the caller using G_free().
  35. \param name map name
  36. \param mapset mapset name
  37. \param[out] filename filename JSON reference
  38. \param[out] band_reference band reference identifier
  39. \return 1 on success
  40. \return 0 band reference not found
  41. \return negative on error
  42. */
  43. int Rast_read_band_reference(const char *name, const char *mapset,
  44. char **filename, char **band_reference)
  45. {
  46. int ret;
  47. FILE *fd;
  48. struct Key_Value *key_val;
  49. G_debug(1, "Reading band reference file for raster map <%s@%s>",
  50. name, mapset);
  51. if (!Rast_has_band_reference(name, mapset))
  52. return 0;
  53. fd = G_fopen_old_misc("cell_misc", _band_file, name, mapset);
  54. if (!fd) {
  55. G_debug(1, "Unable to read band identifier file for <%s@%s>",
  56. name, mapset);
  57. return -1;
  58. }
  59. ret = G__read_band_reference(fd, &key_val);
  60. *filename = G_store(G_find_key_value("file", key_val));
  61. *band_reference = G_store(G_find_key_value("identifier", key_val));
  62. fclose(fd);
  63. G_free_key_value(key_val);
  64. return ret;
  65. }
  66. /*!
  67. \brief Write raster map band reference identifier.
  68. \param name map name
  69. \param filename filename JSON reference
  70. \param band_reference band reference identifier
  71. \return 1 on success
  72. \return negative on error
  73. */
  74. int Rast_write_band_reference(const char *name,
  75. const char *filename, const char *band_reference)
  76. {
  77. int ret;
  78. FILE *fd;
  79. fd = G_fopen_new_misc("cell_misc", _band_file, name);
  80. if (!fd) {
  81. G_fatal_error(_("Unable to create band file for <%s>"), name);
  82. return -1;
  83. }
  84. ret = G__write_band_reference(fd, filename, band_reference);
  85. fclose(fd);
  86. return ret;
  87. }
  88. /*!
  89. \brief Remove band reference from raster map
  90. Only band reference files in current mapset can be removed.
  91. \param name map name
  92. \return 0 if no file
  93. \return 1 on success
  94. \return -1 on error
  95. */
  96. int Rast_remove_band_reference(const char *name)
  97. {
  98. return G_remove_misc("cell_misc", _band_file, name);
  99. }