Manual-Labeling-Tool/Manual-Labeling-Client/Manual-Label-Tool-Widget/LampWindDataItem.cpp

230 lines
7.5 KiB
C++
Raw Normal View History

2025-11-20 09:32:46 +00:00
#include <qgspoint.h>
#include "LampWindDataItem.h"
#include "BaseTool.h"
#include <QFileInfo>
#include "ManualLabelToolWidget.h"
#include <QgsMeshLayer.h>
#include <qgsmeshdataprovider.h>
#include <qgsmeshlayerutils.h>
#include <qgsmeshdataset.h>
#include <qgsproject.h>
#include <qgsvectorlayer.h>
#include <qgsmeshrenderersettings.h>
#include <qgscoordinatereferencesystem.h>
#include <qgsmapcanvas.h>
#include <qgsfeature.h>
#include <qgsgeometry.h>
#include <qgsfield.h>
#include <qgssymbol.h>
#include <qgssinglesymbolrenderer.h>
#include <qgslinesymbol.h>
#include <qgsmarkersymbol.h>
#include <qgsrenderer.h>
#include <qgsmarkersymbollayer.h>
#include <qgsmesheditor.h>
#include <qgsmeshdatasetgroupstore.h>
#include <qgsmeshdatasetgrouptreeview.h>
#include <qgsvectorfieldsymbollayer.h>
#include <qgsmemoryproviderutils.h>
#include <qgsgraduatedsymbolrenderer.h>
#include <omp.h>
#include "WidgetSettingClass.h"
#include "ImageOperatorBase.h"
#include "Wind2ERANc.h"
#include <QProgressDialog>
#include <QObject>
#include <QString>
LampWindDataItem::LampWindDataItem(QTreeWidget* IntreeWidget)
:LampDataItem(IntreeWidget)
{
timeArr.clear();
Filename.clear();
Filepath.clear();
time_filepath.clear();
selectItems.clear();
this->treeWidget = IntreeWidget;
this->ItemType = u8"LampWind";
}
LampWindDataItem::~LampWindDataItem()
{
}
void LampWindDataItem::InitTreeNode()
{
// 创建根节点,子节点,父窗体: QTreeWidget* treeWidget;
// 其中要求子节点选中的时候,需要能够知道根节点的文本
this->setText(0, this->Filename);
this->setText(1, u8"WindData");
this->setCheckState(0, Qt::Unchecked);
// 添加子节点
for (const auto& key : timeArr.keys()) {
QTreeWidgetItem* childItem1 = new QTreeWidgetItem(this); // 指定父节点为rootItem
childItem1->setText(0, key);
childItem1->setText(1, "");
childItem1->setCheckState(0, Qt::Unchecked); // 在第一列添加复选框 [3](@ref)
}
//treeWidget->expandAll();
}
void LampWindDataItem::showData(ManualLabelToolWidget* mainWidget)
{
// 获取当前节点的setCheckState
if (this->checkState(0) == Qt::Checked) {
for (int32_t i = 0; i < this->childCount(); i++) {
int32_t tid = timeArr[this->child(i)->text(0)];
this->ShowWindData(mainWidget, tid, this->child(i)->text(0));
}
}
else {
for (int32_t i = 0; i < this->childCount(); i++) {
if (this->child(i)->checkState(0) == Qt::Checked) {
int32_t tid = timeArr[this->child(i)->text(0)];
this->ShowWindData(mainWidget, tid, this->child(i)->text(0));
}
}
}
}
QString LampWindDataItem::getDescription()
{
QString starttimestr = Timenanosecond2timeStr(info.firstTimestamp);
QString endtimestr = Timenanosecond2timeStr(info.lastTimestamp);
return QString(u8"FilePath: %1\nFileName: %2\nHeight:%3 \nWidth:%4 \nNum:%5, \nfirstTs:%6, \nlastTs:%7, \nminLon:%8, \nmaxLon:%9, \nminLat:%10, \nmaxLat:%11, \nESPG:%12, \nTransX:%13, %14, %15, \nTransY:%15, %16, %17, \nSize:%18 \n")
.arg(this->Filepath).arg(this->Filename)
.arg(info.Height).arg(info.Width).arg(info.Num)
.arg(starttimestr).arg(endtimestr)
.arg(info.minLon).arg(info.maxLon).arg(info.minLat).arg(info.maxLat)
.arg(info.ESPGCODE)
.arg(info.T11).arg(info.T12).arg(info.T13)
.arg(info.T21).arg(info.T22).arg(info.T23)
.arg(info.fileSize);
}
void LampWindDataItem::setSelectItems(QList<QString> selectItemName)
{
}
void LampWindDataItem::OpenFileData(QString path)
{
// 读取数据
this->info = getDataFileInfo(path.toUtf8().constData());
int64_t* timeArr = new int64_t[this->info.Num];
QString ncfilename = QFileInfo(path).completeBaseName();
QProgressDialog* progressDialog = new QProgressDialog(this->treeWidget);
progressDialog->setWindowTitle( (u8"请稍候")); // 设置对话框标题
progressDialog->setLabelText( (u8"正在处理中...")); // 设置说明文字
progressDialog->resize(150, 50);
// 生成缓存文件地址
FileCacheFolderPath = WidgetSettingClass::instance().getTempFolder() + "\\"+ ncfilename;
QDir dir;
dir.mkpath(FileCacheFolderPath);
ERA5NetCDFConverter cover;
if (get_WindDataFileTimeArr(path.toUtf8().constData(), this->info, timeArr) == 0) {
this->timeArr.clear();
progressDialog->setRange(0, this->info.Num); // 设置进度范围例如从0到100 [3,4](@ref)
for (int64_t i = 0; i < this->info.Num; i++) {
QString timeflag = Timenanosecond2timeStr(timeArr[i]);
QString timefilename= QString(u8"\\mesh_wind_%1.nc").arg(timeflag.replace(":", "").replace(".", "M"));
QString temppath = FileCacheFolderPath + "\\" + timefilename;
time_filepath.insert(i, temppath);
cover.convert_to_era5_netcdf(
path.toUtf8().constData(),
temppath.toUtf8().constData(),
i
);
this->timeArr.insert(QString(u8"%1").arg(timeflag),i);
if (i % 30 == 0) {
progressDialog->setValue(i);
progressDialog->show();
}
}
}else{}
this->hashCode = pathToHashCode_Qt(path);
this->Filepath = path;
this->Filename=QFileInfo(path).fileName();
progressDialog->close();
delArrPtr(timeArr);
}
void LampWindDataItem::ShowWindData(ManualLabelToolWidget* mainWidget, int64_t tid, QString timeStr)
{
// 创建缓存文件
//QString temppath = WidgetSettingClass::instance().getTempFolder() + QString(u8"\\mesh_wind_%1.nc").arg(timeStr.replace(":", "").replace(".", "M"));
QgsMapCanvas* map_canvas = mainWidget->map_canvas; // 地图
QString url = time_filepath[tid];
QgsMeshLayer* meshLayer = new QgsMeshLayer(url, timeStr, "mdal");
//qDebug() << temppath;
QString EPSGStr = QString(u8"EPSG:%1").arg(info.ESPGCODE);
// 获取数据提供者
QgsMeshDataProvider* dp = meshLayer->dataProvider();
if (!dp) {
qDebug() << "Failed to get data provider!";
return;
}
meshLayer->setCrs(QgsCoordinateReferenceSystem(EPSGStr));
// 获取数据集组数量
int gprCount = dp->datasetGroupCount();
int targetVectorIndex = -1; // 初始化为-1表示未找到
// 遍历所有数据集组,寻找第一个矢量数据集
for (int i = 0; i < gprCount; ++i) {
QgsMeshDatasetIndex index(i, 0); // 组索引i时间步0
QgsMeshDatasetGroupMetadata meta = dp->datasetGroupMetadata(index);
bool isVector = meta.isVector();
QString name = meta.name();
if (isVector) {
targetVectorIndex = i;
break;
}
}
// 如果找到了矢量数据集组
if (targetVectorIndex != -1) {
// 获取当前的渲染器设置
QgsMeshRendererSettings s = meshLayer->rendererSettings();
// 设置激活的矢量数据集组和标量数据集组
s.setActiveVectorDatasetGroup(targetVectorIndex);
s.setActiveScalarDatasetGroup(targetVectorIndex);
// 将修改后的设置应用回图层
meshLayer->setRendererSettings(s);
qDebug() << "Successfully set active dataset group to index:" << targetVectorIndex;
}
else {
qDebug() << "No vector dataset group found!";
}
mainWidget->AddLayers(meshLayer);
map_canvas->setExtent(meshLayer->extent());
map_canvas->refresh();
}