Merge branch 'dev/cbwu'

master
cbwu 10 months ago
commit d38943e3d0

File diff suppressed because it is too large Load Diff

@ -407,7 +407,7 @@ extern "C" void WINAPI UpdateDataInfo(int index,const char* key,double value )
//功能:目标追踪测试接口 //功能:目标追踪测试接口
//输入经纬度点的像素大小默认20 //输入经纬度点的像素大小默认20
extern "C" void WINAPI OnShowTargetPoint(const double lon, const double lat, const int pixelSize) extern "C" void WINAPI OnShowTargetPoint(double lon, double lat, int pixelSize)
{ {
AFX_MANAGE_STATE(AfxGetAppModuleState()); AFX_MANAGE_STATE(AfxGetAppModuleState());
if (g_bCreateMap) if (g_bCreateMap)

@ -108,7 +108,7 @@ extern "C" _declspec(dllexport) void DrawCallBackPoint(const BYTE callbackMode,
//功能:目标追踪测试接口 //功能:目标追踪测试接口
//输入经纬度点的像素大小默认20 //输入经纬度点的像素大小默认20
extern "C" _declspec(dllexport) void OnShowTargetPoint(const double lon, const double lat, const int pixelSize=20); extern "C" _declspec(dllexport) void OnShowTargetPoint(double lon, double lat, int pixelSize);

@ -346,7 +346,7 @@ void CFlyLineDesign::OnSaveFlyLine()
memset(&pt, 0, sizeof(PtStruct)); memset(&pt, 0, sizeof(PtStruct));
//原点数据写入 //原点数据写入
fprintf(fp, "%d, %d, %lf, %lf, %.2lf, %d, %02X, %02X\n", designLineID, 0, g_gcsLon, g_gcsLat, 0.0, 0, 0, 2); fprintf(fp, "%d, %d, %.7f, %.7f, %.2lf, %d, %02X, %02X\n", designLineID, 0, g_gcsLon, g_gcsLat, 0.0, 0, 0, 2);
//遍历航点集合数据 //遍历航点集合数据
for ( int i = 0; i < m_linePtNums; i++ ) for ( int i = 0; i < m_linePtNums; i++ )
@ -356,11 +356,11 @@ void CFlyLineDesign::OnSaveFlyLine()
//将除最后一个点的数据写入文件 //将除最后一个点的数据写入文件
if ( i < (m_linePtNums-1)) if ( i < (m_linePtNums-1))
{ {
fprintf(fp, "%d, %d, %lf, %lf, %.2lf, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, pt.nH, pt.nV, pt.ch1, pt.ch2); fprintf(fp, "%d, %d, %.7f, %.7f, %.2lf, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, pt.nH, pt.nV, pt.ch1, pt.ch2);
} }
else//将最后一个点的航段特征数据写入文件 else//将最后一个点的航段特征数据写入文件
{ {
fprintf(fp, "%d, %d, %lf, %lf, %.2lf, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, pt.nH, pt.nV, pt.ch1, lineProperty); fprintf(fp, "%d, %d, %.7f, %.7f, %.2lf, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, pt.nH, pt.nV, pt.ch1, lineProperty);
} }
} }

@ -422,21 +422,23 @@ BEGIN
EDITTEXT IDC_EDIT_EXTERNALLENGTH,70,46,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT EDITTEXT IDC_EDIT_EXTERNALLENGTH,70,46,41,15,ES_AUTOHSCROLL,WS_EX_RIGHT
END END
IDD_DLG_SETMULTIROUTE DIALOGEX 0, 0, 210, 159 IDD_DLG_SETMULTIROUTE DIALOGEX 0, 0, 210, 171
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
DEFPUSHBUTTON "确定",IDOK,39,125,61,20 DEFPUSHBUTTON "确定",IDOK,39,142,61,20
PUSHBUTTON "取消",IDCANCEL,118,125,61,20 PUSHBUTTON "取消",IDCANCEL,118,142,61,20
LTEXT "航线间隔(m):",IDC_STATIC,25,41,65,14 LTEXT "航线间隔(m):",IDC_STATIC,25,41,65,14
EDITTEXT IDC_EDIT_LINEINTERVAL,112,37,77,21,ES_CENTER | ES_AUTOHSCROLL EDITTEXT IDC_EDIT_LINEINTERVAL,112,37,77,21,ES_CENTER | ES_AUTOHSCROLL
LTEXT "偏移角度(°):",IDC_STATIC,25,14,65,14 LTEXT "偏移角度(°):",IDC_STATIC,25,14,65,14
EDITTEXT IDC_EDIT_AZIMUTH,112,10,77,21,ES_CENTER | ES_AUTOHSCROLL EDITTEXT IDC_EDIT_AZIMUTH,112,10,77,21,ES_CENTER | ES_AUTOHSCROLL
LTEXT "高度间隔(m):",IDC_STATIC,25,69,65,14 LTEXT "高度间隔(m):",IDC_STATIC,25,68,65,14
EDITTEXT IDC_EDIT_HEIGHTINTERVAL,112,65,77,21,ES_CENTER | ES_AUTOHSCROLL EDITTEXT IDC_EDIT_HEIGHTINTERVAL,112,64,77,21,ES_CENTER | ES_AUTOHSCROLL
LTEXT "航线数量:",IDC_STATIC,26,96,65,14 LTEXT "航线数量:",IDC_STATIC,26,95,65,14
EDITTEXT IDC_EDIT_LINENUMBER,112,92,77,21,ES_CENTER | ES_AUTOHSCROLL EDITTEXT IDC_EDIT_LINENUMBER,112,91,77,21,ES_CENTER | ES_AUTOHSCROLL
LTEXT "仅单点偏移(水平):",IDC_STATIC,25,120,65,14
COMBOBOX IDC_COMBO_HPT,113,118,76,63,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
END END
@ -463,6 +465,13 @@ BEGIN
0 0
END END
IDD_DLG_SETMULTIROUTE DLGINIT
BEGIN
IDC_COMBO_HPT, 0x403, 2, 0
0x0030,
0
END
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
@ -582,9 +591,9 @@ BEGIN
IDD_DLG_SETMULTIROUTE, DIALOG IDD_DLG_SETMULTIROUTE, DIALOG
BEGIN BEGIN
LEFTMARGIN, 3 LEFTMARGIN, 3
RIGHTMARGIN, 204 RIGHTMARGIN, 207
TOPMARGIN, 3 TOPMARGIN, 3
BOTTOMMARGIN, 152 BOTTOMMARGIN, 167
END END
END END
#endif // APSTUDIO_INVOKED #endif // APSTUDIO_INVOKED
@ -679,6 +688,7 @@ BEGIN
MENUITEM "开始编辑", ID_EDIT_NODE MENUITEM "开始编辑", ID_EDIT_NODE
MENUITEM "修改航点", ID_EDIT_LINE MENUITEM "修改航点", ID_EDIT_LINE
MENUITEM "保存编辑", ID_EDIT_SAVE MENUITEM "保存编辑", ID_EDIT_SAVE
MENUITEM "批量航线", ID_COPE_LINE
END END
POPUP "限制区" POPUP "限制区"
BEGIN BEGIN

@ -71,7 +71,7 @@ CGISDlg::CGISDlg(CWnd* pParent /*=NULL*/)
for (int i = 0;i<3;i++) for (int i = 0;i<255;i++)
{ {
//航迹标绘图层ID //航迹标绘图层ID
m_flyTrackLayerID[i] = -1; m_flyTrackLayerID[i] = -1;
@ -188,6 +188,17 @@ CGISDlg::CGISDlg(CWnd* pParent /*=NULL*/)
m_CircleGuideLayer = -1; //盘旋引导图层 m_CircleGuideLayer = -1; //盘旋引导图层
//多机子航线
for (int i=0;i<20;++i)
{
for (int j=0;j<20;++j)
{
m_subLineLayerID[i][j]=-1;
m_subLinePtLayerID[i][j]=-1;
m_pHaveDrawCopyLineFlag[i][j] = -1;
}
}
m_bShowCopyLine = false;
/*******************************测绘航线********************************/ /*******************************测绘航线********************************/
surveyRegionLayerID = -1; surveyRegionLayerID = -1;
tmpSurveyRegionLayerID = -1; tmpSurveyRegionLayerID = -1;
@ -583,6 +594,7 @@ BEGIN_MESSAGE_MAP(CGISDlg, CBCGPDialog)
ON_COMMAND(ID_EDIT_NODE, OnEditLine) //编辑航线 ON_COMMAND(ID_EDIT_NODE, OnEditLine) //编辑航线
ON_COMMAND(ID_EDIT_LINE, ShowModifyPointDlg) //修改航点 ON_COMMAND(ID_EDIT_LINE, ShowModifyPointDlg) //修改航点
ON_COMMAND(ID_EDIT_SAVE, ShowEditSaveDlg) //保存编辑 ON_COMMAND(ID_EDIT_SAVE, ShowEditSaveDlg) //保存编辑
ON_COMMAND(ID_COPE_LINE, ShowMultiRouteSetting) //批量航线
/* /*
ON_COMMAND(ID_MODIFY_LINEPOINT, OnMapSelect); //修改航点航线 ON_COMMAND(ID_MODIFY_LINEPOINT, OnMapSelect); //修改航点航线
ON_COMMAND(ID_EDIT_SAVE, OnMapSelect); //保存编辑*/ ON_COMMAND(ID_EDIT_SAVE, OnMapSelect); //保存编辑*/
@ -1074,7 +1086,7 @@ void CGISDlg::OnEraseTrack()
//清除航迹 //清除航迹
void CGISDlg::EraseTrack(int uavid) void CGISDlg::EraseTrack(int uavid)
{ {
if (uavid<0||uavid>2) if (uavid<0||uavid>255)
{ {
return; return;
} }
@ -3717,7 +3729,7 @@ void CGISDlg::AddTargetPoint(const int nPt, const double dX, const double dY)
//说明创建专门用于绘制无人机的矢量面图层每次先删除上次标绘的Shp再重新标绘 //说明创建专门用于绘制无人机的矢量面图层每次先删除上次标绘的Shp再重新标绘
void CGISDlg::DrawUAV(int uavid, const double dX, const double dY, const double yaw,bool control) void CGISDlg::DrawUAV(int uavid, const double dX, const double dY, const double yaw,bool control)
{ {
if (uavid<0||uavid>2) if (uavid<0||uavid>255)
{ {
return; return;
} }
@ -4627,7 +4639,13 @@ void CGISDlg::DrawFlyLine(const DrawLineDataStruct lineData)
} }
else else
{ {
strText.Format(_T("%d-%d"), lineData.lineID, lineData.pts[i].nPt); /*
if (g_b981AMulti && lineData.pts[0].ch1 > 1)
{
strText.Format(_T("%d(%d)-%d"), lineData.lineID, lineData.pts[0].ch1,lineData.pts[i].nPt);
}
else*/
strText.Format(_T("%d-%d"), lineData.lineID, lineData.pts[i].nPt);
} }
//增加Labels //增加Labels
@ -4639,6 +4657,95 @@ void CGISDlg::DrawFlyLine(const DrawLineDataStruct lineData)
m_map.Redraw(); m_map.Redraw();
} }
//功能:标绘飞行航线(批量航线)
//输入航线数据lineData
void CGISDlg::DrawCopyFlyLine(const DrawLineDataStruct lineData)
{
//field索引值
long fieldIndex = 0;
//航线索引号
int lineID = lineData.lineID-1;
//子航线索引号
int sublineID = lineData.pts[0].ch1-1;
/*
map<long,long> subLineLayerIDs;
map<long,long> subLinePtLayerIDs;
if (m_subLineLayerID.find(lineData.lineID)!=m_subLineLayerID.end())
{
subLineLayerIDs = m_subLineLayerID[lineData.lineID];
}
if (m_subLinePtLayerID.find(lineData.lineID)!=m_subLinePtLayerID.end())
{
subLinePtLayerIDs = m_subLinePtLayerID[lineData.lineID];
}*/
//没有目标标绘SHP图层创建该图层
if (m_subLineLayerID[lineID][sublineID] ==-1)
{
//创建线图层
CreateEmptyShapfile(m_subLineLayerID[lineID][sublineID], 1, /*RGB(0,255,0)*/LineClr[lineID]);
//创建线图层成功
m_pHaveDrawCopyLineFlag[lineID][sublineID] = true;
}
//没有目标标绘SHP图层创建该图层
if (m_subLinePtLayerID[lineID][sublineID] ==-1)
{
//创建点图层
CreateEmptyShapfile(m_subLinePtLayerID[lineID][sublineID], 0, /*RGB(0,255,0)*/LineClr[lineID]);
//创建线图层成功
m_pHaveDrawCopyLineFlag[lineID][sublineID] = true;
}
//向点图层加入航点数据
AddPoints2PointShapfile(m_subLinePtLayerID[lineID][sublineID], lineData.pts, lineData.pointNum);
//向线图层加入航点数据
AddPoints2LineShapfile(m_subLineLayerID[lineID][sublineID], lineData.linePts, lineData.linePointNum);
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
//Label集合
CLabels labesPtr;
labesPtr = (m_map.GetShapefile(m_subLinePtLayerID[lineID][sublineID])).GetLabels();
labesPtr.SetFontColor(/*RGB(255,0,0)*/LineClr[lineID]);
labesPtr.SetAlignment(1);
labesPtr.SetFontBold(true);
labesPtr.SetFontName(LPCTSTR("黑体"));
labesPtr.SetFontSize(16);
labesPtr.put_FontSize2(16);
labesPtr.SetFrameVisible(false);
labesPtr.SetAvoidCollisions(FALSE);
CString strText = _T("");
//标绘航点的名称
for (long i=0; i<lineData.pointNum; i++)
{
//标注信息
if ( 14 ==lineData.lineID)
{
strText.Format(_T("自主着陆点(%d)") /*lineData.lineID, */ /*lineData.pts[i].nPt*/,lineData.pts[0].ch1);
}
else
{
strText.Format(_T("%d(%d)-%d"), lineData.lineID, lineData.pts[0].ch1,lineData.pts[i].nPt);
}
//增加Labels
labesPtr.AddLabel((LPCTSTR)strText, lineData.pts[i].dX, lineData.pts[i].dY, 0, 0);
}
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
//重新绘制
m_map.Redraw();
}
//功能:根据地图控件的显示分辨率移动地图控件 //功能:根据地图控件的显示分辨率移动地图控件
@ -4949,6 +5056,25 @@ void CGISDlg::ClearDrawedLine(const int lineID)
} }
} }
//功能:清除已经标绘的航线(多机子航线)
//输入航线编号lineID从0开始计数
void CGISDlg::ClearDrawedCopyLine(const int lineID,const int sublineID)
{
if (m_pHaveDrawCopyLineFlag[lineID][sublineID])
{
//清除标绘的点矢量图层
ClearPointShape(m_subLinePtLayerID[lineID][sublineID]);
//清除已经标绘的航线
m_map.RemoveLayer(m_subLineLayerID[lineID][sublineID]);
m_pHaveDrawCopyLineFlag[lineID][sublineID] = false;
m_subLineLayerID[lineID][sublineID] = -1;
m_subLinePtLayerID[lineID][sublineID] = -1;
}
}
//功能:处理快捷菜单与航线显示相关的操作 //功能:处理快捷菜单与航线显示相关的操作
// 1)航线已经标注,清除显示 // 1)航线已经标注,清除显示
// 2)航线未标注,进行显示 // 2)航线未标注,进行显示
@ -4968,6 +5094,21 @@ void CGISDlg::SetFlyLineShowStatus(const int lineID)
//标识置false //标识置false
m_pHaveDrawLineFlag[lineIndex] = false; m_pHaveDrawLineFlag[lineIndex] = false;
if (g_b981AMulti)
{
for (int i=0;i<10;++i)
{
if (m_pHaveDrawCopyLineFlag[lineIndex][i])
{
ClearDrawedCopyLine(lineIndex,i);
//刷新
m_map.Redraw2(mapWindow::RedrawMinimal);
//m_map.Redraw();
m_pHaveDrawCopyLineFlag[lineIndex][i] = false;
}
}
}
} }
else else
{ {
@ -4983,6 +5124,21 @@ void CGISDlg::SetFlyLineShowStatus(const int lineID)
CString str = LineRouteDlg.GetPathName(); //获取文件路径名 CString str = LineRouteDlg.GetPathName(); //获取文件路径名
//OnShowGivenLine(GetFlyLineName(lineID)); //OnShowGivenLine(GetFlyLineName(lineID));
OnShowGivenLine(str); OnShowGivenLine(str);
if (g_b981AMulti)
{
CString tmp;
m_bShowCopyLine = true;
for (int i=2;i<=10;++i)
{
tmp.Format("-%d",i);
CString dirPath = ExtractDirPath(str);
CString fileName = ExtractFileName(str,false);
CString fileType = ExtractFileType(str);
CString pathName = dirPath + "\\" + fileName + tmp + "." + fileType;
OnShowGivenLine(pathName);
}
m_bShowCopyLine = false;
}
} }
} }
@ -5060,7 +5216,7 @@ void CGISDlg::OnShowGivenLine(const CString strLineFileName)
} }
//判断文件是否存在 //判断文件是否存在
if (!SearchDirectory(strLineFileName)) if (!SearchDirectory(strLineFileName) && !m_bShowCopyLine)
{ {
BCGPMessageBox( _T( "航路文件不存在!" ) ); BCGPMessageBox( _T( "航路文件不存在!" ) );
return; return;
@ -5076,12 +5232,23 @@ void CGISDlg::OnShowGivenLine(const CString strLineFileName)
if (m_lineManage.ReadLineDataFromFile(lineDataGroup, strLineFileName)) if (m_lineManage.ReadLineDataFromFile(lineDataGroup, strLineFileName))
{ {
//判断航线号是否正确lineID取值1-8,10-11,13add by jackwong 2018.08.01 //判断航线号是否正确lineID取值1-8,10-11,13add by jackwong 2018.08.01
if(lineDataGroup.lineID<1 || /*(*/lineDataGroup.lineID>14 /*&& lineDataGroup.lineID<10)*/ /*|| lineDataGroup.lineID==14 *//*|| lineDataGroup.lineID>13*/) if(lineDataGroup.lineID<1 || lineDataGroup.lineID>14 )
{ {
BCGPMessageBox("航线号不正确!"); BCGPMessageBox("航线号不正确!");
return; return;
} }
m_lineFullPathName[lineDataGroup.lineID] = strLineFileName;
if (lineDataGroup.pts[0].ch1>1)
{
//清除标绘的航线
ClearDrawedCopyLine(lineDataGroup.lineID-1,lineDataGroup.pts[0].ch1);
//标绘航线
DrawCopyFlyLine(lineDataGroup);
return;
}
int ch = lineDataGroup.linePts[lineDataGroup.pointNum-1].ch1; int ch = lineDataGroup.linePts[lineDataGroup.pointNum-1].ch1;
/***************************测绘区域处理************************************/ /***************************测绘区域处理************************************/
if (ch == 0x03) if (ch == 0x03)
@ -5601,15 +5768,18 @@ void CGISDlg::OnEnddesign() //
double azmuth,heightInterval,lineInterval,numLine; double azmuth,heightInterval,lineInterval,numLine;
bool bSaveMultiLine = false; bool bSaveMultiLine = false;
CString pathName; CString pathName;
int singlePointNumber;
if (g_b981AMulti && dlg.m_bCheckMultiLine) if (g_b981AMulti && dlg.m_bCheckMultiLine)
{ {
SetMultiRouteDlg multiRouteDlg; SetMultiRouteDlg multiRouteDlg;
multiRouteDlg.SetPointNumber(m_designLinePointNum);
if (multiRouteDlg.DoModal() == IDOK ) if (multiRouteDlg.DoModal() == IDOK )
{ {
azmuth = multiRouteDlg.azmuth; azmuth = multiRouteDlg.azmuth;
heightInterval = multiRouteDlg.heightInterval; heightInterval = multiRouteDlg.heightInterval;
lineInterval = multiRouteDlg.lineInterval; lineInterval = multiRouteDlg.lineInterval;
numLine = multiRouteDlg.numLine; numLine = multiRouteDlg.numLine;
singlePointNumber = multiRouteDlg.GetHPointNumber();
bSaveMultiLine = true; bSaveMultiLine = true;
} }
else else
@ -5635,7 +5805,7 @@ void CGISDlg::OnEnddesign() //
if (IDOK == dlgSave.DoModal()) if (IDOK == dlgSave.DoModal())
{ {
strFlyLineName = dlgSave.GetPathName(); strFlyLineName = dlgSave.GetPathName();
pathName = ExtractFileName(strFlyLineName); pathName = ExtractFileName(strFlyLineName,false);
////写出航线数据 ////写出航线数据
FILE *fp = fopen(strFlyLineName, "w" ); FILE *fp = fopen(strFlyLineName, "w" );
@ -5683,8 +5853,9 @@ void CGISDlg::OnEnddesign() //
if (g_b981AMulti && bSaveMultiLine) if (g_b981AMulti && bSaveMultiLine)
{ {
vector<vector<PtStruct>> resultLines; vector<vector<PtStruct>> resultLines;
GetMultiRouteLine(azmuth,lineInterval,numLine,m_pDesignLineStruct,m_designLinePointNum,resultLines); GetMultiRouteLine(azmuth,lineInterval,numLine,m_pDesignLineStruct,m_designLinePointNum,resultLines,singlePointNumber);
SaveMultiRouteLine(pathName,heightInterval,resultLines); vector<CString>savePathNameArr;
SaveMultiRouteLine(pathName,heightInterval,savePathNameArr,resultLines);
} }
memset(m_pDesignLineStruct, 0, sizeof(PtStruct)*m_lineMaxPointNum); //初始化新建一条航线 memset(m_pDesignLineStruct, 0, sizeof(PtStruct)*m_lineMaxPointNum); //初始化新建一条航线
@ -8402,13 +8573,14 @@ void CGISDlg::OnShowDesignSurveyLineDlg()
/****************************多机航线一键生成************************************/ /****************************多机航线一键生成************************************/
void CGISDlg::GetMultiRouteLine(double azimuth,double lineInterval,int lineNumber,PtStruct* lineStruct,int nLinePts,vector<vector<PtStruct>>& resultLines) void CGISDlg::GetMultiRouteLine(double azimuth,double lineInterval,int lineNumber,PtStruct* lineStruct,int nLinePts,vector<vector<PtStruct>>& resultLines,int hPtOffset)
{ {
GeoCompute geoComputer; GeoCompute geoComputer;
double tmpLon,tmpLat; double tmpLon,tmpLat;
vector<PtStruct> line; vector<PtStruct> line;
double dist = 0; double dist = 0;
double lineAzimuth = 0; double lineAzimuth = 0;
//bool bOneOffset = false;
for (int j=0;j< lineNumber;++j) for (int j=0;j< lineNumber;++j)
{ {
line.clear(); line.clear();
@ -8418,33 +8590,66 @@ void CGISDlg::GetMultiRouteLine(double azimuth,double lineInterval,int lineNumbe
lineAzimuth = azimuth; lineAzimuth = azimuth;
for (int i=0;i< nLinePts;++i) for (int i=0;i< nLinePts;++i)
{ {
PtStruct line0 = lineStruct[i]; //PtStruct line0 = lineStruct[i];
PtStruct line1 = lineStruct[i+1]; //PtStruct line1 = lineStruct[i+1];
geoComputer.computeOffsetGeoPosition(tmpLon,tmpLat,lineAzimuth,dist/1000,tmpLon,tmpLat); /*
PtStruct pt; if (hPtOffset>0 && i!=(hPtOffset-1)) //仅某一点水平方向偏移
pt.dX = tmpLon; {
pt.dY = tmpLat; tmpLon = lineStruct[i].dX;
pt.nH = lineStruct[i].nH; tmpLat = lineStruct[i].dY;
pt.nL = lineStruct[i].nL; bOneOffset = true;
pt.nPt = lineStruct[i].nPt; }
pt.nV = lineStruct[i].nV; else
pt.ch1 = lineStruct[i].ch1; {*/
pt.ch2 = lineStruct[i].ch2; if (hPtOffset == 0)
line.push_back(pt); {
geoComputer.computeOffsetGeoPosition(tmpLon,tmpLat,lineAzimuth,dist/1000,tmpLon,tmpLat);
//CalculateTwoPtsAzimuth(azimuth,lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY,3); PtStruct pt;
if (i+1<nLinePts) pt.dX = tmpLon;
pt.dY = tmpLat;
pt.nH = lineStruct[i].nH;
pt.nL = lineStruct[i].nL;
pt.nPt = lineStruct[i].nPt;
pt.nV = lineStruct[i].nV;
pt.ch1 = lineStruct[i].ch1;
pt.ch2 = lineStruct[i].ch2;
line.push_back(pt);
if (i+1<nLinePts)
{
CalculateTwoPtsDistanceAzimuth(dist,lineAzimuth,lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY,3);
}
}
else//仅某一点水平方向偏移
{ {
CalculateTwoPtsDistanceAzimuth(dist,lineAzimuth,lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY,3); PtStruct pt;
pt.nH = lineStruct[i].nH;
pt.nL = lineStruct[i].nL;
pt.nPt = lineStruct[i].nPt;
pt.nV = lineStruct[i].nV;
pt.ch1 = lineStruct[i].ch1;
pt.ch2 = lineStruct[i].ch2;
if (i!=(hPtOffset-1))
{
pt.dX = lineStruct[i].dX;
pt.dY = lineStruct[i].dY;
}
else
{
geoComputer.computeOffsetGeoPosition(lineStruct[i].dX,lineStruct[i].dY,lineAzimuth,dist/1000,tmpLon,tmpLat);
pt.dX = tmpLon;
pt.dY = tmpLat;
//int i = 0;
}
line.push_back(pt);
} }
//dist = geoComputer.VincentyDistance(lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY);
} }
resultLines.push_back(line); resultLines.push_back(line);
} }
} }
void CGISDlg::SaveMultiRouteLine(CString pathDirName,double heightInterval,const vector<vector<PtStruct>>& resultLines) void CGISDlg::SaveMultiRouteLine(CString pathDirName,double heightInterval,vector<CString>& savePathNameArr,const vector<vector<PtStruct>>& resultLines)
{ {
CString saveFileName; CString saveFileName;
for (int i=0;i<resultLines.size();++i) for (int i=0;i<resultLines.size();++i)
@ -8453,21 +8658,76 @@ void CGISDlg::SaveMultiRouteLine(CString pathDirName,double heightInterval,const
CString tmp; CString tmp;
tmp.Format("-%d",i+2); tmp.Format("-%d",i+2);
saveFileName = pathDirName + tmp + ".txt"; saveFileName = pathDirName + tmp + ".txt";
savePathNameArr.push_back(saveFileName);
//保存文件 //保存文件
FILE* fp = fopen(saveFileName,"w"); FILE* fp = fopen(saveFileName,"w");
fprintf(fp,"%d, 0, %.7f, %.7f, %.2f, 0, 00, 03\n", line[0].nL, 0.0, 0.0, 0.0); fprintf(fp,"%d, 0, %.7f, %.7f, %.2f, 0, 00, 03\n", line[0].nL, 0.0, 0.0, 0.0);
int j = 0; int j = 0;
for (j;j<line.size()-1;++j) for (j;j<line.size()-1;++j)
{ {
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 03\n", line[j].nL, j+1,line[j].dX, line[j].dY,line[j].nH + heightInterval*(i+1)); if (j==0) //第一个航线存储批量航线子航线号
{
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, %02X, 03\n", line[j].nL, j+1,line[j].dX, line[j].dY,line[j].nH + heightInterval*(i+1),i+2);
}
else
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 03\n", line[j].nL, j+1,line[j].dX, line[j].dY,line[j].nH + heightInterval*(i+1));
} }
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, %02X, 01\n", line[j].nL, j+1,line[j].dX, line[j].dY,line[j].nH + heightInterval*(i+1),line[j].ch2); fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, %02X, 01\n", line[j].nL, j+1,line[j].dX, line[j].dY,line[j].nH + heightInterval*(i+1),line[j].ch1);
fclose(fp); fclose(fp);
} }
} }
void CGISDlg::ShowMultiRouteSetting()
{
if (!m_bSelectFeatureFlag || m_lineSelectedID==-1) return;
//批量航线设置
double azmuth,heightInterval,lineInterval,numLine;
bool bSaveMultiLine = false;
CString pathName;
vector<CString>pathNameArr;
if (g_b981AMulti)
{
SetMultiRouteDlg multiRouteDlg;
DrawLineDataStruct selectLineData = m_ShowedLineDataList[m_lineSelectedID];
multiRouteDlg.SetPointNumber(selectLineData.pointNum);
if (multiRouteDlg.DoModal() == IDOK )
{
azmuth = multiRouteDlg.azmuth;
heightInterval = multiRouteDlg.heightInterval;
lineInterval = multiRouteDlg.lineInterval;
numLine = multiRouteDlg.numLine;
bSaveMultiLine = true;
int hPtNumber = multiRouteDlg.GetHPointNumber();
CString selectLinePath = m_lineFullPathName[m_lineSelectedID];
if (ExtractFileType(selectLinePath) == ".route") return; // 已装订的航线不允许批量生成
CString dirPath = ExtractDirPath(selectLinePath);
CString fileName = ExtractFileName(selectLinePath,false);
pathName = dirPath + "\\" + fileName;
//批量航线保存
vector<vector<PtStruct>> resultLines;
GetMultiRouteLine(azmuth,lineInterval,numLine,selectLineData.pts,selectLineData.pointNum,resultLines,hPtNumber);
SaveMultiRouteLine(pathName,heightInterval,pathNameArr,resultLines);
}
else
{
bSaveMultiLine = false;
}
}
ClearHighLightLine();
m_bSelectFeatureFlag = false;
m_lineSelectedID==-1;
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
for (int i=0;i<pathNameArr.size();++i)
{
OnShowGivenLine(pathNameArr.at(i));
}
}
void CGISDlg::OnShowTargetPoint(const double lon,const double lat,int pixelSize) void CGISDlg::OnShowTargetPoint(double lon,double lat,int pixelSize)
{ {
if (testLayer!=-1) if (testLayer!=-1)
{ {

@ -34,6 +34,7 @@
#include "TopologicalAnalysis.h" #include "TopologicalAnalysis.h"
#include "DlgMarker.h" #include "DlgMarker.h"
#include <map> #include <map>
#include <array>
#include "MapElevation.h" #include "MapElevation.h"
#include "../Include/8BMapDLL_type.h" #include "../Include/8BMapDLL_type.h"
#include "SaveZoneDlg.h" #include "SaveZoneDlg.h"
@ -247,6 +248,13 @@ public:
void ZoomToLocation(double lon,double lat); void ZoomToLocation(double lon,double lat);
private: // by Wu private: // by Wu
//map<int,map<long,long>> m_subLineLayerID; //子航线线图层号
//map<int,map<long,long>> m_subLinePtLayerID; //子航线点图层号
long m_subLineLayerID[20][20]; //子航线线图层号
long m_subLinePtLayerID[20][20]; //子航线点图层号
bool m_pHaveDrawCopyLineFlag[20][20];
bool m_bShowCopyLine;
map<int,CString> m_lineFullPathName;
// //
void ShowModifyPointDlg(int selectedPointID=0); //编辑航线时,显示航点设置对话框 void ShowModifyPointDlg(int selectedPointID=0); //编辑航线时,显示航点设置对话框
void ShowEditSaveDlg(); //显示保存编辑对话框 void ShowEditSaveDlg(); //显示保存编辑对话框
@ -319,14 +327,14 @@ private:
bool m_bHaveAddMap; bool m_bHaveAddMap;
//航迹标绘图层ID //航迹标绘图层ID
long m_flyTrackLayerID[3]; long m_flyTrackLayerID[255];
//UAV航迹标绘图层ID //UAV航迹标绘图层ID
long m_UAVFlyTrackLayerID[3]; long m_UAVFlyTrackLayerID[255];
long m_UAVFlyTrackLayerID_ADS[MAX_PLANE_NUM_ADS]; long m_UAVFlyTrackLayerID_ADS[MAX_PLANE_NUM_ADS];
//是否已经标绘了无人机的飞行轨迹 //是否已经标绘了无人机的飞行轨迹
bool m_bFirstDrawUAVTrack[3]; bool m_bFirstDrawUAVTrack[255];
bool m_bFirstDrawUAVTrack_ADS[MAX_PLANE_NUM_ADS]; bool m_bFirstDrawUAVTrack_ADS[MAX_PLANE_NUM_ADS];
//地图显示区宽度、高度倒数 //地图显示区宽度、高度倒数
@ -506,7 +514,7 @@ private:
long m_CircleGuideLayer; //盘旋引导图层 long m_CircleGuideLayer; //盘旋引导图层
int m_drawTrackPtNum[3]; int m_drawTrackPtNum[255];
//新航线设计的航点的最大个数 2016.01.06 //新航线设计的航点的最大个数 2016.01.06
int m_MaxNumofLinePt; int m_MaxNumofLinePt;
@ -713,6 +721,9 @@ private:
//功能:标绘飞行航线 //功能:标绘飞行航线
//输入航线数据lineData //输入航线数据lineData
void DrawFlyLine(const DrawLineDataStruct lineData); void DrawFlyLine(const DrawLineDataStruct lineData);
//功能:标绘飞行航线(批量航线)
//输入航线数据lineData
void DrawCopyFlyLine(const DrawLineDataStruct lineData);
afx_msg void OnUpdateLineDisplay1(CCmdUI* pCmdUI); afx_msg void OnUpdateLineDisplay1(CCmdUI* pCmdUI);
afx_msg void OnUpdateLineDisplay2(CCmdUI* pCmdUI); afx_msg void OnUpdateLineDisplay2(CCmdUI* pCmdUI);
@ -727,6 +738,9 @@ private:
//功能:清除已经标绘的航线 //功能:清除已经标绘的航线
//输入航线编号lineID从0开始计数 //输入航线编号lineID从0开始计数
void ClearDrawedLine(const int lineID); void ClearDrawedLine(const int lineID);
//功能:清除已经标绘的航线(多机子航线)
//输入航线编号lineID从0开始计数
void ClearDrawedCopyLine(const int lineID,const int sublineID);
//功能:清除点图层标注信息 //功能:清除点图层标注信息
@ -983,12 +997,13 @@ public:
//功能:显示测绘航线设计对话框 //功能:显示测绘航线设计对话框
void OnShowDesignSurveyLineDlg(); void OnShowDesignSurveyLineDlg();
/****************************多机航线一键生成************************************/ /****************************多机航线一键生成************************************/
void GetMultiRouteLine(double azimuth,double lineInterval,int lineNumber,PtStruct* lineStruct,int nLinePts,vector<vector<PtStruct>>& resultLines); void GetMultiRouteLine(double azimuth,double lineInterval,int lineNumber,PtStruct* lineStruct,int nLinePts,vector<vector<PtStruct>>& resultLines,int hPtOffset=0);
void SaveMultiRouteLine(CString pathDirName,double heightInterval,const vector<vector<PtStruct>>& resultLines); void SaveMultiRouteLine(CString pathDirName,double heightInterval,vector<CString>& savePathNameArr,const vector<vector<PtStruct>>& resultLines);
void ShowMultiRouteSetting();
/****************************吊舱目标追踪测试************************************/ /****************************吊舱目标追踪测试************************************/
long testLayer; long testLayer;
void OnShowTargetPoint(const double lon,const double lat,int pixelSize=20); void OnShowTargetPoint(double lon,double lat,int pixelSize);
}; };
//{{AFX_INSERT_LOCATION}} //{{AFX_INSERT_LOCATION}}

@ -97,6 +97,7 @@ extern bool CreateDirectory(const CString &strDir)
} }
//提取没有后缀名的文件名 //提取没有后缀名的文件名
/*
extern CString ExtractFileName(CString fileName) extern CString ExtractFileName(CString fileName)
{ {
// 查找最后一个点的位置 // 查找最后一个点的位置
@ -114,7 +115,7 @@ extern CString ExtractFileName(CString fileName)
// 如果没有找到点,说明没有后缀,直接显示文件名 // 如果没有找到点,说明没有后缀,直接显示文件名
return fileName; return fileName;
} }
} }*/
//功能一个字节分成8位分别存储到数组中 //功能一个字节分成8位分别存储到数组中
@ -189,6 +190,58 @@ CString GetFlyLineName( const int lineID )
return (GetSoftwareCurrentDirectory() + _T( "\\route" ) + str + _T( ".txt" )); return (GetSoftwareCurrentDirectory() + _T( "\\route" ) + str + _T( ".txt" ));
} }
CString GetFlyLineDirName( const int lineID )
{
CString str;
if (lineID<=5)
{
str.Format( "航线%d", lineID );
}
else if (lineID == 11)
{
str = "应急航线";
}
else if( lineID == 12 )
{
str = "电子围栏";
}
else if (lineID == 14)
{
str = "回收航线";
}
return (GetSoftwareCurrentDirectory() + _T( "\\Route\\" ) + str );
}
//获取文件路径字符串
CString ExtractDirPath(CString strFullPath)
{
int n=strFullPath.ReverseFind('\\')+1;
return strFullPath.Left(n);
}
//获取文件名字字符串
CString ExtractFileName(CString strFullPath,bool bIncludeType)
{
CString strFile;
int n=strFullPath.GetLength()-strFullPath.ReverseFind('\\')-1;
strFile=strFullPath.Right(n);
if (bIncludeType==false) //去除文件名后缀
{
n = strFile.ReverseFind('.');
return strFile.Left(n);
}
else
{
return strFile;
}
}
//获取文件类型
CString ExtractFileType(CString strFullPath)
{
int n=strFullPath.GetLength()-strFullPath.ReverseFind('.')-1;
return strFullPath.Right(n);
}
//可视域分析相关变量 //可视域分析相关变量
/************************************************************************/ /************************************************************************/

@ -173,7 +173,7 @@ extern bool SearchDirectory(const CString &strDir);
extern bool CreateDirectory(const CString &strDir); extern bool CreateDirectory(const CString &strDir);
//提取没有后缀名的文件名 //提取没有后缀名的文件名
extern CString ExtractFileName(CString fileName); //extern CString ExtractFileName(CString fileName);
//功能一个字节分成8位分别存储到数组中 //功能一个字节分成8位分别存储到数组中
//输入字节oneByte //输入字节oneByte
@ -193,6 +193,15 @@ extern CString GPSUTCTime2BeijingTime(const double utcTime);
//获得航线文件名输入航线号1、2、3、4、5 //获得航线文件名输入航线号1、2、3、4、5
extern CString GetFlyLineName( const int lineID ); extern CString GetFlyLineName( const int lineID );
//获取航线文件夹名字
extern CString GetFlyLineDirName( const int lineID );
//获取文件路径字符串
extern CString ExtractDirPath(CString strFullPath);
//获取文件名字字符串
extern CString ExtractFileName(CString strFullPath,bool bIncludeType=true);
//获取文件类型
extern CString ExtractFileType(CString strFullPath);
const int LINEPTNUM = 256; const int LINEPTNUM = 256;

@ -1,13 +1,13 @@
// //
// GISCONTROLDLG.RC2 - resources Microsoft Visual C++ does not edit directly // GISCONTROLDLG.RC2 - resources Microsoft Visual C++ does not edit directly
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#error this file is not editable by Microsoft Visual C++ #error this file is not editable by Microsoft Visual C++
#endif //APSTUDIO_INVOKED #endif //APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Add manually edited resources here... // Add manually edited resources here...
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

@ -164,6 +164,7 @@
#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 IDC_EDIT_FLYSPEED 1056
#define IDC_COMBO_HPT 1056
#define IDB_BITMAP2 1057 #define IDB_BITMAP2 1057
#define IDC_EDIT_MARKER_NAME 1057 #define IDC_EDIT_MARKER_NAME 1057
#define IDC_TXT_FLYTIME 1057 #define IDC_TXT_FLYTIME 1057
@ -426,14 +427,16 @@
#define ID__32940 32940 #define ID__32940 32940
#define ID__DESIGNSURVEYLINE 32941 #define ID__DESIGNSURVEYLINE 32941
#define ID_DESIGNSURVEYLINE 32942 #define ID_DESIGNSURVEYLINE 32942
#define ID_32943 32943
#define ID_COPE_LINE 32944
// Next default values for new objects // Next default values for new objects
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#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 32945
#define _APS_NEXT_CONTROL_VALUE 1056 #define _APS_NEXT_CONTROL_VALUE 1057
#define _APS_NEXT_SYMED_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 1000
#endif #endif
#endif #endif

@ -14,6 +14,9 @@ SetMultiRouteDlg::SetMultiRouteDlg(CWnd* pParent /*=NULL*/)
: CBCGPDialog(SetMultiRouteDlg::IDD, pParent) : CBCGPDialog(SetMultiRouteDlg::IDD, pParent)
{ {
EnableVisualManagerStyle(TRUE, TRUE); EnableVisualManagerStyle(TRUE, TRUE);
numPoints = 0;
selectHPtNumber = 0;
} }
SetMultiRouteDlg::~SetMultiRouteDlg() SetMultiRouteDlg::~SetMultiRouteDlg()
@ -23,11 +26,13 @@ SetMultiRouteDlg::~SetMultiRouteDlg()
void SetMultiRouteDlg::DoDataExchange(CDataExchange* pDX) void SetMultiRouteDlg::DoDataExchange(CDataExchange* pDX)
{ {
CBCGPDialog::DoDataExchange(pDX); CBCGPDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_HPT, m_HPtCombobox);
} }
BEGIN_MESSAGE_MAP(SetMultiRouteDlg, CBCGPDialog) BEGIN_MESSAGE_MAP(SetMultiRouteDlg, CBCGPDialog)
ON_BN_CLICKED(IDOK, &SetMultiRouteDlg::OnBnClickedOk) ON_BN_CLICKED(IDOK, &SetMultiRouteDlg::OnBnClickedOk)
ON_CBN_SELCHANGE(IDC_COMBO_HPT, &SetMultiRouteDlg::OnCbnSelchangeComboHpt)
END_MESSAGE_MAP() END_MESSAGE_MAP()
BOOL SetMultiRouteDlg::OnInitDialog() BOOL SetMultiRouteDlg::OnInitDialog()
@ -39,6 +44,14 @@ BOOL SetMultiRouteDlg::OnInitDialog()
GetDlgItem( IDC_EDIT_HEIGHTINTERVAL )->SetWindowTextA("10"); GetDlgItem( IDC_EDIT_HEIGHTINTERVAL )->SetWindowTextA("10");
GetDlgItem( IDC_EDIT_LINENUMBER )->SetWindowTextA("3"); GetDlgItem( IDC_EDIT_LINENUMBER )->SetWindowTextA("3");
CString str;
for (int i=1;i<=numPoints;++i)
{
str.Format("%d",i);
m_HPtCombobox.InsertString(i,str);
}
m_HPtCombobox.SetCurSel(0);
return TRUE; return TRUE;
} }
@ -75,3 +88,19 @@ void SetMultiRouteDlg::OnBnClickedOk()
this->OnOK(); this->OnOK();
} }
void SetMultiRouteDlg::SetPointNumber(int num)
{
numPoints = num;
}
int SetMultiRouteDlg::GetHPointNumber()
{
return selectHPtNumber;
}
void SetMultiRouteDlg::OnCbnSelchangeComboHpt()
{
selectHPtNumber = m_HPtCombobox.GetCurSel();
}

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "Resource.h" #include "Resource.h"
#include "afxwin.h"
// SetMultiRouteDlg 对话框 // SetMultiRouteDlg 对话框
@ -24,4 +25,12 @@ protected:
DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
public: public:
afx_msg void OnBnClickedOk(); afx_msg void OnBnClickedOk();
void SetPointNumber(int num);
int GetHPointNumber();
private:
CBCGPComboBox m_HPtCombobox;
int numPoints;
int selectHPtNumber;
public:
afx_msg void OnCbnSelchangeComboHpt();
}; };

Loading…
Cancel
Save