154 lines
3.8 KiB
C++
154 lines
3.8 KiB
C++
#include "ruledialog.h"
|
|
#include "ui_ruledialog.h"
|
|
#include "qmessagebox.h"
|
|
|
|
RuleDialog::RuleDialog(QWidget *parent) :
|
|
QDialog(parent),
|
|
ui(new Ui::RuleDialog)
|
|
{
|
|
ui->setupUi(this);
|
|
setWindowFlags(Qt::WindowStaysOnTopHint);
|
|
CurrentPoint = 1;
|
|
|
|
|
|
ui->MouseLatitude->setReadOnly(true);
|
|
ui->MouseLongitude->setReadOnly(true);
|
|
|
|
|
|
ui->ConformButton->setEnabled(false);
|
|
|
|
ui->FirstPointLatitude->setEnabled(false);
|
|
ui->FirstPointLongitude->setEnabled(false);
|
|
ui->SecondPointLatitude->setEnabled(false);
|
|
ui->SecondPointLongitude->setEnabled(false);
|
|
|
|
ui->TwoPointDistance->setEnabled(false);
|
|
ui->TwoPointAngle->setEnabled(false);
|
|
|
|
}
|
|
|
|
RuleDialog::~RuleDialog()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void RuleDialog::closeEvent(QCloseEvent *event)
|
|
{
|
|
event->ignore();
|
|
//退出测量
|
|
emit exitRuler();
|
|
|
|
//event->accept();
|
|
}
|
|
|
|
|
|
|
|
double RuleDialog::GetDiatance(qreal lat1,qreal lng1,qreal lat2 ,qreal lng2)
|
|
{
|
|
double EarthRadiusKm = 6378.137;
|
|
|
|
double dLat1InRad = lat1 * (M_PI / 180);
|
|
double dLong1InRad = lng1 * (M_PI / 180);
|
|
double dLat2InRad = lat2 * (M_PI / 180);
|
|
double dLong2InRad = lng2 * (M_PI / 180);
|
|
double dLongitude = dLong2InRad - dLong1InRad;
|
|
double dLatitude = dLat2InRad - dLat1InRad;
|
|
double a = pow(sin(dLatitude / 2), 2) + cos(dLat1InRad) * cos(dLat2InRad) * pow(sin(dLongitude / 2), 2);
|
|
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
|
|
double dDistance = EarthRadiusKm * c;
|
|
|
|
return dDistance;
|
|
}
|
|
|
|
double RuleDialog::GetHeading(qreal lat1,qreal lng1,qreal lat2 ,qreal lng2)
|
|
{
|
|
double temp;
|
|
double mLat = lat2 - lat1;
|
|
double mLon = (lng2 - lng1)* cos(((lat2 + lat1)/2)* 0.0174532925);
|
|
temp = 90.0 + atan2(-mLat, mLon) * 57.2957795;
|
|
if(temp < 0)temp += 360.0;
|
|
return temp;
|
|
}
|
|
|
|
void RuleDialog::RulePoint(int num,qreal lat,qreal lng)
|
|
{
|
|
switch(num) {
|
|
case 1:{
|
|
Point1.lat = lat;
|
|
Point1.lng = lng;
|
|
ui->FirstPointLatitude->setText(QString::number(lat,'f',8));
|
|
ui->FirstPointLongitude->setText(QString::number(lng,'f',8));
|
|
} break;
|
|
case 2:{
|
|
Point2.lat = lat;
|
|
Point2.lng = lng;
|
|
ui->SecondPointLatitude->setText(QString::number(lat,'f',8));
|
|
ui->SecondPointLongitude->setText(QString::number(lng,'f',8));
|
|
|
|
on_ConformButton_clicked();
|
|
|
|
} break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void RuleDialog::ShowMousePos(qreal lat,qreal lng)
|
|
{
|
|
ui->MouseLatitude->setText(QString::number(lat,'f',8));
|
|
ui->MouseLongitude->setText(QString::number(lng,'f',8));
|
|
}
|
|
|
|
|
|
void RuleDialog::Lineinfo(qreal dis,qreal bearing)
|
|
{
|
|
ui->ConformButton->setEnabled(true);
|
|
|
|
ui->FirstPointLatitude->setEnabled(true);
|
|
ui->FirstPointLongitude->setEnabled(true);
|
|
ui->SecondPointLatitude->setEnabled(true);
|
|
ui->SecondPointLongitude->setEnabled(true);
|
|
|
|
ui->TwoPointDistance->setEnabled(true);
|
|
ui->TwoPointAngle->setEnabled(true);
|
|
|
|
ui->TwoPointDistance->setText(QString::number(dis * 0.001,'f',3) + "km");
|
|
ui->TwoPointAngle->setText(QString::number(bearing * 57.3,'f',1) + "°");
|
|
}
|
|
|
|
|
|
void RuleDialog::on_ConformButton_clicked()
|
|
{
|
|
bool flag = false;
|
|
qreal value = ui->FirstPointLatitude->text().toDouble(&flag);
|
|
if(flag)
|
|
{
|
|
Point1.lat = value;
|
|
emit valuechanged(1,value);
|
|
}
|
|
|
|
flag = false;
|
|
value = ui->FirstPointLongitude->text().toDouble(&flag);
|
|
if(flag)
|
|
{
|
|
Point1.lat = value;
|
|
emit valuechanged(2,value);
|
|
}
|
|
|
|
flag = false;
|
|
value = ui->SecondPointLatitude->text().toDouble(&flag);
|
|
if(flag)
|
|
{
|
|
Point1.lat = value;
|
|
emit valuechanged(3,value);
|
|
}
|
|
|
|
flag = false;
|
|
value = ui->SecondPointLongitude->text().toDouble(&flag);
|
|
if(flag)
|
|
{
|
|
Point1.lat = value;
|
|
emit valuechanged(4,value);
|
|
}
|
|
}
|