214 lines
6.5 KiB
C++
214 lines
6.5 KiB
C++
#include "DEMLLA2XYZTool.h"
|
||
#include <QMessageBox>
|
||
#include <QFileDialog>
|
||
#include "ImageOperatorBase.h"
|
||
#include "GeoOperator.h"
|
||
|
||
|
||
DEMLLA2XYZTool::DEMLLA2XYZTool(QWidget *parent)
|
||
: QDialog(parent)
|
||
{
|
||
ui.setupUi(this);
|
||
|
||
connect(this->ui.dialogBtn, SIGNAL(accept()), this, SLOT(accept()));
|
||
connect(this->ui.dialogBtn, SIGNAL(reject()), this, SLOT(reject()));
|
||
connect(this->ui.DEMWSG84SelectBtn, SIGNAL(clicked()), this, SLOT(onDEMWSG84SelectBtn_Clicked()));
|
||
connect(this->ui.DEMXYZSelectBtn, SIGNAL(clicked()), this, SLOT(onDEMXYZSelectBtn_Clicked()));
|
||
connect(this->ui.BtnSloper, SIGNAL(clicked()), this, SLOT(onBtnSloper_Clicked()));
|
||
|
||
|
||
}
|
||
|
||
DEMLLA2XYZTool::~DEMLLA2XYZTool()
|
||
{}
|
||
|
||
void DEMLLA2XYZTool::accept()
|
||
{
|
||
QString DEMPath = this->ui.lineEditLLA->text();
|
||
QString XYZPath = this->ui.lineEditXYZ->text();
|
||
QString SLOPERPath = this->ui.lineEditSloper->text();
|
||
|
||
this->ui.progressBar->setValue(0);
|
||
this->ui.progressBar->setMaximum(100);
|
||
|
||
gdalImage demds(DEMPath);
|
||
gdalImage demxyz = CreategdalImageDouble(XYZPath, demds.height, demds.width, 3, demds.gt, demds.projection, true, true, true);// X,Y,Z
|
||
|
||
// ·Ö¿é¼ÆË㲢ת»»ÎªXYZ
|
||
|
||
Eigen::MatrixXd demArr = demds.getData(0, 0, demds.height, demds.width, 1);
|
||
Eigen::MatrixXd demR = demArr;
|
||
Landpoint LandP{ 0,0,0 };
|
||
Point3 GERpoint{ 0,0,0 };
|
||
double R = 0;
|
||
double dem_row = 0, dem_col = 0, dem_alt = 0;
|
||
|
||
long line_invert = 1000;
|
||
|
||
double rowidx = 0;
|
||
double colidx = 0;
|
||
this->ui.label_3->setText("WGS84 : LLA -> XYZ");
|
||
|
||
for (int max_rows_ids = 0; max_rows_ids < demds.height; max_rows_ids = max_rows_ids + line_invert) {
|
||
|
||
|
||
Eigen::MatrixXd demdata = demds.getData(max_rows_ids, 0, line_invert, demds.width, 1);
|
||
Eigen::MatrixXd xyzdata_x = demdata.array() * 0;
|
||
Eigen::MatrixXd xyzdata_y = demdata.array() * 0;
|
||
Eigen::MatrixXd xyzdata_z = demdata.array() * 0;
|
||
|
||
int datarows = demdata.rows();
|
||
int datacols = demdata.cols();
|
||
|
||
for (int i = 0; i < datarows; i++) {
|
||
for (int j = 0; j < datacols; j++) {
|
||
rowidx = i + max_rows_ids;
|
||
colidx = j;
|
||
demds.getLandPoint(rowidx, colidx, demdata(i, j), LandP); // »ñÈ¡µØÀí×ø±ê
|
||
LLA2XYZ(LandP, GERpoint); // ¾Î³¶Èת»»ÎªµØÐÄ×ø±êϵ
|
||
xyzdata_x(i, j) = GERpoint.x;
|
||
xyzdata_y(i, j) = GERpoint.y;
|
||
xyzdata_z(i, j) = GERpoint.z;
|
||
}
|
||
}
|
||
demxyz.saveImage(xyzdata_x, max_rows_ids, 0, 1);
|
||
demxyz.saveImage(xyzdata_y, max_rows_ids, 0, 2);
|
||
demxyz.saveImage(xyzdata_z, max_rows_ids, 0, 3);
|
||
|
||
this->ui.progressBar->setValue(max_rows_ids/ demds.height/2);
|
||
}
|
||
|
||
|
||
// ¼ÆËãÆÂÏò½Ç
|
||
|
||
|
||
|
||
gdalImage demsloperxyz = CreategdalImageDouble(SLOPERPath, demds.height, demds.width, 4, demds.gt, demds.projection, true, true, true);// X,Y,Z,cosangle
|
||
|
||
line_invert = 1000;
|
||
long start_ids = 0;
|
||
long dem_rows = 0, dem_cols = 0;
|
||
this->ui.label_3->setText("WGS84 : XYZ -> Sloper XYZ ");
|
||
for (start_ids = 1; start_ids < demds.height; start_ids = start_ids + line_invert) {
|
||
Eigen::MatrixXd demdata = demds.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 1);
|
||
long startlineid = start_ids;
|
||
|
||
Eigen::MatrixXd demsloper_x = demsloperxyz.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 1);
|
||
Eigen::MatrixXd demsloper_y = demsloperxyz.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 2);
|
||
Eigen::MatrixXd demsloper_z = demsloperxyz.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 3);
|
||
Eigen::MatrixXd demsloper_angle = demsloperxyz.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 4);
|
||
|
||
Landpoint p0, p1, p2, p3, p4, pslopeVector, pp;
|
||
Vector3D slopeVector;
|
||
|
||
dem_rows = demsloper_x.rows();
|
||
dem_cols = demsloper_x.cols();
|
||
double sloperAngle = 0;
|
||
Vector3D Zaxis = { 0,0,1 };
|
||
|
||
double rowidx = 0, colidx = 0;
|
||
|
||
for (long i = 1; i < dem_rows - 1; i++) {
|
||
for (long j = 1; j < dem_cols - 1; j++) {
|
||
rowidx = i + startlineid;
|
||
colidx = j;
|
||
demds.getLandPoint(rowidx, colidx, demdata(i, j), p0);
|
||
demds.getLandPoint(rowidx - 1, colidx, demdata(i - 1, j), p1);
|
||
demds.getLandPoint(rowidx, colidx - 1, demdata(i, j - 1), p2);
|
||
demds.getLandPoint(rowidx + 1, colidx, demdata(i + 1, j), p3);
|
||
demds.getLandPoint(rowidx, colidx + 1, demdata(i, j + 1), p4);
|
||
|
||
pslopeVector = getSlopeVector(p0, p1, p2, p3, p4); // µØÃæÆÂÏòʸÁ¿
|
||
slopeVector = { pslopeVector.lon,pslopeVector.lat,pslopeVector.ati };
|
||
pp = LLA2XYZ(p0);
|
||
Zaxis.x = pp.lon;
|
||
Zaxis.y = pp.lat;
|
||
Zaxis.z = pp.ati;
|
||
sloperAngle = getCosAngle(slopeVector, Zaxis); // µØÃæÆÂÏò½Ç
|
||
|
||
demsloper_x(i, j) = slopeVector.x;
|
||
demsloper_y(i, j) = slopeVector.y;
|
||
demsloper_z(i, j) = slopeVector.z;
|
||
demsloper_angle(i, j) = sloperAngle;
|
||
|
||
}
|
||
}
|
||
|
||
demsloperxyz.saveImage(demsloper_x, start_ids - 1, 0, 1);
|
||
demsloperxyz.saveImage(demsloper_y, start_ids - 1, 0, 2);
|
||
demsloperxyz.saveImage(demsloper_z, start_ids - 1, 0, 3);
|
||
demsloperxyz.saveImage(demsloper_angle, start_ids - 1, 0, 4);
|
||
|
||
this->ui.progressBar->setValue(50+start_ids / demds.height / 2);
|
||
}
|
||
|
||
QMessageBox::information(this, tr(u8"³ÌÐòÖ´ÐÐÍê³É"), tr(u8"³ÌÐòÖ´ÐÐÍê³É¡£"));
|
||
|
||
this->ui.progressBar->setValue(0);
|
||
this->ui.label_3->setText("");
|
||
}
|
||
|
||
void DEMLLA2XYZTool::reject()
|
||
{
|
||
this->close();
|
||
}
|
||
|
||
void DEMLLA2XYZTool::onDEMWSG84SelectBtn_Clicked()
|
||
{
|
||
QString fileName = QFileDialog::getOpenFileName(
|
||
this, // ¸¸´°¿Ú
|
||
tr(u8"Ñ¡ÔñÓ°ÏñÎļþ"), // ±êÌâ
|
||
QString(), // ĬÈÏ·¾¶
|
||
tr(u8"tif Files (*.tif);;data Files (*.data);;bin Files (*.bin);;All Files (*)") // Îļþ¹ýÂËÆ÷
|
||
);
|
||
|
||
// Èç¹ûÓû§Ñ¡ÔñÁËÎļþ
|
||
if (!fileName.isEmpty()) {
|
||
this->ui.lineEditLLA->setText(fileName);
|
||
|
||
}
|
||
else {
|
||
QMessageBox::information(this, tr(u8"ûÓÐÑ¡ÔñÎļþ"), tr(u8"ûÓÐÑ¡ÔñÈκÎÎļþ¡£"));
|
||
}
|
||
|
||
}
|
||
|
||
void DEMLLA2XYZTool::onDEMXYZSelectBtn_Clicked()
|
||
{
|
||
QString fileName = QFileDialog::getSaveFileName(
|
||
this, // ¸¸´°¿Ú
|
||
tr(u8"Ñ¡ÔñXYZÎļþ"), // ±êÌâ
|
||
QString(), // ĬÈÏ·¾¶
|
||
tr(u8"data Files (*.data);;bin Files (*.bin)") // Îļþ¹ýÂËÆ÷
|
||
);
|
||
|
||
// Èç¹ûÓû§Ñ¡ÔñÁËÎļþ
|
||
if (!fileName.isEmpty()) {
|
||
this->ui.lineEditXYZ->setText(fileName);
|
||
|
||
}
|
||
else {
|
||
QMessageBox::information(this, tr(u8"ûÓÐÑ¡ÔñÎļþ"), tr(u8"ûÓÐÑ¡ÔñÈκÎÎļþ¡£"));
|
||
}
|
||
|
||
}
|
||
|
||
void DEMLLA2XYZTool::onBtnSloper_Clicked()
|
||
{
|
||
QString fileName = QFileDialog::getSaveFileName(
|
||
this, // ¸¸´°¿Ú
|
||
tr(u8"Ñ¡Ôñ sloper Îļþ"), // ±êÌâ
|
||
QString(), // ĬÈÏ·¾¶
|
||
tr(u8"data Files (*.data);;bin Files (*.bin)") // Îļþ¹ýÂËÆ÷
|
||
);
|
||
|
||
// Èç¹ûÓû§Ñ¡ÔñÁËÎļþ
|
||
if (!fileName.isEmpty()) {
|
||
this->ui.lineEditSloper->setText(fileName);
|
||
|
||
}
|
||
else {
|
||
QMessageBox::information(this, tr(u8"ûÓÐÑ¡ÔñÎļþ"), tr(u8"ûÓÐÑ¡ÔñÈκÎÎļþ¡£"));
|
||
}
|
||
}
|