LCOV - code coverage report
Current view: top level - frmts/miramon - miramon_dataset.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 6 6 100.0 %
Date: 2026-03-05 10:33:42 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  MiraMon Raster Driver
       4             :  * Purpose:  Implements MMRDataset class: responsible for generating the
       5             :  *           main dataset or the subdatasets as needed.
       6             :  * Author:   Abel Pau
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 2025, Xavier Pons
      10             :  *
      11             :  * SPDX-License-Identifier: MIT
      12             :  ****************************************************************************/
      13             : 
      14             : #ifndef MMRDATASET_H_INCLUDED
      15             : #define MMRDATASET_H_INCLUDED
      16             : 
      17             : #include <cstddef>
      18             : #include <vector>
      19             : #include <optional>
      20             : #include <array>
      21             : 
      22             : #include "gdal_pam.h"
      23             : #include "gdal_rat.h"
      24             : 
      25             : #include "../miramon_common/mm_gdal_constants.h"  // For MM_EXT_DBF_N_FIELDS
      26             : #include "miramon_rel.h"
      27             : 
      28             : /* ==================================================================== */
      29             : /*                              MMRDataset                              */
      30             : /* ==================================================================== */
      31             : 
      32             : class MMRRasterBand;
      33             : class MMRRel;
      34             : 
      35             : /*
      36             :     * -oo  RAT_OR_CT
      37             :     Controls whether the Raster Attribute Table (RAT) and/or the Color Table (CT) are exposed.
      38             : 
      39             :       ALL
      40             :             Expose both the attribute table and the color table. Note that in some software this option may cause visualization and/or legend issues.
      41             :       RAT
      42             :             Expose the attribute table only, without the color table.
      43             :       PER_BAND_ONLY
      44             :             Expose the color table only, without the attribute table.
      45             :     */
      46             : enum class RAT_OR_CT
      47             : {
      48             :     ALL,
      49             :     RAT,
      50             :     CT
      51             : };
      52             : 
      53             : class MMRDataset final : public GDALPamDataset
      54             : {
      55             :   public:
      56             :     explicit MMRDataset(GDALOpenInfo *poOpenInfo);  // Used in reading
      57             :     MMRDataset(GDALProgressFunc pfnProgress, void *pProgressData,
      58             :                CSLConstList papszOptions, CPLString osFilename,
      59             :                GDALDataset &oSrcDS, const CPLString &osUsrPattern,
      60             :                const CPLString &osPattern);  // Used in writing
      61             :     MMRDataset(const MMRDataset &) =
      62             :         delete;  // I don't want to construct a MMRDataset from another MMRDataset (effc++)
      63             :     MMRDataset &operator=(const MMRDataset &) =
      64             :         delete;  // I don't want to assign a MMRDataset to another MMRDataset (effc++)
      65             :     ~MMRDataset() override;
      66             : 
      67             :     static int Identify(GDALOpenInfo *);
      68             :     static GDALDataset *Open(GDALOpenInfo *);
      69             :     static GDALDataset *CreateCopy(const char *pszFilename,
      70             :                                    GDALDataset *poSrcDS, int bStrict,
      71             :                                    CSLConstList papszOptions,
      72             :                                    GDALProgressFunc pfnProgress,
      73             :                                    void *pProgressData);
      74             : 
      75         210 :     MMRRel *GetRel()
      76             :     {
      77         210 :         return m_pMMRRel.get();
      78             :     }
      79             : 
      80         210 :     RAT_OR_CT GetRatOrCT() const
      81             :     {
      82         210 :         return nRatOrCT;
      83             :     }
      84             : 
      85             :   private:
      86             :     void ReadProjection();
      87             :     void UpdateProjection(GDALDataset &oSrcDS);
      88             :     void AssignBandsToSubdataSets();
      89             :     void CreateSubdatasetsFromBands();
      90             :     bool CreateRasterBands();
      91             :     bool BandInTheSameDataset(int nIBand1, int nIBan2) const;
      92             : 
      93             :     int UpdateGeoTransform();
      94             :     const OGRSpatialReference *GetSpatialRef() const override;
      95             :     CPLErr GetGeoTransform(GDALGeoTransform &gt) const override;
      96             :     static CPLString
      97             :     CreateAssociatedMetadataFileName(const CPLString &osFileName);
      98             :     static CPLString CreatePatternFileName(const CPLString &osFileName,
      99             :                                            const CPLString &osPattern);
     100             :     static bool BandInOptionsList(CSLConstList papszOptions,
     101             :                                   const CPLString &pszType,
     102             :                                   const CPLString &osBand);
     103             :     static bool IsCategoricalBand(GDALDataset &oSrcDS,
     104             :                                   GDALRasterBand &pRasterBand,
     105             :                                   CSLConstList papszOptions,
     106             :                                   const CPLString &osIndexBand);
     107             :     void WriteRGBMap();
     108             : 
     109         498 :     bool IsValid() const
     110             :     {
     111         498 :         return m_bIsValid;
     112             :     }
     113             : 
     114             :     GDALGeoTransform m_gt{};
     115             :     OGRSpatialReference m_oSRS{};
     116             : 
     117             :     bool m_bIsValid =
     118             :         false;  // Determines if the created object is valid or not.
     119             :     std::unique_ptr<MMRRel> m_pMMRRel = nullptr;
     120             : 
     121             :     std::vector<gdal::GCP> m_aoGCPs{};
     122             : 
     123             :     // Numbers of subdatasets (if any) in this dataset.
     124             :     int m_nNSubdataSets = 0;
     125             : 
     126             :     // To expose CT, RAT or both
     127             :     RAT_OR_CT nRatOrCT = RAT_OR_CT::ALL;
     128             : 
     129             :     // For writing part
     130             :     //
     131             :     // EPSG number
     132             :     CPLString m_osEPSG = "";
     133             :     // Global raster dimensions
     134             :     int m_nWidth = 0;
     135             :     int m_nHeight = 0;
     136             : 
     137             :     double m_dfMinX = MM_UNDEFINED_STATISTICAL_VALUE;
     138             :     double m_dfMaxX = -MM_UNDEFINED_STATISTICAL_VALUE;
     139             :     double m_dfMinY = MM_UNDEFINED_STATISTICAL_VALUE;
     140             :     double m_dfMaxY = -MM_UNDEFINED_STATISTICAL_VALUE;
     141             : 
     142             :     // If a RGB combination can be done, then a map ".mmm" will be generated
     143             :     int m_nIBandR = -1;
     144             :     int m_nIBandG = -1;
     145             :     int m_nIBandB = -1;
     146             : };
     147             : 
     148             : #endif  // MMRDATASET_H_INCLUDED

Generated by: LCOV version 1.14