Esempio n. 1
0
    def _save(self, file_to_write, overwrite):
        if overwrite:
            file_to_write = self.filename
        elif os.path.isfile(file_to_write):
            msg = 'File ' + file_to_write + ' already exists !\n' + \
                  'Call save() with "overwrite = True" to overwrite the file.'
            raise IOError(msg)

        encoder = pvl.encoder.PDSLabelEncoder
        serial_label = pvl.dumps(self.label, cls=encoder)
        label_sz = len(serial_label)
        image_pointer = int(label_sz / self.label['RECORD_BYTES']) + 1
        self.label['^IMAGE'] = image_pointer + 1

        diff = 0
        if len(pvl.dumps(self.label, cls=encoder)) != label_sz:
            diff = label_sz - len(pvl.dumps(self.label, cls=encoder))
        pvl.dump(self.label, file_to_write, cls=encoder)
        offset = image_pointer * self.label['RECORD_BYTES'] - label_sz
        stream = open(file_to_write, 'a')

        for i in range(0, offset+diff):
            stream.write(" ")

        if (self._bands > 1 and self._format != 'BAND_SEQUENTIAL'):
            raise NotImplementedError
        else:
            self.data.tofile(stream, format='%' + self._sample_type[1])
        stream.close()
Esempio n. 2
0
def test_dump_stream():
    for filename in PDS_LABELS:
        label = pvl.load(filename)
        stream = io.BytesIO()
        pvl.dump(label, stream)
        stream.seek(0)
        assert label == pvl.load(stream)
Esempio n. 3
0
    def _save(self, file_to_write, overwrite):
        """Save PDS3Image object as PDS3 file.

        Parameters
        ----------
        Overwrite: Use this keyword to save image with same filename.

        Examples
        --------

        >>> from planetaryimage import PDS3Image
        >>> image = PDS3Image.open('tests/mission_data/2p129641989eth0361p2600r8m1.img')
        >>> image.save('temp.IMG')
        >>> image.save('temp.IMG', overwrite=True)

        """
        if overwrite:
            file_to_write = self.filename
        elif os.path.isfile(file_to_write):
            msg = 'File ' + file_to_write + ' already exists !\n' + \
                  'Call save() with "overwrite = True" to overwrite the file.'
            raise IOError(msg)

        encoder = pvl.encoder.PDSLabelEncoder
        serial_label = pvl.dumps(self.label, cls=encoder)
        label_sz = len(serial_label)
        image_pointer = int(label_sz / self.label['RECORD_BYTES']) + 1
        self.label['^IMAGE'] = image_pointer + 1

        if self._sample_bytes != self.label['IMAGE']['SAMPLE_BITS'] * 8:
            self.label['IMAGE']['SAMPLE_BITS'] = self.data.itemsize * 8

        sample_type_to_save = self.DTYPES[self._sample_type[0] + self.dtype.kind]
        self.label['IMAGE']['SAMPLE_TYPE'] = sample_type_to_save

        if len(self.data.shape) == 3:
            self.label['IMAGE']['BANDS'] = self.data.shape[0]
            self.label['IMAGE']['LINES'] = self.data.shape[1]
            self.label['IMAGE']['LINE_SAMPLES'] = self.data.shape[2]
        else:
            self.label['IMAGE']['BANDS'] = 1
            self.label['IMAGE']['LINES'] = self.data.shape[0]
            self.label['IMAGE']['LINE_SAMPLES'] = self.data.shape[1]

        diff = 0
        if len(pvl.dumps(self.label, cls=encoder)) != label_sz:
            diff = abs(label_sz - len(pvl.dumps(self.label, cls=encoder)))
        pvl.dump(self.label, file_to_write, cls=encoder)
        offset = image_pointer * self.label['RECORD_BYTES'] - label_sz
        stream = open(file_to_write, 'a')
        for i in range(0, offset+diff):
            stream.write(" ")

        if (self._bands > 1 and self._format != 'BAND_SEQUENTIAL'):
            raise NotImplementedError
        else:
            self.data.tofile(stream, format='%' + self.dtype.kind)
        stream.close()
Esempio n. 4
0
def test_dump_to_file():
    tmpdir = tempfile.mkdtemp()

    try:
        for filename in PDS_LABELS:
            label = pvl.load(filename)
            tmpfile = os.path.join(tmpdir, os.path.basename(filename))
            pvl.dump(label, tmpfile)
            assert label == pvl.load(tmpfile)
    finally:
        shutil.rmtree(tmpdir)
Esempio n. 5
0
def test_dump_to_file_insert_after():
    tmpdir = tempfile.mkdtemp()

    try:
        for filename in PDS_LABELS:
            label = pvl.load(filename)
            if os.path.basename(filename) != 'empty.lbl':
                label.insert_after('PDS_VERSION_ID', [('new', 'item')])
            tmpfile = os.path.join(tmpdir, os.path.basename(filename))
            pvl.dump(label, tmpfile)
            assert label == pvl.load(tmpfile)
    finally:
        shutil.rmtree(tmpdir)
Esempio n. 6
0
    def _save(self, file_to_write, overwrite):
        """
        Redefine _save() used in PDS3Image() so it does not overwrite the comment
        lines we add in with PDS3LabelEncoder()
        """
        # if overwrite:
        ##            file_to_write = self.filename
        # elif os.path.isfile(file_to_write):
        # msg = 'File ' + file_to_write + ' already exists !\n' + \
        ##                  'Call save() with "overwrite = True" to overwrite the file.'
        ##            raise IOError(msg)

        # with open(file_to_write, 'a+b') as stream:
        encoder = PDS3LabelEncoder
        serial_label = pvl.dumps(self.label, cls=encoder)
        label_sz = len(serial_label)
        image_pointer = int(label_sz / self.label['RECORD_BYTES']) + 1
        self.label['^IMAGE'] = image_pointer + 1

        if self._sample_bytes != self.label['IMAGE']['SAMPLE_BITS'] * 8:
            self.label['IMAGE']['SAMPLE_BITS'] = self.data.itemsize * 8

        sample_type_to_save = self.DTYPES[self._sample_type[0] +
                                          self.dtype.kind]
        self.label['IMAGE']['SAMPLE_TYPE'] = sample_type_to_save

        if len(self.data.shape) == 3:
            self.label['IMAGE']['BANDS'] = self.data.shape[0]
            self.label['IMAGE']['LINES'] = self.data.shape[1]
            self.label['IMAGE']['LINE_SAMPLES'] = self.data.shape[2]
        else:
            self.label['IMAGE']['BANDS'] = 1
            self.label['IMAGE']['LINES'] = self.data.shape[0]
            self.label['IMAGE']['LINE_SAMPLES'] = self.data.shape[1]

        diff = 0
        if len(pvl.dumps(self.label, cls=encoder)) != label_sz:
            diff = abs(label_sz - len(pvl.dumps(self.label, cls=encoder)))
        pvl.dump(self.label, file_to_write, cls=encoder)
        offset = image_pointer * self.label['RECORD_BYTES'] - label_sz
        stream = open(file_to_write, 'a')
        for i in range(0, offset + diff):
            stream.write(" ")

        if (self._bands > 1 and self._format != 'BAND_SEQUENTIAL'):
            raise NotImplementedError
        else:
            self.data.tofile(stream, format='%' + self.dtype.kind)
        stream.close()
Esempio n. 7
0
 def dump(self, dictlike: dict, outfile: os.PathLike):
     return pvl.dump(dictlike, outfile, encoder=self.encoder)
Esempio n. 8
0
 def test_dump_file_object(self):
     with open('dummy', 'w') as f:
         pvl.dump(self.module, f)
         self.assertEqual([call.write(self.string.encode())],
                          f.method_calls)
Esempio n. 9
0
 def test_dump_Path(self):
     mock_path = create_autospec(Path)
     with patch('pvl.Path', autospec=True, return_value=mock_path):
         pvl.dump(self.module, Path('dummy'))
         self.assertEqual([call.write_text(self.string)],
                          mock_path.method_calls)
Esempio n. 10
0
    def _add_group(self, group_name):
        """
        Adds PVLGroup into label.

        Parameters
        ----------
        group_name: String
            Name of the group to be added.

        Returns:
        --------
        label: PVLModule
            Returns label after adding PVLGroup in it.
        """
        if group_name == 'PTU_ARTICULATION_STATE':
            self.label['BEGIN_GROUP'] = 'PTU_ARTICULATION_STATE'
            self.label['ARTICULATION_DEVICE_ID'] = "PTU"
            self.label['ARTICULATION_DEVICE_NAME'] = "FLIR Pan-Tilt Unit"
            self.label['ARTICULATION_DEVICE_ANGLE'] = [
                round(self.yaml_data['AZIMUTH']),
                round(self.yaml_data['ELEVATION'])
            ]
            self.label['ARTICULATION_DEVICE_ANGLE_NAME'] = [
                "AZIMUTH-MEASURED", "ELEVATION-MEASURED"
            ]
            #self.label['PP'] = int(self.yaml_data['PP'])
            #self.label['TP'] = int(self.yaml_data['TP'])
            #self.label['AZIMUTH'] = self.yaml_data['AZIMUTH']
            #self.label['ELEVATION'] = self.yaml_data['ELEVATION']
            self.label['ARTICULATION_DEVICE_MODE'] = 'DEPLOYED'
            self.label['END_GROUP'] = 'PTU_ARTICULATION_STATE'

        elif group_name == 'CAHVOR_CAMERA_MODEL_LEFT':
            self.label['BEGIN_GROUP'] = 'GEOMETRIC_CAMERA_MODEL'
            self.label['MODEL_TYPE'] = 'CAHVOR'
            self.label['MODEL_COMPONENT_ID'] = ["C", "A", "H", "V", "O", "R"]
            self.label['MODEL_COMPONENT_NAME'] = [
                "CENTER", "AXIS", "HORIZONTAL", "VERTICAL", "OPTICAL_AXIS",
                "DISTORTION_COEFFICIENTS"
            ]
            self.label['MODEL_COMPONENT_UNIT'] = [
                "METER", "N/A", "PIXEL", "PIXEL", "N/A", "N/A"
            ]
            cahv = CAHVmodel.compute(self.yaml_data['Camera'])

            C = [0, 0, 0]
            A = [0.999762, 0.021815, 0.000000]
            H = [1429.297020, 3942.905305, 0.000000]
            V = [1043.675052, 22.773071, 3910.787050]
            O = [0.999762, 0.021815, 0.000000]
            R = [0, 0.164600, -0.084529]
            Hc = 1522.659078
            Vc = 1041.005182
            Vs = 3886.530592
            V1 = 0.166722249
            TV = [0, 0.11, -0.144]
            Q = [0, -0.9999, 0, -0.0109]

            self.label['MODEL_COMPONENT_1'] = C
            self.label['MODEL_COMPONENT_2'] = A
            self.label['MODEL_COMPONENT_3'] = H
            self.label['MODEL_COMPONENT_4'] = V
            self.label['MODEL_COMPONENT_5'] = O
            self.label['MODEL_COMPONENT_6'] = R
            self.label['MODEL_TRANSFORM_VECTOR'] = TV
            self.label['MODEL_TRANSFORM_VECTOR_UNIT'] = 'METER'
            self.label['MODEL_TRANSFORM_QUATERNION'] = Q
            self.label['END_GROUP'] = 'GEOMETRIC_CAMERA_MODEL'

        elif group_name == 'CAHVOR_CAMERA_MODEL_RIGHT':
            self.label['BEGIN_GROUP'] = 'GEOMETRIC_CAMERA_MODEL'
            self.label['MODEL_TYPE'] = 'CAHVOR'
            self.label['MODEL_COMPONENT_ID'] = ["C", "A", "H", "V", "O", "R"]
            self.label['MODEL_COMPONENT_NAME'] = [
                "CENTER", "AXIS", "HORIZONTAL", "VERTICAL", "OPTICAL_AXIS",
                "DISTORTION_COEFFICIENTS"
            ]
            self.label['MODEL_COMPONENT_UNIT'] = [
                "METER", "N/A", "PIXEL", "PIXEL", "N/A", "N/A"
            ]

            cahv = CAHVmodel.compute(self.yaml_data['Camera'])

            C = [0, 0.252, 0]
            A = [0.999762, -0.021815, 0.000000]
            H = [1614.223560, 3839.925763, 0.000000]
            V = [1042.262663, -22.742252, 3874.226066]
            O = [0.999762, -0.021815, 0.000000]
            R = [0, 0.169487, -0.100739]
            Hc = 1516.339359
            Vc = 1038.826689
            Vs = 3912.148959
            V1 = 0.166722334
            TV = [0, 0.11, 0.108]
            Q = [0, 0.9999, 0, -0.0109]

            self.label['MODEL_COMPONENT_1'] = C
            self.label['MODEL_COMPONENT_2'] = A
            self.label['MODEL_COMPONENT_3'] = H
            self.label['MODEL_COMPONENT_4'] = V
            self.label['MODEL_COMPONENT_5'] = O
            self.label['MODEL_COMPONENT_6'] = R
            self.label['MODEL_TRANSFORM_VECTOR'] = TV
            self.label['MODEL_TRANSFORM_VECTOR_UNIT'] = 'METER'
            self.label['MODEL_TRANSFORM_QUATERNION'] = Q
            self.label['END_GROUP'] = 'GEOMETRIC_CAMERA_MODEL'

        elif group_name == 'COLLINEAR_CAMERA_MODEL_LEFT':
            self.label['BEGIN_GROUP'] = 'GEOMETRIC_CAMERA_MODEL'
            self.label['MODEL_TYPE'] = 'COLLINEAR'
            self.label['MODEL_COMPONENT_ID'] = [
                "C", "F", "f", "PxS", "P", "ANG", "ROT_MAT", "k"
            ]
            self.label['MODEL_COMPONENT_NAME'] = [
                "CENTER", "FOCAL_LENGTH", "fx/fy", "PIXEL_SIZE", "PRINCIPAL",
                "ROT_ANG[OMEGA,PHI,KAPPA]", "ROTATION_MATRIX",
                "DISTORTION_COEFFICIENTS"
            ]

            self.label['MODEL_COMPONENT_UNIT'] = [
                "METER", "MILLIETER", "PIXEL", "MILLIMETER", "MILLIMETER",
                "DEGREE", "RADIANS", "N/A"
            ]
            C = [0, 0, 0]
            F = 28.939824
            f = [3910.787050, 3910.787050]
            PxS = [0.0074, 0.0074]
            P = [-0.155615, -0.147434]
            ANG = [0, -1.25, 0]
            ROT_MAT = [[0.999762, 0, 0.021815], [0, -1.0, 0],
                       [0.021815, 0, -0.999762]]
            k = [0.000201221865, -0.000000179738162, 0.000000000291226599]

            self.label['MODEL_COMPONENT_1'] = C
            self.label['MODEL_COMPONENT_2'] = F
            self.label['MODEL_COMPONENT_3'] = f
            self.label['MODEL_COMPONENT_4'] = PxS
            self.label['MODEL_COMPONENT_5'] = P
            self.label['MODEL_COMPONENT_6'] = ANG
            self.label['MODEL_COMPONENT_7'] = ROT_MAT
            self.label['MODEL_COMPONENT_8'] = k
            self.label['END_GROUP'] = 'GEOMETRIC_CAMERA_MODEL'

        elif group_name == 'COLLINEAR_CAMERA_MODEL_RIGHT':
            self.label['BEGIN_GROUP'] = 'GEOMETRIC_CAMERA_MODEL'
            self.label['MODEL_TYPE'] = 'COLLINEAR'
            self.label['MODEL_COMPONENT_ID'] = [
                "C", "F", "f", "PxS", "P", "ANG", "ROT_MAT", "k"
            ]
            self.label['MODEL_COMPONENT_NAME'] = [
                "CENTER", "FOCAL_LENGTH", "fx/fy", "PIXEL_SIZE", "PRINCIPAL",
                "ROT_ANG[OMEGA,PHI,KAPPA]", "ROTATION_MATRIX",
                "DISTORTION_COEFFICIENTS"
            ]

            self.label['MODEL_COMPONENT_UNIT'] = [
                "METER", "MILLIMETER", "PIXEL", "MILLIMETER", "MILLIMETER",
                "DEGREE", "RADIANS", "N/A"
            ]
            C = [0, 0.252, 0]
            F = 28.669273
            f = [3874.226066, 3874.226066]
            PxS = [0.0074, 0.0074]
            P = [-0.043868, -0.136980]
            ANG = [0, 1.25, 0]
            ROT_MAT = [[0.999762, 0, -0.021815], [0, -1, 0],
                       [-0.021815, 0, -0.999762]]
            k = [0.000199562771, -0.0000000467599006, -0.000000000439101069]

            self.label['MODEL_COMPONENT_1'] = C
            self.label['MODEL_COMPONENT_2'] = F
            self.label['MODEL_COMPONENT_3'] = f
            self.label['MODEL_COMPONENT_4'] = PxS
            self.label['MODEL_COMPONENT_5'] = P
            self.label['MODEL_COMPONENT_6'] = ANG
            self.label['MODEL_COMPONENT_7'] = ROT_MAT
            self.label['MODEL_COMPONENT_8'] = k
            self.label['END_GROUP'] = 'GEOMETRIC_CAMERA_MODEL'

        elif group_name == 'RCAM_EL_TRANSLATION':
            self.label['BEGIN_GROUP'] = 'RCAM_EL_TRANSLATION'
            self.label['COORDINATE_SYSTEM_NAME'] = 'RC_HEAD_FRAME'
            self.label['ORIGIN_OFFSET_VECTOR'] = [0.0, 0.108, -0.11]
            self.label['ORIGIN_OFFSET_VECTOR_INDEX'] = ['X', 'Y', 'Z']
            self.label['ORIGIN_OFFSET_VECTOR_UNIT'] = "METERS"
            self.label['ORIGIN_ROTATION_QUATERION'] = [1, 0, 0, 0]
            self.label['ORIGIN_ANGULAR_OFFSET'] = [1.25]
            self.label['ORIGIN_ANGULAR_OFFSET_UNIT'] = 'DEGREES'
            self.label['POSITIVE_ELEVATION_DIRECTION'] = "UP"
            self.label['REFERENCE_COORD_SYSTEM_NAME'] = 'PTU_ELEVATION_AXIS'
            self.label['END_GROUP'] = 'RCAM_EL_TRANSLATION'

        elif group_name == 'LCAM_EL_TRANSLATION':
            self.label['BEGIN_GROUP'] = 'LCAM_EL_TRANSLATION'
            self.label['COORDINATE_SYSTEM_NAME'] = 'LC_HEAD_FRAME'
            self.label['ORIGIN_OFFSET_VECTOR'] = [0.0, -0.144, -0.11]
            self.label['ORIGIN_OFFSET_VECTOR_INDEX'] = ['X', 'Y', 'Z']
            self.label['ORIGIN_OFFEST_VECTOR_UNIT'] = "METERS"
            self.label['ORIGIN_ROTATION_QUATERION'] = [1, 0, 0, 0]
            self.label['ORIGIN_ANGULAR_OFFSET'] = [-1.25]
            self.label['ORIGIN_ANGULAR_OFFSET_UNIT'] = 'DEGREES'
            self.label['POSITIVE_ELEVATION_DIRECTION'] = "UP"
            self.label['REFERENCE_COORD_SYSTEM_NAME'] = 'PTU_ELEVATION_AXIS'
            self.label['END_GROUP'] = 'LCAM_EL_TRANSLATION'

        elif group_name == 'RCAM_AZ_TRANSLATION':
            self.label['BEGIN_GROUP'] = 'RCAM_AZ_TRANSLATION'
            self.label['COORDINATE_SYSTEM_NAME'] = 'RC_HEAD_FRAME'
            self.label['ORIGIN_OFFSET_VECTOR'] = [0.0, 0.108, -0.2398]
            self.label['ORIGIN_OFFSET_VECTOR_INDEX'] = ['X', 'Y', 'Z']
            self.label['ORIGIN_OFFSET_VECTOR_UNIT'] = "METERS"
            self.label['POSITIVE_ELEVATION_DIRECTION'] = "UP"
            self.label['ORIGIN_ROTATION_QUATERION'] = [1, 0, 0, 0]
            self.label['ORIGIN_ANGULAR_OFFSET'] = [1.25]
            self.label['ORIGIN_ANGULAR_OFFSET_UNIT'] = 'DEGREES'
            self.label['REFERENCE_COORD_SYSTEM_NAME'] = 'PTU_AZIMUTH_AXIS'
            self.label['END_GROUP'] = 'RCAM_AZ_TRANSLATION'

        elif group_name == 'LCAM_AZ_TRANSLATION':
            self.label['BEGIN_GROUP'] = 'LCAM_AZ_TRANSLATION'
            self.label['COORDINATE_SYSTEM_NAME'] = 'LC_HEAD_FRAME'
            self.label['ORIGIN_OFFSET_VECTOR'] = [0.0, 0.108, -0.2398]
            self.label['ORIGIN_OFFSET_VECTOR_INDEX'] = ['X', 'Y', 'Z']
            self.label['ORIGIN_OFFSET_VECTOR_UNIT'] = "METERS"
            self.label['ORIGIN_ROTATION_QUATERION'] = [1, 0, 0, 0]
            self.label['ORIGIN_ANGULAR_OFFSET'] = [-1.25]
            self.label['ORIGIN_ANGULAR_OFFSET_UNIT'] = 'DEGREES'
            self.label['POSITIVE_ELEVATION_DIRECTION'] = "UP"
            self.label['REFERENCE_COORD_SYSTEM_NAME'] = 'PTU_AZIMUTH_AXIS'
            self.label['END_GROUP'] = 'LCAM_AZ_TRANSLATION'

        elif group_name == 'PTU_AXES_HEIGHTS':
            self.label['BEGIN_GROUP'] = 'PTU_AXES_HEIGHTS'
            self.label['COORD_SYS_UNIT'] = 'METERS'
            self.label['AZ_AXIS_HEIGHT'] = '1.305'
            self.label['EL_AXIS_HEIGHT'] = '1.4348'
            self.label['OPTICAL_CENTER_HEIGHT'] = '1.5448'
            self.label['REFERENCE_COORDINATE_SYSTEM'] = 'GROUND_BENEATH_TRIPOD'
            self.label['END_GROUP'] = 'PTU_AXES_HEIGHTS'

        # This one is pointing of CAMERAS wrt rover frame (TRIPOD).
        elif group_name == 'ROVER_FRAME':
            self.label['BEGIN_GROUP'] = 'ROVER_DERIVED_GEOMETRY_PARMS'
            self.label['INSTRUMENT_AZIMUTH'] = '{} <deg>'.format(
                round(self.yaml_data['AZIMUTH']))
            self.label['INSTRUMENT_ELEVATION'] = '{} <deg>'.format(
                round(self.yaml_data['ELEVATION']))
            self.label['POSITIVE_AZIMUTH_DIRECTION'] = 'CLOCKWISE'
            self.label['ORIGIN_ANGULAR_OFFSET_UNIT'] = 'DEGREES'
            self.label['REFERENCE_COORD_SYSTEM_INDEX'] = [
                1, 0, 0, 0, 0, 0, 1, 0, 0, 0
            ]
            self.label['REFERENCE_COORD_SYSTEM_NAME'] = "ROVER_NAV_FRAME"
            self.label['END_GROUP'] = 'ROVER_DERIVED_GEOMETRY_PARMS'

        # This one is pointing of cameras wrt to site frame
        elif group_name == 'SITE_FRAME':
            self.label['BEGIN_GROUP'] = 'SITE_DERIVED_GEOMETRY_PARMS'
            self.label['INSTRUMENT_AZIMUTH'] = 'null <deg>'
            self.label['INSTRUMENT_ELEVATION'] = 'null <deg>'
            self.label['POSITIVE_AZIMUTH_DIRECTION'] = "CLOCKWISE"
            self.label['REFERENCE_COORD_SYSTEM_INDEX'] = '1'
            self.label['REFERENCE_COORD_SYSTEM_NAME'] = "SITE_FRAME"
            self.label['END_GROUP'] = "SITE_DERIVED_GEOMETRY_PARMS"

        stream = io.BytesIO()
        with open(self.filename + '.IMG', 'w+b') as stream:
            # use our own PDS3 encoder class so we can add comment lines
            pvl.dump(self.label, stream, cls=PDS3LabelEncoder)
            stream.seek(0)
            label_list = list(pvl.load(stream))
        l = len(label_list)
        label_list[l - 2], label_list[l - 1] = label_list[l -
                                                          1], label_list[l - 2]
        label = pvl.PVLModule(label_list)
        return label
        isis3lbl['IsisCube']['Mapping']['LatitudeType'].upper()
    }))

# Prepare the new PDS3 label for writing
# If out_name already exists, it will be overwritten
out_name = inputlbl.replace('.lbl', '_pds3.lbl')
print(out_name)

## DEBUG Only ##
# out_name = 'test_pds3_output.lbl'
# print(out_name)
################

# Write the PDS3 label to disk using pvl.dump and the PDS encoder
with open(out_name, 'w') as stream:
    pvl.dump(pds3label, out_name, cls=pvl.encoder.PDSLabelEncoder)

## HACK to remove the single quotes from the value of the "^IMAGE" keyword
#  Compile regular expressions for the "^IMAGE" and "'" strings
# Also use brute force to ensure that final PDS3 label uses CRLF line endings
imgpointer = re.compile('\^IMAGE')
singlequote = re.compile('\'')
lineending = re.compile('\r\n$')
with fileinput.input(
    [out_name],
        inplace=True,
) as f:
    for line in f:
        s = imgpointer.search(line)
        # Just to be careful,
        #  we only replace singlequotes on lines that contain "^IMAGE"
} ))


# Prepare the new PDS3 label for writing
# If out_name already exists, it will be overwritten
out_name = inputlbl.replace('.lbl', '_pds3.lbl')
print(out_name)

## DEBUG Only ##
# out_name = 'test_pds3_output.lbl'
# print(out_name)
################

# Write the PDS3 label to disk using pvl.dump and the PDS encoder
with open(out_name, 'w') as stream:
    pvl.dump(pds3label,out_name,cls=pvl.encoder.PDSLabelEncoder)

## HACK to remove the single quotes from the value of the "^IMAGE" keyword
#  Compile regular expressions for the "^IMAGE" and "'" strings
# Also use brute force to ensure that final PDS3 label uses CRLF line endings
imgpointer = re.compile('\^IMAGE')
singlequote = re.compile('\'')
lineending = re.compile('\r\n$')
with fileinput.input([out_name], inplace=True,) as f:
    for line in f:
        s = imgpointer.search(line)
        # Just to be careful,
        #  we only replace singlequotes on lines that contain "^IMAGE"
        if s:
            updated_line = singlequote.sub('', line)
            # Write the updated line back to the file
Esempio n. 13
0
    def _add_group(self, group_name):
        """
        Adds PVLGroup into label.

        Parameters
        ----------
        group_name: String
            Name of the group to be added.

        Returns:
        label: PVLModule
            Returns label after adding PVLGroup in it.
        """
        if group_name == 'IDENTIFICATION_DATA_ELEMENTS':
            self.img.label['BEGIN_GROUP'] = 'IDENTIFICATION_DATA_ELEMENTS'
            self.img.label['DATA_SET_ID'] = 'UNK'
            self.img.label['PRODUCT_ID'] = 'UNK'
            self.img.label['INSTRUMENT_HOST_NAME'] = 'MARS 2020'
            self.img.label['INSTRUMENT_NAME'] = 'STEREOSIM'
            self.img.label['TARGET_NAME'] = 'MARS'
            self.img.label['START_TIME'] = 'UNK'
            self.img.label['STOP_TIME'] = 'UNK'
            self.img.label['SPACECRAFT_CLOCK_START_COUNT'] = 'UNK'
            self.img.label['SPACECRAFT_CLOCK_STOP_COUNT'] = 'UNK'
            self.img.label['PRODUCT_CREATION_TIME'] = 'UNK'
            self.img.label['END_GROUP'] = 'IDENTIFICATION_DATA_ELEMENTS'
        elif group_name == 'PTU_ARTICULATION_STATE':
            self.img.label['BEGIN_GROUP'] = 'PTU_ARTICULATION_STATE'
            self.img.label['ARTICULATION_DEVICE_ID'] = "PTU"
            self.img.label['ARTICULATION_DEVICE_NAME'] = "FLIR Pan-Tilt Unit"
            self.img.label['PP'] = int(self.yaml_data['PP'])
            self.img.label['TP'] = int(self.yaml_data['TP'])
            self.img.label['AZIMUTH'] = self.yaml_data['AZIMUTH']
            self.img.label['ELEVATION'] = self.yaml_data['ELEVATION']
            self.img.label['END_GROUP'] = 'PTU_ARTICULATION_STATE'
        elif group_name == 'CAHVOR_CAMERA_MODEL':
            self.img.label['BEGIN_GROUP'] = 'CAHVOR_CAMERA_MODEL'
            self.img.label['MODEL_TYPE'] = 'CAHVOR'
            self.img.label['MODEL_COMPONENT_ID'] = [
                "C", "A", "H", "V", "O", "R"
            ]
            self.img.label['MODEL_COMPONENT_NAME'] = [
                "CENTER", "AXIS", "HORIZONTAL", "VERTICAL", "OPTICAL_AXIS",
                "DISTORTION_COEFFICIENTS"
            ]
            cahv = CAHVmodel.compute(self.yaml_data['Camera'])
            print("Printing CAHV")
            print(cahv)
            print("TESTING CAHVOR")
            C = compute_coordinates(cahv.C, self.yaml_data['AZIMUTH'],
                                    self.yaml_data['ELEVATION'])
            A = compute_coordinates(cahv.A, self.yaml_data['AZIMUTH'],
                                    self.yaml_data['ELEVATION'])
            H = compute_coordinates(cahv.H, self.yaml_data['AZIMUTH'],
                                    self.yaml_data['ELEVATION'])
            V = compute_coordinates(cahv.V, self.yaml_data['AZIMUTH'],
                                    self.yaml_data['ELEVATION'])
            O = compute_coordinates(cahv.O, self.yaml_data['AZIMUTH'],
                                    self.yaml_data['ELEVATION'])
            R = cahv.R
            # print("Printing A vector")
            # print(cahv.A)
            # print("Printing O vector")
            # print(cahv.O)
            print("Printing R vector")
            print(cahv.R)

            # This is how I would print 'O' vector directly i.e. without changing the camera_orientation.py
            #my_test_object = CAHVmodel(self.yaml_data['Camera'])
            #my_test = my_test_object._cahv
            #print("Printing O vector")
            # print(my_test['O'])

            self.img.label['MODEL_COMPONENT_1'] = C.tolist()
            self.img.label['MODEL_COMPONENT_2'] = A.tolist()
            self.img.label['MODEL_COMPONENT_3'] = H.tolist()
            self.img.label['MODEL_COMPONENT_4'] = V.tolist()
            self.img.label['MODEL_COMPONENT_5'] = O.tolist()
            if (R == None):
                self.img.label['MODEL_COMPONENT_6'] = R
            else:
                self.img.label['MODEL_COMPONENT_6'] = R.tolist()
            self.img.label['END_GROUP'] = 'CAHVOR_CAMERA_MODEL'
        elif group_name == 'PHOTOGRAMMETRY_CAMERA_MODEL':
            self.img.label['BEGIN_GROUP'] = 'PHOTOGRAMMETRY_CAMERA_MODEL'
            self.img.label['MODEL_TYPE'] = 'PHOTOGRAMMETRY'
            self.img.label['MODEL_COMPONENT_ID'] = [
                "C", "F", "PxS", "ImS", "P", "ANG"
            ]
            self.img.label['MODEL_COMPONENT_NAME'] = [
                "CENTER", "FOCAL_LENGTH", "PIXEL_SIZE", "IMAGE_SIZE",
                "PRINICIPAL", "ROTATION_ANGLES"
            ]
            print("TESTING COLLINEARITY")
            test_object = CAHVmodel(self.yaml_data['Camera'])
            test = test_object._cahv_input
            #print("Printing CENTER")
            # print(test['center'])
            C = test['center']
            F = test['f']
            PxS = test['pixelsize']
            ImS = test['image_size']
            P = test['principal']
            ANG = None
            print("Printing Principal")
            print(ImS)
            # ang = test[]
            self.img.label['MODEL_COMPONENT_1'] = C
            self.img.label['MODEL_COMPONENT_2'] = F
            self.img.label['MODEL_COMPONENT_3'] = PxS
            self.img.label['MODEL_COMPONENT_4'] = ImS
            self.img.label['MODEL_COMPONENT_5'] = P.tolist()
            self.img.label['MODEL_COMPONENT_6'] = ANG
            self.img.label['END_GROUP'] = 'PHOTOGRAMMETRY_CAMERA_MODEL'
        stream = io.BytesIO()
        pvl.dump(self.img.label, stream)
        stream.seek(0)
        label_list = list(pvl.load(stream))
        l = len(label_list)
        label_list[l - 2], label_list[l - 1] = label_list[l -
                                                          1], label_list[l - 2]
        label = pvl.PVLModule(label_list)
        # print(label)
        return label