Compare commits

...

No commits in common. "master" and "DemFill" have entirely different histories.

26 changed files with 1367 additions and 1450 deletions

View File

@ -1,22 +1,22 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.31911.196 VisualStudioVersion = 16.0.32126.315
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DEM_GeneRas", "DEM_GeneRas\DEM_GeneRas.vcxproj", "{AAEF388B-265D-4CF4-8832-9E6CD50B4644}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DEM_Fill", "DEM_Fill\DEM_Fill.vcxproj", "{32F04C81-EC93-432F-9B60-0B92B5FCC5C5}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|x64 = Release|x64 Release|x64 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AAEF388B-265D-4CF4-8832-9E6CD50B4644}.Release|x64.ActiveCfg = Release|x64 {32F04C81-EC93-432F-9B60-0B92B5FCC5C5}.Release|x64.ActiveCfg = Release|x64
{AAEF388B-265D-4CF4-8832-9E6CD50B4644}.Release|x64.Build.0 = Release|x64 {32F04C81-EC93-432F-9B60-0B92B5FCC5C5}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6D802BB4-76E8-4FE8-8FB7-04BCDE98FF27} SolutionGuid = {D6C86E29-E4F8-449B-838C-C7B217220096}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

364
DEM_Fill/DEM_Fill.cpp Normal file
View File

@ -0,0 +1,364 @@
#include "DEM_Fill.h"
#include <qgsrasterlayer.h>
#include <qgsvectorlayer.h>
#include <qgsmapcanvas.h>
void WorkThreadObject::runFillingWork(QString in_masked, QString out_filled, QString scale, QString size)
{
QDir pyDir = QDir(qApp->applicationDirPath());
if (!pyDir.cd("models\\mask_fill"))
{
qDebug() << "no folder models\\mask_fill";
return;
}
QString pyFilePath = pyDir.absoluteFilePath("demFillHoles.py");
if (pyFilePath == "")
{
qDebug() << "not find demFillHoles.py";
return;
}
QDir datDir = QDir(qApp->applicationDirPath());
if (!datDir.cd("QGIS_3.22.8\\bin"))
{
qDebug() << "no folder QGIS_3.22.8\\bin";
return;
}
QString datPath = datDir.absoluteFilePath("python-qgis-ltr.bat");
if (datPath == "")
{
qDebug() << "not find qgis env";
return;
}
const char* cmd = (datPath + " " + pyFilePath + " --in_holedem " + in_masked + "/" + " --work_space " + out_filled + "/" +
" --scale " + scale + " --win_size " + size).toStdString().c_str();
cout << cmd << "\n";
run_cmd(cmd);
//QString cmd = datPath + " " + pyFilePath
// + " --in_holedem " + in_masked + "/" + " --work_space " + out_filled + "/"
// + " --scale " + scale + " --win_size " + size;
//QProcess* pProces = new QProcess(this);
//connect(pProces, SIGNAL(readyReadStandardOutput()), this, SLOT(readProcessStandardOutput()));
//pProces->start(cmd);
//emit process(2);
}
void WorkThreadObject::readProcessStandardOutput()
{
mProcess = (QProcess*)sender();
QString output = QString::fromLocal8Bit(mProcess->readAllStandardOutput());
output.chop(2);
if (output.toFloat() != 0)
{
qDebug() << "process:" << output.toFloat();
emit process(output.toFloat());
}
else
qDebug() << "unsolved exe out:" << output;
}
int WorkThreadObject::run_cmd(const char* cmd)
{
char MsgBuff[1024];
int MsgLen = 1020;
FILE* fp;
if (cmd == NULL)
return -1;
if ((fp = _popen(cmd, "r")) == NULL)
return -2;
else
{
memset(MsgBuff, 0, MsgLen);
//读取命令执行过程中的输出
while (fgets(MsgBuff, MsgLen, fp) != NULL)
{
printf("MsgBuff: %s\n", MsgBuff);
QString qStr = QString(MsgBuff);
if (qStr.toDouble() != 0.0)
emit process(qStr.toDouble());
}
//关闭执行的进程
if (_pclose(fp) == -1)
return -3;
}
return 0;
}
///////////////////////////////////////////////////////////
DataFilling::DataFilling()
{
//ui.setupUi(this);
}
QString DataFilling::PannelName()
{
return QString::fromLocal8Bit("");
}
QString DataFilling::CategoryName()
{
return QString::fromLocal8Bit("DEM模块");
}
QString DataFilling::EnglishName()
{
return QString::fromLocal8Bit("DEM_Module");
}
QString DataFilling::ChineseName()
{
return QString::fromLocal8Bit("数据填补");
}
QString DataFilling::Information()
{
return "数据填补";
}
QString DataFilling::IconPath()
{
return ":/DEM_Fill/resources/fill.svg";
}
QWidget* DataFilling::CenterWidget()
{
QString gdal_path = qApp->applicationDirPath().toLocal8Bit() + "/share/gdal";
QString pro_lib_path = qApp->applicationDirPath().toLocal8Bit() + "/share/proj";
qputenv("GDAL_DATA", gdal_path.toLocal8Bit());
qputenv("PROJ_LIB", pro_lib_path.toLocal8Bit());
bool showWin = false;
if (myWidget == nullptr)
{
myWidget = new QDialog();
showWin = true;
qDebug() << "new QDialog()";
}
else
{
qDebug() << "already have myWidget";
myWidget->activateWindow();
myWidget->raise();
return myWidget;
}
ui.setupUi(myWidget);
myWidget->setWindowTitle(QString::fromLocal8Bit("数据填补"));
myWidget->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint);
myWidget->setWindowIcon(QIcon(":/DEM_Fill/resources/fill.svg"));
myWidget->setAttribute(Qt::WA_QuitOnClose, false);
myWidget->setAttribute(Qt::WA_DeleteOnClose);
connect(myWidget, &QDialog::destroyed, this, [=] {
qDebug() << "----DEM Fill window close----";
QDir pluginsDir = QDir(qApp->applicationDirPath());
if (pluginsDir.cd("srsplugins\\DemModel"))
{
QString strConfigPath = pluginsDir.absoluteFilePath("dem_config.ini");
QFile f(strConfigPath);
if (f.exists())
{
WriteConfigPaths(strConfigPath);
f.close();
}
}
myWidget->close();
myWidget = nullptr;
if (mWorkThread != nullptr)
{
mWorkThread->quit();
mWorkThread->wait();//调用wait后先调用finished信号对应的槽函数执行完成后再往下走
mWorkThread = nullptr;//mWorkThread, &QThread::finished, mWorkThread, &QObject::deleteLater不需要delete
mWorker = nullptr;//mWorkThread, &QThread::finished, mWorker, &QObject::deleteLater
}
});
connect(ui.pbtMasked, &QPushButton::pressed, this, &DataFilling::chooseMaskedSlope);
connect(ui.pbtOutFill, &QPushButton::pressed, this, &DataFilling::chooseOutFill);
connect(ui.pushButton_ok, &QPushButton::pressed, this, &DataFilling::readAndStart);
connect(ui.pushButton_cancel, &QPushButton::pressed, this, &DataFilling::pbCancel);
ui.progressBar->setTextVisible(true);
ui.progressBar->setRange(0, 100);
ui.pbtMasked->setFocus();
ui.lineRectangleScale->setValidator(new QRegExpValidator(QRegExp("^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$")));
ui.lineExpandSize->setValidator(new QIntValidator(0, 999, this));
ui.lineRectangleScale->setText("0.1");
ui.lineExpandSize->setText("3");
QFile qssFile(":/DEM_Fill/DEM_Fill.qss");
qssFile.open(QFile::ReadOnly); //以只读方式打开
if (qssFile.isOpen())
{
QString qss = QLatin1String(qssFile.readAll());
myWidget->setStyleSheet(qss);
qssFile.close();
}
else
qDebug() << "无法打开文件";
QDir pluginsDir = QDir(qApp->applicationDirPath());
if (pluginsDir.cd("srsplugins\\DemModel"))
{
QString strConfigPath = pluginsDir.absoluteFilePath("dem_config.ini");
QFile f(strConfigPath);
if (f.exists())
{
ReadConfigHistoryPaths(strConfigPath);
f.close();
}
}
if (showWin)
myWidget->show();
return myWidget;
}
void DataFilling::startWorkThread()
{
if (mWorker != nullptr)
{
return;
}
mWorkThread = new QThread();
mWorker = new WorkThreadObject();
mWorker->moveToThread(mWorkThread);
connect(mWorkThread, &QThread::finished, mWorkThread, &QObject::deleteLater);
connect(mWorkThread, &QThread::finished, mWorker, &QObject::deleteLater);
connect(mWorker, &WorkThreadObject::sendMaskedTiff, this, &DataFilling::openResultData);
connect(mWorker, &WorkThreadObject::process, myWidget, [=](int value) {
ui.progressBar->setValue(value);
if (value == 100)
{
QMessageBox mess(QMessageBox::Information,
QString::fromLocal8Bit("填补结束"),
QString::fromLocal8Bit("填补结果文件夹:\n") + outPath);
mess.setWindowFlags(Qt::Drawer);
mess.setStandardButtons(QMessageBox::Yes);
mess.button(QMessageBox::StandardButton::Yes)->setText(QString::fromLocal8Bit("确认"));
//mess.setTextInteractionFlags(Qt::TextSelectableByMouse);
int result = mess.exec();
pbCancel();
}
});
connect(this, &DataFilling::startDataFill, mWorker, &WorkThreadObject::runFillingWork);
mWorkThread->start();
}
void DataFilling::chooseMaskedSlope()
{
QString dirDom = QFileDialog::getExistingDirectory(ui.pbtMasked, QString::fromLocal8Bit("选择输入裁剪后的DEM文件夹"), "");
if (dirDom != "")
ui.lineMasked->setText(dirDom);
}
void DataFilling::chooseOutFill()
{
QString dirDom = QFileDialog::getExistingDirectory(ui.pbtOutFill, QString::fromLocal8Bit("选择输出数据填补结果文件夹"), "");
if (dirDom != "")
ui.lineOutFill->setText(dirDom);
}
void DataFilling::readAndStart()
{
QString in_masked = ui.lineMasked->text();
QString out_filled = ui.lineOutFill->text();
QString scale = ui.lineRectangleScale->text();
QString size = ui.lineExpandSize->text();
if (in_masked == "" || out_filled == "" || scale == "" || size == "")
{
QMessageBox mess(QMessageBox::NoIcon, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("请检查输入输出路径"));
mess.setWindowFlags(Qt::Drawer);
int result = mess.exec();
return;
}
outPath = out_filled;
ui.progressBar->setValue(0);
if (mWorkThread == nullptr)
{
qDebug() << "--startThread";
startWorkThread();
}
emit startDataFill(in_masked, out_filled, scale, size);
}
void DataFilling::ReadConfigHistoryPaths(QString strPath)
{
QSettings configIni(strPath, QSettings::IniFormat);
//打开标题为:[DemFill] 的组
configIni.beginGroup("DemFill");
ui.lineMasked->setText(configIni.value("MaskedFiles").toString());
ui.lineOutFill->setText(configIni.value("FilledFiles").toString());
configIni.endGroup();//关闭组
}
void DataFilling::WriteConfigPaths(QString strPath)
{
QSettings configIni(strPath, QSettings::IniFormat);
configIni.setIniCodec("utf-8");
//打开标题为:[DemFill] 的组
configIni.beginGroup("DemFill");
//更新输入模型路径
QString temp = ui.lineMasked->text();
if (temp != "")
configIni.setValue("MaskedFiles", temp);
//更新输入DOM路径
temp = ui.lineOutFill->text();
if (temp != "")
configIni.setValue("FilledFiles", temp);
configIni.endGroup();//关闭组
}
void DataFilling::pbCancel()
{
delete myWidget;//调起&QDialog::destroyed
}
void DataFilling::openResultData(QStringList string_list)
{
if (string_list.isEmpty())
return;
QgsRasterLayer* rastLayer;
QgsVectorLayer* vecLayer;
for each (QString layerPath in string_list)
{
QFileInfo fileInfo(layerPath);
QString layerBaseName = fileInfo.baseName(); // 图层名称
if ("tif" == fileInfo.suffix() || "tiff" == fileInfo.suffix())
{
rastLayer = new QgsRasterLayer(fileInfo.filePath(), layerPath, "gdal");
if (!rastLayer)
return;
QgsMapLayer* mapLayer = rastLayer;
QgsRectangle myRectangle;
//rastLayer->setContrastEnhancement(QgsContrastEnhancement::StretchToMinimumMaximum
// , QgsRasterMinMaxOrigin::StdDev, myRectangle);
QList<QgsMapLayer*> mapLayers;
mapLayers << mapLayer;
QgsProject::instance()->addMapLayers(mapLayers);
//zoomToSelectedLayer(mapLayer);
}
else if ("shp" == fileInfo.suffix())
{
vecLayer = new QgsVectorLayer(fileInfo.filePath(), layerPath);
if (!vecLayer)
return;
QgsMapLayer* mapLayer = vecLayer;
QList<QgsMapLayer*> mapLayers;
mapLayers << mapLayer;
QgsProject::instance()->addMapLayers(mapLayers);
}
}
}

92
DEM_Fill/DEM_Fill.h Normal file
View File

@ -0,0 +1,92 @@
#pragma once
#include <QtWidgets/QDialog>
#include <QProcess>
#include <QThread>
#include <QFile>
#include <QDebug>
#include <QMessageBox>
#include <QFileDialog>
#include <QStringList>
#include <QIntValidator>
#include <QRegExpValidator>
#include "SrsMainPluginInterFace.h"
#include "ui_DEM_Fill.h"
#include <string>
#include <iostream>
using namespace std;
class WorkThreadObject :public QObject
{
Q_OBJECT
public:
int run_cmd(const char* cmd);
signals:
void process(int value);
void sendMaskedTiff(QStringList maskedData);
public slots:
void runFillingWork(QString in_masked, QString out_filled, QString scale, QString size);
void readProcessStandardOutput();
private:
QProcess* mProcess = nullptr;
QString outTiffPath, tifflinear, tiffcubic;
};
class DataFilling : public SrsMainInterface
{
Q_OBJECT
Q_INTERFACES(SrsMainInterface)
Q_PLUGIN_METADATA(IID MainInterface_iid)
public:
DataFilling();
virtual QString PannelName() override;
virtual QString CategoryName() override;
virtual QString EnglishName() override;
virtual QString ChineseName() override;
virtual QString Information() override;
virtual QString IconPath() override;
virtual QWidget* CenterWidget() override;
void startWorkThread();
//读json文件获取历史存储的路径
void ReadConfigHistoryPaths(QString strPath);
//保存本次打开的路径到json文件
void WriteConfigPaths(QString strPath);
public slots:
//pushbutton_OK
void readAndStart();
void pbCancel();
void chooseMaskedSlope();
void chooseOutFill();
void openResultData(QStringList string_list);
signals:
void startDataFill(QString in_masked, QString out_filled, QString scale, QString size);
private:
Ui::DEM_FillClass ui;
QDialog* myWidget = nullptr;
QThread* mWorkThread = nullptr;
WorkThreadObject* mWorker = nullptr;
QString outPath;
};

6
DEM_Fill/DEM_Fill.qrc Normal file
View File

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/DEM_Fill">
<file>resources/fill.svg</file>
<file>DEM_Fill.qss</file>
</qresource>
</RCC>

View File

@ -15,6 +15,7 @@ QProgressBar#progressBar QLineEdit {
background-color:transparent; background-color:transparent;
} }
QLabel{ QLabel{
color:black; color:black;
font-family:'Microsoft YaHei'; font-family:'Microsoft YaHei';
@ -22,8 +23,7 @@ QLabel{
} }
/*----QPushButtonÑùʽ±í*/ /*----QPushButtonÑùʽ±í*/
#pushButton_ok, #pushButton_cancel, #pbt_DOM, #pbt_DSM , #pushButton_ok, #pushButton_cancel, #pbtMasked, #pbtOutFill{
#pbt_Label, #pbt_PRE, #pbt_Moudle {
font-family:'Microsoft YaHei'; font-family:'Microsoft YaHei';
font-size:12px; font-size:12px;
background-color: #ffffff; background-color: #ffffff;
@ -32,42 +32,37 @@ QLabel{
border-radius: 5px; border-radius: 5px;
max-height:20px; max-height:20px;
} }
#pushButton_ok, #pushButton_cancel{ #pushButton_ok:hover, #pushButton_cancel:hover, #pbtMasked:hover, #pbtOutFill:hover{
min-width:36px;
}
#pushButton_ok:hover, #pushButton_cancel:hover, #pbt_DOM:hover, #pbt_DSM:hover
,#pbt_Label:hover, #pbt_PRE:hover, #pbt_Moudle:hover {
background-color: #ecf5ff; background-color: #ecf5ff;
color: #409eff; color: #409eff;
} }
#pushButton_ok:pressed, #pushButton_cancel:pressed, #pbt_DOM:pressed, #pbt_DSM:pressed #pushButton_ok:pressed, #pushButton_cancel:pressed, #pbtMasked:pressed, #pbtOutFill:pressed{
,#pbt_Label:pressed, #pbt_PRE:pressed, #pbt_Moudle:pressed {
border: 1px solid #3a8ee6; border: 1px solid #3a8ee6;
color: #409eff; color: #409eff;
} }
#pushButton_ok:checked, #pushButton_cancel:checked, #pbt_DOM:checked, #pbt_DSM:checked #pushButton_ok:checked, #pushButton_cancel:checked, #pbtMasked:checked, #pbtOutFill:checked{
,#pbt_Label:checked, #pbt_PRE:checked, #pbt_Moudle:checked{
border: 1px solid #3a8ee6; border: 1px solid #3a8ee6;
color: #409eff; color: #409eff;
} }
#pushButton_ok:focus, #pushButton_cancel:focus, #pbt_DOM:focus, #pbt_DSM:focus #pushButton_ok:focus, #pushButton_cancel:focus, #pbtMasked:focus, #pbtOutFill:focus{
,#pbt_Label:focus, #pbt_PRE:focus, #pbt_Moudle:focus{
border: 1px solid #3a8ee6; border: 1px solid #3a8ee6;
color: #409eff; color: #409eff;
outline: none; outline: none;
} }
#pushButton_ok, #pushButton_cancel{
min-width:36px;
}
/*----QLineEditÑùʽ*/ /*----QLineEditÑùʽ*/
#line_DOM, #line_DSM, #line_Label, #line_PRE, #line_Moudle{ #lineMasked, #lineOutFill,#lineRectangleScale,#lineExpandSize{
border:0px; border:0px;
border-bottom: 1px solid #B3B3B3; border-bottom: 1px solid #B3B3B3;
font-family:'Microsoft YaHei'; font-family:'Microsoft YaHei';
font-size:12px;
background-color:transparent; background-color:transparent;
} }
#line_DOM:hover, #line_DSM:hover, #line_Label:hover, #line_PRE:hover, #line_Moudle:hover{ #lineMasked:hover, #lineOutFill:hover,#lineRectangleScale:hover,#lineExpandSize:hover{
border-bottom: 2px solid #66A3FF; border-bottom: 2px solid #66A3FF;
} }
#line_DOM:focus, #line_DSM:focus, #line_Label:focus, #line_PRE:focus, #line_Moudle:focus{ #lineMasked:focus, #lineOutFill:focus,#lineRectangleScale:focus,#lineExpandSize:focus{
border-bottom: 2px solid #7666FF; border-bottom: 2px solid #7666FF;
} }

236
DEM_Fill/DEM_Fill.ui Normal file
View File

@ -0,0 +1,236 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DEM_FillClass</class>
<widget class="QDialog" name="DEM_FillClass">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>250</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>250</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>400</width>
<height>250</height>
</size>
</property>
<property name="windowTitle">
<string>DEM_Fill</string>
</property>
<property name="windowIcon">
<iconset resource="DEM_Fill.qrc">
<normaloff>:/DEM_Fill/resources/fill.svg</normaloff>:/DEM_Fill/resources/fill.svg</iconset>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>输入裁剪后的DEM文件</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLineEdit" name="lineMasked"/>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pbtMasked">
<property name="minimumSize">
<size>
<width>75</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>选择文件夹</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>输出数据填补结果文件</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLineEdit" name="lineOutFill"/>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="pbtOutFill">
<property name="minimumSize">
<size>
<width>75</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>选择文件夹</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="topMargin">
<number>12</number>
</property>
<property name="bottomMargin">
<number>12</number>
</property>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>外接矩形外扩比例</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineRectangleScale"/>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>空洞外扩像素</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineExpandSize"/>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>81</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_ok">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>确定</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>13</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_cancel">
<property name="text">
<string>取消</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QProgressBar" name="progressBar">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<tabstops>
<tabstop>lineMasked</tabstop>
<tabstop>pbtMasked</tabstop>
<tabstop>lineOutFill</tabstop>
<tabstop>pbtOutFill</tabstop>
<tabstop>lineRectangleScale</tabstop>
<tabstop>lineExpandSize</tabstop>
<tabstop>pushButton_ok</tabstop>
<tabstop>pushButton_cancel</tabstop>
</tabstops>
<resources>
<include location="DEM_Fill.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -7,11 +7,10 @@
</ProjectConfiguration> </ProjectConfiguration>
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<ProjectGuid>{AAEF388B-265D-4CF4-8832-9E6CD50B4644}</ProjectGuid> <ProjectGuid>{32F04C81-EC93-432F-9B60-0B92B5FCC5C5}</ProjectGuid>
<Keyword>QtVS_v304</Keyword> <Keyword>QtVS_v304</Keyword>
<WindowsTargetPlatformVersion Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">10.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">10.0.19041.0</WindowsTargetPlatformVersion>
<QtMsBuild Condition="'$(QtMsBuild)'=='' OR !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild> <QtMsBuild Condition="'$(QtMsBuild)'=='' OR !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
<ProjectName>DEM_Predict</ProjectName>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'" Label="Configuration">
@ -38,13 +37,13 @@
</ImportGroup> </ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<TargetName>dem4-$(ProjectName)</TargetName>
<IncludePath>D:\qgis\osgeo4w\include;D:\qgis\osgeo4w\apps\Qt5\include;D:\qgis\osgeo4w\apps\qgis_build_sdk\include;D:\qgis\osgeo4w\apps\Qt5\include\QtXml;$(IncludePath)</IncludePath> <IncludePath>D:\qgis\osgeo4w\include;D:\qgis\osgeo4w\apps\Qt5\include;D:\qgis\osgeo4w\apps\qgis_build_sdk\include;D:\qgis\osgeo4w\apps\Qt5\include\QtXml;$(IncludePath)</IncludePath>
<LibraryPath>D:\qgis\osgeo4w\lib;D:\qgis\osgeo4w\apps\Qt5\lib;D:\qgis\osgeo4w\apps\qgis_build_sdk\lib;$(LibraryPath)</LibraryPath> <LibraryPath>D:\qgis\osgeo4w\lib;D:\qgis\osgeo4w\apps\Qt5\lib;D:\qgis\osgeo4w\apps\qgis_build_sdk\lib;$(LibraryPath)</LibraryPath>
<TargetName>dem3-demPredict</TargetName>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Link> <Link>
<AdditionalDependencies>gdal_i.lib;qgis_gui.lib;qgis_analysis.lib;qgis_core.lib;qgis_native.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>qgis_gui.lib;qgis_analysis.lib;qgis_core.lib;qgis_native.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'" Label="Configuration"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'" Label="Configuration">
@ -56,32 +55,25 @@
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="im2shp.cpp" /> <QtRcc Include="DEM_Fill.qrc" />
<ClCompile Include="QtGDALProcessBar.cpp" /> <QtUic Include="DEM_Fill.ui" />
<ClCompile Include="ThreadObject.cpp" /> <QtMoc Include="DEM_Fill.h" />
<QtRcc Include="DEM_GeneRas.qrc" /> <ClCompile Include="DEM_Fill.cpp" />
<QtMoc Include="DEM_GeneRas.h" />
<ClCompile Include="DEM_GeneRas.cpp" />
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtUic Include="DEM_GeneRas.ui" />
</ItemGroup>
<ItemGroup>
<QtMoc Include="ThreadObject.h" />
<QtMoc Include="SrsMainPluginInterFace.h" /> <QtMoc Include="SrsMainPluginInterFace.h" />
<ClInclude Include="CProcessBase.h" />
<ClInclude Include="im2shp.h" />
<QtMoc Include="QtGDALProcessBar.h" />
<ClInclude Include="x64\Release\uic\ui_DEM_GeneRas.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="DEM_GeneRas.qss" /> <ClInclude Include="x64\Release\uic\ui_DEM_Fill.h" />
</ItemGroup>
<ItemGroup>
<None Include="DEM_Fill.qss" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')"> <ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">

View File

@ -21,18 +21,18 @@
<UniqueIdentifier>{639EADAA-A684-42e4-A9AD-28FC9BCB8F7C}</UniqueIdentifier> <UniqueIdentifier>{639EADAA-A684-42e4-A9AD-28FC9BCB8F7C}</UniqueIdentifier>
<Extensions>ts</Extensions> <Extensions>ts</Extensions>
</Filter> </Filter>
<Filter Include="process">
<UniqueIdentifier>{8ac62ded-3917-412e-99b7-44350c87e7c8}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtRcc Include="DEM_GeneRas.qrc"> <QtRcc Include="DEM_Fill.qrc">
<Filter>Resource Files</Filter> <Filter>Resource Files</Filter>
</QtRcc> </QtRcc>
<QtMoc Include="DEM_GeneRas.h"> <QtUic Include="DEM_Fill.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtMoc Include="DEM_Fill.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<ClCompile Include="DEM_GeneRas.cpp"> <ClCompile Include="DEM_Fill.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
@ -40,45 +40,19 @@
<ClCompile Include="main.cpp"> <ClCompile Include="main.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="im2shp.cpp">
<Filter>process</Filter>
</ClCompile>
<ClCompile Include="QtGDALProcessBar.cpp">
<Filter>process</Filter>
</ClCompile>
<ClCompile Include="ThreadObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<QtUic Include="DEM_GeneRas.ui">
<Filter>Form Files</Filter>
</QtUic>
</ItemGroup>
<ItemGroup>
<ClInclude Include="x64\Release\uic\ui_DEM_GeneRas.h">
<Filter>Form Files</Filter>
</ClInclude>
<ClInclude Include="im2shp.h">
<Filter>process</Filter>
</ClInclude>
<ClInclude Include="CProcessBase.h">
<Filter>process</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="SrsMainPluginInterFace.h"> <QtMoc Include="SrsMainPluginInterFace.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="QtGDALProcessBar.h">
<Filter>process</Filter>
</QtMoc>
<QtMoc Include="ThreadObject.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="DEM_GeneRas.qss"> <ClInclude Include="x64\Release\uic\ui_DEM_Fill.h">
<Filter>Form Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="DEM_Fill.qss">
<Filter>Resource Files</Filter> <Filter>Resource Files</Filter>
</None> </None>
</ItemGroup> </ItemGroup>

10
DEM_Fill/main.cpp Normal file
View File

@ -0,0 +1,10 @@
#include "DEM_Fill.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
DataFilling w;
w.CenterWidget()->show();
return a.exec();
}

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg width="26" height="26" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="6" y="6" width="36" height="36" rx="3" fill="none" stroke="#2c2c2c" stroke-width="3" stroke-linecap="butt" stroke-linejoin="round"/><rect x="14" y="14" width="20" height="20" fill="none" stroke="#2c2c2c" stroke-width="3" stroke-linecap="butt" stroke-linejoin="round"/><path d="M34 23L23 34" stroke="#2c2c2c" stroke-width="3" stroke-linecap="butt" stroke-linejoin="round"/><path d="M25 14L14 25" stroke="#2c2c2c" stroke-width="3" stroke-linecap="butt" stroke-linejoin="round"/><path d="M34 14L14 34" stroke="#2c2c2c" stroke-width="3" stroke-linecap="butt" stroke-linejoin="round"/><path d="M14 22V34H26" stroke="#2c2c2c" stroke-width="3" stroke-linecap="butt" stroke-linejoin="round"/><path d="M22 14H34V26" stroke="#2c2c2c" stroke-width="3" stroke-linecap="butt" stroke-linejoin="round"/></svg>

After

Width:  |  Height:  |  Size: 936 B

View File

@ -1,98 +0,0 @@
#pragma once
#include <iostream>
using namespace std;
/**
* @brief
*
*
*/
//源码class IMGALG_API CProcessBase
class CProcessBase
{
public:
/**
* @brief
*/
CProcessBase()
{
m_dPosition = 0.0;
m_iStepCount = 100;
m_iCurStep = 0;
m_bIsContinue = true;
}
/**
* @brief
*/
virtual ~CProcessBase() {}
/**
* @brief
* @param pszMsg
*/
virtual void SetMessage(const char* pszMsg) = 0;
/**
* @brief
* @param dPosition
* @return true为不取消false为取消
*/
virtual bool SetPosition(double dPosition) = 0;
/**
* @brief true表示继续false表示取消
* @return true为不取消false为取消
*/
virtual bool StepIt() = 0;
/**
* @brief
* @param iStepCount
*/
virtual void SetStepCount(int iStepCount)
{
ReSetProcess();
m_iStepCount = iStepCount;
}
/**
* @brief
* @return
*/
string GetMessage()
{
return m_strMessage;
}
/**
* @brief
* @return
*/
double GetPosition()
{
return m_dPosition;
}
/**
* @brief
*/
void ReSetProcess()
{
m_dPosition = 0.0;
m_iStepCount = 100;
m_iCurStep = 0;
m_bIsContinue = true;
}
/*! 进度信息 */
string m_strMessage;
/*! 进度值 */
double m_dPosition;
/*! 进度个数 */
int m_iStepCount;
/*! 进度当前个数 */
int m_iCurStep;
/*! 是否取消值为false时表示计算取消 */
bool m_bIsContinue;
};

View File

@ -1,333 +0,0 @@
#include "DEM_GeneRas.h"
#include <qgsrasterlayer.h>
#include <qgsvectorlayer.h>
#include <qgsmapcanvas.h>
#include <QSettings>
VegePredict::VegePredict()
{
//ui.setupUi(this);
}
VegePredict::~VegePredict()
{
}
QString VegePredict::PannelName()
{
return QString::fromLocal8Bit("");
}
QString VegePredict::CategoryName()
{
return QString::fromLocal8Bit("DEM模块");
}
QString VegePredict::EnglishName()
{
return QString::fromLocal8Bit("DEM_Module");
}
QString VegePredict::ChineseName()
{
return QString::fromLocal8Bit("植被预测");
}
QString VegePredict::Information()
{
return QString::fromLocal8Bit("植被预测");
}
QString VegePredict::IconPath()
{
return ":/DEM_GeneRas/resources/dem_ras.svg";
}
QWidget* VegePredict::CenterWidget()
{
//QString str = QString("%1->%2,thread id:%3").arg(__FILE__).arg(__FUNCTION__).arg((int)QThread::currentThreadId());
//qDebug() << str;
QString gdal_path = qApp->applicationDirPath().toLocal8Bit() + "/share/gdal";
QString pro_lib_path = qApp->applicationDirPath().toLocal8Bit() + "/share/proj";
qputenv("GDAL_DATA", gdal_path.toLocal8Bit());
qputenv("PROJ_LIB", pro_lib_path.toLocal8Bit());
bool showWin = false;
if (myWidget == nullptr)
{
myWidget = new QDialog();
showWin = true;
qDebug() << "new QDialog()";
}
else
{
qDebug() << "already have myWidget";
//激活窗口并提升至顶层
myWidget->activateWindow();
myWidget->raise();
return myWidget;
}
ui.setupUi(myWidget);
myWidget->setWindowTitle(QString::fromLocal8Bit("植被预测"));
myWidget->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint);
myWidget->setWindowIcon(QIcon(":/DEM_GeneRas/resources/dem_ras.svg"));
myWidget->setAttribute(Qt::WA_QuitOnClose, false);
myWidget->setAttribute(Qt::WA_DeleteOnClose);
connect(myWidget, &QDialog::destroyed, this, [=]() {
qDebug() << "----DEM Predict window close----";
QDir pluginsDir = QDir(qApp->applicationDirPath());
if (pluginsDir.cd("srsplugins\\DemModel"))
{
QString strConfigPath = pluginsDir.absoluteFilePath("dem_config.ini");
QFile f(strConfigPath);
if (f.exists())
{
WriteConfigPaths(strConfigPath);
f.close();
}
}
if (mWorkThread != nullptr)
{
mWorkThread->requestInterruption();//请求线程中断
mWorkThread->quit();
mWorkThread->wait();//调用wait后先调用finished信号对应的槽函数执行完成后再往下走
mWorker->on_cancel();
mWorkThread = nullptr;//mWorkThread, &QThread::finished, mWorkThread, &QObject::deleteLater不需要delete
mWorker = nullptr;//mWorkThread, &QThread::finished, mWorker, &QObject::deleteLater
}
myWidget->close();
myWidget = nullptr;
//qDebug() << "--destroyed";
});
connect(ui.pbt_DOM, &QPushButton::clicked, this, &VegePredict::chooseDomPath);
connect(ui.pbt_DSM, &QPushButton::clicked, this, &VegePredict::chooseDsmPath);
//connect(ui.pbt_Label, &QPushButton::pressed, this, &VegePredict::chooseLabelPath);
connect(ui.pbt_PRE, &QPushButton::clicked, this, &VegePredict::choosePreDir);
connect(ui.pbt_Moudle, &QPushButton::clicked, this, &VegePredict::chooseMouleFile);
connect(ui.pushButton_ok, &QPushButton::clicked, this, &VegePredict::readAndStart);
connect(ui.pushButton_cancel, &QPushButton::clicked, this, &VegePredict::pbCancel);
ui.progressBar->setTextVisible(true);
ui.progressBar->setRange(0, 100);
QFile qssFile(":/DEM_GeneRas/DEM_GeneRas.qss");
qssFile.open(QFile::ReadOnly); //以只读方式打开
if (qssFile.isOpen())
{
QString qss = QLatin1String(qssFile.readAll());
myWidget->setStyleSheet(qss);
qssFile.close();
}
else
qDebug() << "无法打开文件";
QDir pluginsDir = QDir(qApp->applicationDirPath());
if (pluginsDir.cd("srsplugins\\DemModel"))
{
QString strConfigPath = pluginsDir.absoluteFilePath("dem_config.ini");
QFile f(strConfigPath);
if (f.exists())
{
ReadConfigHistoryPaths(strConfigPath);
f.close();
}
}
if (showWin)
myWidget->show();
return myWidget;
}
void VegePredict::startWorkThread()
{
if (mWorker != nullptr)
{
return;
}
mWorkThread = new QThread();
mWorker = new WorkThreadObject();
mWorker->moveToThread(mWorkThread);
connect(mWorkThread, &QThread::finished, mWorkThread, &QObject::deleteLater);
connect(mWorkThread, &QThread::finished, mWorker, &QObject::deleteLater);
connect(mWorker, &WorkThreadObject::process, myWidget, [=](int value) {ui.progressBar->setValue(value); });
connect(mWorker, &WorkThreadObject::addDataToMap, this, &VegePredict::addMap);
connect(mWorker, &WorkThreadObject::addShpDataToMap, this, &VegePredict::openResultData);
connect(this, &VegePredict::killChildThread, mWorker, &WorkThreadObject::on_cancel);
connect(this, &VegePredict::startTiffToShp, mWorker, &WorkThreadObject::runFormatConvert);
connect(this, &VegePredict::start, mWorker, &WorkThreadObject::runPredictWork);
mWorkThread->start();
}
void VegePredict::chooseDomPath()
{
QString dirDom = QFileDialog::getExistingDirectory(ui.pbt_DOM, QString::fromLocal8Bit("选择输入DOM文件路径"), "");
if (dirDom != "")
ui.line_DOM->setText(dirDom);
}
void VegePredict::chooseDsmPath()
{
QString dirDsm = QFileDialog::getExistingDirectory(ui.pbt_DSM, QString::fromLocal8Bit("选择输入Slope文件路径"), "");
if (dirDsm != "")
ui.line_DSM->setText(dirDsm);
}
void VegePredict::choosePreDir()
{
QString dirPre = QFileDialog::getExistingDirectory(ui.pbt_PRE, QString::fromLocal8Bit("选择预测结果输出文件路径"), "");
if (dirPre != "")
ui.line_PRE->setText(dirPre);
}
void VegePredict::chooseMouleFile()
{
QString dirPre = QFileDialog::getOpenFileName(ui.pbt_Moudle, QString::fromLocal8Bit("选择模型文件"), "", "*.pth");
if (dirPre != "")
ui.line_Moudle->setText(dirPre);
}
void VegePredict::addMap()
{
QMessageBox mess(QMessageBox::NoIcon,
QString::fromLocal8Bit("植被预测结束"),
QString::fromLocal8Bit("将对如下路径中结果进行转矢量处理:\n") + ui.line_PRE->text(),
QMessageBox::Ok, NULL);
mess.setWindowFlags(Qt::Drawer);
mess.setButtonText(QMessageBox::Ok, QString::fromLocal8Bit("确认"));
int result = mess.exec();
switch (result)
{
case QMessageBox::Ok:
emit startTiffToShp(ui.line_PRE->text(), ui.line_DSM->text());
ui.label_process->setText(QString::fromLocal8Bit("转矢量进度:"));
ui.progressBar->setValue(0);
break;
default:
break;
}
}
void VegePredict::ReadConfigHistoryPaths(QString strPath)
{
QSettings configIni(strPath, QSettings::IniFormat);
//打开标题为:[DemPredict] 的组
configIni.beginGroup("DemPredict");
ui.line_DOM->setText(configIni.value("SrcDom").toString());
ui.line_DSM->setText(configIni.value("SrcDsm").toString());
ui.line_PRE->setText(configIni.value("PredictResult").toString());
configIni.endGroup();//关闭组
}
void VegePredict::WriteConfigPaths(QString strPath)
{
QSettings configIni(strPath, QSettings::IniFormat);
configIni.setIniCodec("utf-8");
//打开标题为:[DemPredict] 的组
configIni.beginGroup("DemPredict");
//更新输入DOM路径
QString temp = ui.line_DOM->text();
if (temp != "")
configIni.setValue("SrcDom", temp);
//更新输入DSM路径
temp = ui.line_DSM->text();
if (temp != "")
configIni.setValue("SrcDsm", temp);
//更新输出结果路径
temp = ui.line_PRE->text();
if (temp != "")
configIni.setValue("PredictResult", temp);
configIni.endGroup();//关闭组
}
void VegePredict::readAndStart()
{
QString dirDOM = ui.line_DOM->text();
QString dirDSM = ui.line_DSM->text();
QString dirPRE = ui.line_PRE->text();
QString fileMoudle = ui.line_Moudle->text();
ui.progressBar->setValue(0);
if (dirDOM == "" || dirDSM == "" || dirPRE == "" || fileMoudle == "")
{
QMessageBox mess(QMessageBox::NoIcon, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("请检查输入输出文件或路径"));
mess.setWindowFlags(Qt::Drawer);
int result = mess.exec();
return;
}
//startObjThread();
if (mWorkThread == nullptr)
{
qDebug() << "--startThread";
startWorkThread();
}
//std::function<void(int)>processCallback = [=](int val) {
// ui.progressBar->setValue(val);
// qDebug() << val << endl;
//};//类间回调函数;
/////////////////////////////////////////////////////////////////////
//emit startTiffToShp(ui.line_PRE->text(), ui.line_Label->text());
/////////////////////////////////////////////////////////////////////
ui.label_process->setText(QString::fromLocal8Bit("预测进度:"));
emit start(fileMoudle, dirDOM, dirDSM, dirPRE);//, processCallback
}
void VegePredict::pbCancel()
{
delete myWidget;//调起&QDialog::destroyed
}
void VegePredict::openResultData(QStringList string_list)
{
if (string_list.isEmpty())
return;
QgsRasterLayer* rastLayer;
QgsVectorLayer* vecLayer;
for each (QString layerPath in string_list)
{
QFileInfo fileInfo(layerPath);
QString layerBaseName = fileInfo.baseName(); // 图层名称
if ("tif" == fileInfo.suffix() || "tiff" == fileInfo.suffix())
{
rastLayer = new QgsRasterLayer(fileInfo.filePath(), layerPath, "gdal");
if (!rastLayer)
return;
QgsMapLayer* mapLayer = rastLayer;
QgsRectangle myRectangle;
rastLayer->setContrastEnhancement(QgsContrastEnhancement::StretchToMinimumMaximum
, QgsRasterMinMaxOrigin::StdDev, myRectangle);
QList<QgsMapLayer*> mapLayers;
mapLayers << mapLayer;
QgsProject::instance()->addMapLayers(mapLayers);
//zoomToSelectedLayer(mapLayer);
}
else if ("shp" == fileInfo.suffix())
{
vecLayer = new QgsVectorLayer(fileInfo.filePath(), layerPath);
if (!vecLayer)
return;
QgsMapLayer* mapLayer = vecLayer;
QList<QgsMapLayer*> mapLayers;
mapLayers << mapLayer;
QgsProject::instance()->addMapLayers(mapLayers);
}
}
}

View File

@ -1,75 +0,0 @@
#pragma once
#include <QtWidgets/QDialog>
#include <QFileDialog>
#include <QMetaType>
#include <QDialog>
#include <QDebug>
#include <QObject>
#include <QMessageBox>
#include <QPushButton>
#include <QString>
#include <QThread>
#include <QVector>
#include "ui_DEM_GeneRas.h"
#include "ThreadObject.h"
#include "SrsMainPluginInterFace.h"
#include "gdal_priv.h"
//#include "gdal_alg_priv.h"
class VegePredict : public SrsMainInterface
{
Q_OBJECT
Q_INTERFACES(SrsMainInterface)
Q_PLUGIN_METADATA(IID MainInterface_iid)
public:
VegePredict();
~VegePredict();
virtual QString PannelName() override;
virtual QString CategoryName() override;
virtual QString EnglishName() override;
virtual QString ChineseName() override;
virtual QString Information() override;
virtual QString IconPath() override;
virtual QWidget* CenterWidget() override;
//读json文件获取历史存储的路径
void ReadConfigHistoryPaths(QString strPath);
//保存本次打开的路径到json文件
void WriteConfigPaths(QString strPath);
void startWorkThread();
void openResultData(QStringList string_list);
public slots:
void chooseDomPath();
void chooseDsmPath();
void choosePreDir();
void chooseMouleFile();
void addMap();
void readAndStart();
void pbCancel();
signals:
void start(QString Moudle, QString DOM, QString DSM, QString PRE);//, std::function<void(int)>func
void killChildThread();
void startTiffToShp(QString PRE, QString DSM);
private:
Ui::DEM_GeneRasClass ui;
QDialog* myWidget = nullptr;
WorkThreadObject* mWorker = nullptr;
QThread* mWorkThread = nullptr;
};

View File

@ -1,6 +0,0 @@
<RCC>
<qresource prefix="/DEM_GeneRas">
<file>resources/dem_ras.svg</file>
<file>DEM_GeneRas.qss</file>
</qresource>
</RCC>

View File

@ -1,325 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DEM_GeneRasClass</class>
<widget class="QDialog" name="DEM_GeneRasClass">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>500</width>
<height>300</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>500</width>
<height>300</height>
</size>
</property>
<property name="windowTitle">
<string/>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="2">
<widget class="QPushButton" name="pbt_Moudle">
<property name="text">
<string>选择文件</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>输入模型文件路径</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>输入DSM文件路径</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pbt_DOM">
<property name="minimumSize">
<size>
<width>75</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>选择文件夹</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="line_PRE"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>输入DOM文件路径</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="pbt_DSM">
<property name="minimumSize">
<size>
<width>75</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>选择文件夹</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>预测结果文件路径</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="line_Moudle"/>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="pbt_PRE">
<property name="minimumSize">
<size>
<width>75</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>选择文件夹</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="line_DOM">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="line_DSM">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_ok">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>确定</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_cancel">
<property name="text">
<string>取消</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_process">
<property name="text">
<string>进度:</string>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="progressBar">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
<include location="DEM_GeneRas.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -1,100 +0,0 @@
#include "QtGDALProcessBar.h"
#include <QCoreApplication>
QtGDALProcessBar::QtGDALProcessBar(QWidget *parent)
: QProgressBar(parent)
{
//ui.setupUi(this);
this->setTextVisible(true);
m_dPosition = 0.0;
m_iStepCount = 100;
m_iCurStep = 0;
}
QtGDALProcessBar::~QtGDALProcessBar()
{
}
/**
* @brief
* @param pszMsg
*/
void QtGDALProcessBar::SetMessage(const char* pszMsg)
{
if (pszMsg != NULL)
{
m_strMessage = pszMsg;
//setLabelText(QString(pszMsg));
}
}
/**
* @brief
* @param dPosition
*/
bool QtGDALProcessBar::SetPosition(double dPosition)
{
m_dPosition = dPosition;
//cout << "m_dPosition " << m_dPosition << endl;
//current_value = value();
int temp_value = int(m_start_value +std::min(100u, (uint)(m_dPosition * 100.0 )) * m_scale);
setValue(temp_value);
//setFormat(tr("%1%").arg(temp_value));
//cout << "StepIt " << temp_value << "\t" << "current_value" << int(m_start_value + temp_value * m_scale) << endl;
//QCoreApplication::instance()->processEvents();
//this->update();
//if (this->wasCanceled())
// return false;
return true;
}
bool QtGDALProcessBar::SetStartEndValue(int i_start_value, int i_end_value)
{
if (i_end_value< i_start_value )
{
return false;
}
else
{
m_start_value = i_start_value;
m_end_value = i_end_value;
m_scale = (m_end_value - m_start_value) / 100.0;
return true;
}
}
/**
* @brief ,false表示终止操作
*/
bool QtGDALProcessBar::StepIt()
{
m_iCurStep++;
m_dPosition = m_iCurStep * 1.0 / m_iStepCount;
//current_value = value();
int temp_value = std::min(100u, (uint)(m_dPosition * 100.0));
setValue(int(m_start_value + temp_value * m_scale));
//setFormat(QString("当前进度为:%1%").arg(temp_value));
//cout << "StepIt " << temp_value <<"\t"<<"current_value"<< current_value << endl;
//QCoreApplication::instance()->processEvents();
//if (this->wasCanceled())
// return false;
return true;
}
void QtGDALProcessBar::updateProgress(int step)
{
this->setValue(step);
//this->update();
//cout << "updateProgress " << step << endl;
//QCoreApplication::instance()->processEvents();
}

View File

@ -1,62 +0,0 @@
#pragma once
#include <QProgressBar>
#include "CProcessBase.h"
class QtGDALProcessBar : public QProgressBar,public CProcessBase
{
Q_OBJECT
public:
QtGDALProcessBar(QWidget *parent = Q_NULLPTR);
~QtGDALProcessBar();
/**
* @brief
* @param pszMsg
*/
void SetMessage(const char* pszMsg);
/**
* @brief
* @param dPosition
*/
bool SetPosition(double dPosition);
/// <summary>
/// 设置进度条开始结束值
/// </summary>
/// <param name="i_start_value"></param>
/// <returns></returns>
bool SetStartEndValue(int i_start_value,int i_end_value);
/**
* @brief
*/
bool StepIt();
/// <summary>
/// 当前进度值
/// </summary>
int current_value;
public slots:
void updateProgress(int);
private:
/// <summary>
/// 进度条开始值
/// </summary>
int m_start_value;
/// <summary>
/// 进度条结束值
/// </summary>
int m_end_value;
float m_scale;
};

View File

@ -1,117 +0,0 @@
#include <QProcess>
#include <QDir>
#include <QApplication>
#include <QDebug>
#include <QTimer>
#include <windows.h>
#include "DEM_GeneRas.h"
#include "ThreadObject.h"
#include "im2shp.h"
using namespace std;
WorkThreadObject::WorkThreadObject(QObject* parent) :QObject(parent)
{
qRegisterMetaType<std::function<void(int)> >("std::function<void(int)>");
}
WorkThreadObject::~WorkThreadObject()
{
}
void WorkThreadObject::runPredictWork(QString Moudle, QString DOM, QString DSM, QString PRE)//, std::function<void(int)>func
{
QString str = QString("%1->%2,thread id:%3").arg(__FILE__).arg(__FUNCTION__).arg((int)QThread::currentThreadId());
QDir pluginsDir = QDir(qApp->applicationDirPath());
qDebug() << str << "----" << pluginsDir.currentPath();
if (!pluginsDir.cd("models\\envs"))
{
qDebug() << "no folder models\\envs";
return;
}
QString exeDirName = pluginsDir.absoluteFilePath("predict_4c_vegetation.exe");
qDebug() << "----" << exeDirName;
QString model = " --model_path " + Moudle;
QString dom_path = " --dom_path " + DOM + "/";
QString dsm_path = " --dsm_path " + DSM + "/";
QString pre_dir = " --pre_path " + PRE + "/";
QString ss = exeDirName + model + dom_path + dsm_path + pre_dir;
qDebug() << ss;
QProcess* pProces = new QProcess(this);
connect(pProces, SIGNAL(readyReadStandardOutput()), this, SLOT(on_read()));
pProces->start(ss);
emit process(2);
}
void WorkThreadObject::on_read()
{
mProces = (QProcess*)sender();
QString output = QString::fromLocal8Bit(mProces->readAllStandardOutput());
if (output.toFloat() > 0)
{
qDebug() << "exe out:" << output.toFloat();
emit process(output.toFloat());
if (output.toFloat() == 100.0)
emit addDataToMap();
}
else
qDebug() << "Unresolved exe out:" << output;
}
void WorkThreadObject::runFormatConvert(QString pre_path, QString DSM)
{
QDir dir(pre_path);
QStringList nameFilters;
nameFilters << "*.tif" << "*.tiff";
QStringList pre_tiff_files = dir.entryList(nameFilters, QDir::Files | QDir::Readable, QDir::Name);
int list_len = pre_tiff_files.size();
for (int i = 0; i < list_len; i++)
{
emit process(float(i) / float(list_len) * 95);
qDebug() << "TiffToShp progress:" << float(i) / float(list_len) * 100;
QString file_path = pre_path + "\\" + pre_tiff_files[i];
QString dsm_path = DSM + "\\" + pre_tiff_files[i];
string path_preTiff = file_path.toStdString();
string pathPureName = path_preTiff.substr(0, path_preTiff.rfind("."));
string shp_path = pathPureName + ".shp";
//调起栅格转矢量
img2shp cc;
QtGDALProcessBar* gb = new QtGDALProcessBar();
bool returnval = cc.ImagePolygonize(path_preTiff.c_str(), shp_path.c_str(), "ESRI Shapefile", 1, gb, gb);
if (returnval == true)
{
QStringList list;
list << dsm_path << QString::fromStdString(shp_path);
emit addShpDataToMap(list);
}
else
{
//QMessageBox mess(QMessageBox::NoIcon, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("请检查输入数据"));
//mess.setWindowFlags(Qt::Drawer);
//int result = mess.exec();
//return;
}
}
emit process(100);
}
void WorkThreadObject::on_cancel()
{
if (mProces == nullptr)
{
qDebug() << "--mProces null";
}
else
{
//py打包exe文件名
QString KillStr = "taskkill /f /im predict_4c_vegetation.exe";
mProces->startDetached(KillStr);
qDebug() << "--kill Proces";
}
}

View File

@ -1,47 +0,0 @@
#ifndef THREADOBJECT_H
#define THREADOBJECT_H
#include <functional>
#include <QMessageBox>
#include <QObject>
#include <QProcess>
#include <QThread>
#include <QVector>
#include <QDateTime>
#include <iostream>
//#include "qtclasslibrary1_global.h"
#include "SrsMainPluginInterFace.h"
#include "ui_DEM_GeneRas.h"
//#include "Extract.h"
using namespace std;
class VegePredict;
class WorkThreadObject :public QObject
{
Q_OBJECT
public:
WorkThreadObject(QObject* parent = NULL);
~WorkThreadObject();
void on_cancel();
signals:
void process(int value);
void addDataToMap();
void addShpDataToMap(QStringList list);
public slots:
void runPredictWork(QString Moudle, QString DOM, QString DSM, QString PRE);//
void on_read();
void runFormatConvert(QString pre_path, QString DSM);
private:
QProcess* mProces = nullptr;
QString assess_txt_path;
};
#endif

View File

@ -1,154 +0,0 @@
#include "im2shp.h"
#include <ogrsf_frmts.h>
#include "CProcessBase.h"
/**
* \brief GDAL进度条接口
*
* GDAL算法中的进度信息导出到CProcessBase基类中
*
* @param dfComplete 0.0 1.0
* @param pszMessage
* @param pProgressArg CProcessBase的指针
*
* @return TRUE表示继续计算
*/
int STD_API ALGTermProgress(double dfComplete, const char* pszMessage, void* pProgressArg)
{
if (pProgressArg != NULL)
{
QtGDALProcessBar* pProcess = (QtGDALProcessBar*)pProgressArg;
pProcess->m_bIsContinue = pProcess->SetPosition(dfComplete);
if (pProcess->m_bIsContinue)
return TRUE;
else
return FALSE;
}
else
return TRUE;
}
int img2shp::ImagePolygonize(const char* pszSrcFile, const char* pszDstFile, const char* pszFormat, int BandNum,
QtGDALProcessBar* probar, QProgressBar* progressBar)
{
if (NULL == pszSrcFile || NULL == pszDstFile)
{
printf("待处理的栅格数据及输出矢量数据数据无效!");
return false;
}
if (GDALGetDriverCount() == 0)
GDALAllRegister();
OGRRegisterAll();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
CPLSetConfigOption("SHAPE_ENCODING", "gb2312");
//打开输入图像,并判断是否正常
GDALDataset* poSrcDS = (GDALDataset*)GDALOpen(pszSrcFile, GA_ReadOnly);
if (NULL == poSrcDS)
{
printf("输入文件不能打开,请检查文件是否存在!");
return false;
}
//构造矢量文件驱动并创建矢量图层
GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
if (NULL == poDriver)
{
printf("不能创建指定类型的矢量文件驱动!");
GDALClose((GDALDatasetH)poSrcDS);
return false;
}
/*
*Create方法主要用于创建栅格文件的新数据集nXSizenYSizenBands****
*/
//根据文件名创建输出矢量数据集
GDALDataset* poDstDs = poDriver->Create(pszDstFile, 0, 0, 0, GDT_Unknown, NULL);
if (NULL == poDstDs)
{
printf("不能创建矢量文件!");
GDALClose((GDALDatasetH)poSrcDS);
return false;
}
OGRSpatialReference* poSpatialRef = new OGRSpatialReference(poSrcDS->GetProjectionRef());
OGRLayer* poLayer = poDstDs->CreateLayer("Target", poSpatialRef, wkbPolygon, NULL);
if (NULL == poLayer)
{
printf("创建矢量图层失败!");
GDALClose((GDALDatasetH)poSrcDS);
GDALClose(poDstDs);
poSpatialRef = NULL;
return false;
}
OGRFieldDefn ofieldDef("value", OFTInteger);
if (OGRERR_NONE != poLayer->CreateField(&ofieldDef))
{
printf("创建矢量图层属性表失败!");
GDALClose((GDALDatasetH)poSrcDS);
GDALClose(poDstDs);
poSpatialRef = NULL;
return false;
}
//获取图像的对应波段
GDALRasterBandH hSrcBand = (GDALRasterBandH)poSrcDS->GetRasterBand(1);
GDALRasterBand* rasterband = poSrcDS->GetRasterBand(1);
GDALProgressFunc pfnProgress = ALGTermProgress;
if (!probar->SetStartEndValue(0, 100))
{
cout << "初始进度值设置失败!!!" << endl;
}
//if (GDALPolygonize(hSrcBand, NULL, (OGRLayerH)poLayer, 0, NULL, pfnProgress, probar) != CE_None)
//if (GDALPolygonize(hSrcBand, NULL, (OGRLayerH)poLayer, 0, NULL, GDALTermProgress, NULL) != CE_None)
//qDebug() << rasterband->GetNoDataValue() << endl;
//if (0.0 == poSrcDS->GetRasterBand(1)->GetNoDataValue())
//{
// if (CE_None != GDALPolygonize(hSrcBand, hSrcBand, (OGRLayerH)poLayer, 0, NULL, pfnProgress, probar))
// {
// GDALClose((GDALDatasetH)poSrcDS);
// GDALClose(poDstDs);
// delete poSpatialRef;
// poSpatialRef = NULL;
// return 0;
// }
//}
//else
//{
// if (CE_None != GDALPolygonize(hSrcBand, NULL, (OGRLayerH)poLayer, 0, NULL, pfnProgress, probar))
// {
// GDALClose((GDALDatasetH)poSrcDS);
// GDALClose(poDstDs);
// delete poSpatialRef;
// poSpatialRef = NULL;
// return 0;
// }
//}
if (CE_None != GDALPolygonize(hSrcBand, hSrcBand, (OGRLayerH)poLayer, 0, NULL, pfnProgress, probar))
{
GDALClose((GDALDatasetH)poSrcDS);
GDALClose(poDstDs);
delete poSpatialRef;
poSpatialRef = NULL;
return 0;
}
GDALClose((GDALDatasetH)poSrcDS);
GDALClose(poDstDs);
poSpatialRef = NULL;
return true;
}

View File

@ -1,35 +0,0 @@
#pragma once
#include "gdal_priv.h"
#include "ogrsf_frmts.h" //for ogr
#include "gdal_alg.h" //for GDALPolygonize
#include "cpl_conv.h" //for CPLMalloc()
#include "QtGDALProcessBar.h"
#include <QDebug>
/**
* @brief
*/
#ifndef STD_API
#define STD_API __stdcall
#endif
/**
* \brief GDAL进度条接口
*
* GDAL算法中的进度信息导出到CProcessBase基类中
*
* @param dfComplete 0.0 1.0
* @param pszMessage
* @param pProgressArg CProcessBase的指针
*
* @return TRUE表示继续计算
*/
int STD_API ALGTermProgress(double dfComplete, const char* pszMessage, void* pProgressArg);
class img2shp
{
public:
int ImagePolygonize(const char* pszSrcFile, const char* pszDstFile, const char* pszFormat, int BandNum, QtGDALProcessBar* probar, QProgressBar* progressBar);
bool createChineseStringProperty(OGRLayer* poLayer, const char* filterFieldName, const char* createFieldName, vector<string> nameVal, float min, QProgressBar* progressBar);
protected:
private:
};

View File

@ -1,16 +0,0 @@
#include "DEM_GeneRas.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString gdal_path = qApp->applicationDirPath().toLocal8Bit() + "/share/gdal";
QString pro_lib_path = qApp->applicationDirPath().toLocal8Bit() + "/share/proj";
qputenv("GDAL_DATA", gdal_path.toLocal8Bit());
qputenv("PROJ_LIB", pro_lib_path.toLocal8Bit());
VegePredict w;
w.CenterWidget()->show();
return a.exec();
}

View File

@ -1 +0,0 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1640758642809" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10193" xmlns:xlink="http://www.w3.org/1999/xlink" width="26" height="26"><defs><style type="text/css"></style></defs><path d="M633.417143 542.281143c-78.774857 0-142.848-52.736-142.848-117.613714 0-64.804571 64.073143-117.686857 142.848-117.686858s142.921143 52.809143 142.921143 117.76c0 64.877714-64.073143 117.540571-142.921143 117.540572z m0-172.397714c-43.958857 0-81.115429 25.161143-81.115429 54.857142s37.156571 54.784 81.188572 54.784c43.885714 0 81.042286-25.088 81.042285-54.857142 0-29.622857-37.083429-54.857143-81.115428-54.857143zM342.528 1024c-4.461714-106.569143 54.637714-293.302857 146.651429-390.948571 41.837714-44.397714 86.528-66.998857 132.681142-66.998858h64.365715c74.605714 0 135.314286-63.488 135.314285-141.385142s-60.708571-141.312-135.314285-141.312H590.994286c-74.605714 0-135.241143 63.414857-135.241143 141.312-9.362286 405.796571-400.091429 553.691429-404.114286 555.154285l-20.992-59.099428c14.482286-5.339429 354.889143-135.387429 363.300572-496.786286 0-111.908571 88.356571-203.483429 196.973714-203.483429h95.305143c108.617143 0 196.973714 91.574857 196.973714 204.141715 0 112.64-88.356571 204.214857-196.973714 204.214857h-64.365715c-28.672 0-58.294857 16.018286-88.064 47.616-78.994286 83.748571-133.485714 251.099429-129.536 344.795428L342.528 1024z m139.044571-0.146286C472.576 790.308571 559.689143 645.851429 714.605714 637.513143v-0.073143c131.072 0 240.274286-112.64 241.371429-246.272-16.749714-120.173714-97.645714-196.754286-247.369143-233.618286-43.446857-10.752-115.931429-10.971429-116.662857-10.971428-129.462857 0-230.765714 106.934857-230.765714 243.492571 0 343.698286-344.502857 423.862857-348.013715 424.667429L0 753.371429c12.214857-2.706286 299.373714-70.656 299.373714-363.227429 0-171.812571 128.585143-306.322286 292.571429-306.322286 3.291429 0 80.603429 0.146286 131.218286 12.653715 175.762286 43.446857 274.724571 140.507429 294.326857 288.475428l0.292571 4.169143c0 168.448-137.508571 310.710857-300.470857 311.149714-172.617143 9.728-176.786286 248.173714-174.006857 321.097143l-61.732572 2.486857zM6.582857 628.297143c60.416 0 204.653714-38.4 236.909714-394.24l0.731429-4.534857c24.868571-104.155429 95.744-228.205714 291.108571-228.205715 20.333714 0 270.482286-1.316571 270.482286-1.316571l5.558857 0.438857c6.582857 1.243429 161.792 30.866286 212.626286 162.157714l-57.490286 23.04C931.181714 94.354286 820.955429 66.779429 802.962286 62.829714c-28.964571 0.146286-248.685714 1.389714-266.678857 1.389715-46.811429-0.146286-187.684571 0-231.497143 178.029714C267.337143 647.314286 83.894857 691.126857 6.582857 691.126857V628.297143z m2.048-85.942857h-3.657143l3.218286-62.756572h0.877714c26.038857 0 102.107429-55.881143 129.243429-242.468571C156.306286 113.810286 217.088 60.562286 253.44 28.818286c7.314286-6.363429 16.384-14.336 18.285714-17.554286a13.165714 13.165714 0 0 0-1.316571 6.217143h61.732571c0 25.234286-18.651429 41.691429-38.4 58.88-31.744 27.794286-79.725714 69.778286-94.281143 169.984C167.570286 464.896 69.339429 542.354286 8.630857 542.354286z m660.918857 480.256h-61.805714c0-152.429714 67.291429-334.116571 387.510857-334.116572v62.829715c-219.209143 0-325.705143 88.795429-325.705143 271.36z m160.914286 0h-61.805714c0-123.684571 17.261714-235.373714 225.353143-243.931429l2.56 62.756572c-158.427429 6.509714-166.107429 69.851429-166.107429 181.174857z m123.611429 0h-61.805715c0-127.780571 78.848-137.654857 102.985143-137.654857v62.756571c-10.24 0-41.179429 0-41.179428 74.898286z" p-id="10194" fill="#2c2c2c"></path></svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,548 @@
import os
import cv2
import numpy as np
import tifIO
import shutil
import sys
import argparse
import math
from math import floor
import json
import subprocess
import qgis
from qgis.core import * # attach main QGIS library
from qgis.utils import * # attach main python library
from qgis.analysis import *
from osgeo import gdal
#相对路径
qgis_path = sys.executable
process_path = qgis_path.split('bin')[0]+'apps\\qgis-ltr\\python\\plugins'
# process_path = 'D:/code/RsSurvey/RsSurvey_Build/x64/Release/QGIS_3.22.8/apps/qgis-ltr/python/plugins/'
if os.path.exists(process_path):
print("exists path:"+process_path)
sys.stdout.flush()
else:
print("fine no path:"+process_path)
sys.stdout.flush()
sys.path.append(process_path)
qgs = QgsApplication([], False)
qgs.initQgis()
import processing
from processing.core.Processing import Processing
Processing.initialize()
#添加参数
parser = argparse.ArgumentParser()
parser.add_argument('--in_holedem', type=str,
default='D:/A_testdata/dianli_test/00yanshou/data_train_dem/05veg_maskedTiff/',
help='输入数据经过裁剪的dem')
parser.add_argument('--work_space', type=str,
default='D:/A_testdata/dianli_test/00yanshou/data_train_dem/06veg_dataFill_workspace/',
help='用于填补时存放中间路径及结果文件')
parser.add_argument('--scale', type=float,
default=0.1,
help='外接矩形放大的比例')
parser.add_argument('--win_size', type=int,
default=3,
help='空洞外扩像素')
opt = parser.parse_args()
in_holedem = opt.in_holedem
work_space = opt.work_space
scale = opt.scale
win_size = opt.win_size
'''
txt文件名以in_holedem中dem数据文件名命名
内容以singlehole文件开始包含位置信息
subname, lt_x,lt_y,rb_x,rb_y
tktk130_mask_id_1_hw_83_106.tif,1364,1950,1470,2033
'''
out_txt_folder = 'txt_singlehole/'
singlehole_folder = 'dem_singlehole/'# 保存单个空洞
ras2pot_folder = 'raster2points/'
ras2potpro_folder = 'raster2points_pro/'
tinmesh_folder = 'TINMesh/'
potfrommesh_folder = 'pointfrommesh/'
potfrommeshfloat_folder = 'pointfrommeshfloat/'
filltif_folder = 'tif/'
filltifpro_folder = 'tif_pro/'
out_fulltif_folder = 'out_result/'# 填补并放回的整图结果
print("win_size:%d,scale:%.4f" % (win_size, scale))
sys.stdout.flush()
def findHoles(in_demfolder, out_singlehole, txt_folder):
count = 0
ev = floor(win_size / 2)
if os.path.exists(txt_folder):
try:
shutil.rmtree(txt_folder)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print("error {}".format(str(e)))
sys.stdout.flush()
print(-1.0)
sys.stdout.flush()
os.mkdir(txt_folder)
if os.path.exists(out_singlehole):
try:
shutil.rmtree(out_singlehole)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print("error {}".format(str(e)))
sys.stdout.flush()
print(-1)
sys.stdout.flush()
os.mkdir(out_singlehole)
dem_list = []
src_list = os.listdir(in_demfolder)
for f in src_list:
if os.path.splitext(f)[1] == '.tif' or os.path.splitext(f)[1] == '.TIF':
dem_list.append(f)
for imgfile in dem_list:
filename = os.path.splitext(imgfile)[0]
txtname = filename + '.txt'
txt_route = os.path.join(txt_folder, txtname)
file_handle = open(txt_route, mode='w')
# file_handle.writelines(['文件名,左上角列号,左上角行号,右下角列号,右下角行号\n'])
dem_route = os.path.join(in_demfolder, imgfile)
proj, geotrans, dem_img, width, height = tifIO.ReadTif(dem_route) # c,h,w
origin = cv2.imread(dem_route, cv2.IMREAD_UNCHANGED)
img = origin.copy()
# 二值化,转换类型
ret2, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV)
thresh_image = binary.astype(np.uint8)
# 连通域分析
contours, hierarchy = cv2.findContours(thresh_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # 检索最外轮廓
# contours, hierarchy = cv2.findContours(thresh_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) # 检索所有轮廓
for i in range(0, len(contours)):
thisgeo = geotrans.copy()
lt_x, lt_y, w, h = cv2.boundingRect(contours[i]) # 最小包络矩形的四至
# 矩形外扩,最小外扩2像元,保证空洞再小也能外扩
w_ex = floor(w * scale / 2) if floor(w * scale / 2) > 2 else 2
h_ex = floor(h * scale / 2) if floor(h * scale / 2) > 2 else 2
if lt_x - w_ex >= 0:
new_lt_x = lt_x - w_ex
else:
new_lt_x = 0
if lt_y - h_ex >= 0:
new_lt_y = lt_y - h_ex
else:
new_lt_y = 0
if lt_x + w + w_ex <= width:
new_rb_x = lt_x + w + w_ex
else:
new_rb_x = width
if lt_y + h + h_ex <= height:
new_rb_y = lt_y + h + h_ex
else:
new_rb_y = height
this_hole = img[new_lt_y: new_rb_y, new_lt_x: new_rb_x]
flag = np.zeros(this_hole.shape, dtype=int)
flag[this_hole > -9999] = 1 # 如果低于-9999arcgis中nodata是极小的负数
# 洞不扩大
# this_hole[this_hole <=0] = np.nan
# 洞外扩
new_w = new_rb_x - new_lt_x
new_h = new_rb_y - new_lt_y
for c in range(0, new_w):
for r in range(0, new_h):
if flag[r, c] == 0:
for win_c in range(win_size):
for win_r in range(win_size):
tempr = r + win_r - ev
tempc = c + win_c - ev
if tempr >= 0 and tempr < new_h and tempc >= 0 and tempc < new_w:
this_hole[tempr, tempc] = np.nan
lon = thisgeo[0] + thisgeo[1] * new_lt_x
lat = thisgeo[3] + thisgeo[5] * new_lt_y
thisgeo[0] = lon
thisgeo[3] = lat
# fileroutesub =filename+ '_%d.tif' % count
fileroutesub = filename + '_id_%d_hw_%d_%d' % (i + 1, new_h, new_w) + '.tif'
fileroute = os.path.join(out_singlehole, fileroutesub)
this_hole[np.where(this_hole == 0.0)] = np.nan
tifIO.writeTif(fileroute, proj, thisgeo, this_hole) # 投影信息不对
# 坐标从【00】开始计左上坐标【x,y】右下坐标[x+w-1,y+h-1]
file_handle.writelines([fileroutesub, ',', str(new_lt_x), ',',
str(new_lt_y), ',', str(new_rb_x), ',', str(new_rb_y), '\n'])
count = count + 1
file_handle.close()
def confirmWorkspaceClear(rootPath):
out_path_raster2points = os.path.join(rootPath, ras2pot_folder)
if os.path.exists(out_path_raster2points):
try:
shutil.rmtree(out_path_raster2points)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print(-1.0)
sys.stdout.flush()
os.mkdir(out_path_raster2points)
print(4)
sys.stdout.flush()
out_path_raster2points_pro = os.path.join(rootPath, ras2potpro_folder)
if os.path.exists(out_path_raster2points_pro):
try:
shutil.rmtree(out_path_raster2points_pro)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print(-1.0)
sys.stdout.flush()
os.mkdir(out_path_raster2points_pro)
print(5)
sys.stdout.flush()
out_path_TINMesh = os.path.join(rootPath, tinmesh_folder)
if os.path.exists(out_path_TINMesh):
try:
shutil.rmtree(out_path_TINMesh)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print(-1.0)
sys.stdout.flush()
os.mkdir(out_path_TINMesh)
print(6)
sys.stdout.flush()
out_path_pointfrommesh = os.path.join(rootPath, potfrommesh_folder)
if os.path.exists(out_path_pointfrommesh):
try:
shutil.rmtree(out_path_pointfrommesh)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print(-1.0)
sys.stdout.flush()
os.mkdir(out_path_pointfrommesh)
print(7)
sys.stdout.flush()
out_path_pointfrommeshfloat = os.path.join(rootPath, potfrommeshfloat_folder)
if os.path.exists(out_path_pointfrommeshfloat):
try:
shutil.rmtree(out_path_pointfrommeshfloat)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print(-1.0)
sys.stdout.flush()
os.mkdir(out_path_pointfrommeshfloat)
print(8)
sys.stdout.flush()
out_path_tif = os.path.join(rootPath, filltif_folder)
if os.path.exists(out_path_tif):
try:
shutil.rmtree(out_path_tif)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print(-1.0)
sys.stdout.flush()
os.mkdir(out_path_tif)
print(9)
sys.stdout.flush()
out_path_tif_pro = os.path.join(rootPath, filltifpro_folder)
if os.path.exists(out_path_tif_pro):
try:
shutil.rmtree(out_path_tif_pro)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print(-1.0)
sys.stdout.flush()
os.mkdir(out_path_tif_pro)
print(10)
sys.stdout.flush()
def raster2points(fileName):
inFile=work_space+singlehole_folder+fileName
# 获取文件信息
rlayer = QgsRasterLayer(inFile, "SRTM layer name")
tif_crs =rlayer.crs().toWkt()
if not rlayer.isValid():
print("图层加载失败!")
dataset = gdal.Open(inFile)
gt = dataset.GetGeoTransform()
Xmin = gt[0]
Ymin = gt[3]
width = dataset.RasterXSize
height = dataset.RasterYSize
Xmax = gt[0] + width*gt[1] + height*gt[2]
Ymax = gt[3] + width*gt[4] + height*gt[5]
extent = [Xmin,Xmax,min(Ymin,Ymax),max(Ymin,Ymax)]
cellHeight = math.fabs(gt[1])
cellWidth = math.fabs(gt[5])
# #准备进行处理
# aid='saga:rastervaluestopoints'
out_path = os.path.join(work_space,ras2pot_folder)
outFile=out_path+fileName[0:fileName.index('.')]+'.geojson'
# p = {
# 'GRIDS': [inFile],
# 'NODATA': True,
# 'POLYGONS': None,
# 'SHAPES': outFile,
# 'TYPE': 0}
# processing.run(aid, p)
print(qgis_path)
exe_path= qgis_path.split('python.exe')[0]+"saga_cmd.exe"
print(exe_path)
cammand_line=exe_path+" shapes_grid 3 -GRIDS {} -POLYGONS None -NODATA 1 -SHAPES {} -TYPE 0".format(inFile,outFile)# --flags[qr]
process_status=subprocess.call(cammand_line)
if 0!=process_status:
print("error ")
pro_aid = 'native:assignprojection'
proFile = work_space+ras2potpro_folder+fileName[0:fileName.index('.')]+'.geojson'
pro_p = {
'CRS': QgsCoordinateReferenceSystem('EPSG:4546'),
'INPUT': outFile,
'OUTPUT': proFile,
}
processing.run(pro_aid, pro_p)
return fileName[0:fileName.index('.')]+'.geojson', cellHeight, cellWidth, tif_crs, extent
def points2mesh(fileName,tif_crs):
aid='native:tinmeshcreation'
inFile=work_space+ras2potpro_folder+fileName
optFile=work_space+tinmesh_folder+fileName[0:fileName.index('.')]+'.file'
p={ 'CRS_OUTPUT' : QgsCoordinateReferenceSystem('EPSG:4546'), 'MESH_FORMAT' : 2, 'OUTPUT_MESH' : optFile,
'SOURCE_DATA' : [{'source': inFile,'type': 0,'attributeIndex': 3}] }
processing.run(aid,p)
return fileName[0:fileName.index('.')]+'.file'
def getpointFromMesh(fileName, tif_crs,extent):
inFile = work_space + tinmesh_folder + fileName
if not os.path.exists(inFile):
inFile = work_space + tinmesh_folder + fileName + '.ply'
optFile = 'TEMPORARY_OUTPUT'
aid = 'native:exportmeshongrid'
# tif_crs
p = {'CRS_OUTPUT' : QgsCoordinateReferenceSystem('EPSG:4546'), 'DATASET_GROUPS': [0],
'DATASET_TIME': {'type': 'static'},
'EXTENT':None,
'GRID_SPACING': 0.05,
'INPUT' : inFile, 'OUTPUT': optFile, 'VECTOR_OPTION': 0}
# 'EXTENT': '%.8f,%.8f,%.8f,%.8f [EPSG:4546]' % (extent[0],extent[1],extent[2],extent[3]),
res = processing.run(aid, p)
# Save as a shapefile
Fl_ou = fileName[0:fileName.index('.')] + '.geojson'
Fl_ou = work_space + potfrommesh_folder + Fl_ou
options = QgsVectorFileWriter.SaveVectorOptions()
options.driverName = "geojson"
QgsVectorFileWriter.writeAsVectorFormatV2(res['OUTPUT'], Fl_ou, QgsCoordinateTransformContext(), options)
# TODO turn string to realNumber
return fileName[0:fileName.index('.')] + '.geojson'
def transString2float(fileName):
inFile = work_space + potfrommesh_folder + fileName
opt = work_space + potfrommeshfloat_folder + fileName
optFile = open(opt, 'w')
# minx=9999999
# maxx=0
# miny=99999999
# maxy=0
with open(inFile) as jsonFile:
points = json.load(jsonFile)
features = points['features']
for feature in features:
properties = feature['properties']
Bed_Elevation = float(properties['Bed Elevation'])
properties['Bed Elevation'] = Bed_Elevation
#
# geometry=feature['geometry']
'''
coordinates = geometry['coordinates']
x = coordinates[0]
if minx>x:
minx =x
if maxx<x:
maxx=x
y= coordinates[1]
if miny > y:
miny=y
if maxy <y:
maxy=y
'''
json.dump(points, optFile)
optFile.close()
return fileName
def point2tif(fileName,cellHeight,cellWidth,tif_crs,extent):
inFile=work_space+potfrommeshfloat_folder+fileName
# print(inFile)
optFile=work_space+filltif_folder+fileName[0:fileName.index('.')]+'.tif'
# print(extent)
aid='gdal:rasterize'
p = {'BURN':0, 'DATA_TYPE':5,
'EXTENT':None,
'EXTRA': '', 'FIELD' : 'Bed Elevation', 'HEIGHT' : cellHeight,'INIT' : None,
'INPUT': inFile, 'INVERT' : False, 'NODATA' : 0, 'OPTIONS' : '', 'OUTPUT' : optFile,
'UNITS': 1, 'USE_Z' : False, 'WIDTH' : cellWidth}
# p= { 'BURN':0, 'DATA_TYPE':5,
# 'EXTENT':'544158.5540865903, 544161.2540865903, 4450451.895210848, 4450455.295210849 [EPSG:4546]',
# 'EXTRA' : '', 'FIELD' : 'Bed Elevation', 'HEIGHT' : cellHeight,
# 'INIT' : None, 'INPUT' : inFile, 'INVERT' : False, 'NODATA' : 0,
# 'OPTIONS' : '',
# 'OUTPUT' : optFile, 'UNITS' : 1, 'USE_Z' : False, 'WIDTH' : cellWidth}
processing.run(aid,p)
dataset=gdal.Open(optFile)
width = dataset.RasterXSize
height = dataset.RasterYSize
# print('out wid,hei:',width,height)
optFile2=work_space+'tif2/'+fileName[0:fileName.index('.')]+'.tif'
# print(optFile2)
pro_aid='gdal:warpreproject'
# proFile=optFile
# proFile=rootPath+'raster2points_pro/'+fileName[0:fileName.index('.')]+'.shp'
# pro_p={ 'CRS' : QgsCoordinateReferenceSystem('EPSG:4546'), 'INPUT' : outFile, 'OUTPUT' :proFile}
pro_p={'SOURCE_CRS' : QgsCoordinateReferenceSystem('EPSG:4546'),
'TARGET_CRS' : QgsCoordinateReferenceSystem(tif_crs),
'EXTENT': '%.8f,%.8f,%.8f,%.8f [EPSG:4546]' % (extent[0], extent[1], extent[2], extent[3]),
'RESAMPLING':2,'INPUT' : optFile, 'OUTPUT' :optFile2}
processing.run(pro_aid,pro_p)
return fileName
def processOneTif(fileName):
# 转矢量点,赋投影
processedFile, cellHeight, cellWidth, tif_crs, extent = raster2points(fileName)
meshFile = points2mesh(processedFile, tif_crs)
pointsFile = getpointFromMesh(meshFile, tif_crs, extent)
pointsFilefloat = transString2float(pointsFile)
point2tif(pointsFilefloat, cellHeight, cellWidth, tif_crs, extent)
def demFill():
# print("demFill")
# sys.stdout.flush()
single_files_list=os.listdir(work_space+singlehole_folder)
temp_file_lists = []
for file in single_files_list:
if os.path.splitext(file)[1] == '.tif' or os.path.splitext(file)[1] == '.TIF':
temp_file_lists.append(file)
total = len(temp_file_lists)
for index, file in enumerate(temp_file_lists):
sys.stdout.flush()
processOneTif(file)
print(10+float((index+1) / total * 79))
sys.stdout.flush()
def back2Whole():
txtList=[]
txt_dir=work_space+out_txt_folder
sub_list = os.listdir(txt_dir)
#先找txt,保存文件名到list中
for f in sub_list:
if os.path.splitext(f)[1] == '.txt' or os.path.splitext(f)[1] == '.TXT':
txtList.append(f)
txtNum=len(txtList)
if txtNum<=0:
# print("There is no holes to join")
print(-1.0)
sys.stdout.flush()
currentIndicator=0
for txtfile in txtList:
#根据文件名找原来的图像文件,拷贝
imgname=os.path.splitext(txtfile)[0]
demfile=imgname+'.tif'# txt文件名与dem文件名对应
txt_route= os.path.join(txt_dir, txtfile)# txt文件
dem_route = os.path.join(in_holedem, demfile)# 空缺的整图
proj, geotrans, dem_img, width, height = tifIO.ReadTif(dem_route) # c,h,w
img = dem_img.copy()
#读txt,找到对应的小矩形文件
file_handle=open(txt_route,mode="r")
lines=file_handle.readlines()
for i in lines:
s=i.split(',')
#['文件名,左上角列号,左上角行号,右下角列号,右下角行号\n']
subname=s[0]
lt_x=int(s[1])
lt_y=int(s[2])
rb_x=int(s[3])
rb_y=int(s[4])
# print(subname+" img's lt_x:%d,lt_y:%d,rb_x:%d,rb_y:%d" % (lt_x,lt_y,rb_x,rb_y))
# 读相应的文件,根据行列号替换
sub_route = os.path.join(work_space+filltif_folder, subname)
proj_sub, geotrans_sub, sub_img, w_sub, h_sub = tifIO.ReadTif(sub_route)
sp = sub_img.shape
img_w = sp[1]
img_h = sp[0]
# print(subname + " img's w:%d,h:%d" % (img_w,img_h))
# img[lt_y:rb_y,lt_x:rb_x]=sub_img
img[lt_y:lt_y+img_h,lt_x:lt_x+img_w]=sub_img
file_handle.close()
out_path = os.path.join(work_space,out_fulltif_folder)
if os.path.exists(out_path):
try:
shutil.rmtree(out_path)
time.sleep(2) # 防止删除操作未结束就运行mkdir()
except Exception as e:
print(-1.0)
sys.stdout.flush()
os.mkdir(out_path)
out_wholefile=imgname+'_whole.tif'
tifIO.writeTif(out_path+out_wholefile, proj, geotrans, img)
currentIndicator=currentIndicator+1
print(90.0+float(currentIndicator/txtNum)*10)
sys.stdout.flush()
if __name__ == '__main__':
print(0)
sys.stdout.flush()
in_demfolder = in_holedem
out_singlehole = os.path.join(work_space, singlehole_folder)
txt_folder = os.path.join(work_space, out_txt_folder)
# 执行寻找并保存单个空洞
findHoles(in_demfolder,out_singlehole,txt_folder)
print(2)
sys.stdout.flush()
confirmWorkspaceClear(work_space)
demFill()
back2Whole()

View File

@ -0,0 +1,68 @@
from osgeo import gdal
# from tqdm import tqdm
def ReadTif(tif_path):
dataset = gdal.Open(tif_path)
width = dataset.RasterXSize
height = dataset.RasterYSize
geotrans = list(dataset.GetGeoTransform()) # 仿射矩阵
proj = dataset.GetProjection() # 地图投影信息
data = dataset.ReadAsArray(0, 0, width, height) # 将数据写成数组,对应栅格矩阵
del dataset # 关闭对象文件dataset
return proj, geotrans, data, width, height
def writeTif(fileroute, im_proj, im_geotrans, im_data):
# 判断栅格数据的数据类型
"""
GDAL中的GDALDataType是一个枚举型其中的值为
GDT_Unknown : 未知数据类型
GDT_Byte : 8bit正整型 (C++中对应unsigned char)
GDT_UInt16 : 16bit正整型 (C++中对应 unsigned short)
GDT_Int16 : 16bit整型 (C++中对应 short short int)
GDT_UInt32 : 32bit 正整型 (C++中对应unsigned long)
GDT_Int32 : 32bit整型 (C++中对应int long long int)
GDT_Float32 : 32bit 浮点型 (C++中对应float)
GDT_Float64 : 64bit 浮点型 (C++中对应double)
GDT_CInt16 : 16bit复整型 (?)
GDT_CInt32 : 32bit复整型 (?)
GDT_CFloat32 : 32bit复浮点型 (?)
GDT_CFloat64 : 64bit复浮点型 (?)
"""
if 'int8' in im_data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
# 判读数组维数
if len(im_data.shape) == 3:
im_bands, im_height, im_width = im_data.shape
else:
im_bands, (im_height, im_width) = 1, im_data.shape
im_data = im_data.reshape(im_bands,im_height, im_width)
# 创建文件
driver = gdal.GetDriverByName("GTiff") # 数据类型必须有,因为要计算需要多大内存空间
dataset = driver.Create(fileroute, im_width,im_height, im_bands, datatype)
dataset.SetGeoTransform(im_geotrans) # 写入仿射变换参数
dataset.SetProjection(im_proj) # 写入投影
if im_bands == 1:
dataset.GetRasterBand(1).WriteArray(im_data[0]) # 写入数组数据
else:
#for i in range(im_bands):
for i in tqdm(range(im_bands)):
dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
del dataset
def np2gdal(hwc): # hwc2chw
chw = hwc.swapaxes(2, 0).swapaxes(1, 2) # h,w,c to c,h,w
return chw
def gdal2np(chw): #chw2hwc
hwc = chw.swapaxes(1, 0).swapaxes(1, 2) # h,w,c
return hwc