|
|
|
@ -188,6 +188,17 @@ CGISDlg::CGISDlg(CWnd* pParent /*=NULL*/)
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
tmpSurveyRegionLayerID = -1;
|
|
|
|
@ -583,6 +594,7 @@ BEGIN_MESSAGE_MAP(CGISDlg, CBCGPDialog)
|
|
|
|
|
ON_COMMAND(ID_EDIT_NODE, OnEditLine) //编辑航线
|
|
|
|
|
ON_COMMAND(ID_EDIT_LINE, ShowModifyPointDlg) //修改航点
|
|
|
|
|
ON_COMMAND(ID_EDIT_SAVE, ShowEditSaveDlg) //保存编辑
|
|
|
|
|
ON_COMMAND(ID_COPE_LINE, ShowMultiRouteSetting) //批量航线
|
|
|
|
|
/*
|
|
|
|
|
ON_COMMAND(ID_MODIFY_LINEPOINT, OnMapSelect); //修改航点航线
|
|
|
|
|
ON_COMMAND(ID_EDIT_SAVE, OnMapSelect); //保存编辑*/
|
|
|
|
@ -3717,7 +3729,7 @@ void CGISDlg::AddTargetPoint(const int nPt, const double dX, const double dY)
|
|
|
|
|
//说明:创建专门用于绘制无人机的矢量面图层,每次先删除上次标绘的Shp,再重新标绘
|
|
|
|
|
void CGISDlg::DrawUAV(int uavid, const double dX, const double dY, const double yaw,bool control)
|
|
|
|
|
{
|
|
|
|
|
if (uavid<0||uavid>1000)
|
|
|
|
|
if (uavid<0||uavid>2)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -4627,7 +4639,13 @@ void CGISDlg::DrawFlyLine(const DrawLineDataStruct lineData)
|
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
@ -4639,6 +4657,95 @@ void CGISDlg::DrawFlyLine(const DrawLineDataStruct lineData)
|
|
|
|
|
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)航线已经标注,清除显示
|
|
|
|
|
// 2)航线未标注,进行显示
|
|
|
|
@ -4968,6 +5094,21 @@ void CGISDlg::SetFlyLineShowStatus(const int lineID)
|
|
|
|
|
|
|
|
|
|
//标识置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
|
|
|
|
|
{
|
|
|
|
@ -4983,6 +5124,21 @@ void CGISDlg::SetFlyLineShowStatus(const int lineID)
|
|
|
|
|
CString str = LineRouteDlg.GetPathName(); //获取文件路径名
|
|
|
|
|
//OnShowGivenLine(GetFlyLineName(lineID));
|
|
|
|
|
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( "航路文件不存在!" ) );
|
|
|
|
|
return;
|
|
|
|
@ -5076,12 +5232,23 @@ void CGISDlg::OnShowGivenLine(const CString strLineFileName)
|
|
|
|
|
if (m_lineManage.ReadLineDataFromFile(lineDataGroup, strLineFileName))
|
|
|
|
|
{
|
|
|
|
|
//判断航线号是否正确(lineID取值1-8,10-11,13)(add 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("航线号不正确!");
|
|
|
|
|
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;
|
|
|
|
|
/***************************测绘区域处理************************************/
|
|
|
|
|
if (ch == 0x03)
|
|
|
|
@ -5635,7 +5802,7 @@ void CGISDlg::OnEnddesign() //
|
|
|
|
|
if (IDOK == dlgSave.DoModal())
|
|
|
|
|
{
|
|
|
|
|
strFlyLineName = dlgSave.GetPathName();
|
|
|
|
|
pathName = ExtractFileName(strFlyLineName);
|
|
|
|
|
pathName = ExtractFileName(strFlyLineName,false);
|
|
|
|
|
|
|
|
|
|
////写出航线数据
|
|
|
|
|
FILE *fp = fopen(strFlyLineName, "w" );
|
|
|
|
@ -5684,7 +5851,8 @@ void CGISDlg::OnEnddesign() //
|
|
|
|
|
{
|
|
|
|
|
vector<vector<PtStruct>> resultLines;
|
|
|
|
|
GetMultiRouteLine(azmuth,lineInterval,numLine,m_pDesignLineStruct,m_designLinePointNum,resultLines);
|
|
|
|
|
SaveMultiRouteLine(pathName,heightInterval,resultLines);
|
|
|
|
|
vector<CString>savePathNameArr;
|
|
|
|
|
SaveMultiRouteLine(pathName,heightInterval,savePathNameArr,resultLines);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset(m_pDesignLineStruct, 0, sizeof(PtStruct)*m_lineMaxPointNum); //初始化新建一条航线
|
|
|
|
@ -8444,7 +8612,7 @@ void CGISDlg::GetMultiRouteLine(double azimuth,double lineInterval,int lineNumbe
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
for (int i=0;i<resultLines.size();++i)
|
|
|
|
@ -8453,21 +8621,73 @@ void CGISDlg::SaveMultiRouteLine(CString pathDirName,double heightInterval,const
|
|
|
|
|
CString tmp;
|
|
|
|
|
tmp.Format("-%d",i+2);
|
|
|
|
|
saveFileName = pathDirName + tmp + ".txt";
|
|
|
|
|
savePathNameArr.push_back(saveFileName);
|
|
|
|
|
//保存文件
|
|
|
|
|
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);
|
|
|
|
|
int j = 0;
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
if (multiRouteDlg.DoModal() == IDOK )
|
|
|
|
|
{
|
|
|
|
|
azmuth = multiRouteDlg.azmuth;
|
|
|
|
|
heightInterval = multiRouteDlg.heightInterval;
|
|
|
|
|
lineInterval = multiRouteDlg.lineInterval;
|
|
|
|
|
numLine = multiRouteDlg.numLine;
|
|
|
|
|
bSaveMultiLine = true;
|
|
|
|
|
|
|
|
|
|
CString selectLinePath = m_lineFullPathName[m_lineSelectedID];
|
|
|
|
|
if (ExtractFileType(selectLinePath) == ".route") return; // 已装订的航线不允许批量生成
|
|
|
|
|
DrawLineDataStruct selectLineData = m_ShowedLineDataList[m_lineSelectedID];
|
|
|
|
|
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);
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|