77
88from typing import Union
99
10+ import xml .etree .ElementTree
1011import numpy
1112
1213from sarpy .io .xml .base import Serializable
1617from .base import DEFAULT_STRICT , FLOAT_FORMAT
1718
1819
20+ # default_strict is set to False which is why invalid types don't throw an error for NumWaveletLevels, NumBands, or LayerInfo
21+
1922class J2KSubtype (Serializable ):
2023 """
2124 The Jpeg 2000 subtype.
@@ -55,9 +58,38 @@ def __init__(self, NumWaveletLevels=None, NumBands=None, LayerInfo=None, **kwarg
5558 self ._xml_ns_key = kwargs ['_xml_ns_key' ]
5659 self .NumWaveletLevels = NumWaveletLevels
5760 self .NumBands = NumBands
58- self .LayerInfo = LayerInfo
61+ self .setLayerInfoType ( LayerInfo )
5962 super (J2KSubtype , self ).__init__ (** kwargs )
6063
64+ def setLayerInfoType (self , obj ):
65+ """
66+ Since the LayerInfo is defined as an array of bit rates in the definition above and SarPy returns an
67+ element tree with the bit rates nested within different layers, this function is used to parse and return
68+ LayerInfo as an array of bit rates
69+ """
70+ # if LayerInfo is an ElementTree as expected, then it gets parsed to return an array of bit rates
71+ ET = xml .etree .ElementTree
72+ if isinstance ( obj , ET .Element ):
73+ numLayers = int (obj .attrib ['numLayers' ])
74+ if (numLayers == 0 ):
75+ return
76+ bitrates = numpy .zeros (numLayers )
77+
78+ for i in range (numLayers ):
79+ bitrates [i ] = float (obj [i ][0 ].text )
80+ self .LayerInfo = bitrates
81+
82+ # if LayerInfo is a numpy.ndarray, a list, or a tuple per the above definition, return LayerInfo
83+ elif isinstance (obj , (list , tuple , numpy .ndarray )):
84+ self .LayerInfo = obj
85+
86+ # none object handler since it states that LayerInfo can be None in the definition above and it isn't a required field
87+ elif obj is None :
88+ self .LayerInfo = None
89+
90+ # throw an error if LayerInfo is an invalid type and an array of bitrates is unable to be generated
91+ else :
92+ raise TypeError (f'Invalid input type for LayerInfo: { type (obj )} . Must be an ElementTree, list, tuple, ndarray, or None.' )
6193
6294class J2KType (Serializable ):
6395 """
@@ -110,4 +142,4 @@ def __init__(self, J2K=None, **kwargs):
110142 if '_xml_ns_key' in kwargs :
111143 self ._xml_ns_key = kwargs ['_xml_ns_key' ]
112144 self .J2K = J2K
113- super (CompressionType , self ).__init__ (** kwargs )
145+ super (CompressionType , self ).__init__ (** kwargs )
0 commit comments