230 lines
7.5 KiB
C++
230 lines
7.5 KiB
C++
|
|
#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();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|