|
|
|
|
#include "maplocationdialog.h"
|
|
|
|
|
#include "MapEditor/UGMapEditorWnd.h"
|
|
|
|
|
#include "qdebug.h"
|
|
|
|
|
#include "qregularexpression.h"
|
|
|
|
|
#include "ui_maplocationdialog.h"
|
|
|
|
|
#include "angle.h"
|
|
|
|
|
#include <QRegularExpressionValidator>
|
|
|
|
|
#include "messagetips.h"
|
|
|
|
|
|
|
|
|
|
MapLocationDialog::MapLocationDialog(QWidget *parent) :
|
|
|
|
|
QDialog(parent),
|
|
|
|
|
ui(new Ui::MapLocationDialog)
|
|
|
|
|
{
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
|
|
|
|
|
this->setWindowTitle("地图定位");
|
|
|
|
|
this->resize(600,400);
|
|
|
|
|
this->setWindowFlags(Qt::WindowCloseButtonHint); //关闭右上角帮助(?)按钮。
|
|
|
|
|
showAltitudeSetting(false);
|
|
|
|
|
this->is3DMap = false;
|
|
|
|
|
// ui->latitudeText->setTextMargins(10,0,10,0);
|
|
|
|
|
// ui->longitudeText->setTextMargins(10,0,10,0);
|
|
|
|
|
// ui->latitudeText->setInputMask("a09x000000x;");
|
|
|
|
|
// ui->longitudeText->setInputMask("a009x000000x;");
|
|
|
|
|
|
|
|
|
|
ui->longitudeText->setPlaceholderText("121.506377°(-180° to 180°)");
|
|
|
|
|
ui->latitudeText->setPlaceholderText("31.2451056°(-90° to 90°)");
|
|
|
|
|
|
|
|
|
|
ui->longitudeText->setText("121.506377°");
|
|
|
|
|
ui->latitudeText->setText("31.245105°");
|
|
|
|
|
|
|
|
|
|
//设置纬度输入范围()
|
|
|
|
|
QRegularExpression latRe("^(\\- |\\+)?([0-8]?\\d{1}\\.\\d*|90\\.0*|[0-8]?\\d{1}|90)[s\\-,;°度]?$");
|
|
|
|
|
ui->latitudeText->setValidator(new QRegularExpressionValidator(latRe));
|
|
|
|
|
//设置经度输入范围()
|
|
|
|
|
QRegularExpression lonRe("^(\\- |\\+)?(((\\d|[1-9]\\d|1[0-7]\\d|0{1,3})\\.\\d*)|(\\d|[1-9]\\d|1[0-7]\\d|0{1,3})|180\\.0*|180)[s\\-,;°度]?$");
|
|
|
|
|
ui->longitudeText->setValidator(new QRegularExpressionValidator(lonRe));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MapLocationDialog::~MapLocationDialog()
|
|
|
|
|
{
|
|
|
|
|
delete ui;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MapLocationDialog::setMap(UGMapEditorWnd* pEditorWnd)
|
|
|
|
|
{
|
|
|
|
|
this->pEditorWnd = pEditorWnd;
|
|
|
|
|
this->is3DMap = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MapLocationDialog::setScene(SceneControl *pSceneControl)
|
|
|
|
|
{
|
|
|
|
|
this->pSceneControl = pSceneControl;
|
|
|
|
|
showAltitudeSetting(true);
|
|
|
|
|
this->is3DMap = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MapLocationDialog::on_acceptBtn_clicked()
|
|
|
|
|
{
|
|
|
|
|
QString lon = ui->longitudeText->text().remove(QRegExp("\\s"));
|
|
|
|
|
QString lat = ui->latitudeText->text().remove(QRegExp("\\s"));
|
|
|
|
|
|
|
|
|
|
if(lon.isEmpty() || lat.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
QString str = "经度或纬度缺失 ";
|
|
|
|
|
MessageTips *mMessageTips = new MessageTips(str,this);
|
|
|
|
|
mMessageTips->show();
|
|
|
|
|
this->reject();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//获取经纬度
|
|
|
|
|
QStringList lonList;
|
|
|
|
|
QStringList latList;
|
|
|
|
|
lonList = transformAngle(lon);
|
|
|
|
|
latList = transformAngle(lat);
|
|
|
|
|
|
|
|
|
|
Angle angle;
|
|
|
|
|
double dlon;
|
|
|
|
|
double dlat;
|
|
|
|
|
if(ui->checkBox->isChecked())
|
|
|
|
|
{
|
|
|
|
|
angle.DmstoDeg(lonList[0].toInt(),lonList[1].toInt(),lonList[2].toDouble(),dlon);
|
|
|
|
|
angle.DmstoDeg(latList[0].toInt(),latList[1].toInt(),latList[2].toDouble(),dlat);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
dlon = lonList[0].toDouble();
|
|
|
|
|
dlat = latList[0].toDouble();
|
|
|
|
|
}
|
|
|
|
|
//定位
|
|
|
|
|
if(is3DMap)
|
|
|
|
|
{//三维场景
|
|
|
|
|
double altitude = ui->altitudeSpinBox->value();
|
|
|
|
|
double height = pSceneControl->GetScene3D()->GetHeight(dlon,dlat);
|
|
|
|
|
int offset;
|
|
|
|
|
if(height<=100)
|
|
|
|
|
offset = 10;
|
|
|
|
|
else
|
|
|
|
|
offset = height*0.1;
|
|
|
|
|
|
|
|
|
|
if((altitude-height)<offset && height>=0)
|
|
|
|
|
{
|
|
|
|
|
altitude = height + offset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UGCameraState cs;
|
|
|
|
|
cs.dLat = UGMathEngine::DegreesToRadians(dlat);
|
|
|
|
|
cs.dLon = UGMathEngine::DegreesToRadians(dlon);
|
|
|
|
|
cs.dAltitude = altitude;
|
|
|
|
|
// cs.dDistance = 1000;
|
|
|
|
|
cs.dTilt = UGMathEngine::DegreesToRadians(80);
|
|
|
|
|
|
|
|
|
|
pSceneControl->GetCameraWorld()->FlyToCamera(cs,3000);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{//二维地图定位
|
|
|
|
|
//设置地图中心点,并刷新地图
|
|
|
|
|
// UGMapEditorWnd* pEditorWnd = (UGMapEditorWnd*)pMap->GetMapEditWnd();
|
|
|
|
|
pEditorWnd->SetCenter(UGPoint2D(dlon,dlat));
|
|
|
|
|
pEditorWnd->SetScale(1/20000.0);
|
|
|
|
|
pEditorWnd->Refresh();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this->accept();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void MapLocationDialog::on_cancelBtn_clicked()
|
|
|
|
|
{
|
|
|
|
|
this->close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QStringList MapLocationDialog::transformAngle(QString angle)
|
|
|
|
|
{//提取字符串中的数字
|
|
|
|
|
QRegularExpression re("(\\-)?\\d+\\.?\\d*");
|
|
|
|
|
QRegularExpressionMatchIterator i = re.globalMatch(angle);
|
|
|
|
|
QStringList angleList;
|
|
|
|
|
while(i.hasNext())
|
|
|
|
|
{
|
|
|
|
|
QRegularExpressionMatch match = i.next();
|
|
|
|
|
angleList<< match.captured(0);
|
|
|
|
|
}
|
|
|
|
|
return angleList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool MapLocationDialog::isValidedDeg(QString str,int type)
|
|
|
|
|
{
|
|
|
|
|
// QRegularExpressionValidator re("^[NS](\\d{1,3}\\.?\\d{0,6})°$");
|
|
|
|
|
if(type == 1) //lat -90.0~+90.0
|
|
|
|
|
{
|
|
|
|
|
QRegularExpression latRe("^(\\- |\\+)?([0-8]?\\d{1}\\.\\d*|90\\.0*|[0-8]?\\d{1}|90)°$");
|
|
|
|
|
QRegularExpressionValidator vad(latRe,0);
|
|
|
|
|
int pos = 0;
|
|
|
|
|
int suc = vad.validate(str,pos);
|
|
|
|
|
if(suc == 2) return true;
|
|
|
|
|
else return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(type == 2) //lon -180 至 180
|
|
|
|
|
{
|
|
|
|
|
QRegularExpression lonRe("^(\\- |\\+)?(((\\d|[1-9]\\d|1[0-7]\\d|0{1,3})\\.\\d*)|(\\d|[1-9]\\d|1[0-7]\\d|0{1,3})|180\\.0*|180)°$");
|
|
|
|
|
QRegularExpressionValidator vad(lonRe,0);
|
|
|
|
|
int pos = 0;
|
|
|
|
|
int suc = vad.validate(str,pos);
|
|
|
|
|
if(suc == 2) return true;
|
|
|
|
|
else return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool MapLocationDialog::isValidedDms(QString str,int type)
|
|
|
|
|
{// 度分秒形式
|
|
|
|
|
if(type == 1) //lat -90.0~+90.0
|
|
|
|
|
{
|
|
|
|
|
QRegularExpression latRe("^(\\- |\\+)?((\\d|[1-8]\\d)[s\\-,;°度](\\d|[0-5]\\d)[s\\-,;′'’分](\\d|[0-5]\\d)(\\.\\d*)?[s\\-,;\""”秒]?$");
|
|
|
|
|
QRegularExpressionValidator vad(latRe,0);
|
|
|
|
|
int pos = 0;
|
|
|
|
|
int suc = vad.validate(str,pos);
|
|
|
|
|
if(suc == 2) return true;
|
|
|
|
|
else return false;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(type == 2) //lon -180 至 180
|
|
|
|
|
{
|
|
|
|
|
QRegularExpression lonRe("^(\\- |\\+)?((\\d|[1-9]\\d|1[0-7]\\d)[s\\-,;°度](\\d|[0-5]\\d)[s\\-,;′'’分](\\d|[0-5]\\d)(\\.\\d*)?[s\\-,;\""”秒]?$");
|
|
|
|
|
QRegularExpressionValidator vad(lonRe,0);
|
|
|
|
|
int pos = 0;
|
|
|
|
|
int suc = vad.validate(str,pos);
|
|
|
|
|
if(suc == 2) return true;
|
|
|
|
|
else return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//设置高度设置显示
|
|
|
|
|
void MapLocationDialog::showAltitudeSetting(bool isShow)
|
|
|
|
|
{
|
|
|
|
|
if(isShow)
|
|
|
|
|
{
|
|
|
|
|
ui->label_3->setHidden(false);
|
|
|
|
|
ui->altitudeSpinBox->setHidden(false);//默认二维地图模式下隐藏高度选项
|
|
|
|
|
|
|
|
|
|
ui->altitudeSpinBox->setMaximum(8849);
|
|
|
|
|
ui->altitudeSpinBox->setMinimum(-416);
|
|
|
|
|
ui->altitudeSpinBox->setSuffix(" m");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ui->label_3->setHidden(true);
|
|
|
|
|
ui->altitudeSpinBox->setHidden(true);//默认二维地图模式下隐藏高度选项
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MapLocationDialog::on_checkBox_stateChanged(int arg1)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
QString lon = ui->longitudeText->text().remove(QRegExp("\\s"));
|
|
|
|
|
QString lat = ui->latitudeText->text().remove(QRegExp("\\s"));
|
|
|
|
|
|
|
|
|
|
QStringList lonList;
|
|
|
|
|
QStringList latList;
|
|
|
|
|
if(!lon.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
lonList = transformAngle(lon);
|
|
|
|
|
}
|
|
|
|
|
if(!lat.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
latList = transformAngle(lat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(arg1 == 2) // 度分秒显示
|
|
|
|
|
{
|
|
|
|
|
// ui->latitudeText->setInputMask("\\N09°09'09x0000\";");
|
|
|
|
|
// ui->longitudeText->setInputMask("\\E09°09'09x0000\";");
|
|
|
|
|
|
|
|
|
|
//设置纬度输入范围()
|
|
|
|
|
QRegularExpression latRe("^(\\- |\\+)?((\\d|[1-8]\\d)[s\\-,;°度](\\d|[0-5]\\d)[s\\-,;′'’分](\\d|[0-5]\\d)(\\.\\d*)?[s\\-,;\""”秒]?$");
|
|
|
|
|
ui->latitudeText->setValidator(new QRegularExpressionValidator(latRe));
|
|
|
|
|
//设置经度输入范围()
|
|
|
|
|
QRegularExpression lonRe("^(\\- |\\+)?((\\d|[1-9]\\d|1[0-7]\\d)[s\\-,;°度](\\d|[0-5]\\d)[s\\-,;′'’分](\\d|[0-5]\\d)(\\.\\d*)?[s\\-,;\""”秒]?$");
|
|
|
|
|
ui->longitudeText->setValidator(new QRegularExpressionValidator(lonRe));
|
|
|
|
|
|
|
|
|
|
ui->longitudeText->setPlaceholderText("121°30'22.9572\"(-180° to 180°)");
|
|
|
|
|
ui->latitudeText->setPlaceholderText("31°14'42.3801\"(-90° to 90°)");
|
|
|
|
|
// if(lon.isEmpty()) ui->longitudeText->setText("E121°30'22.9572\"");
|
|
|
|
|
// if(lat.isEmpty()) ui->latitudeText->setText("N31°14'42.38016\"");
|
|
|
|
|
|
|
|
|
|
Angle angle;
|
|
|
|
|
if(!lonList.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
int deg;
|
|
|
|
|
int min;
|
|
|
|
|
double sec;
|
|
|
|
|
angle.DegtoDms(lonList[0].toDouble(),deg,min,sec);
|
|
|
|
|
QString text = QString::number(deg) + "°" +
|
|
|
|
|
QString::number(min) + "'" +
|
|
|
|
|
QString::number(sec,'f',4) + "\"";
|
|
|
|
|
ui->longitudeText->setText(text);
|
|
|
|
|
}
|
|
|
|
|
if(!latList.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
int deg;
|
|
|
|
|
int min;
|
|
|
|
|
double sec;
|
|
|
|
|
angle.DegtoDms(latList[0].toDouble(),deg,min,sec);
|
|
|
|
|
QString text = QString::number(deg) + "°" +
|
|
|
|
|
QString::number(min) + "'" +
|
|
|
|
|
QString::number(sec,'f',4) + "\"";
|
|
|
|
|
ui->latitudeText->setText(text);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else // 度显示
|
|
|
|
|
{
|
|
|
|
|
// ui->latitudeText->setInputMask("\\N09x000000°;");
|
|
|
|
|
// ui->longitudeText->setInputMask("\\E009x000000°;");
|
|
|
|
|
|
|
|
|
|
//设置纬度输入范围()
|
|
|
|
|
QRegularExpression latRe("^(\\- |\\+)?([0-8]?\\d{1}\\.\\d*|90\\.0*|[0-8]?\\d{1}|90)[s\\-,;°度]?$");
|
|
|
|
|
ui->latitudeText->setValidator(new QRegularExpressionValidator(latRe));
|
|
|
|
|
//设置经度输入范围()
|
|
|
|
|
QRegularExpression lonRe("^(\\- |\\+)?(((\\d|[1-9]\\d|1[0-7]\\d|0{1,3})\\.\\d*)|(\\d|[1-9]\\d|1[0-7]\\d|0{1,3})|180\\.0*|180)[s\\-,;°度]?$");
|
|
|
|
|
ui->longitudeText->setValidator(new QRegularExpressionValidator(lonRe));
|
|
|
|
|
|
|
|
|
|
ui->longitudeText->setPlaceholderText("121.506377°(-180° to 180°)");
|
|
|
|
|
ui->latitudeText->setPlaceholderText("31.245105°(-90° to 90°)");
|
|
|
|
|
// if(lon.isEmpty()) ui->longitudeText->setText("E121.506377°");
|
|
|
|
|
// if(lat.isEmpty()) ui->latitudeText->setText("N31.245105°");
|
|
|
|
|
|
|
|
|
|
Angle angle;
|
|
|
|
|
if(!lonList.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
double deg;
|
|
|
|
|
angle.DmstoDeg(lonList[0].toInt(),lonList[1].toInt(),lonList[2].toDouble(),deg);
|
|
|
|
|
QString text = QString::number(deg,'f',6) + "°";
|
|
|
|
|
ui->longitudeText->setText(text);
|
|
|
|
|
}
|
|
|
|
|
if(!latList.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
double deg;
|
|
|
|
|
angle.DmstoDeg(latList[0].toInt(),latList[1].toInt(),latList[2].toDouble(),deg);
|
|
|
|
|
QString text = QString::number(deg,'f',6) + "°";
|
|
|
|
|
ui->latitudeText->setText(text);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MapLocationDialog::on_longitudeText_editingFinished()
|
|
|
|
|
{
|
|
|
|
|
// qDebug()<<"********************************************";
|
|
|
|
|
}
|
|
|
|
|
|