#include #include "LampWindDataItem.h" #include "BaseTool.h" #include #include "ManualLabelToolWidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "WidgetSettingClass.h" #include "ImageOperatorBase.h" #include "Wind2ERANc.h" #include #include #include 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 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(); }