fhs / pyhdf

Python wrapper around the NCSA HDF version 4 library
https://pypi.org/project/pyhdf/
Other
46 stars 15 forks source link

Parse ArchiveMetadata.0 field #57

Open mankoff opened 2 years ago

mankoff commented 2 years ago

What version of pyhdf, HDF4, and Python are you using?

pyhdf version: 0.10.5 HDF4 C library version: Python version: 3.10.5

OS: Linux.

I'm not sure if ArchiveMetadata.0 is a hdf standard, or other similar metadata is common. However, in the hdf files I have, this field exists and is accessible as only a string. It looks like the text below. It would be nice if pyhdf could parse and return this as a dictionary. This has been implemented here: https://github.com/SpatioTemporal/STAREMaster_py/blob/af5cba54b55194fefae1448b5a6de1279b05fd22/staremaster/products/hdfeos.py

Hidden Text

``` GROUP = ARCHIVEDMETADATA GROUPTYPE = MASTERGROUP GROUP = BOUNDINGRECTANGLE OBJECT = NORTHBOUNDINGCOORDINATE NUM_VAL = 1 VALUE = 39.9999999964079 END_OBJECT = NORTHBOUNDINGCOORDINATE OBJECT = SOUTHBOUNDINGCOORDINATE NUM_VAL = 1 VALUE = 29.9999999973059 END_OBJECT = SOUTHBOUNDINGCOORDINATE OBJECT = EASTBOUNDINGCOORDINATE NUM_VAL = 1 VALUE = -92.3664205550513 END_OBJECT = EASTBOUNDINGCOORDINATE OBJECT = WESTBOUNDINGCOORDINATE NUM_VAL = 1 VALUE = -117.486656023174 END_OBJECT = WESTBOUNDINGCOORDINATE END_GROUP = BOUNDINGRECTANGLE OBJECT = GEOANYABNORMAL NUM_VAL = 1 VALUE = "False" END_OBJECT = GEOANYABNORMAL OBJECT = GEOESTMAXRMSERROR NUM_VAL = 1 VALUE = 50.0 END_OBJECT = GEOESTMAXRMSERROR OBJECT = LONGNAME NUM_VAL = 1 VALUE = "MODIS/Terra Surface Reflectance Daily L2G Global 1km and 500m SIN Grid" END_OBJECT = LONGNAME OBJECT = SPSOPARAMETERS NUM_VAL = 1 VALUE = "2015" END_OBJECT = SPSOPARAMETERS OBJECT = PROCESSINGCENTER NUM_VAL = 1 VALUE = "MODAPS" END_OBJECT = PROCESSINGCENTER OBJECT = NUMBEROFGRANULES NUM_VAL = 1 VALUE = 1 END_OBJECT = NUMBEROFGRANULES OBJECT = NUMBEROFORBITS NUM_VAL = 1 VALUE = 3 END_OBJECT = NUMBEROFORBITS OBJECT = GRANULEBEGINNINGDATETIME NUM_VAL = 32 VALUE = ("2022-06-30T16:10:00.000000Z") END_OBJECT = GRANULEBEGINNINGDATETIME OBJECT = GRANULEENDINGDATETIME NUM_VAL = 32 VALUE = ("2022-06-30T19:30:00.000000Z") END_OBJECT = GRANULEENDINGDATETIME OBJECT = GRANULEDAYNIGHTFLAG NUM_VAL = 32 VALUE = ("Day") END_OBJECT = GRANULEDAYNIGHTFLAG OBJECT = GRANULEDAYOFYEAR NUM_VAL = 32 VALUE = ("181") END_OBJECT = GRANULEDAYOFYEAR OBJECT = NADIRDATARESOLUTION1KM NUM_VAL = 1 VALUE = "1km" END_OBJECT = NADIRDATARESOLUTION1KM OBJECT = CHARACTERISTICBINANGULARSIZE1KM NUM_VAL = 1 VALUE = 30.0 END_OBJECT = CHARACTERISTICBINANGULARSIZE1KM OBJECT = CHARACTERISTICBINSIZE1KM NUM_VAL = 1 VALUE = 926.625433055556 END_OBJECT = CHARACTERISTICBINSIZE1KM OBJECT = DATACOLUMNS1KM NUM_VAL = 1 VALUE = 1200 END_OBJECT = DATACOLUMNS1KM OBJECT = DATAROWS1KM NUM_VAL = 1 VALUE = 1200 END_OBJECT = DATAROWS1KM OBJECT = GLOBALGRIDCOLUMNS1KM NUM_VAL = 1 VALUE = 43200 END_OBJECT = GLOBALGRIDCOLUMNS1KM OBJECT = GLOBALGRIDROWS1KM NUM_VAL = 1 VALUE = 21600 END_OBJECT = GLOBALGRIDROWS1KM OBJECT = MAXIMUMOBSERVATIONS1KM NUM_VAL = 1 VALUE = 12 END_OBJECT = MAXIMUMOBSERVATIONS1KM OBJECT = ADDITIONALLAYERS1KM NUM_VAL = 1 VALUE = 11 END_OBJECT = ADDITIONALLAYERS1KM OBJECT = TOTALOBSERVATIONS1KM NUM_VAL = 1 VALUE = 3695425 END_OBJECT = TOTALOBSERVATIONS1KM OBJECT = TOTALADDITIONALOBSERVATIONS1KM NUM_VAL = 1 VALUE = 2255425 END_OBJECT = TOTALADDITIONALOBSERVATIONS1KM OBJECT = COVERAGECALCULATIONMETHOD NUM_VAL = 1 VALUE = "volume" END_OBJECT = COVERAGECALCULATIONMETHOD OBJECT = FIRSTLAYERSELECTIONCRITERIA NUM_VAL = 1 VALUE = "order of input pointer" END_OBJECT = FIRSTLAYERSELECTIONCRITERIA OBJECT = L2GSTORAGEFORMAT1KM NUM_VAL = 1 VALUE = "compact" END_OBJECT = L2GSTORAGEFORMAT1KM OBJECT = QUALITYCLASSPERCENTAGE500MBAND3 NUM_VAL = 16 VALUE = (99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0) END_OBJECT = QUALITYCLASSPERCENTAGE500MBAND3 OBJECT = QUALITYCLASSPERCENTAGE500MBAND4 NUM_VAL = 16 VALUE = (100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) END_OBJECT = QUALITYCLASSPERCENTAGE500MBAND4 OBJECT = QUALITYCLASSPERCENTAGE500MBAND5 NUM_VAL = 16 VALUE = (87, 0, 0, 0, 0, 0, 0, 9, 4, 0, 0, 0, 0, 0, 0, 0) END_OBJECT = QUALITYCLASSPERCENTAGE500MBAND5 OBJECT = QUALITYCLASSPERCENTAGE500MBAND6 NUM_VAL = 16 VALUE = (100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) END_OBJECT = QUALITYCLASSPERCENTAGE500MBAND6 OBJECT = QUALITYCLASSPERCENTAGE500MBAND7 NUM_VAL = 16 VALUE = (100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) END_OBJECT = QUALITYCLASSPERCENTAGE500MBAND7 OBJECT = PROCESSINGENVIRONMENT NUM_VAL = 1 VALUE = "Linux nrt4min108 3.10.0-1160.66.1.el7.x86_64 #1 SMP Wed May 18 16:02:34 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux" END_OBJECT = PROCESSINGENVIRONMENT OBJECT = DESCRREVISION NUM_VAL = 1 VALUE = "6.1" END_OBJECT = DESCRREVISION OBJECT = SYSTEMFILENAME NUM_VAL = 100 VALUE = ("MOD09GST.A2022181.h09v05.061.2022182013301.NRT.hdf", "MOD09GHK.A2022181.h09v05.061.2022182013349.NRT.hdf", "MOD09GQK.A2022181.h09v05.061.2022182013332.NRT.hdf", "MODPT1KD.A2022181.h09v05.061.2022182013234.NRT.hdf", " MODPTHKM.A2022181.h09v05.061.2022182013234.NRT.hdf", "MODPTQKM.A2022181.h09v05.061.2022182013234.NRT.hdf", "MODMGGAD.A2022181.h09v05.061.2022182013237.NRT.hdf", "MODTBGD.A2022181.h09v05.061.2022182013353.NRT.hdf", "MODOCGD.A2022181.h09v05.061.2022182013359.NRT.hdf", " MOD10L2G.A2022181.h09v05.061.2022182013251.NRT.hdf") END_OBJECT = SYSTEMFILENAME OBJECT = CHARACTERISTICBINANGULARSIZE500M NUM_VAL = 1 VALUE = 15.0 END_OBJECT = CHARACTERISTICBINANGULARSIZE500M OBJECT = CHARACTERISTICBINSIZE500M NUM_VAL = 1 VALUE = 463.312716527778 END_OBJECT = CHARACTERISTICBINSIZE500M OBJECT = DATACOLUMNS500M NUM_VAL = 1 VALUE = 2400 END_OBJECT = DATACOLUMNS500M OBJECT = DATAROWS500M NUM_VAL = 1 VALUE = 2400 END_OBJECT = DATAROWS500M OBJECT = GLOBALGRIDCOLUMNS500M NUM_VAL = 1 VALUE = 86400 END_OBJECT = GLOBALGRIDCOLUMNS500M OBJECT = GLOBALGRIDROWS500M NUM_VAL = 1 VALUE = 43200 END_OBJECT = GLOBALGRIDROWS500M OBJECT = NADIRDATARESOLUTION500M NUM_VAL = 1 VALUE = "500m" END_OBJECT = NADIRDATARESOLUTION500M OBJECT = PERCENTPROCESSED NUM_VAL = 1 VALUE = 100 END_OBJECT = PERCENTPROCESSED OBJECT = PERCENTLAND NUM_VAL = 1 VALUE = 96 END_OBJECT = PERCENTLAND OBJECT = PERCENTLANDSEAMASKCLASS NUM_VAL = 8 VALUE = (0, 96, 3, 0, 0, 0, 0, 0) END_OBJECT = PERCENTLANDSEAMASKCLASS OBJECT = PERCENTCLOUDY NUM_VAL = 1 VALUE = 42 END_OBJECT = PERCENTCLOUDY OBJECT = PERCENTSHADOW NUM_VAL = 1 VALUE = 5 END_OBJECT = PERCENTSHADOW OBJECT = PERCENTLOWSUN NUM_VAL = 1 VALUE = 0 END_OBJECT = PERCENTLOWSUN OBJECT = RANKING NUM_VAL = 1 VALUE = "No" END_OBJECT = RANKING OBJECT = KEEPALL NUM_VAL = 1 VALUE = "No" END_OBJECT = KEEPALL OBJECT = COVERAGEMINIMUM NUM_VAL = 1 VALUE = 0.00999999977648258 END_OBJECT = COVERAGEMINIMUM OBJECT = MAXOUTPUTRES NUM_VAL = 1 VALUE = "QKM" END_OBJECT = MAXOUTPUTRES OBJECT = DEEPOCEANFLAG NUM_VAL = 1 VALUE = "Yes" END_OBJECT = DEEPOCEANFLAG OBJECT = MAXIMUMOBSERVATIONS500M NUM_VAL = 1 VALUE = 2 END_OBJECT = MAXIMUMOBSERVATIONS500M OBJECT = ADDITIONALLAYERS500M NUM_VAL = 1 VALUE = 1 END_OBJECT = ADDITIONALLAYERS500M OBJECT = TOTALOBSERVATIONS500M NUM_VAL = 1 VALUE = 5853755 END_OBJECT = TOTALOBSERVATIONS500M OBJECT = TOTALADDITIONALOBSERVATIONS500M NUM_VAL = 1 VALUE = 93770 END_OBJECT = TOTALADDITIONALOBSERVATIONS500M OBJECT = L2GSTORAGEFORMAT500M NUM_VAL = 1 VALUE = "compact" END_OBJECT = L2GSTORAGEFORMAT500M OBJECT = QUALITYCLASSPERCENTAGE500MBAND1 NUM_VAL = 16 VALUE = (100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) END_OBJECT = QUALITYCLASSPERCENTAGE500MBAND1 OBJECT = QUALITYCLASSPERCENTAGE500MBAND2 NUM_VAL = 16 VALUE = (100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) END_OBJECT = QUALITYCLASSPERCENTAGE500MBAND2 OBJECT = NUMBEROFOVERLAPGRANULES NUM_VAL = 1 VALUE = 4 END_OBJECT = NUMBEROFOVERLAPGRANULES OBJECT = NUMBEROFINPUTGRANULES NUM_VAL = 1 VALUE = 5 END_OBJECT = NUMBEROFINPUTGRANULES OBJECT = CLOUDOPTION NUM_VAL = 1 VALUE = "MOD09 internally-derived" END_OBJECT = CLOUDOPTION OBJECT = GRANULENUMBERARRAY NUM_VAL = 100 VALUE = (195, 196, 215, 216, 235, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1) END_OBJECT = GRANULENUMBERARRAY OBJECT = GRANULEPOINTERARRAY NUM_VAL = 100 VALUE = (-1, 0, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1) END_OBJECT = GRANULEPOINTERARRAY OBJECT = ORBITNUMBERARRAY NUM_VAL = 100 VALUE = (-1, 119854, 119855, 119855, 119856, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1) END_OBJECT = ORBITNUMBERARRAY OBJECT = GRANULEBEGINNINGDATETIMEARRAY NUM_VAL = 100 VALUE = ("2022-06-30T16:05:00.000000Z", "2022-06-30T16:10:00.000000Z", "2022-06-30T17:45:00.000000Z", "2022-06-30T17:50:00.000000Z", "2022-06-30T19:25:00.000000Z") END_OBJECT = GRANULEBEGINNINGDATETIMEARRAY OBJECT = GRANULEENDINGDATETIMEARRAY NUM_VAL = 100 VALUE = ("2022-06-30T16:10:00.000000Z", "2022-06-30T16:15:00.000000Z", "2022-06-30T17:50:00.000000Z", "2022-06-30T17:55:00.000000Z", "2022-06-30T19:30:00.000000Z") END_OBJECT = GRANULEENDINGDATETIMEARRAY OBJECT = GRANULEDAYNIGHTFLAGARRAY NUM_VAL = 100 VALUE = ("Day", "Day", "Day", "Day", "Day") END_OBJECT = GRANULEDAYNIGHTFLAGARRAY END_GROUP = ARCHIVEDMETADATA END

```