fhs / pyhdf

Python wrapper around the NCSA HDF version 4 library

Home Page:https://pypi.org/project/pyhdf/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

```