feat: 测绘航线新增航程航时计算,测绘航线格式改为.txt,测绘区域格式改为.route,航线文件保存经纬度精确到小数点后7位

pull/31/head
cbwu 12 months ago
parent 42ad71e2ff
commit c2be9a49ed

@ -397,20 +397,27 @@ BEGIN
COMBOBOX IDC_COMBO_DIRECTION,67,49,73,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO_DIRECTION,67,49,73,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
END END
IDD_DLG_DESIGNSURVEYLINE DIALOGEX 0, 0, 195, 106 IDD_DLG_DESIGNSURVEYLINE DIALOGEX 0, 0, 211, 119
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "º½²âº½ÏßÉè¼Æ" CAPTION "º½²âº½ÏßÉè¼Æ"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
LTEXT "航线高度(m):",IDC_STATIC,16,13,53,10 LTEXT "航线高度(m):",IDC_STATIC,10,13,53,10
EDITTEXT IDC_EDIT_HEIGHT,69,11,73,15,ES_AUTOHSCROLL,WS_EX_RIGHT EDITTEXT IDC_EDIT_HEIGHT,70,11,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
LTEXT "航线间隔(m):",IDC_STATIC,16,32,57,10 LTEXT "航线间隔(m):",IDC_STATIC,10,32,57,10
EDITTEXT IDC_EDIT_LINEINTERVAL,69,29,73,15,ES_AUTOHSCROLL,WS_EX_RIGHT EDITTEXT IDC_EDIT_LINEINTERVAL,70,29,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
PUSHBUTTON "导入航测区",IDC_BTN_INPUTREGION,10,55,55,18 PUSHBUTTON "导入航测区",IDC_BTN_INPUTREGION,10,68,55,18
PUSHBUTTON "绘制航测区",IDC_BTN_DRAWREGION,69,55,55,18 PUSHBUTTON "绘制航测区",IDC_BTN_DRAWREGION,69,68,55,18
PUSHBUTTON "保存航测区",IDC_BTN_SAVEREGION,128,55,55,18 PUSHBUTTON "保存航测区",IDC_BTN_SAVEREGION,128,68,55,18
PUSHBUTTON "装订航线",IDC_BTN_BINDLINE,10,77,55,18 PUSHBUTTON "装订航线",IDC_BTN_BINDLINE,10,90,55,18
PUSHBUTTON "生成航线",IDC_BTN_CALCULATELINE,69,77,55,18 PUSHBUTTON "生成航线",IDC_BTN_CALCULATELINE,69,90,55,18
LTEXT "航程:",IDC_STATIC,114,14,44,10
LTEXT "0 m",IDC_TXT_ROUTELENGTH,140,14,50,10
LTEXT "航时:",IDC_STATIC,115,32,44,10
LTEXT "飞行速度(m/s):",IDC_STATIC,6,50,66,10
EDITTEXT IDC_EDIT_FLYSPEED,70,47,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
PUSHBUTTON "航时计算",IDC_BTN_CALCULATETIME,123,46,52,16
LTEXT "0时0分0秒",IDC_TXT_FLYTIME,141,32,59,10
END END
IDD_DLG_SETMULTIROUTE DIALOGEX 0, 0, 210, 159 IDD_DLG_SETMULTIROUTE DIALOGEX 0, 0, 210, 159
@ -565,9 +572,9 @@ BEGIN
IDD_DLG_DESIGNSURVEYLINE, DIALOG IDD_DLG_DESIGNSURVEYLINE, DIALOG
BEGIN BEGIN
LEFTMARGIN, 3 LEFTMARGIN, 3
RIGHTMARGIN, 191 RIGHTMARGIN, 207
TOPMARGIN, 3 TOPMARGIN, 3
BOTTOMMARGIN, 101 BOTTOMMARGIN, 114
END END
IDD_DLG_SETMULTIROUTE, DIALOG IDD_DLG_SETMULTIROUTE, DIALOG

@ -7794,7 +7794,7 @@ void CGISDlg::ShowEditSaveDlg()
filename = dlg.GetPathName(); filename = dlg.GetPathName();
//保存文件 //保存文件
FILE* fp = fopen(filename,"w"); FILE* fp = fopen(filename,"w");
fprintf(fp,"%d, 0, %lf, %lf, %.2lf, 0, 00, 03\n", m_editLineDataGroup.lineID, 0.0, 0.0, 0.0); fprintf(fp,"%d, 0, %.7f, %.7f, %.2f, 0, 00, 03\n", m_editLineDataGroup.lineID, 0.0, 0.0, 0.0);
int n_linePts = m_editLineDataGroup.pointNum; int n_linePts = m_editLineDataGroup.pointNum;
for (int i=1;i<=n_linePts;i++) for (int i=1;i<=n_linePts;i++)
{ {
@ -7803,22 +7803,22 @@ void CGISDlg::ShowEditSaveDlg()
{ {
if (circlingPointID==i-1) //盘旋点 if (circlingPointID==i-1) //盘旋点
{ {
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 01, 03\n", m_editLineDataGroup.lineID, i, linePt.dX, linePt.dY,linePt.nH); fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 01, 03\n", m_editLineDataGroup.lineID, i, linePt.dX, linePt.dY,linePt.nH);
} }
else else
{ {
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 00, 03\n", m_editLineDataGroup.lineID, i, linePt.dX, linePt.dY,linePt.nH); fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 03\n", m_editLineDataGroup.lineID, i, linePt.dX, linePt.dY,linePt.nH);
} }
} }
else if (i==n_linePts-1) else if (i==n_linePts-1)
{ {
if (m_lineSelectedID==11 && g_b981CDesktop) //回收航线 if (m_lineSelectedID==11 && g_b981CDesktop) //回收航线
{ {
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 00, 07\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH); fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 07\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
} }
else else
{ {
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 00, 03\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH); fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 03\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
} }
} }
@ -7826,17 +7826,17 @@ void CGISDlg::ShowEditSaveDlg()
{ {
if (m_lineSelectedID==11 && g_b981CDesktop) //回收航线 if (m_lineSelectedID==11 && g_b981CDesktop) //回收航线
{ {
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 00, 0B\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH); fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 0B\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
} }
else else
{ {
if (linePt.ch1==2) //开合航线 if (linePt.ch1==2) //开合航线
{ {
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 02, 01\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH); fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 02, 01\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
} }
else else
{ {
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 00, 01\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH); fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 01\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
} }
} }
} }
@ -7917,17 +7917,17 @@ void CGISDlg::ShowSaveZoneDlg(double* xPoints,double* yPoints)
filename = dlg.GetPathName(); filename = dlg.GetPathName();
//保存文件 //保存文件
FILE* fp = fopen(filename,"w"); FILE* fp = fopen(filename,"w");
fprintf(fp,"%d, 0, %lf, %lf, %.2lf, 0, 00, 03\n", zoneID, 0.0, 0.0, 0.0); fprintf(fp,"%d, 0, %.7f, %.7f, %.2f, 0, 00, 03\n", zoneID, 0.0, 0.0, 0.0);
fprintf(fp,"%d, 1, %lf, %lf, %.2lf, 0, 00, 03\n", zoneID, xPoints[0], yPoints[0], height); fprintf(fp,"%d, 1, %.7f, %.7f, %.2f, 0, 00, 03\n", zoneID, xPoints[0], yPoints[0], height);
fprintf(fp,"%d, 2, %lf, %lf, %.2lf, 0, 00, 03\n", zoneID, xPoints[1], yPoints[1], height); fprintf(fp,"%d, 2, %.7f, %.7f, %.2f, 0, 00, 03\n", zoneID, xPoints[1], yPoints[1], height);
fprintf(fp,"%d, 3, %lf, %lf, %.2lf, 0, 00, 03\n", zoneID, xPoints[2], yPoints[2], height); fprintf(fp,"%d, 3, %.7f, %.7f, %.2f, 0, 00, 03\n", zoneID, xPoints[2], yPoints[2], height);
if (zoneType==0) //限飞区 if (zoneType==0) //限飞区
{ {
fprintf(fp,"%d, 4, %lf, %lf, %.2lf, 0, 0D, 01\n", zoneID, xPoints[3], yPoints[3], height); fprintf(fp,"%d, 4, %.7f, %.7f, %.2f, 0, 0D, 01\n", zoneID, xPoints[3], yPoints[3], height);
} }
else if (zoneType==1) //禁飞区 else if (zoneType==1) //禁飞区
{ {
fprintf(fp,"%d, 4, %lf, %lf, %.2lf, 0, 0C, 01\n", zoneID, xPoints[3], yPoints[3], height); fprintf(fp,"%d, 4, %.7f, %.7f, %.2f, 0, 0C, 01\n", zoneID, xPoints[3], yPoints[3], height);
} }
fclose(fp); fclose(fp);

@ -17,7 +17,7 @@ DesignSurveyLineDlg::DesignSurveyLineDlg(CWnd* pParent /*=NULL*/)
bDrawRegion = false; bDrawRegion = false;
lineID = 5;//测绘航线号 lineID = 1;//测绘航线号
} }
DesignSurveyLineDlg::~DesignSurveyLineDlg() DesignSurveyLineDlg::~DesignSurveyLineDlg()
@ -38,6 +38,7 @@ BEGIN_MESSAGE_MAP(DesignSurveyLineDlg, CBCGPDialog)
ON_BN_CLICKED(IDC_BTN_BINDLINE, &DesignSurveyLineDlg::OnBnClickedBtnBindline) ON_BN_CLICKED(IDC_BTN_BINDLINE, &DesignSurveyLineDlg::OnBnClickedBtnBindline)
ON_BN_CLICKED(IDC_BTN_CALCULATELINE, &DesignSurveyLineDlg::OnBnClickedBtnCalculateline) ON_BN_CLICKED(IDC_BTN_CALCULATELINE, &DesignSurveyLineDlg::OnBnClickedBtnCalculateline)
ON_WM_CLOSE() ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BTN_CALCULATETIME, &DesignSurveyLineDlg::OnBnClickedBtnCalculatetime)
END_MESSAGE_MAP() END_MESSAGE_MAP()
BOOL DesignSurveyLineDlg::OnInitDialog() BOOL DesignSurveyLineDlg::OnInitDialog()
@ -45,6 +46,9 @@ BOOL DesignSurveyLineDlg::OnInitDialog()
CBCGPDialog::OnInitDialog(); CBCGPDialog::OnInitDialog();
CenterWindow(); CenterWindow();
GetDlgItem( IDC_BTN_CALCULATELINE )->EnableWindow( false ); GetDlgItem( IDC_BTN_CALCULATELINE )->EnableWindow( false );
GetDlgItem( IDC_BTN_CALCULATETIME )->EnableWindow( false );
SetDlgItemText(IDC_EDIT_FLYSPEED,"10");
return TRUE; return TRUE;
} }
@ -150,14 +154,14 @@ void DesignSurveyLineDlg::saveSurveyLine(const vector<double>&surveyLineLons,con
TCHAR s[10000]; TCHAR s[10000];
s[0]=0; s[0]=0;
CString defaultName = g_regionFileName + "-测绘航线.route"; CString defaultName = g_regionFileName + "-测绘航线.txt";
CFileDialog dlg(FALSE, _T(".route"), defaultName); CFileDialog dlg(FALSE, _T(".txt"), defaultName);
dlg.m_ofn.lpstrTitle=_T("保存测绘航线文件"); dlg.m_ofn.lpstrTitle=_T("保存测绘航线文件");
/* /*
dlg.m_ofn.lpstrFile=s; dlg.m_ofn.lpstrFile=s;
dlg.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);*/ dlg.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);*/
TCHAR filter[500]=_T("测绘航线文件(*.route)\0*.route\0"); TCHAR filter[500]=_T("测绘航线文件(*.txt)\0*.txt\0");
dlg.m_ofn.lpstrFilter=filter; dlg.m_ofn.lpstrFilter=filter;
dlg.m_ofn.Flags|=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_CREATEPROMPT; dlg.m_ofn.Flags|=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_CREATEPROMPT;
dlg.m_ofn.lpstrInitialDir = strRouteFileDir; dlg.m_ofn.lpstrInitialDir = strRouteFileDir;
@ -199,13 +203,13 @@ bool DesignSurveyLineDlg::saveSurveyRegion(const vector<double>&surveyRegionLons
TCHAR s[10000]; TCHAR s[10000];
s[0]=0; s[0]=0;
CFileDialog dlg(FALSE, _T(".txt"), _T("测绘区域1.txt")); CFileDialog dlg(FALSE, _T(".route"), _T("测绘区域1.route"));
dlg.m_ofn.lpstrTitle=_T("保存测绘区域文件"); dlg.m_ofn.lpstrTitle=_T("保存测绘区域文件");
/* /*
dlg.m_ofn.lpstrFile=s; dlg.m_ofn.lpstrFile=s;
dlg.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);*/ dlg.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);*/
TCHAR filter[500]=_T("测绘区域文件(*.txt)\0*.txt\0"); TCHAR filter[500]=_T("测绘区域文件(*.route)\0*.route\0");
dlg.m_ofn.lpstrFilter=filter; dlg.m_ofn.lpstrFilter=filter;
dlg.m_ofn.Flags|=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_CREATEPROMPT; dlg.m_ofn.Flags|=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_CREATEPROMPT;
dlg.m_ofn.lpstrInitialDir = strRouteFileDir; dlg.m_ofn.lpstrInitialDir = strRouteFileDir;
@ -346,6 +350,14 @@ void DesignSurveyLineDlg::OnBnClickedBtnCalculateline()
char* path = g_linePathName.GetBuffer(); char* path = g_linePathName.GetBuffer();
::SendMessage(g_mapHwnd, WM_SEND_SHOWSURVEYLINE, (WPARAM)path, 0); ::SendMessage(g_mapHwnd, WM_SEND_SHOWSURVEYLINE, (WPARAM)path, 0);
} }
//计算航程
g_RouteLength = calculateRouteLength(surveyLineLons,surveyLineLats);
cstr.Format("%d",int(g_RouteLength));
cstr += "m";
((CStatic*)GetDlgItem(IDC_TXT_ROUTELENGTH))->SetWindowTextA(cstr);
GetDlgItem( IDC_BTN_CALCULATETIME )->EnableWindow( true );
} }
void DesignSurveyLineDlg::OnClose() void DesignSurveyLineDlg::OnClose()
@ -358,3 +370,37 @@ void DesignSurveyLineDlg::OnClose()
::SendMessage(g_mapHwnd, WM_CLEAR_TMPSURVEYFEATURE, 0, 0); ::SendMessage(g_mapHwnd, WM_CLEAR_TMPSURVEYFEATURE, 0, 0);
} }
} }
//计算航程(m)
double DesignSurveyLineDlg::calculateRouteLength(const vector<double>&surveyLineLons,const vector<double>& surveyLineLats)
{
double sum = 0;
for (int i=0;i<surveyLineLons.size()-1;++i)
{
double dist;
CalculateTwoPtsDistance(dist,surveyLineLons[i],surveyLineLats[i],surveyLineLons[i+1],surveyLineLats[i+1],3);
sum += dist;
}
return sum;
}
//航时计算
void DesignSurveyLineDlg::OnBnClickedBtnCalculatetime()
{
CString cstr;
GetDlgItemText(IDC_EDIT_FLYSPEED,cstr);
double speed = _ttof(cstr);
if (speed<1||speed>15)
{
BCGPMessageBox("飞行速度为[1,15]m/s!");
return;
}
int flyTime = g_RouteLength / speed;
int hours = flyTime/3600;
flyTime %= 3600; // 剩余秒数
int minutes = flyTime / 60; // 剩余秒数除以60得到分钟数
int seconds = flyTime % 60; // 最后剩余的秒数
cstr.Format("%d时%d分%d秒",hours,minutes,seconds);
((CStatic*)GetDlgItem(IDC_TXT_FLYTIME))->SetWindowTextA(cstr);
}

@ -5,6 +5,7 @@
#include "geocompute.h" #include "geocompute.h"
#include "Globe.h" #include "Globe.h"
#include "afxwin.h" #include "afxwin.h"
#include "MapPrj.h"
// DesignSurveyLineDlg 对话框 // DesignSurveyLineDlg 对话框
@ -30,11 +31,13 @@ private:
void calculateSurveyLine(double lineInterval,vector<double>&surveyLineLons,vector<double>& surveyLineLats);//计算测绘航线 void calculateSurveyLine(double lineInterval,vector<double>&surveyLineLons,vector<double>& surveyLineLats);//计算测绘航线
void saveSurveyLine(const vector<double>&surveyLineLons,const vector<double>& surveyLineLats,double height); //保存测绘航线 void saveSurveyLine(const vector<double>&surveyLineLons,const vector<double>& surveyLineLats,double height); //保存测绘航线
bool saveSurveyRegion(const vector<double>&surveyRegionLons,const vector<double>& surveyRegionLats); //保存航测区域 bool saveSurveyRegion(const vector<double>&surveyRegionLons,const vector<double>& surveyRegionLats); //保存航测区域
double calculateRouteLength(const vector<double>&surveyLineLons,const vector<double>& surveyLineLats); //źĆËăş˝łĚ
int lineID; int lineID;
//测绘航线坐标 //测绘航线坐标
vector<double> surveyLineLons; vector<double> surveyLineLons;
vector<double> surveyLineLats; vector<double> surveyLineLats;
double g_Height; double g_Height;
double g_RouteLength;
// 测绘区域文件路径 // 测绘区域文件路径
CString g_regionPathName; CString g_regionPathName;
@ -56,4 +59,5 @@ public:
afx_msg void OnBnClickedBtnCalculateline(); afx_msg void OnBnClickedBtnCalculateline();
afx_msg void OnClose(); afx_msg void OnClose();
CBCGPButton m_btnSaveRegion; CBCGPButton m_btnSaveRegion;
afx_msg void OnBnClickedBtnCalculatetime();
}; };

@ -160,10 +160,14 @@
#define IDC_COMBO_DIRECTION 1053 #define IDC_COMBO_DIRECTION 1053
#define IDC_EDIT_LINEINTERVAL 1054 #define IDC_EDIT_LINEINTERVAL 1054
#define IDC_EDIT_MARKER_LON 1055 #define IDC_EDIT_MARKER_LON 1055
#define IDC_TXT_ROUTELENGTH 1055
#define IDR_TOOLBAR3 1056 #define IDR_TOOLBAR3 1056
#define IDC_EDIT_MARKER_LAT 1056 #define IDC_EDIT_MARKER_LAT 1056
#define IDC_EDIT_FLYSPEED 1056
#define IDB_BITMAP2 1057 #define IDB_BITMAP2 1057
#define IDC_EDIT_MARKER_NAME 1057 #define IDC_EDIT_MARKER_NAME 1057
#define IDC_TXT_ROUTELENGTH2 1057
#define IDC_TXT_FLYTIME 1057
#define IDC_TREE_MARKERS 1058 #define IDC_TREE_MARKERS 1058
#define IDD_DIALOG_MARKER 1063 #define IDD_DIALOG_MARKER 1063
#define IDR_MENU3 1066 #define IDR_MENU3 1066
@ -242,6 +246,7 @@
#define IDC_BTN_INPUTREGION 1172 #define IDC_BTN_INPUTREGION 1172
#define IDD_DLG_DESIGNSURVEYLINE 1172 #define IDD_DLG_DESIGNSURVEYLINE 1172
#define IDD_DLG_SETMULTIROUTE 1173 #define IDD_DLG_SETMULTIROUTE 1173
#define IDC_BTN_CALCULATETIME 1173
#define IDT_GIS_CTRL_BUTTON1 1231 #define IDT_GIS_CTRL_BUTTON1 1231
#define IDT_GIS_CTRL_BUTTON2 1232 #define IDT_GIS_CTRL_BUTTON2 1232
#define IDT_GIS_CTRL_BUTTON3 1233 #define IDT_GIS_CTRL_BUTTON3 1233
@ -427,7 +432,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 1174 #define _APS_NEXT_RESOURCE_VALUE 1174
#define _APS_NEXT_COMMAND_VALUE 32943 #define _APS_NEXT_COMMAND_VALUE 32943
#define _APS_NEXT_CONTROL_VALUE 1055 #define _APS_NEXT_CONTROL_VALUE 1056
#define _APS_NEXT_SYMED_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 1000
#endif #endif
#endif #endif

Loading…
Cancel
Save