diff --git a/CHANGELOG.md b/CHANGELOG.md index 76eb5541..a558ec8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ release points are not being annotated in GitHub. - Unit tests for `sarpy/consistency/sicd_consistency.py` - Support reading CPHDs with an AmpSF PVP whose Data/SignalArrayFormat is CF8 - Unit tests for `sarpy/consistency/sidd_consistency.py` +- Support for MATESA TRE ### Fixed - `sarpy.io.kml.add_polygon` coordinate conditioning for older numpy versions - Replace unsupported `pillow` constant `Image.ANTIALIAS` with `Image.LANCZOS` diff --git a/sarpy/io/general/nitf_elements/tres/unclass/MATESA.py b/sarpy/io/general/nitf_elements/tres/unclass/MATESA.py new file mode 100644 index 00000000..c618cb9f --- /dev/null +++ b/sarpy/io/general/nitf_elements/tres/unclass/MATESA.py @@ -0,0 +1,36 @@ + +from ..tre_elements import TREExtension, TREElement + +__classification__ = "UNCLASSIFIED" +__author__ = "Brad Hards" + +# From STDI-0002 Volume 1 Appendix AK: MATESA 1.1 + +class MATE(TREElement): + def __init__(self, value): + super(MATE, self).__init__() + self.add_field('SOURCE', 's', 42, value) + self.add_field('MATE_TYPE', 's', 16, value) + self.add_field('MATE_ID_LEN', 'd', 4, value) + self.add_field('MATE_ID', 's', self.MATE_ID_LEN, value) + +class GROUP(TREElement): + def __init__(self, value): + super(GROUP, self).__init__() + self.add_field('RELATIONSHIP', 's', 24, value) + self.add_field('NUM_MATES', 'd', 4, value) + self.add_loop('MATEs', self.NUM_MATES, MATE, value) + +class MATESAType(TREElement): + def __init__(self, value): + super(MATESAType, self).__init__() + self.add_field('CUR_SOURCE', 's', 42, value) + self.add_field('CUR_MATE_TYPE', 's', 16, value) + self.add_field('CUR_FILE_ID_LEN', 'd', 4, value) + self.add_field('CUR_FILE_ID', 's', self.CUR_FILE_ID_LEN, value) + self.add_field('NUM_GROUPS', 'd', 4, value) + self.add_loop('GROUPs', self.NUM_GROUPS, GROUP, value) + +class MATESA(TREExtension): + _tag_value = 'MATESA' + _data_type = MATESAType diff --git a/tests/data/example_matesa_tre.bin b/tests/data/example_matesa_tre.bin new file mode 100644 index 00000000..4807fda6 --- /dev/null +++ b/tests/data/example_matesa_tre.bin @@ -0,0 +1 @@ +MATESA00889EO-1_HYPERION FTITLE 005507APR2005_Hyperion_331406N0442000E_SWIR172_1p2B_L1R-BIP0005RADIOMTRC_CALIB 0001EO-1_HYPERION FILENAME 0020HypGain_revC.dat.svfPARENT 0001EO-1_HYPERION FILENAME 0032EO12005097_020D020C_r1_WPS_01.L0PRE_DARKCOLLECT 0001EO-1_HYPERION FILENAME 0032EO12005097_020A0209_r1_WPS_01.L0POST_DARKCOLLECT 0001EO-1_HYPERION FILENAME 0032EO12005097_020F020E_r1_WPS_01.L0PARENT 0003EO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.L1REO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.AUXEO-1_HYPERION FILENAME 0026EO1H1680372005097110PZ.MET \ No newline at end of file diff --git a/tests/data/example_tre_extractor.py b/tests/data/example_tre_extractor.py new file mode 100644 index 00000000..260dbb39 --- /dev/null +++ b/tests/data/example_tre_extractor.py @@ -0,0 +1,16 @@ +import mmap +import os +import pathlib + +# From https://nsgreg.nga.mil/doc/view?i=5516 +nitf_with_tres = '07APR2005_Hyperion_331406N0442000E_SWIR172_1p2B_L1R-BIP.ntf' +cetags = [b'MATESA'] + +for cetag in cetags: + with open(nitf_with_tres, 'r+b') as nitffile, mmap.mmap(nitffile.fileno(), 0) as mm: + mm.seek(mm.find(cetag, 0) + len(cetag), os.SEEK_SET) + cel = mm.read(5) + data = mm.read(int(cel)) + output_file = 'example_{}_tre.bin'.format(cetag.decode('ascii').lower()) + (pathlib.Path(__file__).parent / output_file).write_bytes(cetag + cel + data) + diff --git a/tests/io/general/test_tre.py b/tests/io/general/test_tre.py index 183f6828..bf6a2363 100644 --- a/tests/io/general/test_tre.py +++ b/tests/io/general/test_tre.py @@ -7,3 +7,8 @@ class TestTreRegistry(unittest.TestCase): def test_find_tre(self): the_tre = find_tre('ACFTA') self.assertEqual(the_tre, ACFTA) + + +def test_matesa(tests_path): + example = find_tre('MATESA').from_bytes((tests_path / 'data/example_matesa_tre.bin').read_bytes(), 0) + assert example.DATA.GROUPs[-1].MATEs[-1].MATE_ID == 'EO1H1680372005097110PZ.MET'