RasterProcessTool/Toolbox/BaseToolbox/BaseToolbox/DEMLLA2XYZTool.cpp

217 lines
6.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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(accepted()), this, SLOT(onaccept()));
connect(this->ui.dialogBtn, SIGNAL(rejected()), this, SLOT(onreject()));
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::onaccept()
{
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;
double R = 0;
double dem_row = 0, dem_col = 0, dem_alt = 0;
long line_invert = Memory1MB/8.0/ demds.width*1000;
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();
#pragma omp parallel for
for (int i = 0; i < datarows; i++) {
Landpoint LandP{ 0,0,0 };
Point3 GERpoint{ 0,0,0 };
double rowidx = 0;
double colidx = 0;
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(100.0*(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;
//#pragma omp parallel for
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+ 100.0 * start_ids / demds.height / 2);
}
QMessageBox::information(this, tr(u8"³ÌÐòÖ´ÐÐÍê³É"), tr(u8"³ÌÐòÖ´ÐÐÍê³É¡£"));
this->ui.progressBar->setValue(0);
this->ui.label_3->setText("");
}
void DEMLLA2XYZTool::onreject()
{
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"ûÓÐÑ¡ÔñÈκÎÎļþ¡£"));
}
}