Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: Hierarchical Data Format Release 5 (HDF5) 4 : * Purpose: Header file for HDF5 HDFEOS parser 5 : * Author: Even Rouault 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2023, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef HDF5EOSPARSER_H_INCLUDED 14 : #define HDF5EOSPARSER_H_INCLUDED 15 : 16 : #include "hdf5_api.h" 17 : 18 : #include "cpl_json.h" 19 : #include "ogr_spatialref.h" 20 : 21 : #include <map> 22 : #include <string> 23 : #include <vector> 24 : 25 : /************************************************************************/ 26 : /* HDF5EOSParser */ 27 : /************************************************************************/ 28 : 29 : class HDF5EOSParser 30 : { 31 : public: 32 180 : HDF5EOSParser() = default; 33 : 34 : enum class DataModel 35 : { 36 : INVALID, 37 : GRID, 38 : SWATH, 39 : }; 40 : 41 : struct Dimension 42 : { 43 : std::string osName{}; 44 : int nSize = 0; 45 : 46 40 : inline bool operator==(const Dimension &otherDim) const 47 : { 48 40 : return osName == otherDim.osName; 49 : } 50 : }; 51 : 52 : struct GridMetadata 53 : { 54 : std::string osGridName{}; 55 : std::vector<Dimension> aoDimensions; // all dimensions of the grid 56 : std::string osProjection{}; // e.g HE5_GCTP_SNSOID 57 : int nProjCode = -1; // GTCP numeric value for osProjection 58 : std::string osGridOrigin{}; // e.g HE5_HDFE_GD_UL 59 : std::vector<double> 60 : adfProjParams{}; // e.g (6371007.181000,0,0,0,0,0,0,0,0,0,0,0,0) 61 : int nZone = 0; // for HE5_GCTP_UTM and HE5_GCTP_SPCS 62 : int nSphereCode = 0; 63 : std::vector<double> 64 : adfUpperLeftPointMeters{}; // e.g (-1111950.519667,5559752.598333) 65 : std::vector<double> 66 : adfLowerRightPointMeters{}; // e.g (0.000000,4447802.078667) 67 : 68 : bool GetGeoTransform(double adfGeoTransform[6]) const; 69 : std::unique_ptr<OGRSpatialReference> GetSRS() const; 70 : }; 71 : 72 : struct GridDataFieldMetadata 73 : { 74 : std::vector<Dimension> aoDimensions{}; // dimensions of the data field 75 : const GridMetadata *poGridMetadata = nullptr; 76 : }; 77 : 78 : struct SwathMetadata 79 : { 80 : std::string osSwathName{}; 81 : std::vector<Dimension> aoDimensions{}; // all dimensions of the swath 82 : }; 83 : 84 : struct SwathGeolocationFieldMetadata 85 : { 86 : std::vector<Dimension> 87 : aoDimensions{}; // dimensions of the geolocation field 88 : const SwathMetadata *poSwathMetadata = nullptr; 89 : }; 90 : 91 : struct SwathDataFieldMetadata 92 : { 93 : std::vector<Dimension> aoDimensions{}; // dimensions of the data field 94 : const SwathMetadata *poSwathMetadata = nullptr; 95 : 96 : int iXDim = -1; 97 : int iYDim = -1; 98 : int iOtherDim = -1; 99 : 100 : std::string osLongitudeSubdataset; 101 : std::string osLatitudeSubdataset; 102 : int nLineOffset = 0; 103 : int nLineStep = 0; 104 : int nPixelOffset = 0; 105 : int nPixelStep = 0; 106 : }; 107 : 108 : static bool HasHDFEOS(hid_t hRoot); 109 : bool Parse(hid_t hRoot); 110 : 111 437 : DataModel GetDataModel() const 112 : { 113 437 : return m_eDataModel; 114 : } 115 : 116 : bool GetGridMetadata(const std::string &osGridName, 117 : GridMetadata &gridMetadataOut) const; 118 : bool GetGridDataFieldMetadata( 119 : const char *pszSubdatasetName, 120 : GridDataFieldMetadata &gridDataFieldMetadataOut) const; 121 : bool GetSwathMetadata(const std::string &osSwathName, 122 : SwathMetadata &swathMetadataOut) const; 123 : bool GetSwathDataFieldMetadata( 124 : const char *pszSubdatasetName, 125 : SwathDataFieldMetadata &swathDataFieldMetadataOut) const; 126 : bool GetSwathGeolocationFieldMetadata( 127 : const char *pszSubdatasetName, 128 : SwathGeolocationFieldMetadata &swathGeolocationFieldMetadataOut) const; 129 : 130 : private: 131 : DataModel m_eDataModel = DataModel::INVALID; 132 : std::map<std::string, std::unique_ptr<GridMetadata>> 133 : m_oMapGridNameToGridMetadata{}; 134 : std::map<std::string, GridDataFieldMetadata> 135 : m_oMapSubdatasetNameToGridDataFieldMetadata{}; 136 : std::map<std::string, std::unique_ptr<SwathMetadata>> 137 : m_oMapSwathNameToSwathMetadata{}; 138 : std::map<std::string, SwathDataFieldMetadata> 139 : m_oMapSubdatasetNameToSwathDataFieldMetadata{}; 140 : std::map<std::string, SwathGeolocationFieldMetadata> 141 : m_oMapSubdatasetNameToSwathGeolocationFieldMetadata{}; 142 : 143 : void ParseGridStructure(const CPLJSONObject &oGridStructure); 144 : void ParseSwathStructure(const CPLJSONObject &oSwathStructure); 145 : }; 146 : 147 : #endif // HDF5EOSPARSER_H_INCLUDED