Merge branch 'main' into dev_20260130_RemoveRedis

# Conflicts:
#	backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/sar/service/impl/SarImageServiceImpl.java
This commit is contained in:
longguancheng 2026-03-09 14:01:40 +08:00
commit c9c37dc219
8 changed files with 99 additions and 60 deletions

View File

@ -45,7 +45,7 @@ public class ImageUtil {
int lightRate = rotateDTO.getLightRate(); int lightRate = rotateDTO.getLightRate();
if (lightRate != 0) { if (lightRate != 0) {
//OpenCVUtil.multiply(image, lightRate); //OpenCVUtil.multiply(image, lightRate);
OpenCVUtil.enhanceContrast(image, lightRate, 0); // OpenCVUtil.enhanceContrast(image, lightRate, 0);
} }
return image; return image;
} }

View File

@ -78,18 +78,18 @@ public class SarImageServiceImpl implements ISarImageService {
} }
// 情况2如果最后一张还能拼图则直接返回继续拼 // 情况2如果最后一张还能拼图则直接返回继续拼
JmImage last = imageList.get(imageList.size() - 1); JmImage last = imageList.get(imageList.size() - 1);
Integer startFrameNo = imageCache.get(cachePrefix + ":" + CACHE_FIELD_START_FRAME_NO, Integer.class); // Integer startFrameNo = imageCache.get(cachePrefix + ":" + CACHE_FIELD_START_FRAME_NO, Integer.class);
int currWidth = startFrameNo == null ? 0 : singleWidth * (frameNo - startFrameNo + 1); // int currWidth = startFrameNo == null ? 0 : singleWidth * (frameNo - startFrameNo + 1);
int surplusNum = (IMG_MAX_WITH - currWidth) / singleWidth; // 还可以拼图片数 // int surplusNum = (IMG_MAX_WITH - currWidth) / singleWidth; // 还可以拼图片数
Integer baseNo = imageCache.get(cachePrefix + ":" + CACHE_FIELD_CURR_FRAME_NO, Integer.class); // Integer baseNo = imageCache.get(cachePrefix + ":" + CACHE_FIELD_CURR_FRAME_NO, Integer.class);
//
if (startFrameNo == null || currWidth < IMG_MAX_WITH || // if (startFrameNo == null || currWidth < IMG_MAX_WITH ||
baseNo == null || (frameNo - baseNo + 1 <= surplusNum)) { // baseNo == null || (frameNo - baseNo + 1 <= surplusNum)) {
log.info("当前宽度:{} < {} 可以继续拼接", currWidth, IMG_MAX_WITH); // log.info("当前宽度:{} < {} 可以继续拼接", currWidth, IMG_MAX_WITH);
return last; // return last;
} // }
// 情况3已经拼接到最大数量或者当前图+填充数量超过允许拼接数量创建新图像文件 // 情况3已经拼接到最大数量或者当前图+填充数量超过允许拼接数量创建新图像文件
log.info("当前宽度:{} > {} 重新拼接,当前帧号{}作为首帧", currWidth, IMG_MAX_WITH, frameNo); // log.info("当前宽度:{} > {} 重新拼接,当前帧号{}作为首帧", currWidth, IMG_MAX_WITH, frameNo);
base = new JmImage(); base = new JmImage();
imageCache.put(cachePrefix + ":" + CACHE_FIELD_START_FRAME_NO, frameNo); imageCache.put(cachePrefix + ":" + CACHE_FIELD_START_FRAME_NO, frameNo);
base.setImageNo(last.getImageNo() + 1); base.setImageNo(last.getImageNo() + 1);
@ -105,9 +105,6 @@ public class SarImageServiceImpl implements ISarImageService {
currAirline.setBeforeRight(before); currAirline.setBeforeRight(before);
} }
// 使用前一张图的右侧坐标作为后一张图的左侧前提是没丢图 // 使用前一张图的右侧坐标作为后一张图的左侧前提是没丢图
if (!isFirst && !lostImage) {
// 注释部分保持原样
}
before[0] = imageFrame.getLon5(); before[0] = imageFrame.getLon5();
before[1] = imageFrame.getLat5(); before[1] = imageFrame.getLat5();
before[2] = imageFrame.getLon8(); before[2] = imageFrame.getLon8();

View File

@ -175,6 +175,8 @@ export default {
left: 'Left', left: 'Left',
right: 'Right', right: 'Right',
}, },
uavline: "Airline",
createAirline: 'Create Airline',
rules: { rules: {
inputTaskName: 'Please enter task name', inputTaskName: 'Please enter task name',
startAltitude: 'Please enter start altitude', startAltitude: 'Please enter start altitude',

View File

@ -170,6 +170,12 @@ export default {
stopTaskConfirm: '确定要结束该任务吗?', stopTaskConfirm: '确定要结束该任务吗?',
stopTaskSuccess: '任务已结束!', stopTaskSuccess: '任务已结束!',
planArea: '规划区域', planArea: '规划区域',
direction: {
left: '左侧视',
right: '右侧视',
},
uavline: "航线",
createAirline: '创建航线',
rules: { rules: {
inputTaskName: '请输入任务名称', inputTaskName: '请输入任务名称',
startAltitude: '请输入起飞点高度', startAltitude: '请输入起飞点高度',
@ -219,10 +225,6 @@ export default {
tip: '提示', tip: '提示',
radarEndSuccess: '雷达关机成功', radarEndSuccess: '雷达关机成功',
deleteConfirm: '确定要删除该?', deleteConfirm: '确定要删除该?',
direction: {
left: '左侧视',
right: '右侧视',
},
}, },
picture: { picture: {
list: '影像列表', list: '影像列表',

View File

@ -8,7 +8,6 @@
}" }"
icon="ri-list-unordered" icon="ri-list-unordered"
:title="this.$t('task.taskList')" :title="this.$t('task.taskList')"
:visible.sync="taskList.visible" :visible.sync="taskList.visible"
:scroll="false" :scroll="false"
:showClose="false" :showClose="false"
@ -94,9 +93,15 @@
<i class="ri-more-fill"></i> <i class="ri-more-fill"></i>
</span> </span>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item command="edit">{{ $t('task.editName') }}</el-dropdown-item> <el-dropdown-item command="edit">{{
<el-dropdown-item command="copy">{{ $t('task.copy') }}</el-dropdown-item> $t('task.editName')
<el-dropdown-item command="remove">{{ $t('task.delete') }}</el-dropdown-item> }}</el-dropdown-item>
<el-dropdown-item command="copy">{{
$t('task.copy')
}}</el-dropdown-item>
<el-dropdown-item command="remove">{{
$t('task.delete')
}}</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</div> </div>
@ -233,9 +238,11 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item :label="$t('task.airline')" v-if="form.mode === '3'"> <el-form-item :label="$t('task.uavline')" v-if="form.mode === '3'">
<div class="airline-wrap"> <div class="airline-wrap">
<div class="airline-create" @click="createAirline">{{ $t('task.createAirline') }}</div> <div class="airline-create" @click="createAirline">
{{ $t('task.createAirline') }}
</div>
<div class="airline-list"> <div class="airline-list">
<div <div
class="airline-item" class="airline-item"
@ -405,7 +412,10 @@
<el-option label="16bit" :value="1"></el-option> <el-option label="16bit" :value="1"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('task.sideViewDirection')" v-if="form.mode !== '3'"> <el-form-item
:label="$t('task.sideViewDirection')"
v-if="form.mode !== '3'"
>
<el-select <el-select
popper-class="form-light" popper-class="form-light"
size="small" size="small"
@ -455,7 +465,10 @@
size="mini" size="mini"
></el-slider> ></el-slider>
</el-form-item> </el-form-item>
<el-form-item v-if="form.mode !== '2'" :label="$t('task.waveAngle')"> <el-form-item
v-if="form.mode !== '2'"
:label="$t('task.waveAngle')"
>
<el-slider <el-slider
v-model="form.waveAngle" v-model="form.waveAngle"
:step="0.1" :step="0.1"
@ -492,7 +505,9 @@
@click="previewLine" @click="previewLine"
>{{ $t('common.preview') }}</el-button >{{ $t('common.preview') }}</el-button
> >
<el-button size="mini" type="primary" @click="submit">{{ $t('common.save') }}</el-button> <el-button size="mini" type="primary" @click="submit">{{
$t('common.save')
}}</el-button>
</div> </div>
</dt-card> </dt-card>
</left-slide> </left-slide>
@ -540,15 +555,25 @@
<div class="task-line-detail"> <div class="task-line-detail">
<el-table :data="taskLineDetail.data" height="100%" style="width: 100%"> <el-table :data="taskLineDetail.data" height="100%" style="width: 100%">
<el-table-column type="index" width="50"> </el-table-column> <el-table-column type="index" width="50"> </el-table-column>
<el-table-column prop="startLon" :label="$t('task.airline.startLon')"> </el-table-column> <el-table-column prop="startLon" :label="$t('task.airline.startLon')">
<el-table-column prop="startLat" :label="$t('task.airline.startLat')"> </el-table-column> </el-table-column>
<el-table-column prop="startHeight" :label="$t('task.airline.startHeight')"> <el-table-column prop="startLat" :label="$t('task.airline.startLat')">
</el-table-column>
<el-table-column
prop="startHeight"
:label="$t('task.airline.startHeight')"
>
</el-table-column> </el-table-column>
<el-table-column prop="startAlt" :label="$t('task.airline.startAlt')"> <el-table-column prop="startAlt" :label="$t('task.airline.startAlt')">
</el-table-column> </el-table-column>
<el-table-column prop="endLon" :label="$t('task.airline.endLon')"> </el-table-column> <el-table-column prop="endLon" :label="$t('task.airline.endLon')">
<el-table-column prop="endLat" :label="$t('task.airline.endLat')"> </el-table-column> </el-table-column>
<el-table-column prop="endHeight" :label="$t('task.airline.endHeight')"> <el-table-column prop="endLat" :label="$t('task.airline.endLat')">
</el-table-column>
<el-table-column
prop="endHeight"
:label="$t('task.airline.endHeight')"
>
</el-table-column> </el-table-column>
<el-table-column prop="endAlt" :label="$t('task.airline.endAlt')"> <el-table-column prop="endAlt" :label="$t('task.airline.endAlt')">
</el-table-column> </el-table-column>

View File

@ -18,7 +18,7 @@ export default class OrthoImageryManager {
/** /**
* 添加或更新新推送的图片 * 添加或更新新推送的图片
*/ */
add(data) { add(data, brightness) {
const key = `${data.jobId}-${data.uavId}~${data.fileId}`; const key = `${data.jobId}-${data.uavId}~${data.fileId}`;
// 已存在则跳过 // 已存在则跳过
@ -39,7 +39,7 @@ export default class OrthoImageryManager {
const layer = this.viewer.cesiumViewer.imageryLayers.addImageryProvider(provider); const layer = this.viewer.cesiumViewer.imageryLayers.addImageryProvider(provider);
// ✅ 使用全局亮度和透明度,保证新图生效 // ✅ 使用全局亮度和透明度,保证新图生效
layer.brightness = this.globalBrightness; layer.brightness = brightness ? brightness : this.globalBrightness;
layer.alpha = this.globalAlpha; layer.alpha = this.globalAlpha;
this.layerMap.set(key, layer); this.layerMap.set(key, layer);
@ -52,7 +52,7 @@ export default class OrthoImageryManager {
* 设置全局亮度影响所有已有图片和未来新推送的图片 * 设置全局亮度影响所有已有图片和未来新推送的图片
*/ */
setBrightness(value) { setBrightness(value) {
this.globalBrightness = value; // this.globalBrightness = value;
this.layerMap.forEach(layer => { this.layerMap.forEach(layer => {
layer.brightness = value; layer.brightness = value;
}); });

View File

@ -375,7 +375,7 @@ export default {
lightPercent: 0, lightPercent: 0,
contrastPercent: 10, contrastPercent: 10,
imageInfos: { imageInfos: {
brightness: 10 brightness: 5
}, },
} }
}, },
@ -487,7 +487,7 @@ export default {
// ) // )
orthoManager = new OrthoImageryManager(viewer, DT.Cesium, { orthoManager = new OrthoImageryManager(viewer, DT.Cesium, {
maxLayers: 400, maxLayers: 400,
brightness: 1.2, // 默认亮度 brightness: 1, // 默认亮度
alpha: 1.0 // 默认透明度 alpha: 1.0 // 默认透明度
}) })
// this.startTest() // this.startTest()
@ -580,11 +580,11 @@ export default {
// 亮度设置变化 // 亮度设置变化
onLightChange: debounce(function (val) { onLightChange: debounce(function (val) {
const imageInfos = { ...this.imageInfos } const imageInfos = { ...this.imageInfos }
orthoManager.setBrightness(val / 10) orthoManager.setBrightness(val)
execBrightnessexport(imageInfos).then(res => { // execBrightnessexport(imageInfos).then(res => {
console.log('亮度调整成功'); // console.log('亮度调整成功');
// this.$message.success('亮度调整成功') // // this.$message.success('亮度调整成功')
}) // })
}, 500), }, 500),
// startTest() { // startTest() {
// let testHeight = 1000 // let testHeight = 1000
@ -2818,10 +2818,10 @@ export default {
handleWebsocketImage(info) { handleWebsocketImage(info) {
// console.log('SAR图像', info.body) // console.log('SAR图像', info.body)
let data = JSON.parse(info.body) let data = JSON.parse(info.body)
this.imageInfos = Object.assign({}, this.imageInfos, data) // this.imageInfos = Object.assign({}, this.imageInfos, data)
this.imageInfos.brightness = data.brightness // this.imageInfos.brightness = data.brightness
console.log('SAR图像2', data) console.log('SAR图像2', data)
orthoManager.add(data) orthoManager.add(data, this.imageInfos.brightness)
// this.addMarkPicture2(data) // this.addMarkPicture2(data)
// console.log('灭有匹配到吗taskUavCollection', taskUavCollection, taskUavCollection[data.jobId]) // console.log('灭有匹配到吗taskUavCollection', taskUavCollection, taskUavCollection[data.jobId])
// if (taskUavCollection[data.jobId]) { // if (taskUavCollection[data.jobId]) {
@ -3040,6 +3040,10 @@ export default {
viewer.entities.remove(item) viewer.entities.remove(item)
} }
}) })
if (orthoManager) {
orthoManager.clearAll()
orthoManager = null
}
} }
if (data.jobStatus === 1 && this.detailUav.id === data.jobId) { if (data.jobStatus === 1 && this.detailUav.id === data.jobId) {
this.updateUavInfo(data.sarStatus) this.updateUavInfo(data.sarStatus)

View File

@ -91,9 +91,9 @@
<el-slider <el-slider
v-model="imageInfos.brightness" v-model="imageInfos.brightness"
show-input show-input
:min="1" :min="0.1"
:max="30" :max="20"
:step="1" :step="0.1"
input-size="mini" input-size="mini"
:show-input-controls="false" :show-input-controls="false"
@change="onLightChange" @change="onLightChange"
@ -137,19 +137,24 @@
<div class="weather-info__content2"> <div class="weather-info__content2">
<div class="base-info"> <div class="base-info">
<div> <div>
<span>{{ $t('task.temperature') }}</span><span>{{ weatherInfo2.wendu }}</span> <span>{{ $t('task.temperature') }}</span
><span>{{ weatherInfo2.wendu }}</span>
</div> </div>
<div> <div>
<span>{{ $t('task.humidity') }}</span><span>{{ weatherInfo2.shidu }}</span> <span>{{ $t('task.humidity') }}</span
><span>{{ weatherInfo2.shidu }}</span>
</div> </div>
<div> <div>
<span>{{ $t('task.airQuality') }}</span><span>{{ weatherInfo2.quality }}</span> <span>{{ $t('task.airQuality') }}</span
><span>{{ weatherInfo2.quality }}</span>
</div> </div>
<div> <div>
<span>{{ $t('task.pm25') }}</span><span>{{ weatherInfo2.pm25 }}</span> <span>{{ $t('task.pm25') }}</span
><span>{{ weatherInfo2.pm25 }}</span>
</div> </div>
<div> <div>
<span>{{ $t('task.pm10') }}</span><span>{{ weatherInfo2.pm10 }}</span> <span>{{ $t('task.pm10') }}</span
><span>{{ weatherInfo2.pm10 }}</span>
</div> </div>
</div> </div>
<div class="week-info"> <div class="week-info">
@ -340,14 +345,18 @@
<div class="task-line-detail"> <div class="task-line-detail">
<el-table :data="taskLineDetail.data" height="100%" style="width: 100%"> <el-table :data="taskLineDetail.data" height="100%" style="width: 100%">
<el-table-column type="index" width="50"> </el-table-column> <el-table-column type="index" width="50"> </el-table-column>
<el-table-column prop="startLon" :label="$t('task.startLon')"> </el-table-column> <el-table-column prop="startLon" :label="$t('task.startLon')">
<el-table-column prop="startLat" :label="$t('task.startLat')"> </el-table-column> </el-table-column>
<el-table-column prop="startLat" :label="$t('task.startLat')">
</el-table-column>
<el-table-column prop="startHeight" :label="$t('task.startHeight')"> <el-table-column prop="startHeight" :label="$t('task.startHeight')">
</el-table-column> </el-table-column>
<el-table-column prop="startAlt" :label="$t('task.startAlt')"> <el-table-column prop="startAlt" :label="$t('task.startAlt')">
</el-table-column> </el-table-column>
<el-table-column prop="endLon" :label="$t('task.endLon')"> </el-table-column> <el-table-column prop="endLon" :label="$t('task.endLon')">
<el-table-column prop="endLat" :label="$t('task.endLat')"> </el-table-column> </el-table-column>
<el-table-column prop="endLat" :label="$t('task.endLat')">
</el-table-column>
<el-table-column prop="endHeight" :label="$t('task.endHeight')"> <el-table-column prop="endHeight" :label="$t('task.endHeight')">
</el-table-column> </el-table-column>
<el-table-column prop="endAlt" :label="$t('task.endAlt')"> <el-table-column prop="endAlt" :label="$t('task.endAlt')">