Files
SpectralPlot/src-tauri/src/irisdatamanager/mod.rs
2026-06-03 13:43:27 +08:00

265 lines
11 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use std::fmt::format;
use chrono::Datelike;
use chrono::Timelike;
use serde_json::json;
use crate::myformatiris::structures::*;
use crate::myformatiris::read::*;
use crate::myformatiris::write::*;
pub fn savecalibratefileIRIS(Gain:serde_json::Value,direction: bool, filepath: String, dndata: serde_json::Value, lampdata: serde_json::Value, devinfo: serde_json::Value) -> String {
//输出 输入参数
//println!("Gain: {:?}", Gain);
// println!("direction: {:?}", direction);
// println!("Filepath: {:?}", devinfo);
// println!("DNData: {:?}", dndata);
// println!("Lampdata: {:?}", lampdata);
// println!("Devinfo: {:?}", devinfo);
let mut oneirisdata:OneIRISData = OneIRISData::new();
let mut spectraldatagain: SpectralData= SpectralData::new();
spectraldatagain.name= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&"_".to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string()+&"_gain".to_string();
spectraldatagain.sensor_id= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string();
spectraldatagain.bands= devinfo["bands"].as_u64().unwrap_or(0) as u16;
spectraldatagain.pixel_size=8;
spectraldatagain.data_type=DATA_TYPE_FLOAT64;
spectraldatagain.fiber_id=direction as u8;
spectraldatagain.exposure=Gain["shutter_time"].as_u64().unwrap_or(0) as f64;
spectraldatagain.gain=Gain["sensor_gain"].as_f64().unwrap_or(1.0) as f32;
let datenow = chrono::Local::now();
let nowtiem= TimeStruct {
time_zone:50,
year:datenow.year() as u16,
month:datenow.month() as u8,
day:datenow.day() as u8,
hour:datenow.hour() as u8,
minute:datenow.minute() as u8,
second:datenow.second() as u8,
millisecond:datenow.timestamp_subsec_millis() as u16,
};
spectraldatagain.collection_time=nowtiem.clone();
spectraldatagain.ground_type=Target_Spectral_Type_CaliFile_Gain;
spectraldatagain.valid_flag=1;
let spectraldatavec:Vec<f64>=Gain["Data"].as_array().unwrap_or(&vec![]).iter()
.map(|x| x.as_f64().unwrap_or(0.0))
.collect::<Vec<f64>>();
spectraldatagain.Set_Spectral_Data(spectraldatavec, DATA_TYPE_FLOAT64);
println!("spectraldata.name: {:?}", spectraldatagain.name);
oneirisdata.spectral_data_section.push(spectraldatagain);
let mut spectraldata_dn: SpectralData= SpectralData::new();
spectraldata_dn.name= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&"_".to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string()+&"_dn".to_string();
spectraldata_dn.sensor_id= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string();
spectraldata_dn.bands= devinfo["bands"].as_u64().unwrap_or(0) as u16;
spectraldata_dn.pixel_size=8;
spectraldata_dn.fiber_id=direction as u8;
spectraldata_dn.exposure=dndata["shutter_time"].as_u64().unwrap_or(0) as f64;
spectraldata_dn.gain=dndata["gain"].as_f64().unwrap_or(1.0) as f32;
spectraldata_dn.data_type=DATA_TYPE_FLOAT64;
spectraldata_dn.collection_time=nowtiem.clone();
spectraldata_dn.ground_type=Target_Spectral_Type_DN;
spectraldata_dn.valid_flag=1;
let spectraldatavec_dn:Vec<f64>=dndata["data"].as_array().unwrap_or(&vec![]).iter()
.map(|x| x.as_f64().unwrap_or(0.0))
.collect::<Vec<f64>>();
spectraldata_dn.Set_Spectral_Data(spectraldatavec_dn, DATA_TYPE_FLOAT64);
println!("spectraldata_dn.name: {:?}", spectraldata_dn.name);
oneirisdata.spectral_data_section.push(spectraldata_dn);
let mut spectraldata_lamp: SpectralData= SpectralData::new();
let lampvalue= lampdata["value_lable"].as_str().unwrap_or("Unknown");
let datalabel= lampdata["data_value"].as_str().unwrap_or("Unknown");
spectraldata_lamp.name= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&"_".to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string()+&"_lamplable_".to_string()+&lampvalue.to_string()+&"_datalabel_".to_string()+&datalabel.to_string();
spectraldata_lamp.sensor_id= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string();
let lampvalue_f64_vec= lampdata["data"].as_array().unwrap_or(&vec![]).iter()
.map(|x| x.as_f64().unwrap_or(0.0))
.collect::<Vec<f64>>();
spectraldata_lamp.Set_Spectral_Data(lampvalue_f64_vec, DATA_TYPE_FLOAT64);
spectraldata_lamp.ground_type=Target_LAMP_VALUE_SCALED;
oneirisdata.spectral_data_section.push(spectraldata_lamp);
let spectraldata_devinfo= json!(
{
"info_type": "devinfo", // 0 for device info
"sensor_id": devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string(),
"wave_coeff": {
"a1": devinfo["bochangxishu"]["a1"].as_f64().unwrap_or(0.0),
"a2": devinfo["bochangxishu"]["a2"].as_f64().unwrap_or(0.0),
"a3": devinfo["bochangxishu"]["a3"].as_f64().unwrap_or(0.0),
"a4": devinfo["bochangxishu"]["a4"].as_f64().unwrap_or(0.0)
}
}
);
let environment_info= json!(
{
"info_type": "environment", // 1 for environment info
"date": format!("{}-{:02}-{:02} {:02}:{:02}:{:02}",
datenow.year(),
datenow.month(),
datenow.day(),
datenow.hour(),
datenow.minute(),
datenow.second()
),
}
);
/*
let spectraldata_devinfo= json!(
{
"info_type": "infolist", // 0 for device info
"info_number":3,
"info_list": [
{
"info_type": "devinfo", // 0 for device info
"sensor_id": "is30002",
"bandnum": 2048,
"wave_coeff": {
"a1": 0.0,
"a2": 0.0,
"a3": 400,
"a4": 1.0
}
},
{
"info_type": "environment", // 1 for gain info
"date": "2000-01-00 00:00:00",
//下面可选
"humidity":90.0,
"temperature":35.0 ,
"gps":{
"latitude":115.01,
"longitude": 39.01,
"altitude": 100.0
},
},
{
"info_type": "devinfo", // 0 for device info
"sensor_id": "is20001",
"bandnum": 512,
"wave_coeff": {
"a1": 0,
"a2": 0.0,
"a3":390,
"a4": 4
}
}
]
}
);
*/
// spectraldata_devinfo.sensor_id=devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string();
// spectraldata_devinfo.wave_coeff[0]=devinfo["bochangxishu"]["a1"].as_f64().unwrap_or(0.0);
// spectraldata_devinfo.wave_coeff[1]=devinfo["bochangxishu"]["a2"].as_f64().unwrap_or(0.0);
// spectraldata_devinfo.wave_coeff[2]=devinfo["bochangxishu"]["a3"].as_f64().unwrap_or(0.0);
// spectraldata_devinfo.wave_coeff[3]=devinfo["bochangxishu"]["a4"].as_f64().unwrap_or(0.0);
oneirisdata.spectral_info_section.push(spectraldata_devinfo);
oneirisdata.spectral_info_section.push(environment_info);
// 修复后的代码
let filesave_date = format!("{}_{:04}{:02}{:02}",
filepath, // 如果 filepath 是 String,这里会自动借用
datenow.year(),
datenow.month(),
datenow.day()
);
let filesavepath=filesave_date.clone()+".iris";
wirte_iris_data(&oneirisdata, &filesavepath);
"ok".to_string()
}
pub fn save_reflectance_to_iris(reflectance_data: serde_json::Value, devinfo: serde_json::Value, filepath: String) -> String {
let mut oneirisdata: OneIRISData = OneIRISData::new();
let mut spectraldata_reflectance: SpectralData = SpectralData::new();
let fileName = reflectance_data["fileName"].as_str().unwrap_or("Unknown").to_string();
//将filename中的.替换为_ 并保存到新的变量里
let fileName1 = fileName.replace(".", "_");
spectraldata_reflectance.name = fileName1+&devinfo["name"].as_str().unwrap_or("Unknown").to_string() ;
spectraldata_reflectance.sensor_id = devinfo["sensor_id"].as_str().unwrap_or("Unknown").to_string() ;
// + &devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string();
let reflectance_values: Vec<f64> = reflectance_data["data"]
.as_array()
.unwrap_or(&vec![])
.iter()
.map(|x| x.as_f64().unwrap_or(0.0))
.collect::<Vec<f64>>();
spectraldata_reflectance.bands = reflectance_values.len() as u16;
spectraldata_reflectance.pixel_size = 8;
spectraldata_reflectance.data_type = DATA_TYPE_FLOAT64;
spectraldata_reflectance.fiber_id = 0;
spectraldata_reflectance.exposure = 0.0;
spectraldata_reflectance.gain = 0.0;
let datenow = chrono::Local::now();
let nowtime = TimeStruct {
time_zone: 50,
year: datenow.year() as u16,
month: datenow.month() as u8,
day: datenow.day() as u8,
hour: datenow.hour() as u8,
minute: datenow.minute() as u8,
second: datenow.second() as u8,
millisecond: datenow.timestamp_subsec_millis() as u16,
};
spectraldata_reflectance.collection_time = nowtime.clone();
spectraldata_reflectance.ground_type = Target_Spectral_Type_FlatRef;
spectraldata_reflectance.valid_flag = 1;
spectraldata_reflectance.Set_Spectral_Data(reflectance_values, DATA_TYPE_FLOAT64);
oneirisdata.spectral_data_section.push(spectraldata_reflectance);
let spectraldata_devinfo = json!({
"info_type": "devinfo",
"sensor_id": devinfo["sensor_id"].as_str().unwrap_or("Unknown").to_string(),
"wave_coeff": {
"a1": devinfo["bochangxishu"]["a0"].as_f64().unwrap_or(0.0),
"a2": devinfo["bochangxishu"]["a1"].as_f64().unwrap_or(0.0),
"a3": devinfo["bochangxishu"]["a2"].as_f64().unwrap_or(0.0),
"a4": devinfo["bochangxishu"]["a3"].as_f64().unwrap_or(0.0)
}
});
println!("spectraldata_devinfo: {:?}", spectraldata_devinfo);
let environment_info = json!({
"info_type": "environment",
"date": format!("{}-{:02}-{:02} {:02}:{:02}:{:02}",
datenow.year(),
datenow.month(),
datenow.day(),
datenow.hour(),
datenow.minute(),
datenow.second()
)
});
oneirisdata.spectral_info_section.push(spectraldata_devinfo);
oneirisdata.spectral_info_section.push(environment_info);
match wirte_iris_data(&oneirisdata, &filepath) {
Ok(_) => "ok".to_string(),
Err(e) => format!("保存失败: {}", e)
}
}