Parse ArchiveMetadata.0 field
mankoff opened this issue · comments
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
```