This commit is contained in:
nuknal
2024-05-20 11:08:24 +08:00
parent f609b2b023
commit efd824cc8a
14 changed files with 332 additions and 69 deletions

View File

@@ -142,6 +142,9 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
var afh AuxFrameHead
msdata := make([][]byte, 4)
var header []byte
var ebAux []byte
var platAux []byte
for i := 0; i < dataLen; {
if i+4 > dataLen {
@@ -182,11 +185,17 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
break
}
auxTime := binary.BigEndian.Uint32(data[i+32 : i+36])
if math.Abs(float64(auxTime)-float64(afh.TimeSec)) < 30 {
header = append(header, data[i:i+24]...)
}
// 存储辅助数据到临时文件
dataIndex := i + 24
lw.ws[EB_AUX].w.Write(data[dataIndex : dataIndex+8]) // 8字节焦面电箱辅助数据
// lw.ws[EB_AUX].w.Write(data[dataIndex : dataIndex+8]) // 8字节焦面电箱辅助数据
ebAux = append(ebAux, data[dataIndex:dataIndex+8]...)
dataIndex += 8
lw.ws[PLAT_AUX].w.Write(data[dataIndex : dataIndex+32]) // 32字节中心机辅助数据
// lw.ws[PLAT_AUX].w.Write(data[dataIndex : dataIndex+32]) // 32字节中心机辅助数据
platAux = append(platAux, data[dataIndex:dataIndex+32]...)
dataIndex += 32
// 存储图像数据到临时文件 - 以 ENVI BSQ 格式存储,同时提供 HDR 描述文件
@@ -221,15 +230,41 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
i = dataIndex // 完成一行数据解析
}
var bands = 0
for i := 0; i < 4; i++ {
if len(msdata[i]) > 0 {
log.Println("write mss data of band B", i+1)
_, err := write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[i])
if err != nil {
log.Error("write mss data error:", err.Error())
}
bands += 1
// var bands = 0
// for i := 0; i < 4; i++ {
// if len(msdata[i]) > 0 {
// log.Println("write mss data of band B", i+1)
// _, err := write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[i])
// if err != nil {
// log.Error("write mss data error:", err.Error())
// }
// bands += 1
// }
// }
if len(msdata[0]) != len(msdata[1]) || len(msdata[2]) != len(msdata[3]) {
log.Error("mss data of bands B1-B4 are not equal")
return errors.New("mss data of bands B1-B4 are not equal")
}
mssRowLen := 1192 * 4
for i := 0; i < len(msdata[0]); i += mssRowLen {
var err error
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[0][i:i+mssRowLen])
if err != nil {
log.Error("write mss 1 data error:", err.Error())
}
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[1][i:i+mssRowLen])
if err != nil {
log.Error("write mss 2 data error:", err.Error())
}
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[2][i:i+mssRowLen])
if err != nil {
log.Error("write mss 3 data error:", err.Error())
}
_, err = write16bPixelLittleEndian(lw.ws[MSS_RAW].w, msdata[3][i:i+mssRowLen])
if err != nil {
log.Error("write mss 4 data error:", err.Error())
}
}
@@ -238,16 +273,29 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
lw.ws[PAN_HDR].w.Write([]byte(panEnviHdr.String()))
mssEnviHdr.Lines = mssEnviHdr.Lines / 4 // 多光谱波段分别在 4 行中传输
mssEnviHdr.Samples = 2384
mssEnviHdr.Bands = bands
mssEnviHdr.Samples = 2384 * 4
mssEnviHdr.Bands = 1
lw.ws[MSS_HDR].w.Write([]byte(mssEnviHdr.String()))
// 帧头+辅助数据
if len(header)/24 < len(ebAux)/128 || len(ebAux)/128 != len(platAux)/512 {
fmt.Println("aux data length:", len(header)/24, len(ebAux)/128, len(platAux)/512)
return errors.New("aux data length is not equal")
}
auxRows := len(header) / 24
for i := 0; i < auxRows; i++ {
lw.ws[AUX].w.Write(header[i*24 : (i+1)*24])
lw.ws[AUX].w.Write(ebAux[i*128 : (i+1)*128])
lw.ws[AUX].w.Write(platAux[i*512 : (i+1)*512])
}
return nil
}
func (e *Extractor) quanlityAnalysis(data []byte) {
// 数据质量分析
fimg, _ := os.Create("demo/temp/" + e.params.DataId + "_aux_img.txt")
fimg, _ := os.Create("demo/temp/" + e.params.DataId + "/aux.txt")
defer fimg.Close()
fimg.WriteString("字节数 帧头流水号 文件号 帧头时间 中心辅助数据前4字节(行33-36)\n")