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