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()
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)
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()
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)
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)
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()
def dump(self, dictlike: dict, outfile: os.PathLike): return pvl.dump(dictlike, outfile, encoder=self.encoder)
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)
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)
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
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