|
|
// GISDlg.cpp : implementation file
|
|
|
//
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
#include "GISDlg.h"
|
|
|
#include <math.h>
|
|
|
#include "label.h"
|
|
|
//#include <atlimage.h>
|
|
|
#include "shapedrawingoptions.h"
|
|
|
#include "shape.h"
|
|
|
#include "labelcategory.h"
|
|
|
#include "ScreenCapture.h"
|
|
|
#include "SetSaveLineID.h"
|
|
|
#include "CUtils.h"
|
|
|
|
|
|
|
|
|
//#include "8BMapDLL_type.h"
|
|
|
|
|
|
#include <fstream>
|
|
|
#include <sstream>
|
|
|
#include <iostream>
|
|
|
#include "vectortoraster.h"
|
|
|
#include "SaveLineEditSetting.h"
|
|
|
#include "ModifyLinePointDlg.h"
|
|
|
#include <OleAuto.h>
|
|
|
#include <Windows.h>
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
#define new DEBUG_NEW
|
|
|
#undef THIS_FILE
|
|
|
static char THIS_FILE[] = __FILE__;
|
|
|
#endif
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
// CGISDlg dialog
|
|
|
|
|
|
const double DEG2RAD = 0.017453292519943295769236907684886127134428718885417;
|
|
|
|
|
|
DWORD LineClr[15] = {RGB(0,255,0),RGB(255,0,0), RGB(0,0,255),RGB(128,128,0), RGB(0,0,0),RGB(0,255,0),RGB(255,0,0), RGB(0,0,255),RGB(128,128,0), RGB(0,0,0),RGB(0,255,0),RGB(255,0,0), RGB(0,0,255),RGB(124,252,0/*127,255,170*/), RGB(0,0,0)};
|
|
|
|
|
|
//常发数据定时器回调函数
|
|
|
void FAR PASCAL CatchMTimerDraw(WORD IDEvent, WORD uReserved, DWORD dwUser,DWORD dwReserved1,DWORD dwReserve2)
|
|
|
{
|
|
|
::PostMessage(g_mapHwnd, WM_SEND_DRAWUAV, FALSE, 0);
|
|
|
}
|
|
|
|
|
|
CGISDlg::CGISDlg(CWnd* pParent /*=NULL*/)
|
|
|
: CBCGPDialog(CGISDlg::IDD, pParent)
|
|
|
{
|
|
|
EnableVisualManagerStyle(TRUE, TRUE);
|
|
|
//{{AFX_DATA_INIT(CGISDlg)
|
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
|
//}}AFX_DATA_INIT
|
|
|
|
|
|
m_MsgHwnd = NULL;
|
|
|
m_MsgID = 0; //导引点的消息ID
|
|
|
m_LineLoadMsgID=0; //装订航线
|
|
|
m_drawPlanFlyLine = -1;
|
|
|
|
|
|
//经纬度对话框显示标识
|
|
|
m_bHaveShowLonLatDlg = false;
|
|
|
|
|
|
//新航线设计对话框显示标识
|
|
|
m_bHaveShowLineDesign = false;
|
|
|
|
|
|
//2点之间的水平距离界面显示的标识
|
|
|
m_bHaveShowDistanceDlg = false;
|
|
|
|
|
|
//是否已经加载了地图
|
|
|
m_bHaveAddMap = false;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0;i<3;i++)
|
|
|
{
|
|
|
//航迹标绘图层ID
|
|
|
m_flyTrackLayerID[i] = -1;
|
|
|
|
|
|
//UAV航迹标绘图层ID
|
|
|
m_UAVFlyTrackLayerID[i] = -1;
|
|
|
|
|
|
//是否已经标绘了无人机的飞行轨迹
|
|
|
m_bFirstDrawUAVTrack[i] = false;
|
|
|
|
|
|
m_drawTrackPtNum[i] = 0;
|
|
|
}
|
|
|
//
|
|
|
for (int i = 0;i<MAX_PLANE_NUM_ADS;i++)
|
|
|
{
|
|
|
//航迹标绘图层ID
|
|
|
//m_flyTrackLayerID[i] = -1;
|
|
|
|
|
|
//UAV航迹标绘图层ID
|
|
|
m_UAVFlyTrackLayerID_ADS[i] = -1;
|
|
|
|
|
|
m_bWithin100km_ADS[i] = false;
|
|
|
}
|
|
|
m_iCurrentADSid = 0;
|
|
|
m_iTotalADSnum = 0;
|
|
|
|
|
|
//地图显示区宽度、高度倒数
|
|
|
m_onePerWidth = 0;
|
|
|
m_onePerHeight = 0;
|
|
|
|
|
|
m_mapAreaHalfWidth = 0;
|
|
|
m_mapAreaHalfHeight = 0;
|
|
|
|
|
|
//航线设计状态
|
|
|
m_bLineDesign = false;
|
|
|
|
|
|
//飞行器标绘的航点个数
|
|
|
m_ptNum = 18;
|
|
|
|
|
|
//飞行器
|
|
|
memset(m_ppUavPtArray,0,sizeof(double)*18*2);
|
|
|
memset(m_ppUavPtArray_ADS,0,sizeof(double)*18*2);
|
|
|
|
|
|
m_ptPlane[0] = CPoint(0, -13);
|
|
|
m_ptPlane[1] = CPoint(2, -9);
|
|
|
m_ptPlane[2] = CPoint(2, -6);
|
|
|
m_ptPlane[3] = CPoint(12, 4);
|
|
|
m_ptPlane[4] = CPoint(12, 6);
|
|
|
m_ptPlane[5] = CPoint(2, 2);
|
|
|
m_ptPlane[6] = CPoint(1, 10);
|
|
|
m_ptPlane[7] = CPoint(3, 12);
|
|
|
m_ptPlane[8] = CPoint(3, 13);
|
|
|
m_ptPlane[9] = CPoint(0, 13);
|
|
|
m_ptPlane[10] = CPoint(-3, 13);
|
|
|
m_ptPlane[11] = CPoint(-3, 12);
|
|
|
m_ptPlane[12] = CPoint(-1, 10);
|
|
|
m_ptPlane[13] = CPoint(-2, 2);
|
|
|
m_ptPlane[14] = CPoint(-12, 6);
|
|
|
m_ptPlane[15] = CPoint(-12, 4);
|
|
|
m_ptPlane[16] = CPoint(-2, -6);
|
|
|
m_ptPlane[17] = CPoint(-2, -9);
|
|
|
|
|
|
m_ptPlane_ADS[0] = CPoint(0, -13);
|
|
|
m_ptPlane_ADS[1] = CPoint(2, -9);
|
|
|
m_ptPlane_ADS[2] = CPoint(2, -6);
|
|
|
m_ptPlane_ADS[3] = CPoint(12, 4);
|
|
|
m_ptPlane_ADS[4] = CPoint(12, 6);
|
|
|
m_ptPlane_ADS[5] = CPoint(2, 2);
|
|
|
m_ptPlane_ADS[6] = CPoint(1, 10);
|
|
|
m_ptPlane_ADS[7] = CPoint(3, 12);
|
|
|
m_ptPlane_ADS[8] = CPoint(3, 13);
|
|
|
m_ptPlane_ADS[9] = CPoint(0, 13);
|
|
|
m_ptPlane_ADS[10] = CPoint(-3, 13);
|
|
|
m_ptPlane_ADS[11] = CPoint(-3, 12);
|
|
|
m_ptPlane_ADS[12] = CPoint(-1, 10);
|
|
|
m_ptPlane_ADS[13] = CPoint(-2, 2);
|
|
|
m_ptPlane_ADS[14] = CPoint(-12, 6);
|
|
|
m_ptPlane_ADS[15] = CPoint(-12, 4);
|
|
|
m_ptPlane_ADS[16] = CPoint(-2, -6);
|
|
|
m_ptPlane_ADS[17] = CPoint(-2, -9);
|
|
|
|
|
|
//地图显示区域左上角X坐标
|
|
|
m_leftTopX = 0;
|
|
|
|
|
|
//地图显示区域左上角Y坐标
|
|
|
m_leftTopY = 0;
|
|
|
|
|
|
//目标标绘SHP图层ID号
|
|
|
m_targetPtShapeID = 0;
|
|
|
|
|
|
//是否已经创建过SHP目标标注图层
|
|
|
m_bHaveCreateTargetShp = false;
|
|
|
|
|
|
//标注偏差量
|
|
|
m_labelWarpValue = 15;
|
|
|
|
|
|
//总共的目标点个数
|
|
|
m_totalPointNum = 512;
|
|
|
|
|
|
//新航线设计的航点的最大个数 2016.01.06
|
|
|
m_MaxNumofLinePt = 255;
|
|
|
// m_pNewDesignLineStruct = new tmpPT[m_MaxNumofLinePt]; //航点数据
|
|
|
// memset(m_pNewDesignLineStruct, 0, sizeof(tmpPT)*m_MaxNumofLinePt); //初始化
|
|
|
|
|
|
m_pNewDesignLineStruct = new PtStruct[m_MaxNumofLinePt]; //航点数据
|
|
|
memset(m_pNewDesignLineStruct, 0, sizeof(PtStruct)*m_MaxNumofLinePt); //初始化
|
|
|
|
|
|
m_NowNumLineDesign = 0; //当前航点的个数
|
|
|
|
|
|
m_lineMaxPointNum = 255; //一条航线最大的航点个数
|
|
|
m_pDesignLineStruct = new PtStruct[m_lineMaxPointNum]; //航点数据
|
|
|
memset(m_pDesignLineStruct, 0, sizeof(PtStruct)*m_lineMaxPointNum); //初始化
|
|
|
m_designLinePointNum = 0; //当前航点个数
|
|
|
|
|
|
m_CircleGuideLayer = -1; //盘旋引导图层
|
|
|
|
|
|
/*******************************测绘航线********************************/
|
|
|
surveyRegionLayerID = -1;
|
|
|
tmpSurveyRegionLayerID = -1;
|
|
|
tmpSurveyLineLayerID = -1;
|
|
|
/*******************************新增限制区********************************/
|
|
|
//绘制禁飞区、限飞区
|
|
|
std::fill(noFlyZoneLayersID, noFlyZoneLayersID + 5, -1);//禁飞区
|
|
|
std::fill(restrictedZoneLayersID, restrictedZoneLayersID + 5, -1);//限飞区
|
|
|
bDrawRestrictedZone = false;
|
|
|
bShowZone = false;
|
|
|
m_tempZoneLayerID = -1;
|
|
|
/**********************************************************************************/
|
|
|
//航线标绘图层ID初始化
|
|
|
m_designLineLayerID = -1;
|
|
|
m_designLineLayerID2 = -1;
|
|
|
|
|
|
//目标点标绘图层的ID号
|
|
|
m_targetDrawLayerID = -1;
|
|
|
|
|
|
//临时标绘图层
|
|
|
m_tempLayerID = -1;
|
|
|
/****************新增<编辑航线>功能***********************************/
|
|
|
/*****by Wu 2023.09.11*******/
|
|
|
//选中高亮图层
|
|
|
m_highLightLineLayerID = -1;
|
|
|
//地形点图层
|
|
|
m_tempTerrainPointsLayerID = -1;
|
|
|
m_tempshpPointLayerID = -1;
|
|
|
m_tempshpLineLayerID = -1;
|
|
|
//存储盘旋点ID
|
|
|
circlingPointID = -1;
|
|
|
m_lineSelectedID = -1;
|
|
|
|
|
|
GLOBAL_X = 0;
|
|
|
GLOBAL_Y = 0;
|
|
|
|
|
|
//编辑回收航线状态
|
|
|
m_bEditLine = false;
|
|
|
//回收航线显示状态
|
|
|
//m_bShowBackLine = false;
|
|
|
//拖拽移动标志
|
|
|
m_dragFlag = false;
|
|
|
// 选择模式
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
|
|
|
//
|
|
|
m_KTPtShpLayerID = -1; //空投点图层
|
|
|
//m_pDesignKTLineDlg = NULL;
|
|
|
/****************/
|
|
|
|
|
|
/*****By Wu 2023.10.16********/
|
|
|
m_distLabelLayer = -1; //编辑时显示方位角和距离
|
|
|
|
|
|
//多点测距相关变量初始化
|
|
|
m_bPolylineMeasure = false; //多点测距标志
|
|
|
m_numPolylineMeasurePts = 0; //测距点数
|
|
|
m_bMeasureDrag = false; //是否可以拉扯
|
|
|
//参与距离测量的连线段图层
|
|
|
m_polylineMeasureLineLayerID = -1;
|
|
|
|
|
|
//标注距离测量结果标注的图层
|
|
|
m_polylineMeasureLabelLayerID = -1;
|
|
|
|
|
|
//参与距离测量的点序号的标注图层
|
|
|
m_polylineMeasurePtLayerID[0] = -1;
|
|
|
m_polylineMeasurePtLayerID[1] = -1;
|
|
|
/************************************************************/
|
|
|
//标识是否在临时图层上进行标注
|
|
|
m_beTemLayerDrawing = true;
|
|
|
|
|
|
//当前设计的航点数据
|
|
|
memset(&m_curDesignPoint, 0, sizeof(PtStruct));
|
|
|
|
|
|
//是否已经增加新的航点
|
|
|
m_bAddNewPoint = false;
|
|
|
|
|
|
int i = 0;
|
|
|
int j = 0;
|
|
|
|
|
|
//////////////////与航线显示相关的数据体/////////////////////
|
|
|
m_totalFlyLines = 14; //总的飞行航线数原5改为14 20221121
|
|
|
|
|
|
DrawLineDataStruct m_pFlyLines[14]; //飞行航线数据体 原5 改为12
|
|
|
memset(m_pFlyLines, 0, sizeof(DrawLineDataStruct)*m_totalFlyLines);
|
|
|
|
|
|
|
|
|
m_flyLineNum = 0; //飞行航线数
|
|
|
|
|
|
//飞行航线标注层
|
|
|
m_flyLinesLayerID = -1;
|
|
|
|
|
|
//是否已经创建了无人机标绘的Shp面图层
|
|
|
m_bHaveCreateUAVShpLayer = false;
|
|
|
|
|
|
//无人机标绘的Shp面图层ID
|
|
|
m_uavShapileLayerID = -1;
|
|
|
|
|
|
//航线标绘图层的Shp图层ID数组,每条航线具有2个标绘图层:1个图层为航点、另一个图层为航线//5改为8 20221121
|
|
|
long m_ppPlanLineShpLayerIDArr[14][2];
|
|
|
for (i=0; i<14; i++)
|
|
|
{
|
|
|
for (j=0; j<2; j++)
|
|
|
{
|
|
|
m_ppPlanLineShpLayerIDArr[i][j] = -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//航线是否已经标绘的标志
|
|
|
for (i=0; i<14; i++)
|
|
|
{
|
|
|
m_pHaveDrawLineFlag[i] = false;
|
|
|
}
|
|
|
|
|
|
m_pLineSectDlg = NULL;
|
|
|
m_pTargetDlg = NULL;
|
|
|
|
|
|
//第一个航点是否已经标绘
|
|
|
m_bDesignFirstPoint = true;
|
|
|
|
|
|
m_pFlyLineDesign = NULL;
|
|
|
|
|
|
m_pLineDesign = NULL;
|
|
|
|
|
|
m_bShowToolBar = false;
|
|
|
|
|
|
//地面站位置
|
|
|
g_gcsLon = 0; //经度
|
|
|
g_gcsLat = 0; //纬度
|
|
|
g_gcsAlt = 0; //高度
|
|
|
|
|
|
memset(&m_guidePtInfo, 0, sizeof(GuidePointData));
|
|
|
|
|
|
//地面站位置点矢量图层
|
|
|
m_gcsPtShpLayerID = -1;
|
|
|
|
|
|
//导引点位置点矢量图层
|
|
|
m_guidePtShpLayerID = -1;
|
|
|
|
|
|
//当前待编辑的航点数据
|
|
|
memset(&m_curEditLinePoint, 0, sizeof(PtStruct));
|
|
|
//目标点矢量图层ID号
|
|
|
//memset(m_pTargetShapfileID, 0, sizeof(long)*MAX_TARGET_NUM);
|
|
|
|
|
|
//工具栏高度
|
|
|
m_toolbarHeight = 0;
|
|
|
|
|
|
//是否进行自动漫游的标识
|
|
|
m_bAutoMove = true;
|
|
|
|
|
|
memset(m_pCallBackShapfileID, 0, sizeof(long)*255);
|
|
|
|
|
|
//导引点模式
|
|
|
m_guidePointMode = 0;
|
|
|
|
|
|
m_bGuideMode =false ;//导引飞行模式默认为false
|
|
|
///////
|
|
|
m_bSetPointModel=false; //没有处在置点工作模式
|
|
|
m_bEndSetPoint=false;
|
|
|
m_iPtSel=-1;
|
|
|
|
|
|
m_bLDSetPoint = FALSE;
|
|
|
|
|
|
m_canvasLayerID = -1;
|
|
|
|
|
|
memset(&m_infoData,0,sizeof(m_infoData));
|
|
|
|
|
|
m_targetSelID = 0;
|
|
|
|
|
|
m_bSelectDropPoint = false;
|
|
|
|
|
|
m_gisManager = GISManager::getInstance();
|
|
|
|
|
|
for (int i=0;i<g_iDemAltPtNum;i++)
|
|
|
{
|
|
|
g_lDemAltLayerID[i] = -1;
|
|
|
g_lDemAltDisLayerID[i] = -1;
|
|
|
g_lDemPtNumLayerID[i] = -1;
|
|
|
}
|
|
|
|
|
|
m_bPlotDemArea = false;
|
|
|
|
|
|
m_bEnableShowADSB = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
CGISDlg::~CGISDlg()
|
|
|
{
|
|
|
timeKillEvent(TimerID_Draw);
|
|
|
|
|
|
if(m_Layer != NULL)
|
|
|
{
|
|
|
delete m_Layer;
|
|
|
m_Layer = NULL;
|
|
|
}
|
|
|
|
|
|
if (m_pLonLatDlg != NULL)
|
|
|
{
|
|
|
delete m_pLonLatDlg;
|
|
|
m_pLonLatDlg = NULL;
|
|
|
}
|
|
|
|
|
|
if (m_pHZDistanceDlg != NULL)
|
|
|
{
|
|
|
delete m_pHZDistanceDlg;
|
|
|
m_pHZDistanceDlg = NULL;
|
|
|
}
|
|
|
|
|
|
if (m_pFlyLineDesign != NULL)
|
|
|
{
|
|
|
delete m_pFlyLineDesign;
|
|
|
m_pFlyLineDesign = NULL;
|
|
|
}
|
|
|
|
|
|
if (m_pLineDesign != NULL)
|
|
|
{
|
|
|
delete m_pLineDesign;
|
|
|
m_pLineDesign = NULL;
|
|
|
}
|
|
|
|
|
|
|
|
|
if (m_pDesignLineStruct != NULL)
|
|
|
{
|
|
|
delete []m_pDesignLineStruct;
|
|
|
m_pDesignLineStruct = NULL;
|
|
|
}
|
|
|
|
|
|
//2016.01.06
|
|
|
if (m_pNewDesignLineStruct != NULL)
|
|
|
{
|
|
|
delete []m_pNewDesignLineStruct;
|
|
|
m_pNewDesignLineStruct = NULL;
|
|
|
}
|
|
|
|
|
|
if (m_pLineSectDlg != NULL)
|
|
|
{
|
|
|
delete m_pLineSectDlg;
|
|
|
m_pLineSectDlg = NULL;
|
|
|
}
|
|
|
|
|
|
if (m_pTargetDlg != NULL)
|
|
|
{
|
|
|
delete m_pTargetDlg;
|
|
|
m_pTargetDlg = NULL;
|
|
|
}
|
|
|
|
|
|
if(m_gisManager != NULL)
|
|
|
{
|
|
|
m_gisManager->DestroyObject();
|
|
|
m_gisManager = NULL;
|
|
|
}
|
|
|
|
|
|
if (designSurveyLineDlg != nullptr)
|
|
|
{
|
|
|
delete designSurveyLineDlg;
|
|
|
designSurveyLineDlg = nullptr;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::DoDataExchange(CDataExchange* pDX)
|
|
|
{
|
|
|
CBCGPDialog::DoDataExchange(pDX);
|
|
|
DDX_Control(pDX, IDC_MAP1, m_map);
|
|
|
}
|
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CGISDlg, CBCGPDialog)
|
|
|
|
|
|
//{{AFX_MSG_MAP(CGISDlg)
|
|
|
ON_WM_MOUSEMOVE()
|
|
|
// ON_WM_MOUSEWHEEL()
|
|
|
ON_COMMAND(ID_ADDPOINT, OnAddpoint)
|
|
|
ON_MESSAGE(WM_SET_LAYER_STATUS, OnSetLayerStatus)
|
|
|
ON_MESSAGE(WM_CLOSE_LONLAT_DIALOG, OnCloseLonLatDialog)
|
|
|
ON_MESSAGE(WM_CLOSE_DISTANCE_DIALOG, OnCloseShowDistanceDialog)
|
|
|
ON_MESSAGE(WM_CLOSE_LINEDESIGN_DIALOG, OnCloseLineDesignDialog)
|
|
|
ON_MESSAGE(WM_ADD_LINE_POINT, OnAddLinePoint) //增加航点
|
|
|
ON_MESSAGE(WM_EDIT_LINE_POINT, OnEditLinePoint) //编辑航点
|
|
|
ON_MESSAGE(WM_DELETE_LINE_POINT, OnDeleteLinePoint) //删除航点
|
|
|
ON_MESSAGE(WM_SAVE_LINE_POINTS, OnSaveLinePoints) //保存航线
|
|
|
ON_COMMAND(IDT_BUTTON1, OnAddMapData) //加载地图数据
|
|
|
ON_COMMAND(IDT_BUTTON2, OnAddRasterImage) //加载栅格影像数据
|
|
|
ON_COMMAND(IDT_BUTTON3, OnAddFlyLineData) //加载航线数据
|
|
|
ON_COMMAND(IDT_BUTTON4, OnLayerManage) //图层管理
|
|
|
ON_COMMAND(IDT_BUTTON5, OnRemoveAllLayers) //清除所有图层
|
|
|
ON_COMMAND(IDM_DESIGN_MYFLYLINE, OnFlyLineDesign) //航线设计 2015.11.25 屏蔽航线设计对话框
|
|
|
ON_COMMAND(IDT_BUTTON6, OnMenuLinePtCtrlShow/*OnMapSelect*/) //地图选择
|
|
|
ON_COMMAND(IDT_BUTTON7, OnMapZoomIn) //地图放大
|
|
|
ON_COMMAND(IDT_BUTTON8, OnMapZoomOut) //地图缩小
|
|
|
ON_COMMAND(IDT_BUTTON9, OnMapMove) //地图漫游
|
|
|
ON_COMMAND(IDT_BUTTON10, OnMapFullScreen) //地图全景显示
|
|
|
ON_COMMAND(IDT_BUTTON11, OnEraseTrack) //清除航迹
|
|
|
ON_COMMAND(IDT_BUTTON12, OnShowLonLatInfo) //显示经纬度信息
|
|
|
ON_COMMAND(IDT_BUTTON13, OnSurvey) //测量2点之间的距离
|
|
|
ON_COMMAND(IDT_BUTTON14, OnShowCtrlMenu/*OnPrint*/) //航线属性 //打印输出
|
|
|
ON_COMMAND(IDT_BUTTON15, OnZhangCW) //打印输出
|
|
|
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipsNotify) //按钮文字提示
|
|
|
ON_COMMAND(IDM_GUIDE_FLY1, OnGuideMode1)
|
|
|
ON_COMMAND(IDM_DESIGN_MYFLYLINE, OnDesignLine)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_GUIDE_FLY1, OnUpdateGuideMode1)
|
|
|
ON_COMMAND(IDM_GUIDE_FLY2, OnGuideMode2)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_GUIDE_FLY2, OnUpdateGuideMode2)
|
|
|
ON_COMMAND(IDM_SHOW_LINE1, OnShowLine1)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE1, OnUpdateLineDisplay1)
|
|
|
ON_COMMAND(IDM_SHOW_LINE2, OnShowLine2)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE2, OnUpdateLineDisplay2)
|
|
|
ON_COMMAND(IDM_SHOW_LINE3, OnShowLine3)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE3, OnUpdateLineDisplay3)
|
|
|
ON_COMMAND(IDM_SHOW_LINE4, OnShowLine4)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE4, OnUpdateLineDisplay4)
|
|
|
ON_COMMAND(IDM_SHOW_LINE5, OnShowLine5)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE5, OnUpdateLineDisplay5)
|
|
|
ON_COMMAND(IDM_AUTO_MOVE, OnAutoMove)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_AUTO_MOVE, OnUpdateAutoMov)
|
|
|
ON_MESSAGE(WM_CHECK_FLY_LINE_STATUS, OnCheckFlyLineShowStatus)
|
|
|
ON_COMMAND(IDM_REMOVE_GUIDE_DRAW, OnRemoveGuidePtDraw)
|
|
|
ON_COMMAND(IDM_OPEN_FLYLINE, OnAddFlyLineData)
|
|
|
ON_COMMAND(ID_ENDDESIGN, OnEnddesign)
|
|
|
//}}AFX_MSG_MAP
|
|
|
|
|
|
ON_COMMAND(ID_CLEARPOINT, OnClearpoint)
|
|
|
ON_COMMAND(ID_EDITPOINT, OnEditpoint)
|
|
|
ON_COMMAND(ID_DELPOINT, OnDelpoint)
|
|
|
//ON_COMMAND(IDM_BINDLINE1, &CGISDlg::OnBindline1)
|
|
|
ON_COMMAND(IDM_BINDLINE2, OnBindline2)
|
|
|
ON_COMMAND(ID_LOAD_MYLINE1, OnLoadMyline1)
|
|
|
ON_COMMAND(IDM_BINDLINE3, OnBindline3)
|
|
|
ON_COMMAND(IDM_BINDLINE4, OnBindline4)
|
|
|
ON_COMMAND(IDM_BINDLINE5, OnBindline5)
|
|
|
ON_COMMAND(IDM_LAYERMNG, OnLayermng)
|
|
|
ON_COMMAND(IDM_ADDGTARGET, OnAddgtarget)
|
|
|
|
|
|
//ON_MESSAGE(MESSAGE_DRAWZK, &CGISDlg::DRAW_ZK)
|
|
|
|
|
|
// ON_WM_MOUSEHWHEEL()
|
|
|
ON_COMMAND(ID_NLINEDESIGN, &CGISDlg::OnNlinedesign)
|
|
|
ON_UPDATE_COMMAND_UI(ID_NLINEDESIGN, &CGISDlg::OnUpdateNlinedesign)
|
|
|
ON_COMMAND(ID_SHOW_BACKLINE, &CGISDlg::OnShowBackLine)
|
|
|
ON_UPDATE_COMMAND_UI(ID_SHOW_BACKLINE, &CGISDlg::OnUpdateShowBackLine)
|
|
|
ON_COMMAND(ID_SHOW_HS11, &CGISDlg::OnShowHs11)
|
|
|
ON_UPDATE_COMMAND_UI(ID_SHOW_HS11, &CGISDlg::OnUpdateShowHs11)
|
|
|
ON_COMMAND(ID_BIND_HS11, &CGISDlg::OnBindHs11)
|
|
|
ON_COMMAND(ID_SHOW_TC12, &CGISDlg::OnShowTc12)
|
|
|
ON_COMMAND(ID_BIND_TC12, &CGISDlg::OnBindTc12)
|
|
|
ON_UPDATE_COMMAND_UI(ID_SHOW_TC12, &CGISDlg::OnUpdateShowTc12)
|
|
|
ON_WM_SIZE()
|
|
|
ON_COMMAND(ID_BIND_BACKLINE, &CGISDlg::OnBindBackLine)
|
|
|
ON_WM_MOVE()
|
|
|
ON_MESSAGE(WM_SEL_UAV, &CGISDlg::OnSelUav)
|
|
|
ON_COMMAND(ID_ADD_TARGET, &CGISDlg::OnAddTarget)
|
|
|
ON_MESSAGE(WM_DRAW_TARGET, &CGISDlg::OnDrawTarget)
|
|
|
ON_WM_SHOWWINDOW()
|
|
|
ON_COMMAND(ID_TARGET_DELETE, &CGISDlg::OnTargetDelete)
|
|
|
|
|
|
ON_MESSAGE(WM_SEND_SELECTTARGET, &CGISDlg::OnSendSelectTarget)
|
|
|
ON_MESSAGE(WM_SEND_CLOSEDEMALT, &CGISDlg::OnSendCloseDemAlt)
|
|
|
|
|
|
ON_MESSAGE(WM_SHOW_POINTINMAP, &CGISDlg::OnShowPointInMap)
|
|
|
ON_MESSAGE(WM_SHOW_ISVISIBLE, &CGISDlg::OnShowPointVisible)
|
|
|
ON_MESSAGE(WM_SHOW_NOTVISIBLE, &CGISDlg::OnShowPointNotVisible)
|
|
|
ON_MESSAGE(WM_SEND_CLEARSHAPE, &CGISDlg::OnSendClearShape)
|
|
|
|
|
|
ON_MESSAGE(WM_SHOW_VISI_REALTIME, &CGISDlg::OnShowAreaVisible)
|
|
|
ON_MESSAGE(WM_SHOW_NOTVISI_REALTIME, &CGISDlg::OnShowAreaNotVisible)
|
|
|
ON_MESSAGE(WM_SHOW_VISI_DELETE, &CGISDlg::OnShowClearArea)
|
|
|
ON_MESSAGE(WM_ADD_LINELAYER, &CGISDlg::OnAddLineLayer)
|
|
|
ON_MESSAGE(WM_DEL_LINELAYER, &CGISDlg::OnDelLineLayer)
|
|
|
ON_MESSAGE(WM_SEND_REGIONTOGIS, &CGISDlg::OnSendRegionToGis)
|
|
|
ON_MESSAGE(WM_DRAW_LINEPOINT, &CGISDlg::OnDrawLinePoint)
|
|
|
ON_MESSAGE(WM_SHOW_CRASH_REALTIME, &CGISDlg::OnShowCrashArea)
|
|
|
ON_MESSAGE(WM_SEND_DRAWFIGHT, &CGISDlg::OnSendDrawFight)
|
|
|
ON_MESSAGE(WM_SEND_DRAWDEMREGION, &CGISDlg::OnSendDrawDemRegion)
|
|
|
|
|
|
ON_MESSAGE(WM_SEND_MAPLOCATION,&CGISDlg::OnZoomToLocation)
|
|
|
|
|
|
ON_COMMAND(ID__MENU_LIGHTREGION, &CGISDlg::OnMenuLightRegion)
|
|
|
ON_COMMAND(ID_MENU_ENTRYPOINT, &CGISDlg::OnMenuEntryPoint)
|
|
|
ON_COMMAND(ID_MENU_PLOTDEMAREA, &CGISDlg::OnMenuPlotdemArea)
|
|
|
|
|
|
ON_MESSAGE(WM_SEND_MAPCURSORMODE, &CGISDlg::OnSetMapCursorMode) //设置Map CursorMode
|
|
|
ON_MESSAGE(WM_SEND_DRAWMARKER, &CGISDlg::OnDrawMarker) //显示或隐藏标记点
|
|
|
ON_COMMAND(ID_MENU_CLEARGCS, &CGISDlg::OnMenuClearGCS)
|
|
|
ON_COMMAND(ID_MENU_ADSB, &CGISDlg::OnMenuADSB)
|
|
|
|
|
|
ON_MESSAGE(WM_SEND_DRAWUAV, &CGISDlg::OnTimerDrawUAV) //绘制无人机
|
|
|
|
|
|
//航线编辑 // -----by Wu 2023.09.14
|
|
|
ON_COMMAND(ID_SELECT_LINE, OnMapSelect) //选择航线
|
|
|
ON_COMMAND(ID_EDIT_NODE, OnEditLine) //编辑航线
|
|
|
ON_COMMAND(ID_EDIT_LINE, ShowModifyPointDlg) //修改航点
|
|
|
ON_COMMAND(ID_EDIT_SAVE, ShowEditSaveDlg) //保存编辑
|
|
|
/*
|
|
|
ON_COMMAND(ID_MODIFY_LINEPOINT, OnMapSelect); //修改航点航线
|
|
|
ON_COMMAND(ID_EDIT_SAVE, OnMapSelect); //保存编辑*/
|
|
|
|
|
|
|
|
|
/*
|
|
|
//新增航线6-8
|
|
|
ON_COMMAND(IDM_SHOW_LINE6, &CGISDlg::OnShowLine6)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE6, &CGISDlg::OnUpdateShowLine6)
|
|
|
ON_COMMAND(IDM_SHOW_LINE7, &CGISDlg::OnShowLine7)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE7, &CGISDlg::OnUpdateShowLine7)
|
|
|
ON_COMMAND(IDM_SHOW_LINE8, &CGISDlg::OnShowLine8)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE8, &CGISDlg::OnUpdateShowLine8)
|
|
|
ON_COMMAND(IDM_BINDLINE6, &CGISDlg::OnBindline6)
|
|
|
ON_COMMAND(IDM_BINDLINE7, &CGISDlg::OnBindline7)
|
|
|
ON_COMMAND(IDM_BINDLINE8, &CGISDlg::OnBindline8)
|
|
|
ON_COMMAND(IDM_SHOW_LINE9, &CGISDlg::OnShowLine9)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE9, &CGISDlg::OnUpdateShowLine9)
|
|
|
ON_COMMAND(IDM_SHOW_LINE10, &CGISDlg::OnShowLine10)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE10, &CGISDlg::OnUpdateShowLine10)
|
|
|
ON_COMMAND(IDM_BINDLINE9, &CGISDlg::OnBindline9)
|
|
|
ON_COMMAND(IDM_BINDLINE10, &CGISDlg::OnBindline10)*/
|
|
|
//空投航线
|
|
|
ON_COMMAND(IDM_SHOW_LINE14, &CGISDlg::OnShowLine14)
|
|
|
ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE14, &CGISDlg::OnUpdateShowLine14)
|
|
|
/****************************限制区************************************/
|
|
|
ON_COMMAND(IDM_DESIGN_ZONE,OnDesignZone)
|
|
|
ON_COMMAND(IDM_IMPORT_ZONE,OnImportZone)
|
|
|
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE1,OnShowRestrictedZone1)
|
|
|
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE2,OnShowRestrictedZone2)
|
|
|
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE3,OnShowRestrictedZone3)
|
|
|
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE4,OnShowRestrictedZone4)
|
|
|
ON_COMMAND(IDM_SHOW_RESTRICTEDZONE5,OnShowRestrictedZone5)
|
|
|
|
|
|
ON_COMMAND(IDM_SHOW_NOFLYZONE1,OnShowNoFlyZone1)
|
|
|
ON_COMMAND(IDM_SHOW_NOFLYZONE2,OnShowNoFlyZone2)
|
|
|
ON_COMMAND(IDM_SHOW_NOFLYZONE3,OnShowNoFlyZone3)
|
|
|
ON_COMMAND(IDM_SHOW_NOFLYZONE4,OnShowNoFlyZone4)
|
|
|
ON_COMMAND(IDM_SHOW_NOFLYZONE5,OnShowNoFlyZone5)
|
|
|
|
|
|
ON_COMMAND(IDM_BIND_ZONE,OnBindZone)
|
|
|
|
|
|
/*****************************测绘航线*******************************/
|
|
|
ON_MESSAGE(WM_SEND_SHOWSURVEYREGION, &CGISDlg::OnShowSurveyRegion) //显示测绘区域
|
|
|
ON_MESSAGE(WM_SEND_SHOWSURVEYLINE, &CGISDlg::OnShowSurveyRegion) //显示测绘航线
|
|
|
ON_MESSAGE(WM_CLEAR_TMPSURVEYFEATURE, &CGISDlg::OnClearTmpSurveyFeature) //显示测绘航线
|
|
|
ON_MESSAGE(WM_BIND_SURVEYLINE, &CGISDlg::OnBindSurveyLine) //装订测绘航线
|
|
|
ON_COMMAND(ID_DESIGNSURVEYLINE,OnShowDesignSurveyLineDlg) //显示测绘航线设计对话框
|
|
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
// CGISDlg message handlers
|
|
|
|
|
|
|
|
|
BOOL CGISDlg::OnInitDialog()
|
|
|
{
|
|
|
CBCGPDialog::OnInitDialog();
|
|
|
|
|
|
SetWindowPos(NULL,0 ,0 ,600, 700, SWP_NOZORDER|SWP_NOMOVE);
|
|
|
|
|
|
//功能:创建浮动工具栏
|
|
|
CreateFloatToolBar();
|
|
|
//窗口句柄
|
|
|
g_mapHwnd = this->GetSafeHwnd();
|
|
|
|
|
|
//创建图层管理对话框
|
|
|
m_Layer = new CMapLayerManage();
|
|
|
m_Layer->Create(IDD_DIALOG_LAYER_MANAGE);
|
|
|
|
|
|
//在整个全屏幕中的GIS显示区域
|
|
|
m_gisAreaInScreen = m_rcGISArea;
|
|
|
m_gisAreaInScreen.top += 32;
|
|
|
|
|
|
//创建经纬度对话框
|
|
|
m_pLonLatDlg = new CLonLatDlg();
|
|
|
m_pLonLatDlg->MoveToGivenArea(m_gisAreaInScreen);
|
|
|
m_pLonLatDlg->Create(IDD_XY_DIALOG);
|
|
|
|
|
|
//2点之间的水平距离显示对话框对象
|
|
|
m_pHZDistanceDlg = new CShowHZDistanceDlg();
|
|
|
m_pHZDistanceDlg->MoveToGivenArea(m_gisAreaInScreen);
|
|
|
m_pHZDistanceDlg->Create(IDD_DISTANCE_DIALOG);
|
|
|
|
|
|
//航线设计对话框
|
|
|
m_pFlyLineDesign = new CFlyLineDesign();
|
|
|
m_pFlyLineDesign->MoveToGivenArea(m_gisAreaInScreen);
|
|
|
m_pFlyLineDesign->Create(IDD_DIALOG_FLYLINE_DESIGN);
|
|
|
|
|
|
// m_pLineDesign = new CLineDesign();
|
|
|
// m_pLineDesign->Create(IDD_DLG_LINEDESIGN);
|
|
|
|
|
|
//航线设计时,航段数据对话框
|
|
|
m_pLineSectDlg = new CLineSectDisAZDlg();
|
|
|
m_pLineSectDlg->MoveToGivenArea(m_gisAreaInScreen);
|
|
|
m_pLineSectDlg->Create(IDD_DIALOG_LINE_SECT);
|
|
|
|
|
|
m_pTargetDlg = new CTargetDlg();
|
|
|
m_pTargetDlg->Create(IDD_DIALOG_TARGET,this);
|
|
|
|
|
|
//创建标记点对话框
|
|
|
m_dlgMarker.Create(IDD_DIALOG_MARKER,this);
|
|
|
m_dlgMarker.MoveToGivenArea(m_gisAreaInScreen);
|
|
|
|
|
|
//创建航线航测对话框
|
|
|
designSurveyLineDlg = new DesignSurveyLineDlg();
|
|
|
designSurveyLineDlg->Create(IDD_DLG_DESIGNSURVEYLINE);
|
|
|
|
|
|
//地图显示区宽度、高度倒数
|
|
|
m_onePerWidth = 1.0/m_rcGISArea.Width();
|
|
|
m_onePerHeight = 1.0/m_rcGISArea.Height();
|
|
|
|
|
|
//地图显示区宽度、高度
|
|
|
m_mapAreaHalfWidth = 0.5*m_rcGISArea.Width();
|
|
|
m_mapAreaHalfHeight = 0.5*m_rcGISArea.Height();
|
|
|
|
|
|
//测试
|
|
|
m_rcgisSmallArea = m_rcGISArea;
|
|
|
m_rcgisSmallArea.top = 24;
|
|
|
|
|
|
//工具栏高度
|
|
|
m_toolbarHeight = m_rcgisSmallArea.top;
|
|
|
|
|
|
m_ToolBar.ShowWindow(SW_SHOW);
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
|
|
|
m_gisManager->m_pMapCwnd = GetDlgItem(IDC_MAP1);
|
|
|
m_gisManager->setMap(&m_map);
|
|
|
|
|
|
m_dlgLightRegion.Create(IDD_DIALOG_LIGHTREGION,this);
|
|
|
|
|
|
m_DlgDemAlt.Create(IDD_DIALOG_DEMALT,this);
|
|
|
|
|
|
|
|
|
//多媒体定时器
|
|
|
timeBeginPeriod(0);
|
|
|
TimerID_Draw = timeSetEvent(500, 1, (LPTIMECALLBACK)CatchMTimerDraw, (DWORD)NULL, TIME_PERIODIC);
|
|
|
if(!TimerID_Draw)
|
|
|
{
|
|
|
BCGPMessageBox(_T("多媒体定时器启动错误!"),MB_OK|MB_ICONEXCLAMATION,0);
|
|
|
}
|
|
|
|
|
|
//加载在线地图服务
|
|
|
AddTianDiTuService();
|
|
|
//激活在线地图服务
|
|
|
LoadTianDiTuService();
|
|
|
|
|
|
m_map.SetScalebarVisible(true); //显示比例尺
|
|
|
|
|
|
return TRUE;
|
|
|
}
|
|
|
|
|
|
//功能:加载天地图在线影像地图服务
|
|
|
void CGISDlg::AddTianDiTuService()
|
|
|
{
|
|
|
string baseurl = "http://{switch:t0,t1,t2,t3,t4,t5,t6,t7}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={zoom}&TileRow={y}&TileCol={x}&style=default&format=tiles&tk=";
|
|
|
//string baseurl_vec = "http://t0.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={zoom}&TileRow={y}&TileCol={x}&style=default&format=tiles&tk=";
|
|
|
string key = "c61f5f40fca2d64038cafbd2477e791d";//企业Key,日访问上限300w次。
|
|
|
|
|
|
|
|
|
mapWindow::ITiles* pTiles = m_map.GetTiles();
|
|
|
mapWindow::ITileProvidersPtr providers = pTiles->GetProviders();
|
|
|
//pTiles->ClearCache(mapWindow::tkCacheType::Disk);//清除磁盘Tiles缓存
|
|
|
//int providerId = (int)mapWindow::tkTileProvider::ProviderCustom + 1; // (1024 + 1) should be unique across application runs in case disk caching is used
|
|
|
int providerId = mapWindow::tkTileProvider::ProviderCustom;
|
|
|
_bstr_t copyright = "TianDiTu,All Rights Reserved";
|
|
|
|
|
|
bool su = providers->Add(providerId, "TianDiTu",
|
|
|
(baseurl+key).c_str(),//(_bstr_t)url.c_str(),
|
|
|
mapWindow::tkTileProjection::SphericalMercator, 0, 18);//,"TianDiTu,All Rights Reserved"
|
|
|
|
|
|
m_map.put_ZoomBarMaxZoom(20);//设置缩放条最大20级
|
|
|
//pTiles->ProviderId = providerId; //激活当前服务
|
|
|
//Tile缓存设置
|
|
|
//pTiles->put_UseCache(mapWindow::tkCacheType::Disk,true);//默认情况下处于打开状态
|
|
|
//pTiles->put_UseCache(mapWindow::tkCacheType::RAM, true);//默认情况下处于打开状态
|
|
|
//将新下载的切片添加到缓存中
|
|
|
//pTiles->put_DoCaching(mapWindow::tkCacheType::RAM, true);//默认情况下处于打开状态
|
|
|
pTiles->put_DoCaching(mapWindow::tkCacheType::Disk,true);//如果默认关闭
|
|
|
//如果不存在具有此名称的文件,则会自动创建该文件。一次只能使用一个数据库。
|
|
|
//pTiles->put_UseCache(mapWindow::tkCacheType::Disk, true); //默认情况下处于打开状态
|
|
|
pTiles->put_DiskCacheFilename(_bstr_t("./mwtiles.db3"));
|
|
|
|
|
|
//这两种类型的缓存,都有内置机制来限制其大小,超过该机制时,将删除最旧的切片,以便为较新的切片腾出空间
|
|
|
//pTiles->put_MaxCacheSize(mapWindow::tkCacheType::RAM, 200.0); //大小以 MB 为单位;默认为 100
|
|
|
pTiles->put_MaxCacheSize(mapWindow::tkCacheType::Disk, 300.0);//大小以 MB 为单位;默认为 100
|
|
|
}
|
|
|
|
|
|
//功能:激活天地图在线影像地图服务
|
|
|
void CGISDlg::LoadTianDiTuService()
|
|
|
{
|
|
|
mapWindow::IGlobalSettingsPtr glSettingsPtr;
|
|
|
glSettingsPtr.CreateInstance("MapWinGIS.GlobalSettings");
|
|
|
m_map.put_ReuseTileBuffer(true);
|
|
|
//m_map.SetMouseWheelSpeed(1);//默认值为 0.5。接受 0.1 - 10.0 范围内的值。值 1.0 将关闭鼠标滚轮缩放。
|
|
|
|
|
|
m_map.put_GrabProjectionFromData(false); //避免图层为0时投影置空导致在线地图不显示
|
|
|
m_map.put_Projection(mapWindow::tkMapProjection::PROJECTION_WGS84);
|
|
|
m_map.GetTiles()->ProviderId = mapWindow::tkTileProvider::ProviderCustom;
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
m_map.put_ZoomBehavior(mapWindow::tkZoomBehavior::zbUseTileLevels);
|
|
|
//m_map.put_KnownExtents(mapWindow::tkKnownExtents::keChina);
|
|
|
m_map.GetTiles()->Visible = true;
|
|
|
if (m_map.GetNumLayers()==0)
|
|
|
{
|
|
|
m_map.put_Longitude(100);
|
|
|
m_map.put_Latitude(37);
|
|
|
//m_map.put_CurrentZoom(4);
|
|
|
m_map.ZoomToTileLevel(6);
|
|
|
}
|
|
|
m_map.Redraw3(mapWindow::RedrawSkipAllLayers, True);
|
|
|
|
|
|
//是否已经加载了地图
|
|
|
m_bHaveAddMap = true;
|
|
|
}
|
|
|
|
|
|
//功能:缩放到目标位置
|
|
|
void CGISDlg::ZoomToLocation(double lon,double lat)
|
|
|
{
|
|
|
m_map.put_Projection(mapWindow::tkMapProjection::PROJECTION_WGS84);
|
|
|
m_map.GetTiles()->Visible = true;
|
|
|
m_map.put_Longitude(lon);
|
|
|
m_map.put_Latitude(lat);
|
|
|
m_map.put_CurrentZoom(16);
|
|
|
m_map.Redraw3(mapWindow::RedrawSkipAllLayers, True);
|
|
|
//是否已经加载了地图
|
|
|
m_bHaveAddMap = true;
|
|
|
}
|
|
|
|
|
|
//功能:加载地图数据,包括矢量数据
|
|
|
void CGISDlg::OnAddMapData()
|
|
|
{
|
|
|
TCHAR s[10000];
|
|
|
s[0]=0;
|
|
|
CFileDialog dlg(true);
|
|
|
dlg.m_ofn.lpstrTitle=_T("打开本地文件");
|
|
|
dlg.m_ofn.lpstrFile=s;
|
|
|
dlg.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);
|
|
|
TCHAR filter[500]=_T("SHAPE文件(*.shp)\0*.shp");
|
|
|
dlg.m_ofn.lpstrFilter=filter;
|
|
|
dlg.m_ofn.Flags|=OFN_ALLOWMULTISELECT|OFN_ENABLESIZING|OFN_EXPLORER;
|
|
|
if(dlg.DoModal()==IDCANCEL) return;
|
|
|
|
|
|
POSITION pos;
|
|
|
pos=dlg.GetStartPosition();
|
|
|
CString path;
|
|
|
long count=0;
|
|
|
while(pos)
|
|
|
{
|
|
|
path=dlg.GetNextPathName(pos);
|
|
|
count++;
|
|
|
}
|
|
|
pos=dlg.GetStartPosition();
|
|
|
while(pos)
|
|
|
{
|
|
|
path=dlg.GetNextPathName(pos);
|
|
|
Openlocalfile(path);
|
|
|
}
|
|
|
// 读取节点配置信息
|
|
|
CString fileName = GetSoftwareCurrentDirectory() + "\\map.ini";
|
|
|
::WritePrivateProfileString("map","layer",path,fileName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:加载栅格影像数据
|
|
|
void CGISDlg::OnAddRasterImage()
|
|
|
{
|
|
|
TCHAR s[10000];
|
|
|
s[0]=0;
|
|
|
CFileDialog dlg(true);
|
|
|
dlg.m_ofn.lpstrTitle=_T("打开本地文件");
|
|
|
dlg.m_ofn.lpstrFile=s;
|
|
|
dlg.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);
|
|
|
//TCHAR filter[500]=_T("SHAPE文件(*.shp)\0*.shp\0IMG文件(*.img)\0*.img\0GeoTIFF文件(*.tif)\0*.tif\0ASC文件(*.asc)\0*.asc\0所有文件(*.*)\0*.*\0");
|
|
|
|
|
|
TCHAR filter[500]=_T("GeoTIFF文件(*.tif)\0*.tif\0所有文件(*.*)\0*.*\0");
|
|
|
dlg.m_ofn.lpstrFilter=filter;
|
|
|
dlg.m_ofn.Flags|=OFN_ALLOWMULTISELECT|OFN_ENABLESIZING|OFN_EXPLORER;
|
|
|
if(dlg.DoModal()==IDCANCEL) return;
|
|
|
|
|
|
POSITION pos;
|
|
|
pos=dlg.GetStartPosition();
|
|
|
CString path;
|
|
|
long count=0;
|
|
|
while(pos)
|
|
|
{
|
|
|
path=dlg.GetNextPathName(pos);
|
|
|
count++;
|
|
|
}
|
|
|
pos=dlg.GetStartPosition();
|
|
|
while(pos)
|
|
|
{
|
|
|
path=dlg.GetNextPathName(pos);
|
|
|
Openlocalfile(path);
|
|
|
}
|
|
|
// 读取节点配置信息
|
|
|
CString fileName = GetSoftwareCurrentDirectory() + "\\map.ini";
|
|
|
::WritePrivateProfileString("map","layer",path,fileName);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:打开文件选择对话框,加载航线数据文件
|
|
|
void CGISDlg::OnAddFlyLineData()
|
|
|
{
|
|
|
//未加载地图,返回
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (m_flyLineNum > m_totalFlyLines)
|
|
|
{
|
|
|
AfxMessageBox(_T("已加载航线数>12!"));
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//弹出文件对话框
|
|
|
CFileDialog dlg(true, ".txt","*.txt",OFN_HIDEREADONLY, "航线文件(*.txt)|*.txt|", NULL);
|
|
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
|
{
|
|
|
//读取航路文件,并标绘出来
|
|
|
OnShowGivenLine(dlg.GetPathName());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:进行地图的放大操作
|
|
|
void CGISDlg::OnMapZoomIn()
|
|
|
{
|
|
|
|
|
|
m_bSetPointModel=FALSE;
|
|
|
//m_bLineDesign=FALSE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
m_map.SetCursorMode(0);
|
|
|
|
|
|
m_bLDSetPoint = FALSE;
|
|
|
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
//地图缩小
|
|
|
void CGISDlg::OnMapZoomOut()
|
|
|
{
|
|
|
m_bSetPointModel=FALSE;
|
|
|
//m_bLineDesign=FALSE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
m_map.SetCursorMode(1);
|
|
|
|
|
|
m_bLDSetPoint = FALSE;
|
|
|
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
}
|
|
|
|
|
|
//地图漫游
|
|
|
void CGISDlg::OnMapMove()
|
|
|
{
|
|
|
m_bSetPointModel=FALSE;
|
|
|
//m_bLineDesign=FALSE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
if (m_map.GetCursorMode()==mapWindow::tkCursorMode::cmPan)
|
|
|
{
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmPan);
|
|
|
}
|
|
|
|
|
|
m_bLDSetPoint = FALSE;
|
|
|
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:地图选择
|
|
|
void CGISDlg::OnMapSelect()
|
|
|
{
|
|
|
m_bSetPointModel=FALSE;
|
|
|
//m_bLineDesign=FALSE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmSelection);
|
|
|
|
|
|
m_bLDSetPoint = FALSE;
|
|
|
|
|
|
if (!m_bEditLine && !m_bLineDesign) //非航线编辑模式下可选
|
|
|
{
|
|
|
if (!m_bSelectFeatureFlag)
|
|
|
{
|
|
|
m_bSelectFeatureFlag = true; // by Wu
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
ClearHighLightLine();
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
//ClearHighLightLine();
|
|
|
//m_bSelectFeatureFlag = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//地图全景显示
|
|
|
void CGISDlg::OnMapFullScreen()
|
|
|
{
|
|
|
m_bSetPointModel=FALSE;
|
|
|
//m_bLineDesign=FALSE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
m_map.ZoomToMaxExtents();
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
|
|
|
m_bLDSetPoint = FALSE;
|
|
|
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:测量2点之间的距离
|
|
|
void CGISDlg::OnSurvey()
|
|
|
{
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
|
|
|
m_bSetPointModel=FALSE;
|
|
|
// m_bLineDesign=FALSE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
|
|
|
m_bLDSetPoint = FALSE;
|
|
|
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
//多点测距
|
|
|
if (m_bPolylineMeasure)
|
|
|
{
|
|
|
ClearPloylineMeasure();
|
|
|
m_bPolylineMeasure = false;
|
|
|
m_numPolylineMeasurePts = 0;
|
|
|
m_bMeasureDrag = false;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_bPolylineMeasure = true;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
//重置
|
|
|
m_pHZDistanceDlg->ResetCoordinateData();
|
|
|
|
|
|
if (!m_bHaveShowDistanceDlg)
|
|
|
{
|
|
|
m_bHaveShowDistanceDlg = true;
|
|
|
|
|
|
//显示软件界面
|
|
|
m_pHZDistanceDlg->ShowWindow(SW_SHOW);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_bHaveShowDistanceDlg = false;
|
|
|
|
|
|
//隐藏软件界面
|
|
|
m_pHZDistanceDlg->ShowWindow(SW_HIDE);
|
|
|
}*/
|
|
|
}
|
|
|
|
|
|
|
|
|
//清除航迹
|
|
|
void CGISDlg::OnEraseTrack()
|
|
|
{
|
|
|
EraseTrack(0);
|
|
|
EraseTrack(1);
|
|
|
EraseTrack(2);
|
|
|
}
|
|
|
|
|
|
//清除航迹
|
|
|
void CGISDlg::EraseTrack(int uavid)
|
|
|
{
|
|
|
if (uavid<0||uavid>2)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
m_bSetPointModel=FALSE;
|
|
|
//m_bLineDesign=FALSE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
|
|
|
m_bLDSetPoint = FALSE;
|
|
|
|
|
|
//已经标绘了无人机的飞行轨迹,清除航迹
|
|
|
if (m_bFirstDrawUAVTrack[uavid])
|
|
|
{
|
|
|
//清除无人机的标绘图层
|
|
|
if (m_flyTrackLayerID[uavid] != -1)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_flyTrackLayerID[uavid]);
|
|
|
}
|
|
|
|
|
|
if (m_UAVFlyTrackLayerID[uavid] != -1)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_UAVFlyTrackLayerID[uavid]);
|
|
|
}
|
|
|
|
|
|
m_bFirstDrawUAVTrack[uavid] = false;
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//清除标绘的所有目标点数据
|
|
|
void CGISDlg::OnEraseAllTargets()
|
|
|
{
|
|
|
//标绘的目标点个数大于0时
|
|
|
if (m_targetPointNum > 0)
|
|
|
{
|
|
|
//清除所有标绘的Label
|
|
|
m_map.ClearLabels(m_targetDrawLayerID);
|
|
|
|
|
|
m_map.ClearDrawing(m_targetDrawLayerID);
|
|
|
|
|
|
m_targetDrawLayerID = -1;
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:增加无人机的飞行航点,绘制出无人机的飞行航迹
|
|
|
//输入:无人机的当前的经度dX,纬度dY,航向角yaw, 都以(°为单位)
|
|
|
void CGISDlg::AddFlyPoint(int uavId,const double dX, const double dY, const double yaw,bool control)
|
|
|
{
|
|
|
//未加载地图,返回
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//对输入的经纬度数值范围进行检查,看是否有效
|
|
|
double fabsLon = fabs(dX);
|
|
|
double fabsLat = fabs(dY);
|
|
|
|
|
|
//判断数据范围是否有效
|
|
|
if ((fabsLon<=0.000001) || (fabsLon>180) || (fabsLat<=0.000001) || (fabsLat>90) || (yaw<0) || (yaw>360))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (m_bAutoMove)
|
|
|
{
|
|
|
//自动漫游,使飞机显示在地图中间
|
|
|
if (control)
|
|
|
{
|
|
|
AutomaticMoveMap(dX, dY);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//标绘航迹点数zcw
|
|
|
m_drawTrackPtNum[uavId]++;
|
|
|
|
|
|
|
|
|
//增加了航迹点数,由200-》2000 2017.07.05
|
|
|
if (m_drawTrackPtNum[uavId] >= 100)
|
|
|
{
|
|
|
//清除航迹
|
|
|
EraseTrack(uavId);
|
|
|
m_drawTrackPtNum[uavId] = 0;
|
|
|
}
|
|
|
|
|
|
//绘制UAV的飞行轨迹
|
|
|
DrawUAV(uavId,dX, dY, yaw,control);
|
|
|
|
|
|
/*static int num = 0;
|
|
|
if (num == 1)
|
|
|
{
|
|
|
DrawCanvas();
|
|
|
num = 0;
|
|
|
}
|
|
|
num++;*/
|
|
|
|
|
|
//实时通视分析
|
|
|
//m_dlgLightRegion.AnalysisRealTime(dY, distance, angleGU, g_gcsLon, g_gcsLat);
|
|
|
//m_dlgLightRegion.DrawVisiAreaRealTime(dY, distance, angleGU, g_gcsLon, g_gcsLat);
|
|
|
m_dlgLightRegion.DrawCrashAreaRealTime(dY, dX, dY);
|
|
|
|
|
|
//刷新地图(每5帧刷新一次)
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
void CGISDlg::AddFlyPoint_ADS(const int uavNum, const int uavid, const double lon, const double lat, const double yaw, const bool control, const CString strPlaneName)
|
|
|
{
|
|
|
//未加载地图,返回
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//对输入的经纬度数值范围进行检查,看是否有效
|
|
|
double fabsLon = fabs(lon);
|
|
|
double fabsLat = fabs(lat);
|
|
|
|
|
|
//判断数据范围是否有效
|
|
|
if ((fabsLon<=0.000001) || (fabsLon>180) || (fabsLat<=0.000001) || (fabsLat>90) || (yaw<0) || (yaw>360))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//绘制UAV的飞行轨迹
|
|
|
DrawUAV_ADS(uavNum, uavid, lon, lat, yaw, control, strPlaneName);
|
|
|
|
|
|
//刷新地图(每5帧刷新一次)
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::Openlocalfile(CString file)
|
|
|
{
|
|
|
int error=0;
|
|
|
CString filetype=GetFileType(file);
|
|
|
CString filename=GetFileName(file);
|
|
|
filetype.MakeLower();
|
|
|
|
|
|
if(filetype.Compare("shp")==0)
|
|
|
{
|
|
|
mapWindow::IShapefilePtr shape;
|
|
|
shape.CreateInstance("MapWinGIS.Shapefile");
|
|
|
if( !shape->Open((_bstr_t)file,NULL))
|
|
|
{
|
|
|
error=1;
|
|
|
}
|
|
|
_bstr_t pro=shape->GetProjection();
|
|
|
|
|
|
//设置地图的背景色为白色
|
|
|
m_map.SetBackColor(RGB(255,255,255));
|
|
|
|
|
|
int shpLayerPose = m_map.AddLayer(shape,true);
|
|
|
|
|
|
//移动到底端
|
|
|
m_map.MoveLayerBottom(shpLayerPose);
|
|
|
|
|
|
m_Layer->AddLayerInfo(filename,1);
|
|
|
|
|
|
//是否已经加载了地图
|
|
|
m_bHaveAddMap = true;
|
|
|
}
|
|
|
else if(filetype.Compare("img")==0)
|
|
|
{
|
|
|
mapWindow::IImagePtr image;
|
|
|
image.CreateInstance("MapWinGIS.Image");
|
|
|
if( !image->Open((_bstr_t)file,mapWindow::IMG_FILE,true,NULL))
|
|
|
{
|
|
|
error=1;
|
|
|
}
|
|
|
|
|
|
//设置地图的背景色为白色
|
|
|
m_map.SetBackColor(RGB(255,255,255));
|
|
|
|
|
|
m_map.AddLayer(image,true);
|
|
|
m_Layer->AddLayerInfo(filename,2);
|
|
|
|
|
|
|
|
|
//是否已经加载了地图
|
|
|
m_bHaveAddMap = true;
|
|
|
}
|
|
|
else if(filetype.Compare("tif")==0)
|
|
|
{
|
|
|
mapWindow::IImagePtr image;
|
|
|
image.CreateInstance("MapWinGIS.Image");
|
|
|
if( !image->Open((_bstr_t)file,mapWindow::TIFF_FILE,true,NULL))
|
|
|
{
|
|
|
error=1;
|
|
|
}
|
|
|
|
|
|
//设置地图的背景色为白色
|
|
|
m_map.SetBackColor(RGB(255,255,255));
|
|
|
|
|
|
int tiffLayerID = m_map.AddLayer(image,true);
|
|
|
|
|
|
m_Layer->AddLayerInfo(filename,2);
|
|
|
|
|
|
m_map.ZoomToLayer(tiffLayerID);
|
|
|
|
|
|
//是否已经加载了地图
|
|
|
m_bHaveAddMap = true;
|
|
|
}
|
|
|
|
|
|
else if(filetype.Compare("asc")==0)
|
|
|
{
|
|
|
mapWindow::IImagePtr image;
|
|
|
image.CreateInstance("MapWinGIS.Image");
|
|
|
if( !image->Open((_bstr_t)file,mapWindow::ASC_FILE,true,NULL))
|
|
|
{
|
|
|
error=1;
|
|
|
}
|
|
|
|
|
|
//设置地图的背景色为白色
|
|
|
m_map.SetBackColor(RGB(255,255,255));
|
|
|
|
|
|
m_map.AddLayer(image,true);
|
|
|
m_Layer->AddLayerInfo(filename,2);
|
|
|
|
|
|
//是否已经加载了地图
|
|
|
m_bHaveAddMap = true;
|
|
|
}
|
|
|
/*if(m_bHaveAddMap)
|
|
|
{
|
|
|
ReadTargetIni(true);
|
|
|
}*/
|
|
|
|
|
|
if(error==1)
|
|
|
{
|
|
|
CString msg="无法打开 "+file;
|
|
|
AfxMessageBox(msg);
|
|
|
}
|
|
|
|
|
|
m_gisManager->m_bHaveAddMap = m_bHaveAddMap;
|
|
|
}
|
|
|
|
|
|
CString CGISDlg::GetFileType(CString file)
|
|
|
{
|
|
|
CString type;
|
|
|
long len=file.GetLength();
|
|
|
int pos=file.ReverseFind('.');
|
|
|
type=file.Right(len-pos-1);
|
|
|
return type;
|
|
|
}
|
|
|
|
|
|
CString CGISDlg::GetFileName(CString file)
|
|
|
{
|
|
|
CString name;
|
|
|
long len=file.GetLength();
|
|
|
int pos=file.ReverseFind('\\');
|
|
|
name=file.Right(len-pos-1);
|
|
|
return name;
|
|
|
}
|
|
|
|
|
|
//显示右键菜单
|
|
|
void CGISDlg::OnShowRMenu()
|
|
|
{
|
|
|
//鼠标右键点击时,弹出快捷菜单
|
|
|
if (!m_bLineDesign)
|
|
|
{
|
|
|
|
|
|
//显示快捷菜单
|
|
|
CMenu menu;
|
|
|
|
|
|
POINT pt;
|
|
|
GetCursorPos( &pt );
|
|
|
|
|
|
|
|
|
//当处于回放模式时,设置、导引操作、航线装订子菜单都先灰色
|
|
|
menu.LoadMenu(IDR_MENU2);
|
|
|
//设置限制区勾选状态
|
|
|
SetMenuZoneCheck(menu);
|
|
|
|
|
|
//航线1
|
|
|
if (m_pHaveDrawLineFlag[0])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE1, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE1, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线2
|
|
|
if (m_pHaveDrawLineFlag[1])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE2, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE2, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线3
|
|
|
if (m_pHaveDrawLineFlag[2])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE3, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE3, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线4
|
|
|
if (m_pHaveDrawLineFlag[3])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE4, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE4, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线5
|
|
|
if (m_pHaveDrawLineFlag[4])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE5, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE5, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
//航线6
|
|
|
if (m_pHaveDrawLineFlag[5])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE6, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE6, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线7
|
|
|
if (m_pHaveDrawLineFlag[6])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE7, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE7, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
//航线8
|
|
|
if (m_pHaveDrawLineFlag[7])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE8, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE8, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
//航线9
|
|
|
if (m_pHaveDrawLineFlag[8])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE9, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE9, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
//航线10
|
|
|
if (m_pHaveDrawLineFlag[9])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE10, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE10, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
*/
|
|
|
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
//航线14 回收航线
|
|
|
if (m_pHaveDrawLineFlag[13])
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_BACKLINE, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_BACKLINE, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线11 应急航线
|
|
|
if (m_pHaveDrawLineFlag[10])
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_HS11, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_HS11, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线12 电子围栏
|
|
|
if (m_pHaveDrawLineFlag[11])
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_TC12, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_TC12, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
//航线14 回收航线
|
|
|
if (m_pHaveDrawLineFlag[10])
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_BACKLINE, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_BACKLINE, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
//航线6 围栏
|
|
|
if (m_pHaveDrawLineFlag[5])
|
|
|
{
|
|
|
//menu.CheckMenuItem( ID_SHOW_WEILAN, MF_BYCOMMAND | MF_CHECKED );
|
|
|
menu.CheckMenuItem( ID_SHOW_TC12, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//menu.CheckMenuItem( ID_SHOW_WEILAN, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
menu.CheckMenuItem( ID_SHOW_TC12, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线7 应急
|
|
|
if (m_pHaveDrawLineFlag[6])
|
|
|
{
|
|
|
//menu.CheckMenuItem( ID_SHOW_LINE_YINGJI, MF_BYCOMMAND | MF_CHECKED );
|
|
|
menu.CheckMenuItem( ID_SHOW_HS11, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//menu.CheckMenuItem( ID_SHOW_LINE_YINGJI, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
menu.CheckMenuItem( ID_SHOW_HS11, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
//航线14,空投航线
|
|
|
if (m_pHaveDrawLineFlag[13])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE14, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE14, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
if (m_bAutoMove)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_AUTO_MOVE, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_AUTO_MOVE, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (m_guidePointMode == 1)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_GUIDE_FLY1, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_GUIDE_FLY1, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (m_guidePointMode == 2)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_GUIDE_FLY2, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_GUIDE_FLY2, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (m_bPlotDemArea)
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_MENU_PLOTDEMAREA, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_MENU_PLOTDEMAREA, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (m_bEnableShowADSB)
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_MENU_ADSB, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_MENU_ADSB, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//menu.GetSubMenu(0)->ModifyMenu(0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
|
|
|
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
// 获取子菜单
|
|
|
CMenu* pSubMenu = menu.GetSubMenu(0); // 第一个子菜单
|
|
|
//int nn = pSubMenu->GetMenuItemCount();
|
|
|
|
|
|
if (pSubMenu)
|
|
|
{
|
|
|
pSubMenu->ModifyMenu(5, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); //隐藏高程分析
|
|
|
pSubMenu->ModifyMenu(7, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); //隐藏标绘
|
|
|
|
|
|
// 获取二级子菜单
|
|
|
CMenu* pSubSubMenu = pSubMenu->GetSubMenu(2); // 二级子菜单(航线子项)
|
|
|
//int nn2 = pSubSubMenu->GetMenuItemCount();
|
|
|
if (pSubSubMenu)
|
|
|
{
|
|
|
// 隐藏二级子菜单的第一个子项
|
|
|
//pSubSubMenu->ModifyMenu(IDM_SHOW_LINE14, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); //隐藏空投航线
|
|
|
pSubSubMenu->RemoveMenu(IDM_SHOW_LINE14, MF_BYCOMMAND); //隐藏空投航线
|
|
|
|
|
|
// 修改二级子菜单文本
|
|
|
pSubMenu->ModifyMenu(ID_BIND_BACKLINE, MF_STRING, ID_BIND_BACKLINE, _T("自主着陆点装订"));
|
|
|
pSubMenu->ModifyMenu(ID_SHOW_BACKLINE, MF_STRING, ID_SHOW_BACKLINE, _T("自主着陆点显示"));
|
|
|
DrawMenuBar();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//弹出快捷菜单
|
|
|
menu.GetSubMenu( 0 )->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this );
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:自动漫游,即保证无人机标绘在地图的中心
|
|
|
//实现原理:1)先获得地图当前的显示区域
|
|
|
// 2)再根据无人机的当前坐标,移动地图
|
|
|
void CGISDlg::AutomaticMoveMap(double dX, double dY)
|
|
|
{
|
|
|
//计算每个像素的经纬度值
|
|
|
double lonDegreePerPixel = 0;
|
|
|
double latDegreePerPixel = 0;
|
|
|
|
|
|
mapWindow::IExtentsPtr pExtents;
|
|
|
pExtents = m_map.GetExtents();
|
|
|
|
|
|
double xMin = 0;
|
|
|
double yMin = 0;
|
|
|
double zMin = 0;
|
|
|
|
|
|
double xMax = 0;
|
|
|
double yMax = 0;
|
|
|
double zMax = 0;
|
|
|
|
|
|
pExtents->GetBounds(&xMin,&yMin,&zMin,&xMax,&yMax,&zMax);
|
|
|
|
|
|
if(dX < xMin || dX > xMax || dY < yMin || dY > yMax)
|
|
|
{
|
|
|
lonDegreePerPixel = (xMax-xMin) * m_onePerWidth;
|
|
|
latDegreePerPixel = (yMax-yMin) * m_onePerHeight;
|
|
|
|
|
|
//显示范围
|
|
|
double xNewMin = 0;
|
|
|
double yNewMin = 0;
|
|
|
double zNewMin = 0;
|
|
|
|
|
|
double xNewMax = 0;
|
|
|
double yNewMax = 0;
|
|
|
double zNewMax = 0;
|
|
|
|
|
|
//经度方向增量
|
|
|
double lonIncrement = lonDegreePerPixel*m_mapAreaHalfWidth;
|
|
|
|
|
|
//纬度方向增量
|
|
|
double latIncrement = latDegreePerPixel*m_mapAreaHalfHeight;
|
|
|
|
|
|
xNewMin = dX - lonIncrement;
|
|
|
xNewMax = dX + lonIncrement;
|
|
|
|
|
|
yNewMin = dY - latIncrement;
|
|
|
yNewMax = dY + latIncrement;
|
|
|
|
|
|
//设置新的显示范围
|
|
|
pExtents->SetBounds(xNewMin,yNewMin,zNewMin,xNewMax,yNewMax,zNewMax);
|
|
|
m_map.SetExtents(pExtents);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//功能:弹出对话框,显示经度纬度信息
|
|
|
void CGISDlg::OnShowLonLatInfo()
|
|
|
{
|
|
|
if (!m_bHaveShowLonLatDlg) //未弹出对话框,则弹出对话框显示
|
|
|
{
|
|
|
m_bHaveShowLonLatDlg = true;
|
|
|
|
|
|
m_pLonLatDlg->SetLonLatInfo(0,0);
|
|
|
m_pLonLatDlg->ShowWindow(SW_SHOW);
|
|
|
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_bHaveShowLonLatDlg = false;
|
|
|
m_pLonLatDlg->ShowWindow(SW_HIDE);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:删除所有图层
|
|
|
void CGISDlg::OnRemoveAllLayers()
|
|
|
{
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//清除航迹
|
|
|
OnEraseTrack();
|
|
|
|
|
|
for(int i=0;i<MAX_PLANE_NUM_ADS;i++)
|
|
|
{
|
|
|
//清除无人机的标绘图层
|
|
|
if (m_UAVFlyTrackLayerID_ADS[i] != -1)
|
|
|
{
|
|
|
//m_map.ClearLabels(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
//m_map.ClearDrawing(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
m_map.RemoveLayer(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
m_UAVFlyTrackLayerID_ADS[i] = -1;
|
|
|
|
|
|
m_bWithin100km_ADS[i] = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//已经标绘了弹道文件,删除现有的数据
|
|
|
if (m_drawPlanFlyLine != -1)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_drawPlanFlyLine);
|
|
|
|
|
|
m_drawPlanFlyLine = -1;
|
|
|
}
|
|
|
|
|
|
if(m_targetDrawLayerID != -1)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_targetDrawLayerID);
|
|
|
m_targetDrawLayerID = -1;
|
|
|
}
|
|
|
|
|
|
//可视域分析时涉及到的图层
|
|
|
if (m_longGroundID != 0)
|
|
|
{
|
|
|
ClearPointShape(m_longGroundID);
|
|
|
m_longGroundID = 0;
|
|
|
}
|
|
|
|
|
|
if (m_visbleCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_visbleCircleLayerID).EditClear();
|
|
|
|
|
|
m_visbleCircleLayerID = -1;
|
|
|
}
|
|
|
|
|
|
if (m_notVisibleCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_notVisibleCircleLayerID).EditClear();
|
|
|
|
|
|
m_notVisibleCircleLayerID = -1;
|
|
|
}
|
|
|
|
|
|
if (m_visiRealCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_visiRealCircleLayerID).EditClear();
|
|
|
|
|
|
m_visiRealCircleLayerID = -1;
|
|
|
}
|
|
|
|
|
|
if (m_notVisiRealCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_notVisiRealCircleLayerID).EditClear();
|
|
|
|
|
|
m_notVisiRealCircleLayerID = -1;
|
|
|
}
|
|
|
|
|
|
if (m_RealCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_RealCircleLayerID).EditClear();
|
|
|
|
|
|
m_RealCircleLayerID = -1;
|
|
|
}
|
|
|
|
|
|
for (int i=0;i<20;i++)
|
|
|
{
|
|
|
if (m_longContourLineID[i] > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_longContourLineID[i]).EditClear();
|
|
|
|
|
|
m_longContourLineID[i] = -1;
|
|
|
}
|
|
|
|
|
|
if (m_longContourTextID[i] != 0)
|
|
|
{
|
|
|
ClearPointShape(m_longContourTextID[i]);
|
|
|
m_longContourTextID[i] = 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (int i=0;i<500;i++)
|
|
|
{
|
|
|
if (m_DemRegionLayerID[i] > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_DemRegionLayerID[i]).EditClear();
|
|
|
|
|
|
m_DemRegionLayerID[i] = -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (m_longSelectLineID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_longSelectLineID).EditClear();
|
|
|
|
|
|
m_longSelectLineID = -1;
|
|
|
}
|
|
|
|
|
|
if (m_longLabelPlotID != 0)
|
|
|
{
|
|
|
ClearPointShape(m_longLabelPlotID);
|
|
|
m_longLabelPlotID = 0;
|
|
|
}
|
|
|
|
|
|
if (m_longLinePointID != 0)
|
|
|
{
|
|
|
ClearPointShape(m_longLinePointID);
|
|
|
m_longLinePointID = 0;
|
|
|
}
|
|
|
|
|
|
if (m_crashAreaLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_crashAreaLayerID).EditClear();
|
|
|
|
|
|
m_crashAreaLayerID = -1;
|
|
|
}
|
|
|
|
|
|
if (m_fightRegionLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_fightRegionLayerID).EditClear();
|
|
|
|
|
|
m_fightRegionLayerID = -1;
|
|
|
}
|
|
|
|
|
|
//清除高程分析图层
|
|
|
for (int i=0;i<g_iDemAltPtNum;i++)
|
|
|
{
|
|
|
m_map.RemoveLayer(g_lDemAltLayerID[i]);
|
|
|
if (g_lDemAltDisLayerID[i] > 0)
|
|
|
{
|
|
|
//清除标绘的点矢量图层
|
|
|
ClearPointShape(g_lDemAltDisLayerID[i]);
|
|
|
g_lDemAltDisLayerID[i] = -1;
|
|
|
}
|
|
|
|
|
|
if (g_lDemPtNumLayerID[i] > 0)
|
|
|
{
|
|
|
//清除标绘的点矢量图层
|
|
|
ClearPointShape(g_lDemPtNumLayerID[i]);
|
|
|
g_lDemPtNumLayerID[i] = -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//清除标记点相关图层
|
|
|
for (int i=0;i<g_iMarkerPtNum;i++)
|
|
|
{
|
|
|
if (g_lMarkerLayerID[i] > 0)
|
|
|
{
|
|
|
ClearPointShape(g_lMarkerLayerID[i]);
|
|
|
g_lMarkerLayerID[i] = 0;
|
|
|
}
|
|
|
}
|
|
|
m_designLinePointNum = 0;
|
|
|
//m_map.RemoveAllLayers();
|
|
|
m_map.ClearDrawing(m_designLineLayerID);
|
|
|
m_map.ClearDrawing(m_designLineLayerID2);
|
|
|
m_map.RemoveLayer(m_designLineLayerID);
|
|
|
m_map.RemoveLayer(m_designLineLayerID2);
|
|
|
m_map.RemoveAllLayers();
|
|
|
memset(m_pDesignLineStruct, 0, sizeof(PtStruct)*m_lineMaxPointNum);
|
|
|
m_Layer->RemoveAll();
|
|
|
m_map.Redraw();
|
|
|
for (int i=0;i<13;i++)
|
|
|
{
|
|
|
m_pHaveDrawLineFlag[i] = false;
|
|
|
}
|
|
|
//设置地图的背景色为白色
|
|
|
m_map.SetBackColor(RGB(0,0,0));
|
|
|
|
|
|
//是否已经加载了地图
|
|
|
//m_bHaveAddMap = false;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:图层管理
|
|
|
void CGISDlg::OnLayerManage()
|
|
|
{
|
|
|
m_Layer->ShowWindow(SW_SHOW);
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:设置图层的显示或隐藏
|
|
|
LRESULT CGISDlg::OnSetLayerStatus(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (lParam == 0) //隐藏图层
|
|
|
{
|
|
|
m_map.SetLayerVisible(wParam, false);
|
|
|
}
|
|
|
else if (lParam == 1) //显示图层
|
|
|
{
|
|
|
m_map.SetLayerVisible(wParam, true);
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
BEGIN_EVENTSINK_MAP(CGISDlg, CBCGPDialog)
|
|
|
ON_EVENT(CGISDlg, IDC_MAP1, 1, CGISDlg::MouseDownMap1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
|
|
|
ON_EVENT(CGISDlg, IDC_MAP1, 2, CGISDlg::MouseUpMap1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
|
|
|
ON_EVENT(CGISDlg, IDC_MAP1, 3, CGISDlg::MouseMoveMap1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
|
|
|
ON_EVENT(CGISDlg, IDC_MAP1, DISPID_DBLCLICK, CGISDlg::MouseDblClickMap1, VTS_NONE)
|
|
|
END_EVENTSINK_MAP()
|
|
|
|
|
|
|
|
|
void CGISDlg::MouseDownMap1(short Button, short Shift, long x, long y)
|
|
|
{
|
|
|
double dX = 0;
|
|
|
double dY = 0;
|
|
|
|
|
|
GLOBAL_X = x;
|
|
|
GLOBAL_Y = y;
|
|
|
|
|
|
CString str_bt;
|
|
|
TRACE(_T("mapWindow clicked\n"));
|
|
|
// TRACE(_T(str_bt.Format("%d",Button)));
|
|
|
// 选择标记点时
|
|
|
if (g_bSelectMarker && (Button == 1))
|
|
|
{
|
|
|
g_bSelectMarker = false;
|
|
|
//TRACE(g_bSelectMarker);
|
|
|
// return;
|
|
|
}
|
|
|
|
|
|
//绘制航测区域
|
|
|
if (designSurveyLineDlg != nullptr && designSurveyLineDlg->bDrawRegion && (Button == 1))
|
|
|
{
|
|
|
//像素坐标转换地理坐标
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
surveyRegionLons.push_back(dX);
|
|
|
surveyRegionLats.push_back(dY);
|
|
|
}
|
|
|
|
|
|
if (m_bHaveShowDistanceDlg && (Button == 1))
|
|
|
{
|
|
|
//像素坐标转换地理坐标
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
//设置点的经度、纬度
|
|
|
m_pHZDistanceDlg->SetPtCoordinate(dX, dY);
|
|
|
}
|
|
|
/************************************限飞区*************************************/
|
|
|
if(bDrawRestrictedZone && (Button == 1))
|
|
|
{
|
|
|
//像素坐标转换地理坐标
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
if (!bShowZone)
|
|
|
{
|
|
|
firstZonePoint[0] = dX;
|
|
|
firstZonePoint[1] = dY;
|
|
|
bShowZone = true;
|
|
|
return;
|
|
|
}
|
|
|
if(bShowZone)
|
|
|
{
|
|
|
double xPoints[5];
|
|
|
double yPoints[5];
|
|
|
double endPoint[2] = {dX,dY};
|
|
|
ComputeRectanglePoints(firstZonePoint,endPoint,xPoints,yPoints);
|
|
|
DrawRestrictedZone(m_tempZoneLayerID,xPoints,yPoints,5,0);
|
|
|
|
|
|
m_map.Redraw();
|
|
|
bShowZone = false;
|
|
|
bDrawRestrictedZone = false;
|
|
|
|
|
|
ShowSaveZoneDlg(xPoints,yPoints);
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
|
|
|
/***************************************多点测距 by Wu 2023.10.16*****************************************/
|
|
|
if (m_bPolylineMeasure && (Button == 1))
|
|
|
{
|
|
|
if (m_bEndMeasure)
|
|
|
{
|
|
|
ClearPloylineMeasure();
|
|
|
m_bEndMeasure = false;
|
|
|
}
|
|
|
//像素坐标转换地理坐标
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
m_numPolylineMeasurePts++;
|
|
|
m_posPolylineMeasurePts[m_numPolylineMeasurePts-1][0] = dX;
|
|
|
m_posPolylineMeasurePts[m_numPolylineMeasurePts-1][1] = dY;
|
|
|
if (m_numPolylineMeasurePts==1) //起点
|
|
|
{
|
|
|
AddPointShapeLayer(m_polylineMeasurePtLayerID[0], dX, dY, _T("起点"), _T(""), RGB(255,0,0));//标注起点
|
|
|
m_bMeasureDrag = true;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//绘制线段
|
|
|
if (m_polylineMeasureLineLayerID==-1)
|
|
|
{
|
|
|
//创建线图层
|
|
|
CreateEmptyShapfile(m_polylineMeasureLineLayerID, 1, RGB(0,255,0));
|
|
|
}
|
|
|
if (m_numPolylineMeasurePts==2)
|
|
|
{
|
|
|
AddOnePoint2Shapfile(m_polylineMeasureLineLayerID, 1, m_posPolylineMeasurePts[0][0], m_posPolylineMeasurePts[0][1]);
|
|
|
}
|
|
|
AddOnePoint2Shapfile(m_polylineMeasureLineLayerID, 1, dX, dY);
|
|
|
|
|
|
if (m_polylineMeasurePtLayerID[1]==-1)
|
|
|
{
|
|
|
CreateEmptyShapfile(m_polylineMeasurePtLayerID[1], 0, RGB(0,255,0));
|
|
|
mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption;
|
|
|
pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions");
|
|
|
pShapeDrawingOption->FillColor = RGB(0,255,0);
|
|
|
pShapeDrawingOption->PointSize = 12;
|
|
|
pShapeDrawingOption->PutPointType(mapWindow::tkPointSymbolType::ptSymbolStandard);
|
|
|
pShapeDrawingOption->PutPointShape(mapWindow::tkPointShapeType::ptShapeStar);
|
|
|
(m_map.GetShapefile(m_polylineMeasurePtLayerID[1])).SetDefaultDrawingOptions(pShapeDrawingOption);
|
|
|
}
|
|
|
//AddOnePoint2Shapfile(m_polylineMeasurePtLayerID[1],0,dX, dY);
|
|
|
//绘制节点
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
shapePtr->Create(mapWindow::SHP_POINT);
|
|
|
//经度
|
|
|
pintPtr->x = dX;
|
|
|
//纬度
|
|
|
pintPtr->y = dY;
|
|
|
long i = m_numPolylineMeasurePts-2;
|
|
|
shapePtr->InsertPoint(pintPtr, &i);
|
|
|
//插入点矢量
|
|
|
(m_map.GetShapefile(m_polylineMeasurePtLayerID[1])).EditInsertShape(shapePtr, &i);
|
|
|
|
|
|
//绘制测量注记
|
|
|
if (m_polylineMeasureLabelLayerID!=-1)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_polylineMeasureLabelLayerID);
|
|
|
}
|
|
|
m_polylineMeasureLabelLayerID = m_map.NewDrawing(1);
|
|
|
DrawDistLabel(m_polylineMeasureLabelLayerID,m_posPolylineMeasurePts,m_numPolylineMeasurePts,1);
|
|
|
}
|
|
|
|
|
|
//右键多点测量结束
|
|
|
if (m_bPolylineMeasure && (Button == 2))
|
|
|
{
|
|
|
EndPolylineMessure();
|
|
|
return;
|
|
|
}
|
|
|
/*******************************************************************************************************/
|
|
|
|
|
|
/*******************************************by Wu 2023.09.14*******************************************/
|
|
|
//选中要素
|
|
|
if (m_bSelectFeatureFlag && (Button == 1))
|
|
|
{
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
double pt[2] = {dX,dY};
|
|
|
|
|
|
m_lineSelectedID = IsSelectLine(pt);
|
|
|
ClearHighLightLine();
|
|
|
if (g_b981APad || g_b981ADesktop)
|
|
|
{
|
|
|
if (m_lineSelectedID==14) //暂时屏蔽回收航线
|
|
|
{
|
|
|
m_lineSelectedID = -1;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (m_lineSelectedID>0)
|
|
|
{
|
|
|
m_editLineDataGroup = m_ShowedLineDataList[m_lineSelectedID];
|
|
|
DrawHighLightLine(m_editLineDataGroup.linePts,m_editLineDataGroup.linePointNum);
|
|
|
}
|
|
|
}
|
|
|
//航线编辑
|
|
|
if (m_bEditLine && (Button == 1))
|
|
|
{
|
|
|
if (m_lineSelectedID<=0)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
m_iPtSel=GetPtSel(m_editLineDataGroup.pts,m_editLineDataGroup.pointNum,x,y);
|
|
|
if (m_iPtSel<0) //选中非节点,在线上新增点
|
|
|
{
|
|
|
//m_editLineDataGroup = m_ShowedLineDataList[m_lineSelectedID];
|
|
|
double pt[2] = {dX,dY};
|
|
|
vector<double> lineX,lineY;
|
|
|
TransformToVectorPoints(m_editLineDataGroup,lineX,lineY);
|
|
|
int addPointPos = topologicalAnalysis.isPointInPolyLine(pt,lineX,lineY);
|
|
|
if (addPointPos==0) //点击点不在线上
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
if (m_lineSelectedID==11)
|
|
|
{
|
|
|
if (addPointPos>m_editLineDataGroup.linePointNum-4) return; //回收航线屏蔽4,5,6长边不让编辑
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (m_editLineDataGroup.pointNum>=127) //限制最多127个点
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//计算添加点坐标
|
|
|
double linePt1[2] = {m_editLineDataGroup.linePts[addPointPos-1].dX,m_editLineDataGroup.linePts[addPointPos-1].dY};
|
|
|
double linePt2[2] = {m_editLineDataGroup.linePts[addPointPos].dX,m_editLineDataGroup.linePts[addPointPos].dY};
|
|
|
double targetPt[2] = {0.0,0.0};
|
|
|
topologicalAnalysis.GetPointToLineVerticalCross(linePt1,linePt2,pt,targetPt);
|
|
|
//添加到线上
|
|
|
AddPointInLine(addPointPos,targetPt,m_editLineDataGroup);
|
|
|
|
|
|
if (m_distLabelLayer!=-1)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_distLabelLayer);//清除距离和方位角标绘
|
|
|
}
|
|
|
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(m_editLineDataGroup.lineID-1);
|
|
|
//标绘航线
|
|
|
DrawFlyLine(m_editLineDataGroup);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//右键编辑结束
|
|
|
if (m_bEditLine && (Button == 2))
|
|
|
{
|
|
|
double lon,lat;
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x,y, &lon, &lat);
|
|
|
int selectedPointID = GetPtSel(m_editLineDataGroup.pts,m_editLineDataGroup.pointNum,x,y);
|
|
|
if (selectedPointID>=0)
|
|
|
{
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
if (m_lineSelectedID==11)
|
|
|
{
|
|
|
if (selectedPointID>=m_editLineDataGroup.pointNum-3 || selectedPointID==0) //回收航线屏蔽1,4,5,6,航点
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
ShowModifyPointDlg(selectedPointID);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
ShowEditSaveDlg();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
/***************************************************************************************************************/
|
|
|
|
|
|
//处于航线设计模式时,且鼠标光标处于选择模式时
|
|
|
if (m_bLineDesign && (Button == 1))
|
|
|
{
|
|
|
////if (m_map.GetCursorMode()!=5) //设置为鼠标箭头状态
|
|
|
////{
|
|
|
// m_map.SetCursorMode(5);
|
|
|
|
|
|
///*}*/
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
if (m_bPtEdit ) //处于航点编辑模式时
|
|
|
{
|
|
|
m_iPtSel=GetPtSel(x,y);
|
|
|
}
|
|
|
if (m_bSetPointModel)//置点
|
|
|
{
|
|
|
if (m_designLinePointNum>=127) //限制最多127个航点
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
POINT pt;
|
|
|
GetCursorPos( &pt );
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
//航点编号
|
|
|
m_curDesignPoint.nPt = m_designLinePointNum+1;
|
|
|
|
|
|
//航点经度
|
|
|
m_curDesignPoint.dX = dX;
|
|
|
|
|
|
//航点纬度
|
|
|
m_curDesignPoint.dY = dY;
|
|
|
|
|
|
m_pDesignLineStruct[m_designLinePointNum] = m_curDesignPoint;
|
|
|
|
|
|
//航点编号计数器增加1
|
|
|
m_designLinePointNum++;
|
|
|
|
|
|
m_bAddNewPoint = true;
|
|
|
}
|
|
|
if (m_bPtDel)//删点
|
|
|
{
|
|
|
int iSel=GetPtSel(x,y);
|
|
|
int i=0;
|
|
|
if (iSel!=-1)
|
|
|
{
|
|
|
for (i=iSel;i<m_designLinePointNum-1;i++)
|
|
|
{
|
|
|
m_pDesignLineStruct[i]=m_pDesignLineStruct[i+1];
|
|
|
m_pDesignLineStruct[i].nPt=m_pDesignLineStruct[i].nPt-1;
|
|
|
}
|
|
|
|
|
|
m_designLinePointNum--;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
DrawLineDesign();
|
|
|
}
|
|
|
|
|
|
//新航线设计 2016.01.05
|
|
|
//当处于航线设计,并且鼠标处于选择模式时
|
|
|
if (m_bHaveShowLineDesign && (Button == 1))
|
|
|
{
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
if (m_bLDSetPoint)
|
|
|
{
|
|
|
POINT pt;
|
|
|
GetCursorPos(&pt);
|
|
|
|
|
|
//像素点坐标转化经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &dX, &dY);
|
|
|
|
|
|
//航点编号
|
|
|
m_CurNewDesignPt.nPt = m_NowNumLineDesign + 1;
|
|
|
|
|
|
//当前设计的航点的经度
|
|
|
m_CurNewDesignPt.dX = dX;
|
|
|
|
|
|
//当前设计的航点的纬度
|
|
|
m_CurNewDesignPt.dY = dY;
|
|
|
|
|
|
//当前设计的航点的高度
|
|
|
m_CurNewDesignPt.nH = 0;
|
|
|
|
|
|
//当前设计的航点的速度
|
|
|
m_CurNewDesignPt.nV = 0;
|
|
|
|
|
|
//当前设计的航点的任务特征字
|
|
|
m_CurNewDesignPt.ch1 = 0x02;
|
|
|
|
|
|
//当前设计的航点的航路特征字
|
|
|
m_CurNewDesignPt.ch2 = 0x01;
|
|
|
|
|
|
m_pLineDesign->ShowLonLat(dX, dY);
|
|
|
|
|
|
m_pNewDesignLineStruct[m_NowNumLineDesign] = m_CurNewDesignPt;
|
|
|
|
|
|
m_pLineDesign->InsertPt(m_CurNewDesignPt);
|
|
|
//航点编号计数器+1
|
|
|
m_NowNumLineDesign++;
|
|
|
|
|
|
|
|
|
//CLineDesign dlg;
|
|
|
//dlg.ShowLonLat(m_curDesignPoint.dX, m_curDesignPoint.dX);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//鼠标右键点击时,弹出快捷菜单
|
|
|
if (Button == 2 && !m_bLineDesign)
|
|
|
{
|
|
|
//删除已经标绘的直线
|
|
|
m_map.ClearDrawing(m_tempLayerID);
|
|
|
m_map.Redraw();
|
|
|
|
|
|
//显示快捷菜单
|
|
|
CMenu menu;
|
|
|
|
|
|
POINT pt;
|
|
|
GetCursorPos( &pt );
|
|
|
bool bSel = false;
|
|
|
for (int i = 0;i<255;i++)
|
|
|
{
|
|
|
if (m_targets[i].id <= 0)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
double pixX = 0;
|
|
|
double pixY = 0;
|
|
|
m_map.ProjToPixel(m_targets[i].lon,m_targets[i].lat, &pixX, &pixY);
|
|
|
if (fabs(x-pixX)<5 && fabs(y-pixY)<5 )
|
|
|
{
|
|
|
bSel = true;
|
|
|
m_targetSelID = m_targets[i].id;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (bSel)
|
|
|
{
|
|
|
menu.LoadMenu(IDR_MENU_TARGET);
|
|
|
//弹出快捷菜单
|
|
|
menu.GetSubMenu( 0 )->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x,pt.y, this );
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
|
|
|
OnShowRMenu();
|
|
|
/*
|
|
|
//当处于回放模式时,设置、导引操作、航线装订子菜单都先灰色
|
|
|
menu.LoadMenu(IDR_MENU2);
|
|
|
|
|
|
//航线1
|
|
|
if (m_pHaveDrawLineFlag[0])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE1, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE1, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线2
|
|
|
if (m_pHaveDrawLineFlag[1])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE2, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE2, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线3
|
|
|
if (m_pHaveDrawLineFlag[2])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE3, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE3, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线4
|
|
|
if (m_pHaveDrawLineFlag[3])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE4, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE4, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线5
|
|
|
if (m_pHaveDrawLineFlag[4])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE5, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE5, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
|
|
|
//航线6
|
|
|
if (m_pHaveDrawLineFlag[5])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE6, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE6, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线7
|
|
|
if (m_pHaveDrawLineFlag[6])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE7, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE7, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
//航线8
|
|
|
if (m_pHaveDrawLineFlag[7])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE8, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE8, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
//航线9
|
|
|
if (m_pHaveDrawLineFlag[8])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE9, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE9, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
//航线10
|
|
|
if (m_pHaveDrawLineFlag[9])
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE10, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_LINE10, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
|
|
|
//航线14 回收航线
|
|
|
if (m_pHaveDrawLineFlag[13])
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_PD10, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_PD10, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线11 应急航线
|
|
|
if (m_pHaveDrawLineFlag[10])
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_HS11, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_HS11, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//航线12 电子围栏
|
|
|
if (m_pHaveDrawLineFlag[11])
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_TC12, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_SHOW_TC12, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (m_bAutoMove)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_AUTO_MOVE, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_AUTO_MOVE, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (m_guidePointMode == 1)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_GUIDE_FLY1, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_GUIDE_FLY1, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (m_guidePointMode == 2)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_GUIDE_FLY2, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_GUIDE_FLY2, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (m_bPlotDemArea)
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_MENU_PLOTDEMAREA, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_MENU_PLOTDEMAREA, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (m_bEnableShowADSB)
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_MENU_ADSB, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( ID_MENU_ADSB, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
//弹出快捷菜单
|
|
|
menu.GetSubMenu( 0 )->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this );
|
|
|
*/
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &m_guidePtInfo.guidePtLon, &m_guidePtInfo.guidePtLat);
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Button == 2 && m_bLineDesign) //航线编辑时,停止编辑
|
|
|
{
|
|
|
//删除已经标绘的直线(追踪线和距离标注)
|
|
|
m_map.ClearDrawing(m_tempLayerID);
|
|
|
m_map.Redraw();
|
|
|
|
|
|
CMenu tmenu;
|
|
|
tmenu.LoadMenu(IDR_FLOATINGMENU);
|
|
|
CRect rc=CRect(0,0,x,y);
|
|
|
ClientToScreen(&rc);
|
|
|
//弹出快捷菜单
|
|
|
tmenu.GetSubMenu( 0 )->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON, rc.right,rc.bottom, this );
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
//处于地标点对话框选点模式时,且鼠标光标处于选择模式,左键按下
|
|
|
if (m_bSelectDropPoint && (m_map.GetCursorMode() == 3) && (Button == 1))
|
|
|
{
|
|
|
m_bSelectDropPoint = false;
|
|
|
|
|
|
double _ptLon = 0.0, _ptLat = 0.0;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &_ptLon, &_ptLat);
|
|
|
|
|
|
//更新坐标点信息
|
|
|
if (m_pTargetDlg && m_pTargetDlg->GetSafeHwnd())
|
|
|
{
|
|
|
m_pTargetDlg->ShowPointPosition(_ptLon,_ptLat);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//处于可视域分析对话框选点模式时,且鼠标光标处于选择模式,左键按下
|
|
|
if (g_bSelectDropPoint && (m_map.GetCursorMode() == 3) && (Button == 1))
|
|
|
{
|
|
|
g_bSelectDropPoint = false;
|
|
|
|
|
|
double _ptLon = 0.0, _ptLat = 0.0;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &_ptLon, &_ptLat);
|
|
|
|
|
|
//更新坐标点信息,并完成通视分析
|
|
|
if (m_dlgLightRegion.GetSafeHwnd())
|
|
|
{
|
|
|
m_dlgLightRegion.ShowPointPosition(_ptLon,_ptLat);
|
|
|
m_dlgLightRegion.LosBetweenTwoPoints();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//高程分析选点
|
|
|
if (g_bDemAnalysising && (Button == 1))
|
|
|
{
|
|
|
|
|
|
g_iDemPointNum++;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
double _ptLon = 0.0, _ptLat = 0.0;
|
|
|
m_map.PixelToProj(x, y, &_ptLon, &_ptLat);
|
|
|
|
|
|
g_dDemPtLon[g_iDemPointNum-1] = _ptLon;
|
|
|
g_dDemPtLat[g_iDemPointNum-1] = _ptLat;
|
|
|
return;
|
|
|
CString str;
|
|
|
str.Format(_T("%d"), g_iDemPointNum);
|
|
|
|
|
|
//显示点的序号标注
|
|
|
AddTextToPointShapeLayer(g_lDemPtNumLayerID[g_iDemPointNum-1], _ptLon, _ptLat, str, _T(""), RGB(255,0,0));
|
|
|
|
|
|
if (g_iDemPointNum >= g_iDemAltPtNum)
|
|
|
{
|
|
|
BCGPMessageBox(_T("暂时仅支持最多10个点的高程分析!"));
|
|
|
|
|
|
g_bDemAnalysising = false;
|
|
|
|
|
|
m_DlgDemAlt.DrawDemAltBetweenPts(g_dDemPtLon, g_dDemPtLat, g_iDemPointNum);
|
|
|
|
|
|
if (m_DlgDemAlt.GetSafeHwnd())
|
|
|
{
|
|
|
m_DlgDemAlt.ShowWindow(TRUE);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//选择导引点
|
|
|
if (m_bGuideMode && (Button == 1))
|
|
|
{
|
|
|
m_bGuideMode = false;
|
|
|
m_map.PixelToProj(x,y,&m_guidePtInfo.guidePtLon,&m_guidePtInfo.guidePtLat);
|
|
|
DrawGuidePoint(m_guidePtInfo.guideMode,m_guidePtInfo.guidePtLon,m_guidePtInfo.guidePtLat);
|
|
|
switch(m_guidePointMode)
|
|
|
{
|
|
|
case 0:
|
|
|
break;
|
|
|
case 1:
|
|
|
{
|
|
|
m_struMapOut.cmd = MapCmd_Guide1;
|
|
|
m_struMapOut.lon = m_guidePtInfo.guidePtLon;
|
|
|
m_struMapOut.lat = m_guidePtInfo.guidePtLat;
|
|
|
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP, (int)(&m_struMapOut),0);
|
|
|
}
|
|
|
break;
|
|
|
case 2:
|
|
|
{
|
|
|
if (m_CircleGuideLayer>=0)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_CircleGuideLayer);
|
|
|
m_CircleGuideLayer = -1;
|
|
|
}
|
|
|
|
|
|
CCircleGuidence circleGuidenceDlg;
|
|
|
if (IDOK == circleGuidenceDlg.DoModal())
|
|
|
{
|
|
|
if (m_CircleGuideLayer<0)
|
|
|
{
|
|
|
m_CircleGuideLayer = m_map.NewDrawing(1);
|
|
|
}
|
|
|
|
|
|
double radius = circleGuidenceDlg.g_radius/abs(2*M_PI*6378137*cos(m_guidePtInfo.guidePtLat*M_PI/180)/360);
|
|
|
|
|
|
m_map.DrawWideCircleEx(m_CircleGuideLayer,m_guidePtInfo.guidePtLon,m_guidePtInfo.guidePtLat,radius,RGB(248,252,55),false,2);
|
|
|
m_map.Redraw();
|
|
|
|
|
|
//装订
|
|
|
m_struMapOut.cmd = MapCmd_Guide2;
|
|
|
m_struMapOut.lon = m_guidePtInfo.guidePtLon;
|
|
|
m_struMapOut.lat = m_guidePtInfo.guidePtLat;
|
|
|
|
|
|
m_struMapOut.height = circleGuidenceDlg.g_alt;
|
|
|
m_struMapOut.radius = circleGuidenceDlg.g_radius;
|
|
|
m_struMapOut.direction = circleGuidenceDlg.g_direction;
|
|
|
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP, (int)(&m_struMapOut),0);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//判断点矢量图层是否已经存在,存在则删除
|
|
|
if (m_guidePtShpLayerID != -1)
|
|
|
{
|
|
|
//清除标绘的点矢量图层
|
|
|
ClearPointShape(m_guidePtShpLayerID);
|
|
|
|
|
|
m_guidePtShpLayerID = -1;
|
|
|
}
|
|
|
m_bGuideMode = true;
|
|
|
//OnRemoveGuidePtDraw();
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
void CGISDlg::MouseDblClickMap1()
|
|
|
{
|
|
|
//结束高程分析
|
|
|
if (g_bDemAnalysising)
|
|
|
{
|
|
|
g_bDemAnalysising = false;
|
|
|
|
|
|
m_DlgDemAlt.DrawDemAltBetweenPts(g_dDemPtLon, g_dDemPtLat, g_iDemPointNum);
|
|
|
|
|
|
if (m_DlgDemAlt.GetSafeHwnd())
|
|
|
{
|
|
|
m_DlgDemAlt.ShowWindow(TRUE);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*********************************by Wu 2023.09.20********************************************/
|
|
|
double dX = 0;
|
|
|
double dY = 0;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(GLOBAL_X,GLOBAL_Y, &dX, &dY);
|
|
|
//双击删除航点
|
|
|
if (m_bEditLine)
|
|
|
{
|
|
|
int ptSelected = GetPtSel(m_editLineDataGroup.pts,m_editLineDataGroup.pointNum,GLOBAL_X,GLOBAL_Y);
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
if (m_editLineDataGroup.lineID==11) //回收航线屏蔽1,4,5,6航点
|
|
|
{
|
|
|
if (ptSelected==0 || (ptSelected>=m_editLineDataGroup.pointNum-3))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (ptSelected>=0)
|
|
|
{
|
|
|
if (m_distLabelLayer!=-1)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_distLabelLayer);//清除距离和方位角标绘
|
|
|
}
|
|
|
|
|
|
RemovePointInLine(ptSelected,m_editLineDataGroup);
|
|
|
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(m_editLineDataGroup.lineID-1);
|
|
|
//标绘航线
|
|
|
DrawFlyLine(m_editLineDataGroup);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*********************************************************************************************/
|
|
|
if (g_b981APad) //平板模式双击测距结束
|
|
|
{
|
|
|
if (m_bPolylineMeasure)
|
|
|
{
|
|
|
EndPolylineMessure();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//结束绘制航测区
|
|
|
if (designSurveyLineDlg != nullptr && designSurveyLineDlg->bDrawRegion)
|
|
|
{
|
|
|
designSurveyLineDlg->bDrawRegion = false;
|
|
|
if (surveyRegionLons.size()<3) //多边形无效
|
|
|
{
|
|
|
surveyRegionLons.clear();
|
|
|
surveyRegionLats.clear();
|
|
|
return;
|
|
|
}
|
|
|
//添加原点闭合
|
|
|
surveyRegionLons.push_back(surveyRegionLons[0]);
|
|
|
surveyRegionLats.push_back(surveyRegionLats[0]);
|
|
|
//显示测绘区域
|
|
|
ShowSurveyRegion(tmpSurveyRegionLayerID,surveyRegionLons,surveyRegionLats);
|
|
|
m_map.Redraw();
|
|
|
designSurveyLineDlg->SetSurveyRegion(surveyRegionLons,surveyRegionLats);
|
|
|
|
|
|
surveyRegionLons.clear();
|
|
|
surveyRegionLats.clear();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void CGISDlg::MouseMoveMap1(short Button, short Shift, long x, long y)
|
|
|
{
|
|
|
if (Button == 2)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//绘制航测区域
|
|
|
if (designSurveyLineDlg!= nullptr && designSurveyLineDlg->bDrawRegion)
|
|
|
{
|
|
|
double dX = 0;
|
|
|
double dY = 0;
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
if ( 1 == surveyRegionLons.size()) //绘制直线
|
|
|
{
|
|
|
if (m_tempLayerID!=-1)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_tempLayerID);
|
|
|
m_tempLayerID = -1;
|
|
|
}
|
|
|
|
|
|
m_tempLayerID = m_map.NewDrawing(1);
|
|
|
m_map.DrawLineEx(m_tempLayerID,surveyRegionLons[0],surveyRegionLats[0],dX,dY,2,RGB(255,0,0));
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
if (2 <= surveyRegionLons.size()) //绘制多边形
|
|
|
{
|
|
|
/*
|
|
|
if ( 2 == surveyRegionLons.size())
|
|
|
{
|
|
|
//添加实时点绘制多边形
|
|
|
surveyRegionLons.push_back(dX);
|
|
|
surveyRegionLats.push_back(dY);
|
|
|
}*/
|
|
|
if (m_tempLayerID!=-1)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_tempLayerID);
|
|
|
m_tempLayerID = -1;
|
|
|
}
|
|
|
surveyRegionLons.push_back(dX);
|
|
|
surveyRegionLats.push_back(dY);
|
|
|
ShowSurveyRegion(tmpSurveyRegionLayerID,surveyRegionLons,surveyRegionLats);
|
|
|
m_map.Redraw();
|
|
|
|
|
|
surveyRegionLons.pop_back();
|
|
|
surveyRegionLats.pop_back();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//显示经纬度坐标时(地图定位)
|
|
|
if (m_bHaveShowLonLatDlg && m_pLonLatDlg ->GetAutoEditStatus())
|
|
|
{
|
|
|
double dX = 0;
|
|
|
double dY = 0;
|
|
|
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
//软件界面显示
|
|
|
m_pLonLatDlg->SetLonLatInfo(dX, dY);
|
|
|
}
|
|
|
|
|
|
//实时绘制限飞区
|
|
|
if (bShowZone)
|
|
|
{
|
|
|
double dX = 0;
|
|
|
double dY = 0;
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
double xPoints[5];
|
|
|
double yPoints[5];
|
|
|
double endPoint[2] = {dX,dY};
|
|
|
ComputeRectanglePoints(firstZonePoint,endPoint,xPoints,yPoints);
|
|
|
DrawRestrictedZone(m_tempZoneLayerID,xPoints,yPoints,5,1);
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
|
|
|
/*****************************************by Wu 2023.09.14*******************************************/
|
|
|
//编辑航线时
|
|
|
if (m_bEditLine && Button == 1)
|
|
|
{
|
|
|
double dX = 0;
|
|
|
double dY = 0;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &dX, &dY);
|
|
|
if (m_iPtSel==-1)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
if (m_editLineDataGroup.lineID==11) //回收航线1,4,5,6不让编辑
|
|
|
{
|
|
|
if (m_iPtSel==0 || (m_iPtSel>=m_editLineDataGroup.pointNum-3))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int n_pts = m_editLineDataGroup.pointNum;
|
|
|
bool isClosedLine;
|
|
|
if (m_editLineDataGroup.pts[n_pts-1].ch1==2) //非闭合航线
|
|
|
{
|
|
|
isClosedLine = false;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
isClosedLine = true;
|
|
|
}
|
|
|
|
|
|
m_dragFlag = true;
|
|
|
m_editLineDataGroup.pts[m_iPtSel].dX = dX;
|
|
|
m_editLineDataGroup.pts[m_iPtSel].dY = dY;
|
|
|
m_editLineDataGroup.linePts[m_iPtSel].dX = dX;
|
|
|
m_editLineDataGroup.linePts[m_iPtSel].dY = dY;
|
|
|
if (m_iPtSel==0 && isClosedLine) //选中起点时,需要同步修改线终点的坐标
|
|
|
{
|
|
|
int endpt = m_editLineDataGroup.linePointNum - 1;
|
|
|
m_editLineDataGroup.linePts[endpt].dX = dX;
|
|
|
m_editLineDataGroup.linePts[endpt].dY = dY;
|
|
|
}
|
|
|
if (m_iPtSel==n_pts-1 && !isClosedLine) //非闭合航线终点
|
|
|
{
|
|
|
m_editLineDataGroup.linePts[n_pts].dX = dX;
|
|
|
m_editLineDataGroup.linePts[n_pts].dY = dY;
|
|
|
}
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(m_editLineDataGroup.lineID-1);
|
|
|
//标绘航线
|
|
|
DrawFlyLine(m_editLineDataGroup);
|
|
|
//拖拽航点时显示距离和方位角
|
|
|
if (m_distLabelLayer!=-1)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_distLabelLayer);
|
|
|
}
|
|
|
m_distLabelLayer = m_map.NewDrawing(1);
|
|
|
if (m_iPtSel==0)//选中起点
|
|
|
{
|
|
|
int endpt = m_editLineDataGroup.pointNum - 1;
|
|
|
DrawDistLabelEx(m_distLabelLayer,m_editLineDataGroup.pts[m_iPtSel].dX,m_editLineDataGroup.pts[m_iPtSel].dY,m_editLineDataGroup.pts[m_iPtSel+1].dX,m_editLineDataGroup.pts[m_iPtSel+1].dY,0);
|
|
|
if (isClosedLine)
|
|
|
{
|
|
|
DrawDistLabelEx(m_distLabelLayer,m_editLineDataGroup.pts[m_iPtSel].dX,m_editLineDataGroup.pts[m_iPtSel].dY,m_editLineDataGroup.pts[endpt].dX,m_editLineDataGroup.pts[endpt].dY,0);
|
|
|
}
|
|
|
}
|
|
|
else if (m_iPtSel==m_editLineDataGroup.pointNum - 1) //选中终点
|
|
|
{
|
|
|
DrawDistLabelEx(m_distLabelLayer,m_editLineDataGroup.pts[m_iPtSel].dX,m_editLineDataGroup.pts[m_iPtSel].dY,m_editLineDataGroup.pts[m_iPtSel-1].dX,m_editLineDataGroup.pts[m_iPtSel-1].dY,0);
|
|
|
if (isClosedLine)
|
|
|
{
|
|
|
DrawDistLabelEx(m_distLabelLayer,m_editLineDataGroup.pts[m_iPtSel].dX,m_editLineDataGroup.pts[m_iPtSel].dY,m_editLineDataGroup.pts[0].dX,m_editLineDataGroup.pts[0].dY,0);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
DrawDistLabelEx(m_distLabelLayer,m_editLineDataGroup.pts[m_iPtSel].dX,m_editLineDataGroup.pts[m_iPtSel].dY,m_editLineDataGroup.pts[m_iPtSel-1].dX,m_editLineDataGroup.pts[m_iPtSel-1].dY,0);
|
|
|
DrawDistLabelEx(m_distLabelLayer,m_editLineDataGroup.pts[m_iPtSel].dX,m_editLineDataGroup.pts[m_iPtSel].dY,m_editLineDataGroup.pts[m_iPtSel+1].dX,m_editLineDataGroup.pts[m_iPtSel+1].dY,0);
|
|
|
}
|
|
|
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
/*****************************************************************************************************************/
|
|
|
|
|
|
/*****************************************多点测距 by Wu 2023.10.16************************************************/
|
|
|
if (m_bPolylineMeasure && m_bMeasureDrag)
|
|
|
{
|
|
|
double dX = 0;
|
|
|
double dY = 0;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &dX, &dY);
|
|
|
|
|
|
//删除已经标绘的直线
|
|
|
m_map.ClearDrawing(m_tempLayerID);
|
|
|
//新建临时标绘图层
|
|
|
m_tempLayerID = m_map.NewDrawing(1);
|
|
|
//绘制直线
|
|
|
if (m_tempLayerID!=-1)
|
|
|
{
|
|
|
m_map.DrawLineEx(m_tempLayerID,m_posPolylineMeasurePts[m_numPolylineMeasurePts-1][0], m_posPolylineMeasurePts[m_numPolylineMeasurePts-1][1], dX, dY, 2, RGB(0,255,0));
|
|
|
|
|
|
//显示线段的距离和方位
|
|
|
DrawDistLabelEx(m_tempLayerID,m_posPolylineMeasurePts[m_numPolylineMeasurePts-1][0], m_posPolylineMeasurePts[m_numPolylineMeasurePts-1][1], dX, dY);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/****************************************************************************************************************/
|
|
|
|
|
|
|
|
|
//新航线设计时
|
|
|
if (m_bHaveShowLineDesign)
|
|
|
{
|
|
|
double dX = 0;
|
|
|
double dY = 0;
|
|
|
|
|
|
m_map.PixelToProj(x,y, &dX, &dY);
|
|
|
|
|
|
//航线设计对话框显示经纬度
|
|
|
//m_pLineDesign->ShowLonLat(dX, dY);
|
|
|
}
|
|
|
|
|
|
//航线设计时
|
|
|
if (m_bLineDesign)
|
|
|
{
|
|
|
double dX = 0;
|
|
|
double dY = 0;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &dX, &dY);
|
|
|
|
|
|
if (m_bPtEdit ) //处于航点编辑模式时
|
|
|
{
|
|
|
if (m_iPtSel==-1)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
m_pDesignLineStruct[m_iPtSel].dX=dX;
|
|
|
m_pDesignLineStruct[m_iPtSel].dY=dY;
|
|
|
DrawLineDesign();
|
|
|
return;
|
|
|
|
|
|
//判断鼠标是否选中待编辑的航点
|
|
|
if (BeMouseClickedLinePoint(m_curEditLinePoint, x, y))
|
|
|
{
|
|
|
//编辑航点
|
|
|
m_pFlyLineDesign->EditPoint(dX, dY);
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (m_bDesignFirstPoint)
|
|
|
{
|
|
|
//航段信息赋值,显示航段信息,以及航点距离原点的距离和方位角
|
|
|
m_pLineSectDlg->InputPointCoordinate(dX, dY);
|
|
|
|
|
|
//航点编号
|
|
|
m_curDesignPoint.nPt = m_designLinePointNum+1;
|
|
|
|
|
|
//航点经度
|
|
|
m_curDesignPoint.dX = dX;
|
|
|
|
|
|
//航点纬度
|
|
|
m_curDesignPoint.dY = dY;
|
|
|
|
|
|
//增加航点
|
|
|
m_pFlyLineDesign->AddPoint(m_curDesignPoint);
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//已经存在临时标绘图层时,删除该图层,重新标注
|
|
|
if (m_designLinePointNum>0 && m_beTemLayerDrawing)
|
|
|
{
|
|
|
//航段信息赋值,显示航段信息,以及航点距离原点的距离和方位角
|
|
|
m_pLineSectDlg->InputPointCoordinate(dX, dY);
|
|
|
|
|
|
//删除已经标绘的直线
|
|
|
m_map.ClearDrawing(m_tempLayerID);
|
|
|
|
|
|
//新建临时标绘图层
|
|
|
m_tempLayerID = m_map.NewDrawing(1);
|
|
|
|
|
|
//航点编号
|
|
|
m_curDesignPoint.nPt = m_designLinePointNum+1;
|
|
|
|
|
|
//航点经度
|
|
|
m_curDesignPoint.dX = dX;
|
|
|
|
|
|
//航点纬度
|
|
|
m_curDesignPoint.dY = dY;
|
|
|
|
|
|
//增加航点
|
|
|
m_pFlyLineDesign->AddPoint(m_curDesignPoint);
|
|
|
|
|
|
//绘制直线
|
|
|
if (m_tempLayerID!=-1)
|
|
|
{
|
|
|
m_map.DrawLineEx(m_tempLayerID,m_pDesignLineStruct[m_designLinePointNum-1].dX, m_pDesignLineStruct[m_designLinePointNum-1].dY, dX, dY, 2, RGB(0,255,0));
|
|
|
DrawDistLabelEx(m_tempLayerID, m_pDesignLineStruct[m_designLinePointNum-1].dX, m_pDesignLineStruct[m_designLinePointNum-1].dY, dX, dY);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//处于可视域分析对话框选点模式时,且鼠标光标处于选择模式
|
|
|
if (m_bSelectDropPoint && (m_map.GetCursorMode() == 3))
|
|
|
{
|
|
|
double _ptLon = 0.0, _ptLat = 0.0;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &_ptLon, &_ptLat);
|
|
|
|
|
|
//更新坐标点信息
|
|
|
if (m_pTargetDlg && m_pTargetDlg->GetSafeHwnd())
|
|
|
{
|
|
|
m_pTargetDlg->ShowPointPosition(_ptLon,_ptLat);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//处于可视域分析对话框选点模式时,且鼠标光标处于选择模式
|
|
|
if (g_bSelectDropPoint && (m_map.GetCursorMode() == 3))
|
|
|
{
|
|
|
double _ptLon = 0.0, _ptLat = 0.0;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &_ptLon, &_ptLat);
|
|
|
|
|
|
//更新坐标点信息
|
|
|
if (m_dlgLightRegion.GetSafeHwnd())
|
|
|
{
|
|
|
m_dlgLightRegion.ShowPointPosition(_ptLon,_ptLat);
|
|
|
}
|
|
|
|
|
|
if (m_longSelectLineID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_longSelectLineID).EditClear();
|
|
|
}
|
|
|
|
|
|
m_gisManager->CreateEmptyLineShapfile(m_longSelectLineID,RGB(0,255,0),2);
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_longSelectLineID,1,m_dlgLightRegion.m_dGroundLon,m_dlgLightRegion.m_dGroundLat);
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_longSelectLineID,1,_ptLon,_ptLat);
|
|
|
|
|
|
double _distance = 0.0, _angle = 0.0;
|
|
|
CalculateTwoPtsDistanceAzimuth(_distance, _angle, m_dlgLightRegion.m_dGroundLon,m_dlgLightRegion.m_dGroundLat, _ptLon, _ptLat, 3);
|
|
|
|
|
|
CString str;
|
|
|
str.Format(_T("D:%.1fkm A:%.1f°"), _distance/1000, _angle);
|
|
|
|
|
|
if (m_longLabelPlotID != 0)
|
|
|
{
|
|
|
ClearPointShape(m_longLabelPlotID);
|
|
|
m_longLabelPlotID = 0;
|
|
|
}
|
|
|
//标注距离和方位
|
|
|
AddPointShapeLayer(m_longLabelPlotID,_ptLon, _ptLat, str, _T("红色"), RGB(255,0,0));
|
|
|
}
|
|
|
//高程分析时
|
|
|
if (g_bDemAnalysising && g_iDemPointNum>=1 )
|
|
|
{
|
|
|
double lon = 0, lat = 0;
|
|
|
m_map.PixelToProj(x, y, &lon, &lat);
|
|
|
|
|
|
double _dis = 0;
|
|
|
CalculateTwoPtsDistance(_dis, g_dDemPtLon[g_iDemPointNum-1], g_dDemPtLat[g_iDemPointNum-1], lon, lat, 3);
|
|
|
|
|
|
//过滤掉由于双击结束时多出的一条线段
|
|
|
if (_dis > 30)
|
|
|
{
|
|
|
m_map.RemoveLayer(g_lDemAltLayerID[g_iDemPointNum-1]);
|
|
|
|
|
|
//创建线图层
|
|
|
CreateEmptyShapfile(g_lDemAltLayerID[g_iDemPointNum-1], 1, RGB(255,255,255));
|
|
|
|
|
|
//绘制线段
|
|
|
AddOnePoint2Shapfile(g_lDemAltLayerID[g_iDemPointNum-1], 1, g_dDemPtLon[g_iDemPointNum-1], g_dDemPtLat[g_iDemPointNum-1]);
|
|
|
AddOnePoint2Shapfile(g_lDemAltLayerID[g_iDemPointNum-1], 1, lon, lat);
|
|
|
|
|
|
//显示线段的距离和方位(绘制标注)
|
|
|
DrawLineLabel(g_lDemAltLayerID[g_iDemPointNum-1], g_dDemPtLon[g_iDemPointNum-1], g_dDemPtLat[g_iDemPointNum-1], lon, lat);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//选择标记点时
|
|
|
if (g_bSelectMarker)
|
|
|
{
|
|
|
TRACE("g_bSelectMarker = true\n");
|
|
|
double _ptLon = 0.0, _ptLat = 0.0;
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(x, y, &_ptLon, &_ptLat);
|
|
|
|
|
|
m_dlgMarker.ShowMarkerCoordinate(_ptLon, _ptLat);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//功能:基于点矢量图层标绘目标点
|
|
|
//输入:点图层名称drawLayerID
|
|
|
// 点坐标,经度lon, 纬度lat
|
|
|
// 点名称strPtName
|
|
|
// 标绘颜色strColor
|
|
|
// 标绘字体颜色数值fontColor
|
|
|
void CGISDlg::AddTextToPointShapeLayer(long &drawLayerID, const double lon, const double lat, const CString strPtName, const CString strColor, unsigned long fontColor)
|
|
|
{
|
|
|
//判断点矢量图层是否已经存在,存在则删除
|
|
|
if (drawLayerID >= 0)
|
|
|
{
|
|
|
//清除标绘的点矢量图层
|
|
|
ClearPointShape(drawLayerID);
|
|
|
drawLayerID = -1;
|
|
|
}
|
|
|
|
|
|
/////////////////////新建点矢量图层标绘点目标///////////////////////////////////
|
|
|
//创建点图层
|
|
|
CreateEmptyShapfile(drawLayerID, 0, RGB(0,255,0));
|
|
|
|
|
|
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
|
|
|
|
|
|
//Label集合
|
|
|
CLabels labesPtr;
|
|
|
labesPtr = (m_map.GetShapefile(drawLayerID)).GetLabels();
|
|
|
|
|
|
CLabelCategory labelCategory = labesPtr.AddCategory(strColor);
|
|
|
labelCategory.SetFontColor(fontColor);
|
|
|
labelCategory.SetAlignment(1);
|
|
|
labelCategory.SetFontBold(TRUE);
|
|
|
labelCategory.SetFontName(_T("Times New Roman"));
|
|
|
labelCategory.SetFontSize(12);
|
|
|
|
|
|
//增加Labels
|
|
|
labesPtr.AddLabel(strPtName, lon+0.0002, lat+0.0002, 0, 0);
|
|
|
|
|
|
//重新绘制
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
//功能:显示两点所连线段的距离和方位标注(Label)
|
|
|
// drawLayerID 绘制标注的图层ID
|
|
|
// ptLon1, ptLat1 第一个点的经纬度
|
|
|
// ptLon2, ptLat2 第二个点的经纬度
|
|
|
void CGISDlg::DrawLineLabel(long &drawLayerID, const double ptLon1, const double ptLat1, const double ptLon2, const double ptLat2)
|
|
|
{
|
|
|
double _dis, _angle;
|
|
|
CalculateTwoPtsDistanceAzimuth(_dis, _angle, ptLon1, ptLat1, ptLon2, ptLat2, 3);
|
|
|
|
|
|
CString str = _T("");
|
|
|
if ( _dis < 1000)
|
|
|
{
|
|
|
str.Format(_T("%.1fm/%.1f°"), _dis, _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
str.Format(_T("%.2fkm/%.1f°"), _dis*0.001,_angle);
|
|
|
}
|
|
|
|
|
|
//根据与目标之间的相对位置关系进行文字标注
|
|
|
double textLon = 0;
|
|
|
double textLat = 0;
|
|
|
|
|
|
//计算标注点坐标
|
|
|
TargetPos2LabelPos(textLon, textLat, (ptLon1 + ptLon2)/2, (ptLat1 + ptLat2)/2);
|
|
|
|
|
|
if (_T("") != str)
|
|
|
{
|
|
|
//Label集合
|
|
|
CLabels labesPtr;
|
|
|
labesPtr = (m_map.GetShapefile(drawLayerID)).GetLabels();
|
|
|
|
|
|
labesPtr.SetFontColor(RGB(255,127,0));
|
|
|
labesPtr.SetFrameTransparency(0);
|
|
|
labesPtr.SetAlignment(1);
|
|
|
labesPtr.SetFontBold(TRUE);
|
|
|
labesPtr.SetFontName(_T("Times New Roman"));
|
|
|
labesPtr.SetFontSize(15);
|
|
|
labesPtr.put_FontSize2(15);
|
|
|
|
|
|
labesPtr.AddLabel(str, textLon, textLat, 0, 0);
|
|
|
}
|
|
|
//重绘
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
//功能:显示两点所连线段的距离和方位
|
|
|
void CGISDlg::DrawDistLabelEx(long drawLayerID, const double ptLon1, const double ptLat1, const double ptLon2, const double ptLat2,int pos)
|
|
|
{
|
|
|
double _dis, _angle;
|
|
|
CalculateTwoPtsDistanceAzimuth(_dis, _angle, ptLon1, ptLat1, ptLon2, ptLat2, 3);
|
|
|
|
|
|
CString str = _T("");
|
|
|
if ( _dis < 1000)
|
|
|
{
|
|
|
str.Format(_T("%dm;%.1f°"), int(_dis), _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if(_dis<1000)
|
|
|
{
|
|
|
str.Format(_T("%.2fkm;%.1f°"), _dis*0.001, _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
str.Format(_T("%.2fkm;%.1f°"), _dis*0.001,_angle);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//根据与目标之间的相对位置关系进行文字标注
|
|
|
double textLon = 0;
|
|
|
double textLat = 0;
|
|
|
|
|
|
//计算标注点坐标
|
|
|
//TargetPos2LabelPos(textLon, textLat, (ptLon1 + ptLon2)/2, (ptLat1 + ptLat2)/2);
|
|
|
switch (pos)
|
|
|
{
|
|
|
case -1://左端点
|
|
|
TargetPos2LabelPos(textLon, textLat, ptLon1, ptLat1);
|
|
|
break;
|
|
|
case 0://中间端点
|
|
|
TargetPos2LabelPos(textLon, textLat, (ptLon1 + ptLon2)/2, (ptLat1 + ptLat2)/2);
|
|
|
break;
|
|
|
case 1://右端点
|
|
|
TargetPos2LabelPos(textLon, textLat, ptLon2, ptLat2);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
CLabels drawLabels = m_map.GetDrawingLabels(drawLayerID);
|
|
|
|
|
|
drawLabels.SetFontName(_T("黑体"));
|
|
|
//drawLabels.SetFontName(_T("Arial"));
|
|
|
drawLabels.SetFontColor(RGB(220,220,220));
|
|
|
drawLabels.SetFontSize(12);
|
|
|
drawLabels.SetFontBold(true);
|
|
|
drawLabels.SetOffsetX(8);
|
|
|
drawLabels.SetFrameVisible(true);
|
|
|
drawLabels.SetFrameOutlineWidth(0);
|
|
|
drawLabels.SetFrameTransparency(150);
|
|
|
drawLabels.SetFrameBackColor(RGB(50,50,50));
|
|
|
drawLabels.SetFrameOutlineColor(RGB(50,50,50));
|
|
|
|
|
|
//labelCategory.SetLineOrientation(mapWindow::tkLineLabelOrientation::lorParallel);
|
|
|
|
|
|
//drawLabels.AddLabel(str,textLon,textLat,_angle-90,0);
|
|
|
drawLabels.AddLabel(str,textLon,textLat,0,0);
|
|
|
|
|
|
//重绘
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
//功能:显示航点之间的距离和方位
|
|
|
void CGISDlg::DrawDistLabel(long drawLayerID,const double pts[][2], const int ptNum,int pos)
|
|
|
{
|
|
|
double _dis, _angle;
|
|
|
double dist_total = 0;
|
|
|
int i = 0;
|
|
|
for (i=0; i<ptNum-1; i++)
|
|
|
{
|
|
|
|
|
|
CalculateTwoPtsDistanceAzimuth(_dis, _angle, pts[i][0], pts[i][1], pts[i+1][0], pts[i+1][1], 3);
|
|
|
|
|
|
dist_total += _dis;
|
|
|
|
|
|
CString str = _T("");
|
|
|
if(i==0)
|
|
|
{
|
|
|
if ( dist_total < 1000)
|
|
|
{
|
|
|
str.Format(_T("%dm;%.1f°"), int(dist_total), _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if(_dis<1000)
|
|
|
{
|
|
|
str.Format(_T("%.2fkm;%.1f°"), dist_total*0.001, _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
str.Format(_T("%.2fkm;%.1f°"), dist_total*0.001,_angle);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if ( dist_total < 1000)
|
|
|
{
|
|
|
str.Format(_T("%dm(+%dm);%.1f°"), int(dist_total), int(_dis), _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if(_dis<1000)
|
|
|
{
|
|
|
str.Format(_T("%.2fkm(+%dm);%.1f°"), dist_total*0.001, int(_dis), _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
str.Format(_T("%.2fkm(+%.2fkm);%.1f°"), dist_total*0.001,_dis*0.001,_angle);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//根据与目标之间的相对位置关系进行文字标注
|
|
|
double textLon = 0;
|
|
|
double textLat = 0;
|
|
|
|
|
|
//计算标注点坐标
|
|
|
switch (pos)
|
|
|
{
|
|
|
case -1: //左端点
|
|
|
TargetPos2LabelPos(textLon, textLat, pts[i][0], pts[i][1]);
|
|
|
break;
|
|
|
case 0: //中间
|
|
|
TargetPos2LabelPos(textLon, textLat, (pts[i][0] + pts[i+1][0])/2, (pts[i][1] + pts[i+1][1])/2);
|
|
|
break;
|
|
|
case 1: //右端点
|
|
|
TargetPos2LabelPos(textLon, textLat, pts[i+1][0], pts[i+1][1]);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
CLabels drawLabels = m_map.GetDrawingLabels(drawLayerID);
|
|
|
CLabelCategory labelCategory = drawLabels.AddCategory(_T("totaldist"));
|
|
|
labelCategory.SetFontName(_T("黑体"));
|
|
|
labelCategory.SetFontColor(RGB(220,220,220));
|
|
|
labelCategory.SetFontBold(true);
|
|
|
labelCategory.SetFontSize(10);
|
|
|
labelCategory.SetOffsetX(10);
|
|
|
labelCategory.SetFrameTransparency(150);
|
|
|
labelCategory.SetFrameVisible(true);
|
|
|
labelCategory.SetFrameBackColor(RGB(50,50,50));
|
|
|
labelCategory.SetFrameOutlineColor(RGB(50,50,50));
|
|
|
|
|
|
if (pos==0)
|
|
|
{
|
|
|
drawLabels.AddLabel(str,textLon,textLat,_angle-90,0);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
drawLabels.AddLabel(str,textLon,textLat,0,0);
|
|
|
}
|
|
|
|
|
|
//重绘
|
|
|
m_map.Redraw();
|
|
|
//m_map.DrawLabelEx(drawLayerID,str,textLon,textLat,_angle);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//功能:显示航点之间的距离和方位
|
|
|
void CGISDlg::DrawDistLebel(long drawLayerID,const PtStruct *pts, const int ptNum)
|
|
|
{
|
|
|
double _dis, _angle;
|
|
|
double dist_total = 0;
|
|
|
int i = 0;
|
|
|
for (i=0; i<ptNum-1; i++)
|
|
|
{
|
|
|
|
|
|
CalculateTwoPtsDistanceAzimuth(_dis, _angle, pts[i].dX, pts[i].dY, pts[i+1].dX, pts[i+1].dY, 3);
|
|
|
|
|
|
dist_total += _dis;
|
|
|
|
|
|
CString str = _T("");
|
|
|
if(i==0)
|
|
|
{
|
|
|
if ( dist_total < 1000)
|
|
|
{
|
|
|
str.Format(_T("%dm;%.1f°"), int(dist_total), _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if(_dis<1000)
|
|
|
{
|
|
|
str.Format(_T("%.2fkm;%.1f°"), dist_total*0.001, _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
str.Format(_T("%.2fkm;%.1f°"), dist_total*0.001,_angle);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if ( dist_total < 1000)
|
|
|
{
|
|
|
str.Format(_T("%dm(+%dm);%.1f°"), int(dist_total), int(_dis), _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if(_dis<1000)
|
|
|
{
|
|
|
str.Format(_T("%.2fkm(+%.dm);%.1f°"), dist_total*0.001, int(_dis), _angle);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
str.Format(_T("%.2fkm(+%.2fkm);%.1f°"), dist_total*0.001,_dis*0.001,_angle);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//根据与目标之间的相对位置关系进行文字标注
|
|
|
double textLon = 0;
|
|
|
double textLat = 0;
|
|
|
|
|
|
//计算标注点坐标
|
|
|
TargetPos2LabelPos(textLon, textLat, (pts[i].dX + pts[i+1].dX)/2, (pts[i].dY + pts[i+1].dY)/2);
|
|
|
|
|
|
CLabels drawLabels = m_map.GetDrawingLabels(drawLayerID);
|
|
|
CLabelCategory labelCategory = drawLabels.AddCategory(_T("totaldist"));
|
|
|
labelCategory.SetFontName(_T("黑体"));
|
|
|
labelCategory.SetFontColor(RGB(220,220,220));
|
|
|
labelCategory.SetFontBold(true);
|
|
|
labelCategory.SetFontSize(12);
|
|
|
labelCategory.SetOffsetX(10);
|
|
|
labelCategory.SetFrameTransparency(150);
|
|
|
labelCategory.SetFrameVisible(true);
|
|
|
labelCategory.SetFrameBackColor(RGB(50,50,50));
|
|
|
labelCategory.SetFrameOutlineColor(RGB(50,50,50));
|
|
|
|
|
|
drawLabels.AddLabel(str,textLon,textLat,_angle-90,0);
|
|
|
//重绘
|
|
|
m_map.Redraw();
|
|
|
//m_map.DrawLabelEx(drawLayerID,str,textLon,textLat,_angle);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//清除多点测量
|
|
|
void CGISDlg::ClearPloylineMeasure()
|
|
|
{
|
|
|
m_map.RemoveLayer(m_polylineMeasureLineLayerID);
|
|
|
m_map.RemoveLayer(m_polylineMeasurePtLayerID[0]);
|
|
|
m_map.RemoveLayer(m_polylineMeasurePtLayerID[1]);
|
|
|
m_map.ClearDrawing(m_polylineMeasureLabelLayerID);
|
|
|
m_map.ClearDrawing(m_tempLayerID);
|
|
|
|
|
|
m_polylineMeasureLineLayerID = -1;
|
|
|
m_polylineMeasureLabelLayerID = -1;
|
|
|
m_polylineMeasurePtLayerID[0] = -1;
|
|
|
m_polylineMeasurePtLayerID[1] = -1;
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
//功能:关闭显示经度、纬度的软件界面
|
|
|
LRESULT CGISDlg::OnCloseLonLatDialog(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
OnShowLonLatInfo();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:关闭显示2点之间的经纬度坐标的软件界面
|
|
|
LRESULT CGISDlg::OnCloseShowDistanceDialog(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
OnSurvey();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:进行航线设计,弹出航线数据对话框
|
|
|
void CGISDlg::OnFlyLineDesign()
|
|
|
{
|
|
|
m_tempLayerID = -1;
|
|
|
m_designLineLayerID = -1;
|
|
|
m_designLineLayerID2 = -1;
|
|
|
|
|
|
//return;
|
|
|
//已经加载地图
|
|
|
if (m_bHaveAddMap)
|
|
|
{
|
|
|
//已经处于航线设计状态时,返回
|
|
|
if (m_bLineDesign)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_bLineDesign = true;
|
|
|
|
|
|
//设计第一个航点
|
|
|
m_bDesignFirstPoint = true;
|
|
|
}
|
|
|
|
|
|
//清除现有的航线数据
|
|
|
m_pFlyLineDesign->ClearCurrentData();
|
|
|
|
|
|
//显示航线设计对话框
|
|
|
//m_pFlyLineDesign->ShowWindow(SW_SHOW);
|
|
|
|
|
|
|
|
|
|
|
|
//显示软件
|
|
|
//m_pLineSectDlg->ShowWindow(SW_SHOW);
|
|
|
|
|
|
//设置鼠标为“选择”样式
|
|
|
m_map.SetCursorMode(3);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
AfxMessageBox(_T("请先加载地图数据!"));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:设置GIS的显示区域
|
|
|
void CGISDlg::SetGISWindowArea(const CRect gisArea)//传进来的区域为GIS对话框的屏幕坐标区域
|
|
|
{
|
|
|
//在整个全屏幕中的GIS显示区域
|
|
|
m_rcGISArea = gisArea;
|
|
|
}
|
|
|
|
|
|
//功能:显示GIS对话框区域
|
|
|
void ShowDlg(const CRect rc, CWnd* pParent)
|
|
|
{
|
|
|
//pParent->Create(IDD_DIALOG1,pParent);
|
|
|
|
|
|
}
|
|
|
//功能:计算用于标绘无人机的18个点坐标
|
|
|
void CGISDlg::CalculateUAVPolygonCoordinate(const double dX, const double dY, const double yaw)
|
|
|
{
|
|
|
double pixelX = 0;
|
|
|
double pixelY = 0;
|
|
|
|
|
|
m_map.ProjToPixel(dX, dY, &pixelX, &pixelY);
|
|
|
|
|
|
// 画飞机
|
|
|
//采用磁航向角
|
|
|
double sinang = sin(yaw * DEG2RAD);
|
|
|
double cosang = cos(yaw * DEG2RAD);
|
|
|
|
|
|
//旋转后的像素坐标
|
|
|
double rotatePixelX = 0;
|
|
|
double rotatePixelY = 0;
|
|
|
|
|
|
//计算经过坐标旋转和平移后的无人机坐标
|
|
|
for(int k=0; k<m_ptNum; k++) //共18个航点
|
|
|
{
|
|
|
rotatePixelX = pixelX + (m_ptPlane[k].x * cosang - m_ptPlane[k].y * sinang); //X方向像素坐标
|
|
|
rotatePixelY = pixelY + (m_ptPlane[k].x * sinang + m_ptPlane[k].y * cosang); //Y方向像素坐标
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(rotatePixelX, rotatePixelY, &m_ppUavPtArray[k][0], &m_ppUavPtArray[k][1]);
|
|
|
}
|
|
|
}
|
|
|
void CGISDlg::CalculateUAVPolygonCoordinate_ADS(const double dX, const double dY, const double yaw)
|
|
|
{
|
|
|
double pixelX = 0;
|
|
|
double pixelY = 0;
|
|
|
|
|
|
m_map.ProjToPixel(dX, dY, &pixelX, &pixelY);
|
|
|
|
|
|
// 画飞机
|
|
|
//采用磁航向角
|
|
|
double sinang = sin(yaw * DEG2RAD);
|
|
|
double cosang = cos(yaw * DEG2RAD);
|
|
|
|
|
|
//旋转后的像素坐标
|
|
|
double rotatePixelX = 0;
|
|
|
double rotatePixelY = 0;
|
|
|
|
|
|
//计算经过坐标旋转和平移后的无人机坐标
|
|
|
for(int k=0; k<m_ptNum; k++) //共18个航点
|
|
|
{
|
|
|
rotatePixelX = pixelX + (m_ptPlane_ADS[k].x * cosang - m_ptPlane_ADS[k].y * sinang); //X方向像素坐标
|
|
|
rotatePixelY = pixelY + (m_ptPlane_ADS[k].x * sinang + m_ptPlane_ADS[k].y * cosang); //Y方向像素坐标
|
|
|
|
|
|
//像素坐标转经纬度坐标
|
|
|
m_map.PixelToProj(rotatePixelX, rotatePixelY, &m_ppUavPtArray_ADS[k][0], &m_ppUavPtArray_ADS[k][1]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//功能:接收到航线设计对话框退出消息,进行处理
|
|
|
LRESULT CGISDlg::OnCloseLineDesignDialog(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//航线设计标识为FALSE
|
|
|
m_bLineDesign = false;
|
|
|
|
|
|
//清除与航线设计相关的标注数据
|
|
|
RemoveDesignLineData();
|
|
|
|
|
|
//隐藏航线设计时,显示航段数据的对话框
|
|
|
m_pLineSectDlg->ShowWindow(SW_HIDE);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//功能:删除航线设计的数据,包括航线数据和航线标绘数据
|
|
|
void CGISDlg::RemoveDesignLineData()
|
|
|
{
|
|
|
//设计的航点个数大于0时
|
|
|
if (m_designLinePointNum > 0)
|
|
|
{
|
|
|
m_designLinePointNum = 0;
|
|
|
|
|
|
//清除航线设计时产生的标绘信息
|
|
|
ClearDrawingInLineDesign();
|
|
|
//m_map.RedrawWindow(m_designLineLayerID2);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//功能:清除航线设计时标绘的数据
|
|
|
void CGISDlg::ClearDrawingInLineDesign()
|
|
|
{
|
|
|
/////////////清除标绘数据/////////////
|
|
|
|
|
|
//删除已经标绘的直线
|
|
|
m_map.ClearDrawing(m_tempLayerID);
|
|
|
m_map.ClearDrawing(m_designLineLayerID);
|
|
|
if (m_designLineLayerID2 != -1)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_designLineLayerID2);
|
|
|
m_designLineLayerID2 = -1;
|
|
|
}
|
|
|
//m_map.ClearLabels(m_designLineLayerID);
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::MouseWheel(short zDelta)
|
|
|
{
|
|
|
m_bSetPointModel=FALSE;
|
|
|
|
|
|
|
|
|
//m_bHaveShowLineDesign = TRUE;
|
|
|
|
|
|
//m_bLDSetPoint = FALSE;
|
|
|
//m_bLineDesign=FALSE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
if (m_bHaveAddMap)
|
|
|
{
|
|
|
//滚轮放大、缩小
|
|
|
m_map.ZoomIn(0.0005 * zDelta);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//功能:增加目标点,在地图显示区标绘出来
|
|
|
//输入:目标点号nPt,经度dX,纬度dY
|
|
|
void CGISDlg::AddTargetPoint(const int nPt, const double dX, const double dY)
|
|
|
{
|
|
|
//没有加载地图
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
CString str;
|
|
|
str.Format(_T("Target%d"), nPt);
|
|
|
|
|
|
//字体标绘颜色
|
|
|
CString strColor = _T("绿色");
|
|
|
|
|
|
//基于点图层进行标注
|
|
|
AddPointShapeLayer(m_targetDrawLayerID, dX, dY, str, strColor, RGB(0,255,0));
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:在矢量图层中动态标绘出无人机
|
|
|
//输入:经度dX,纬度dY,航向角yaw
|
|
|
//说明:创建专门用于绘制无人机的矢量面图层,每次先删除上次标绘的Shp,再重新标绘
|
|
|
void CGISDlg::DrawUAV(int uavid, const double dX, const double dY, const double yaw,bool control)
|
|
|
{
|
|
|
if (uavid<0||uavid>2)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
//2017.03 by ZCW
|
|
|
/*
|
|
|
//第一次标绘航迹,新建标绘图层
|
|
|
if (!m_bFirstDrawUAVTrack)
|
|
|
{
|
|
|
//创建无人机轨迹线标绘图层
|
|
|
CreateEmptyShapfile(m_flyTrackLayerID, 1, RGB(255,0,0));
|
|
|
|
|
|
//创建无人机机体标绘图层
|
|
|
CreateEmptyShapfile(m_UAVFlyTrackLayerID, 2, RGB(255,0,0));
|
|
|
|
|
|
m_bFirstDrawUAVTrack = true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//清除标绘无人机的轨迹
|
|
|
m_map.RemoveLayer(m_UAVFlyTrackLayerID);
|
|
|
|
|
|
//创建无人机机体标绘图层
|
|
|
CreateEmptyShapfile(m_UAVFlyTrackLayerID, 2, RGB(255,0,0));
|
|
|
}
|
|
|
|
|
|
//增加无人机轨迹点
|
|
|
AddOnePoint2Shapfile(m_flyTrackLayerID, 1, dX, dY);
|
|
|
|
|
|
//计算标绘无人机面图层的点数组
|
|
|
CalculateUAVPolygonCoordinate(dX, dY, yaw);
|
|
|
|
|
|
// AddUAVPoints2Polygon(m_UAVFlyTrackLayerID);
|
|
|
|
|
|
//绘制新的无人机shp
|
|
|
for (int i=0; i<m_ptNum; i++)
|
|
|
{
|
|
|
AddOnePoint2Shapfile(m_UAVFlyTrackLayerID, 2, m_ppUavPtArray[i][0], m_ppUavPtArray[i][1]);
|
|
|
}
|
|
|
*/
|
|
|
|
|
|
COLORREF color = RGB(255,255,0);
|
|
|
if (control)
|
|
|
{
|
|
|
color = RGB(255,0,0);
|
|
|
}
|
|
|
|
|
|
//第一次标绘航迹,新建标绘图层
|
|
|
if (!m_bFirstDrawUAVTrack[uavid])
|
|
|
{
|
|
|
//创建无人机轨迹线标绘图层
|
|
|
CreateEmptyShapfile(m_flyTrackLayerID[uavid], 1,color);
|
|
|
|
|
|
//创建无人机机体标绘图层
|
|
|
CreateEmptyShapfile(m_UAVFlyTrackLayerID[uavid], 2, color);
|
|
|
|
|
|
m_bFirstDrawUAVTrack[uavid] = true;
|
|
|
}
|
|
|
//增加无人机轨迹点
|
|
|
AddOnePoint2Shapfile(m_flyTrackLayerID[uavid], 1, dX, dY);
|
|
|
|
|
|
//计算标绘无人机面图层的点数组
|
|
|
CalculateUAVPolygonCoordinate(dX, dY, yaw);
|
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
//删除所有的shp图层
|
|
|
for (i=0; i<m_ptNum; i++)
|
|
|
{
|
|
|
(m_map.GetShapefile(m_UAVFlyTrackLayerID[uavid])).EditDeleteShape(i);
|
|
|
}
|
|
|
//(m_map.GetShapefile(m_UAVFlyTrackLayerID2)).EditClear();
|
|
|
//绘制新的无人机shp
|
|
|
for (i=0; i<m_ptNum; i++)
|
|
|
{
|
|
|
AddOnePoint2Shapfile(m_UAVFlyTrackLayerID[uavid], 2, m_ppUavPtArray[i][0], m_ppUavPtArray[i][1]);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void CGISDlg::DrawUAV_ADS(const int uavNum, const int uavid, const double lon, const double lat, const double yaw, const bool control, const CString strPlaneName)
|
|
|
{
|
|
|
m_bWithin100km_ADS[uavid] = control; //是否在100km内
|
|
|
|
|
|
m_dLon_ADS[uavid] = lon;
|
|
|
m_dLat_ADS[uavid] = lat;
|
|
|
m_dYaw_ADS[uavid] = yaw;
|
|
|
|
|
|
m_strPlaneName_ADS[uavid] = strPlaneName;
|
|
|
|
|
|
m_iTotalADSnum = uavNum;
|
|
|
}
|
|
|
|
|
|
//功能;刷新出标绘的航迹
|
|
|
//说明:目标点名称标注位置与其目标点位置存在Y方向的偏差,当鼠标放大、缩小操作时,标注与目标点位置重新吻合
|
|
|
void CGISDlg::OnRefreshInfo()
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:打印输出,将地图显示区及其标注信息输出到bmp文件中
|
|
|
void CGISDlg::OnPrint()
|
|
|
{
|
|
|
CRect rc;
|
|
|
GetClientRect(&rc);
|
|
|
//m_map.MoveWindow(0,0,rc.Width(),rc.Height(),1);
|
|
|
|
|
|
|
|
|
CRect rcGISCopyArea = m_gisAreaInScreen;
|
|
|
rcGISCopyArea.top += m_toolbarHeight;
|
|
|
|
|
|
CScreenCapture capture;
|
|
|
|
|
|
capture.ScreenGISArea(rcGISCopyArea);
|
|
|
}
|
|
|
void CGISDlg::OnShowCtrlMenu()
|
|
|
{
|
|
|
/*if (!m_bLineDesign)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (m_bLineDesign) */ //航线编辑时,停止编辑
|
|
|
{
|
|
|
if (m_map.GetCursorMode() != mapWindow::tkCursorMode::cmNone)
|
|
|
{
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
}
|
|
|
|
|
|
//TRACE(_T("航点设计\n"));
|
|
|
////新增航点属性编辑
|
|
|
//int iSel=GetPtSel(m_LBtnDownX,m_LBtnDownY);
|
|
|
//if (iSel!=-1)
|
|
|
//{
|
|
|
// double dPointX, dPointY;
|
|
|
// //像素坐标转换地理坐标
|
|
|
// m_map.PixelToProj(m_LBtnDownX, m_LBtnDownY, &dPointX, &dPointY);
|
|
|
|
|
|
// //设置点的经度、纬度
|
|
|
// m_DlgLinePointAttri.SetPtCoordinate(dPointX, dPointY, iSel, m_designLinePointNum, m_pDesignLineStruct);
|
|
|
//}
|
|
|
|
|
|
if (g_b981APad)
|
|
|
{
|
|
|
CMenu tmenu;
|
|
|
tmenu.LoadMenu(IDR_FLOATINGMENU);
|
|
|
POINT pt;
|
|
|
GetCursorPos( &pt );
|
|
|
//弹出快捷菜单
|
|
|
tmenu.GetSubMenu( 0 )->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, this );
|
|
|
}
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnMenuLinePtCtrlShow()
|
|
|
{
|
|
|
//鼠标右键点击时,弹出快捷菜单
|
|
|
if (g_b981APad)
|
|
|
{
|
|
|
OnShowRMenu();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
OnMapSelect();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnZhangCW()
|
|
|
{
|
|
|
int i = 0;
|
|
|
}
|
|
|
|
|
|
BOOL CGISDlg::OnToolTipsNotify(UINT id,NMHDR* pNMHDR,LRESULT* pResult)
|
|
|
{
|
|
|
TOOLTIPTEXT* pT = (TOOLTIPTEXT*)pNMHDR;
|
|
|
UINT nID = pNMHDR->idFrom;
|
|
|
switch (nID)
|
|
|
{
|
|
|
case IDT_BUTTON1:
|
|
|
pT->lpszText = "添加矢量地图";
|
|
|
break;
|
|
|
case IDT_BUTTON2:
|
|
|
pT->lpszText = "添加栅格地图";
|
|
|
break;
|
|
|
case IDT_BUTTON3:
|
|
|
pT->lpszText = "添加航线";
|
|
|
break;
|
|
|
case IDT_BUTTON4:
|
|
|
pT->lpszText = "图层管理";
|
|
|
break;
|
|
|
case IDT_BUTTON5:
|
|
|
pT->lpszText = "删除全部图层";
|
|
|
break;
|
|
|
case IDT_BUTTON6:
|
|
|
pT->lpszText = "地图选择";
|
|
|
break;
|
|
|
case IDT_BUTTON7:
|
|
|
pT->lpszText = "放大";
|
|
|
break;
|
|
|
case IDT_BUTTON8:
|
|
|
pT->lpszText = "缩小";
|
|
|
break;
|
|
|
case IDT_BUTTON9:
|
|
|
pT->lpszText = "漫游";
|
|
|
break;
|
|
|
case IDT_BUTTON10:
|
|
|
pT->lpszText = "全图";
|
|
|
break;
|
|
|
case IDT_BUTTON11:
|
|
|
pT->lpszText = "清除航迹";
|
|
|
break;
|
|
|
case IDT_BUTTON12:
|
|
|
pT->lpszText = "地图定位";
|
|
|
break;
|
|
|
case IDT_BUTTON13:
|
|
|
pT->lpszText = "测量";
|
|
|
break;
|
|
|
case IDT_BUTTON14:
|
|
|
pT->lpszText = "属性";
|
|
|
break;
|
|
|
default:
|
|
|
pT->lpszText ="";
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
//功能:删除给定ID号的目标点
|
|
|
void CGISDlg::DeleteTarget(const int nPt)
|
|
|
{
|
|
|
//判断给定的目标点号是否合法
|
|
|
//if (nPt >= MAX_TARGET_NUM)
|
|
|
//{
|
|
|
// return;
|
|
|
//}
|
|
|
|
|
|
//int i = nPt-1;
|
|
|
|
|
|
////删除所有标注的目标点信息
|
|
|
//if (m_pTargetShapfileID[i] != 0)
|
|
|
//{
|
|
|
// //判断点矢量图层是否已经存在,存在则删除
|
|
|
// ClearPointShape(m_pTargetShapfileID[i]);
|
|
|
// m_pTargetShapfileID[i] = 0;
|
|
|
//}
|
|
|
|
|
|
}
|
|
|
|
|
|
//功能:删除所有目标点
|
|
|
void CGISDlg::DeleteAllTargets()
|
|
|
{
|
|
|
//删除所有标注的目标点信息
|
|
|
//for (int i=0; i<MAX_TARGET_NUM; i++)
|
|
|
//{
|
|
|
// if (m_pTargetShapfileID[i] != 0)
|
|
|
// {
|
|
|
// //判断点矢量图层是否已经存在,存在则删除
|
|
|
// ClearPointShape(m_pTargetShapfileID[i]);
|
|
|
|
|
|
// m_pTargetShapfileID[i] = 0;
|
|
|
// }
|
|
|
//}
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:根据目标点坐标位置计算目标点号标注位置
|
|
|
//输入:目标点位置经度—targetLon,纬度—targetLat
|
|
|
//输出:目标点标注位置经度—labelLon,纬度—labelLat
|
|
|
void CGISDlg::TargetPos2LabelPos(double &labelLon, double &labelLat, const double targetLon, const double targetLat)
|
|
|
{
|
|
|
double textPixelX = 0;
|
|
|
double textPixelY = 0;
|
|
|
|
|
|
//地理坐标转像素坐标
|
|
|
m_map.ProjToPixel(targetLon, targetLat, &textPixelX, &textPixelY);
|
|
|
|
|
|
//y坐标加上偏差量值
|
|
|
textPixelY -= m_labelWarpValue;
|
|
|
|
|
|
//像素坐标转地理坐标
|
|
|
m_map.PixelToProj(textPixelX, textPixelY, &labelLon, &labelLat);
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:在地图显示区标绘目标点
|
|
|
//输入:目标点数据体targetInfo
|
|
|
// 标绘图层ID号drawLayerID
|
|
|
//输出:标绘图层ID号drawLayerID
|
|
|
void CGISDlg::DrawTarget(long &drawLayerID, const PtStruct targetInfo)
|
|
|
{
|
|
|
//没有加载地图,返回
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//第一次标绘时,创建新的标绘图层
|
|
|
if (drawLayerID == -1)
|
|
|
{
|
|
|
//航迹标绘图层
|
|
|
drawLayerID = m_map.NewDrawing(1);
|
|
|
}
|
|
|
|
|
|
CString str = _T("");
|
|
|
|
|
|
// 显示航线编号
|
|
|
// if (targetInfo.lineID <= 0) //仅显示航点编号
|
|
|
// {
|
|
|
//
|
|
|
|
|
|
str.Format(_T("%d"), targetInfo.nPt);
|
|
|
// }
|
|
|
// else //显示航线和航点编号,以“X-XX”格式进行显示
|
|
|
// {
|
|
|
// str.Format(_T("%d-%d"), targetInfo.lineID,targetInfo.nPt);
|
|
|
// }
|
|
|
|
|
|
//标绘目标点
|
|
|
m_map.DrawPoint(targetInfo.dX, targetInfo.dY, 10, RGB(0,0,255));
|
|
|
|
|
|
/* mapwinGIS 4.9.3中被废弃
|
|
|
//设置标绘字体的颜色
|
|
|
m_map.LabelColor(drawLayerID, RGB(0,255,0));
|
|
|
//设置标绘字体的字号
|
|
|
m_map.LayerFont(drawLayerID, _T("黑体"), 20);
|
|
|
*/
|
|
|
|
|
|
/* mapwinGIS 4.9.3以上写法 */
|
|
|
CLabels labels = m_map.GetDrawingLabels(drawLayerID);
|
|
|
labels.SetFrameVisible(false);
|
|
|
labels.SetFontColor(RGB(0,255,0));
|
|
|
labels.SetFontName(_T("黑体"));
|
|
|
labels.SetFontSize(20);
|
|
|
|
|
|
//根据与目标之间的相对位置关系进行文字标注
|
|
|
double textLon = 0;
|
|
|
double textLat = 0;
|
|
|
|
|
|
//计算标注点坐标
|
|
|
TargetPos2LabelPos(textLon, textLat, targetInfo.dX, targetInfo.dY);
|
|
|
|
|
|
//标注目标点标签数据
|
|
|
TRACE(str);
|
|
|
TRACE("\n");
|
|
|
//m_map.AddLabel(drawLayerID, str, RGB(255,255,0), textLon, textLat, 1);
|
|
|
m_map.DrawLabelEx(drawLayerID, str,textLon, textLat,0);
|
|
|
|
|
|
|
|
|
//重绘str
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:增加航点操作完成后,地图显示区进行航点标注
|
|
|
LRESULT CGISDlg::OnAddLinePoint(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//清除航线设计时的标注信息
|
|
|
ClearDrawingInLineDesign();
|
|
|
|
|
|
m_tempLayerID = -1;
|
|
|
|
|
|
//加入航线数据集合中
|
|
|
m_pDesignLineStruct[m_designLinePointNum] = m_curDesignPoint;
|
|
|
|
|
|
//航点编号计数器增加1
|
|
|
//m_designLinePointNum++;
|
|
|
|
|
|
//标绘出设计的航点数据
|
|
|
DrawDesignLineData();
|
|
|
|
|
|
//鼠标移动时,画直线
|
|
|
m_beTemLayerDrawing = true;
|
|
|
|
|
|
//是否已经增加新的航点
|
|
|
m_bAddNewPoint = true;
|
|
|
|
|
|
//航段显示区输入数据,标识已完成一个航段的设计
|
|
|
m_pLineSectDlg->SetLineSectStatus();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//功能:标绘设计的航线数据,包括航点及其标注、航线数据
|
|
|
void CGISDlg::DrawDesignLineData()
|
|
|
{
|
|
|
|
|
|
//新建标绘层
|
|
|
if (m_designLineLayerID2!=-1)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_designLineLayerID2);
|
|
|
m_designLineLayerID2 = -1;
|
|
|
}
|
|
|
|
|
|
|
|
|
m_map.ClearDrawing(m_designLineLayerID);
|
|
|
m_designLineLayerID = m_map.NewDrawing(1);
|
|
|
long index = m_map.GetLayerPosition(m_designLineLayerID);
|
|
|
//BOOL b= m_map.MoveLayerUp(index);
|
|
|
int i = 0;
|
|
|
|
|
|
//绘制航点及其标注
|
|
|
for (i=0; i<m_designLinePointNum; i++)
|
|
|
{
|
|
|
DrawTarget(m_designLineLayerID, m_pDesignLineStruct[i]);
|
|
|
|
|
|
}
|
|
|
if (m_designLinePointNum>1)
|
|
|
{
|
|
|
CreateEmptyShapfile(m_designLineLayerID2,1,RGB(0,255,0));
|
|
|
AddPoints2Shapfile(m_designLineLayerID2,1,m_pDesignLineStruct,m_designLinePointNum);
|
|
|
DrawDistLebel(m_designLineLayerID,m_pDesignLineStruct,m_designLinePointNum);
|
|
|
}
|
|
|
|
|
|
//绘制航点之间的连线
|
|
|
/*for (i=0; i<m_designLinePointNum-1; i++)
|
|
|
{
|
|
|
m_map.DrawLineEx(m_designLineLayerID,m_pDesignLineStruct[i].dX, m_pDesignLineStruct[i].dY,
|
|
|
m_pDesignLineStruct[i+1].dX, m_pDesignLineStruct[i+1].dY, 2, RGB(0,255,0));
|
|
|
}*/
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:编辑航点,加入后,地图显示区进行航点标注
|
|
|
LRESULT CGISDlg::OnEditLinePoint(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//更新航点数据
|
|
|
PtStruct ptEdit;
|
|
|
memcpy(&ptEdit, (PtStruct *)wParam, sizeof(PtStruct));
|
|
|
|
|
|
if (lParam == 0) //航点数据编辑
|
|
|
{
|
|
|
//鼠标移动时,画直线
|
|
|
m_beTemLayerDrawing = true;
|
|
|
}
|
|
|
else if (lParam == 1) //航点编辑模式
|
|
|
{
|
|
|
//鼠标移动时,画直线
|
|
|
m_beTemLayerDrawing = false;
|
|
|
}
|
|
|
|
|
|
//航点数据更新
|
|
|
m_pDesignLineStruct[ptEdit.nPt-1] = ptEdit;
|
|
|
|
|
|
//清除航线设计时的标注信息
|
|
|
ClearDrawingInLineDesign();
|
|
|
|
|
|
//标绘出设计的航点数据
|
|
|
DrawDesignLineData();
|
|
|
|
|
|
//当前待编辑的航点数据
|
|
|
memcpy(&m_curEditLinePoint, &ptEdit, sizeof(PtStruct));
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:删除航点,加入后,地图显示区进行航点标注
|
|
|
LRESULT CGISDlg::OnDeleteLinePoint(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//删除点的点号
|
|
|
int deletePtID = (int)wParam;
|
|
|
|
|
|
if ((deletePtID > (m_designLinePointNum-1)) || (deletePtID<0))
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//根据删除点的点号,更新航点数据集合
|
|
|
for (int i=deletePtID; i<m_designLinePointNum-1; i++)
|
|
|
{
|
|
|
m_pDesignLineStruct[i] = m_pDesignLineStruct[i+1];
|
|
|
m_pDesignLineStruct[i].nPt --;
|
|
|
}
|
|
|
|
|
|
//总的航点个数减去1
|
|
|
m_designLinePointNum --;
|
|
|
|
|
|
//清除航线设计时的标注信息
|
|
|
ClearDrawingInLineDesign();
|
|
|
|
|
|
//标绘出设计的航点数据
|
|
|
DrawDesignLineData();
|
|
|
|
|
|
//鼠标移动时,画直线
|
|
|
m_beTemLayerDrawing = true;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:保存航线,加入后,地图显示区进行航点标注
|
|
|
LRESULT CGISDlg::OnSaveLinePoints(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//航线设计标识为FALSE
|
|
|
m_bLineDesign = false;
|
|
|
|
|
|
//清除与航线设计相关的标注数据
|
|
|
RemoveDesignLineData();
|
|
|
|
|
|
//隐藏航线设计时,显示航段数据的对话框
|
|
|
m_pLineSectDlg->ShowWindow(SW_HIDE);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//功能:创建空的shpfile图层
|
|
|
//输入:矢量图层类型shpType(0为—点图层;1为线图层;2为面图层)
|
|
|
//输入:绘制颜色drawColor
|
|
|
//输出:矢量图层ID号shpLayerID,
|
|
|
void CGISDlg::CreateEmptyShapfile(long &shpLayerID, const int shpType, const unsigned long drawColor)
|
|
|
{
|
|
|
long fieldIndex = 0;
|
|
|
|
|
|
//目标标绘SHP图层
|
|
|
mapWindow::IShapefilePtr targetPtShape;
|
|
|
targetPtShape.CreateInstance("MapWinGIS.Shapefile");
|
|
|
|
|
|
//创建空的图层
|
|
|
if (shpType == 0) //点图层
|
|
|
{
|
|
|
targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::SHP_POINT);
|
|
|
}
|
|
|
else if (shpType == 1) //线图层
|
|
|
{
|
|
|
targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::SHP_POLYLINE);
|
|
|
}
|
|
|
else if (shpType == 2) //面图层
|
|
|
{
|
|
|
targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::SHP_POLYGON);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
shpLayerID = -1;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//增加field表单1
|
|
|
mapWindow::IFieldPtr fieldPtr1;
|
|
|
fieldPtr1.CreateInstance("MapWinGIS.Field");
|
|
|
|
|
|
fieldPtr1->Key = (_bstr_t)("X");
|
|
|
fieldPtr1->Type = mapWindow::DOUBLE_FIELD;
|
|
|
targetPtShape->EditInsertField(fieldPtr1, &fieldIndex, NULL);
|
|
|
|
|
|
//增加field表单2
|
|
|
mapWindow::IFieldPtr fieldPtr2;
|
|
|
fieldPtr2.CreateInstance("MapWinGIS.Field");
|
|
|
|
|
|
fieldPtr2->Key = (_bstr_t)("Y");
|
|
|
fieldPtr2->Type = mapWindow::DOUBLE_FIELD;
|
|
|
targetPtShape->EditInsertField(fieldPtr2, &fieldIndex, NULL);
|
|
|
|
|
|
//目标标绘图层加入地图中
|
|
|
shpLayerID = m_map.AddLayer(targetPtShape, true);
|
|
|
|
|
|
mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption;
|
|
|
pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions");
|
|
|
|
|
|
if (shpType == 0) //点图层
|
|
|
{
|
|
|
pShapeDrawingOption->FillColor = drawColor;
|
|
|
pShapeDrawingOption->PointSize = 20;
|
|
|
//pShapeDrawingOption->SetDefaultPointSymbol(mapWindow::tkDefaultPointSymbol::dpsDiamond);
|
|
|
//pShapeDrawingOption->PutFillColor(drawColor);
|
|
|
//pShapeDrawingOption->PutPointSize(18);
|
|
|
pShapeDrawingOption->PutPointType(mapWindow::tkPointSymbolType::ptSymbolStandard);
|
|
|
pShapeDrawingOption->PutPointShape(mapWindow::tkPointShapeType::ptShapeStar);
|
|
|
|
|
|
//m_map.SetShapeLayerPointType(shpLayerID, mapWindow::ptDiamond);
|
|
|
//m_map.SetShapeLayerStippleColor(shpLayerID, drawColor);
|
|
|
}
|
|
|
else if (shpType == 1) //线图层
|
|
|
{
|
|
|
pShapeDrawingOption->LineColor = drawColor;
|
|
|
pShapeDrawingOption->LineWidth = 2;
|
|
|
}
|
|
|
else if (shpType == 2) //面图层
|
|
|
{
|
|
|
pShapeDrawingOption->FillColor = drawColor;
|
|
|
}
|
|
|
|
|
|
(m_map.GetShapefile(shpLayerID)).SetDefaultDrawingOptions(pShapeDrawingOption);
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:向shpfile点图层中增加航点数据
|
|
|
//输入:矢量图层ID号shpLayerID
|
|
|
// 航点数据集合pts,航点个数ptNum
|
|
|
void CGISDlg::AddPoints2PointShapfile(const long shpLayerID, const PtStruct *pts, const int ptNum)
|
|
|
{
|
|
|
for (long i=0; i<ptNum; i++)
|
|
|
{
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
|
|
|
shapePtr->Create(mapWindow::SHP_POINT);
|
|
|
|
|
|
|
|
|
//经度
|
|
|
pintPtr->x = pts[i].dX;
|
|
|
|
|
|
//纬度
|
|
|
pintPtr->y = pts[i].dY;
|
|
|
|
|
|
shapePtr->InsertPoint(pintPtr, &i);
|
|
|
|
|
|
|
|
|
//插入面矢量
|
|
|
(m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &i);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:向shpfile线图层中增加航点数据
|
|
|
//输入:矢量图层ID号shpLayerID
|
|
|
// 航点数据集合pts,航点个数ptNum
|
|
|
void CGISDlg::AddPoints2LineShapfile(const long shpLayerID, const PtStruct *pts, const int ptNum)
|
|
|
{
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
|
|
|
//创建线矢量shapfile
|
|
|
shapePtr->Create(mapWindow::SHP_POLYLINE);
|
|
|
|
|
|
long i = 0;
|
|
|
|
|
|
for (i=0; i<ptNum; i++)
|
|
|
{
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
|
|
|
//经度
|
|
|
pintPtr->x = pts[i].dX;
|
|
|
|
|
|
//纬度
|
|
|
pintPtr->y = pts[i].dY;
|
|
|
|
|
|
shapePtr->InsertPoint(pintPtr, &i);
|
|
|
}
|
|
|
|
|
|
//插入线图层矢量
|
|
|
(m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &i);
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:向shpfile图层中增加航点数据
|
|
|
//输入:矢量图层ID号shpLayerID,矢量图层类型shpType(0为—点图层;1为线图层;2为面图层)
|
|
|
// 航点数据集合pts,航点个数ptNum
|
|
|
void CGISDlg::AddPoints2Shapfile(const long shpLayerID, const int shpType, const PtStruct *pts, const int ptNum)
|
|
|
{
|
|
|
long i = 0;
|
|
|
|
|
|
//向点图层中加入航点数据
|
|
|
if (shpType == 0) //点图层
|
|
|
{
|
|
|
for (i=0; i<ptNum; i++)
|
|
|
{
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
|
|
|
shapePtr->Create(mapWindow::SHP_POINT);
|
|
|
|
|
|
//经度
|
|
|
pintPtr->x = pts[i].dX;
|
|
|
|
|
|
//纬度
|
|
|
pintPtr->y = pts[i].dY;
|
|
|
|
|
|
shapePtr->InsertPoint(pintPtr, &i);
|
|
|
|
|
|
//插入面矢量
|
|
|
(m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &i);
|
|
|
}
|
|
|
}
|
|
|
else if ((shpType == 1) || (shpType == 2)) //线图层和面图层
|
|
|
{
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
|
|
|
//创建shp
|
|
|
if (shpType == 1) //线矢量
|
|
|
{
|
|
|
shapePtr->Create(mapWindow::SHP_POLYLINE);
|
|
|
}
|
|
|
else //面矢量
|
|
|
{
|
|
|
shapePtr->Create(mapWindow::SHP_POLYGON);
|
|
|
}
|
|
|
|
|
|
for (i=0; i<ptNum; i++)
|
|
|
{
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
|
|
|
//经度
|
|
|
pintPtr->x = pts[i].dX;
|
|
|
|
|
|
//纬度
|
|
|
pintPtr->y = pts[i].dY;
|
|
|
|
|
|
shapePtr->InsertPoint(pintPtr, &i);
|
|
|
}
|
|
|
|
|
|
//插入面矢量
|
|
|
(m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &i);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:基于shpfile面图层标绘方法绘制UAV
|
|
|
void CGISDlg::AddUAVPoints2Polygon(const long shpLayerID)
|
|
|
{
|
|
|
//创建面图层
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
shapePtr->Create(mapWindow::SHP_POLYGON);
|
|
|
|
|
|
long shpNum = 0;
|
|
|
|
|
|
for (int i=0; i<18; i++)
|
|
|
{
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
|
|
|
//经度
|
|
|
pintPtr->x = m_ppUavPtArray[i][0];
|
|
|
|
|
|
//纬度
|
|
|
pintPtr->y = m_ppUavPtArray[i][1];
|
|
|
|
|
|
//向当前shp中插入一个航点数据
|
|
|
shapePtr->InsertPoint(pintPtr, &shpNum);
|
|
|
}
|
|
|
|
|
|
shpNum = 0;
|
|
|
|
|
|
(m_map.GetShapefile(shpLayerID)).EditClear();
|
|
|
|
|
|
//将shpfile文件中插入shp文件
|
|
|
(m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &shpNum);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:向shpfile图层中增加1个航点数据
|
|
|
//输入:矢量图层ID号shpLayerID,shp类型shpType
|
|
|
// 航点数据,经度—dX; 纬度—dY
|
|
|
void CGISDlg::AddOnePoint2Shapfile(const long shpLayerID, const int shpType, const double dX, const double dY)
|
|
|
{
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
|
|
|
//经度
|
|
|
pintPtr->x = dX;
|
|
|
|
|
|
//纬度
|
|
|
pintPtr->y = dY;
|
|
|
|
|
|
//shpfile文件中的shp图层个数
|
|
|
long shpNum = (m_map.GetShapefile(shpLayerID)).GetNumShapes();
|
|
|
|
|
|
//判断是否已经存在该shp图层,不存在,创建新的shp图层
|
|
|
if (shpNum == 0)
|
|
|
{
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
|
|
|
if (shpType == 0) //点图层
|
|
|
{
|
|
|
shapePtr->Create(mapWindow::SHP_POINT);
|
|
|
}
|
|
|
else if (shpType == 1) //线图层
|
|
|
{
|
|
|
shapePtr->Create(mapWindow::SHP_POLYLINE);
|
|
|
}
|
|
|
else if (shpType == 2) //面图层
|
|
|
{
|
|
|
shapePtr->Create(mapWindow::SHP_POLYGON);
|
|
|
}
|
|
|
|
|
|
//向当前shp中插入一个航点数据
|
|
|
shapePtr->InsertPoint(pintPtr, &shpNum);
|
|
|
|
|
|
//将shpfile文件中插入shp文件
|
|
|
(m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &shpNum);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//获得当前的shp
|
|
|
CShape shape = (m_map.GetShapefile(shpLayerID)).GetShape(shpNum-1);
|
|
|
|
|
|
//当前的航点个数
|
|
|
long curLinePts = shape.GetNumPoints();
|
|
|
|
|
|
//向当前shp中插入一个航点数据
|
|
|
shape.InsertPoint(pintPtr, &curLinePts);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:在地图显示区标绘出装订的飞行航线数据
|
|
|
//输入:航线数据体集合linePtArray,航线的航点个数ptNum
|
|
|
//说明:地图显示器已经标绘了该航线,则清除标绘,重新标绘航线
|
|
|
void CGISDlg::DrawBindingLine(const PtStruct *linePtArray, const int ptNum)
|
|
|
{
|
|
|
if (ptNum == 0 )
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//航线数据集合
|
|
|
DrawLineDataStruct lineDataArr;
|
|
|
|
|
|
//航点数据体转标绘的航线数据集合
|
|
|
m_lineManage.LinePoint2DrawLinePoints(lineDataArr, linePtArray, ptNum);
|
|
|
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(lineDataArr.lineID-1);
|
|
|
|
|
|
//拷贝数据到航线集合中
|
|
|
m_pFlyLines[lineDataArr.lineID-1] = lineDataArr;
|
|
|
|
|
|
//地图标绘出航线
|
|
|
//DrawFlyLine(m_pFlyLines[lineDataArr.lineID-1]);
|
|
|
DrawFlyLine(lineDataArr);
|
|
|
|
|
|
}
|
|
|
|
|
|
//功能:标绘飞行航线
|
|
|
//输入:航线数据lineData
|
|
|
void CGISDlg::DrawFlyLine(const DrawLineDataStruct lineData)
|
|
|
{
|
|
|
//field索引值
|
|
|
long fieldIndex = 0;
|
|
|
|
|
|
//航线索引号
|
|
|
int lineID = lineData.lineID-1;
|
|
|
|
|
|
//没有目标标绘SHP图层,创建该图层
|
|
|
if (!m_pHaveDrawLineFlag[lineID])
|
|
|
{
|
|
|
//创建点图层
|
|
|
CreateEmptyShapfile(m_ppPlanLineShpLayerIDArr[lineID][0], 0, /*RGB(0,255,0)*/LineClr[lineID]);
|
|
|
|
|
|
//创建线图层
|
|
|
CreateEmptyShapfile(m_ppPlanLineShpLayerIDArr[lineID][1], 1, /*RGB(0,255,0)*/LineClr[lineID]);
|
|
|
|
|
|
//创建线图层成功
|
|
|
m_pHaveDrawLineFlag[lineID] = true;
|
|
|
}
|
|
|
|
|
|
//向点图层加入航点数据
|
|
|
AddPoints2PointShapfile(m_ppPlanLineShpLayerIDArr[lineID][0], lineData.pts, lineData.pointNum);
|
|
|
|
|
|
|
|
|
//向线图层加入航点数据
|
|
|
AddPoints2LineShapfile(m_ppPlanLineShpLayerIDArr[lineID][1], lineData.linePts, lineData.linePointNum);
|
|
|
|
|
|
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
|
|
|
|
|
|
//Label集合
|
|
|
CLabels labesPtr;
|
|
|
labesPtr = (m_map.GetShapefile(m_ppPlanLineShpLayerIDArr[lineID][0])).GetLabels();
|
|
|
|
|
|
//CLabelCategory labelCategory = labesPtr.AddCategory(_T("红色"));
|
|
|
//labelCategory.SetFontColor(/*RGB(255,0,0)*/LineClr[lineID]);
|
|
|
//labelCategory.SetAlignment(1);
|
|
|
//labelCategory.SetFontBold(TRUE);
|
|
|
//labelCategory.SetFontName(LPCTSTR("黑体"));
|
|
|
//labelCategory.SetFontSize(12);
|
|
|
//labesPtr.SetAvoidCollisions(FALSE);
|
|
|
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("自主着陆点") /*lineData.lineID, */ /*lineData.pts[i].nPt*/);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
strText.Format(_T("%d-%d"), lineData.lineID, lineData.pts[i].nPt);
|
|
|
}
|
|
|
|
|
|
//增加Labels
|
|
|
labesPtr.AddLabel((LPCTSTR)strText, lineData.pts[i].dX, lineData.pts[i].dY, 0, 0);
|
|
|
}
|
|
|
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
|
|
|
|
|
|
//重新绘制
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:根据地图控件的显示分辨率移动地图控件
|
|
|
//说明:根据显示分辨率和设计分辨率之间的几何关系
|
|
|
//输入:制定显示的区域moveToArea
|
|
|
void CGISDlg::MoveGISShowWindow(const CRect moveToArea)
|
|
|
{
|
|
|
CRect gisRect;
|
|
|
|
|
|
//X方向分辨率
|
|
|
double cx = 1.0*moveToArea.Width()/m_rcDesignGISWindow.Width();
|
|
|
|
|
|
//Y方向分辨率
|
|
|
double cy = 1.0*moveToArea.Height()/m_rcDesignGISWindow.Height();
|
|
|
|
|
|
gisRect.left = static_cast<int>(m_rcDesignGISWindow.left*cx);
|
|
|
gisRect.top = static_cast<int>(m_rcDesignGISWindow.top*cy);
|
|
|
|
|
|
gisRect.right = moveToArea.right;
|
|
|
gisRect.bottom = moveToArea.bottom;
|
|
|
|
|
|
//地图显示区宽度、高度倒数
|
|
|
m_onePerWidth = 1.0/gisRect.Width();
|
|
|
m_onePerHeight = 1.0/gisRect.Height();
|
|
|
|
|
|
//地图显示区宽度、高度
|
|
|
m_mapAreaHalfWidth = 0.5*gisRect.Width();
|
|
|
m_mapAreaHalfHeight = 0.5*gisRect.Height();
|
|
|
|
|
|
//地图控件移动到给定区域
|
|
|
GetDlgItem(IDC_MAP1)->MoveWindow(gisRect, TRUE);
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnMouseMove(UINT nFlags, CPoint point)
|
|
|
{
|
|
|
CBCGPDialog::OnMouseMove(nFlags, point);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:创建浮动工具栏
|
|
|
void CGISDlg::CreateFloatToolBar()
|
|
|
{
|
|
|
CBitmap bm;
|
|
|
|
|
|
UINT Resource[14]={IDB_BITMAP_ADD_SHPFILE, IDB_BITMAP_ADD_IMGFILE, IDB_BITMAP_ADD_FLYLINE,
|
|
|
IDB_BITMAP_LAYER_MANAGE, IDB_BITMAP_DELETE_LAYER,
|
|
|
IDB_BITMAP_SELECT, IDB_BITMAP_ZOOMIN, IDB_BITMAP_ZOOMOUT,
|
|
|
IDB_BITMAP_MOVE, IDB_BITMAP_FULLSCREEN, IDB_BITMAP_RULER,
|
|
|
IDB_BITMAP_XY, IDB_BITMAP_SURVEY,
|
|
|
IDB_BITMAP10/*IDB_BITMAP_PRINT*/}; //位图ID数组
|
|
|
|
|
|
|
|
|
m_ImageList.Create(24, 24, ILC_COLOR24|ILC_MASK, 0, 0); //创建Image List
|
|
|
CRect rcToolBar;
|
|
|
|
|
|
/*
|
|
|
rcToolBar.top = m_rcGISArea.top;
|
|
|
rcToolBar.left = m_rcGISArea.right-24;
|
|
|
rcToolBar.bottom = m_rcGISArea.bottom;
|
|
|
rcToolBar.right = m_rcGISArea.right;*/
|
|
|
//m_ToolBar.Create(TBSTYLE_FLAT | CCS_TOP | WS_VISIBLE | /*WS_BORDER |*/ CCS_ADJUSTABLE | TBSTYLE_TOOLTIPS, rcToolBar, this, IDR_TOOLBAR1); //创建Toolbar Control
|
|
|
m_ToolBar.Create(TBSTYLE_FLAT | CCS_TOP | WS_VISIBLE | /*WS_BORDER |*/ TBSTYLE_TOOLTIPS, rcToolBar, this, IDR_TOOLBAR1); //创建Toolbar Control
|
|
|
m_ToolBar.SetBitmapSize(CSize(24, 24));
|
|
|
|
|
|
int buttonItems = 14;
|
|
|
|
|
|
int i;
|
|
|
for(i=0; i<buttonItems; i++)
|
|
|
{
|
|
|
bm.LoadBitmap(Resource[i]);
|
|
|
m_ImageList.Add(&bm, (CBitmap *)NULL);
|
|
|
bm.Detach();
|
|
|
}
|
|
|
|
|
|
m_ToolBar.SetImageList(&m_ImageList);
|
|
|
|
|
|
TBBUTTON Buttons[14]; //定义TBBUTTON结构体数组
|
|
|
CString str;
|
|
|
|
|
|
for(i=0; i<buttonItems; i++)
|
|
|
{
|
|
|
str.LoadString(IDT_BUTTON1+i); //IDS_FILE是在String Table中添加的String
|
|
|
// Buttons[i].iString = m_ToolBar.AddStrings(str);
|
|
|
Buttons[i].iString = NULL;
|
|
|
|
|
|
Buttons[i].dwData=0;
|
|
|
Buttons[i].fsState=TBSTATE_ENABLED;
|
|
|
Buttons[i].fsStyle=TBSTYLE_BUTTON;
|
|
|
Buttons[i].iBitmap=i;
|
|
|
Buttons[i].idCommand = IDT_BUTTON1+i; //按钮命令响应
|
|
|
|
|
|
|
|
|
}
|
|
|
m_ToolBar.EnableToolTips(true);//添加工具条上按钮提示功能
|
|
|
|
|
|
m_ToolBar.AddButtons(buttonItems, Buttons);
|
|
|
m_ToolBar.AutoSize();
|
|
|
|
|
|
//m_ToolBar.ShowWindow(SW_HIDE);
|
|
|
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
BOOL CGISDlg::OnToolTipText(UINT,NMHDR* pNMHDR,LRESULT* pResult)
|
|
|
{
|
|
|
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); // UNICODE消息
|
|
|
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; //TCHAR szFullText[512];
|
|
|
CString strTipText;
|
|
|
UINT nID = pNMHDR->idFrom;
|
|
|
|
|
|
if(pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
|
|
|
{// idFrom为工具条的HWND
|
|
|
nID = ::GetDlgCtrlID((HWND)nID);
|
|
|
}
|
|
|
|
|
|
if(nID != 0) //不为分隔符
|
|
|
{ //AfxLoadString(nID, szFullText); //strTipText=szFullText;
|
|
|
strTipText.LoadString(nID);
|
|
|
strTipText = strTipText.Mid(strTipText.Find('\n',0)+1);
|
|
|
|
|
|
#ifndef _UNICODE
|
|
|
if(pNMHDR->code == TTN_NEEDTEXTA)
|
|
|
{
|
|
|
lstrcpyn(pTTTA->szText,strTipText,sizeof(pTTTA->szText));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
|
|
|
}
|
|
|
#else
|
|
|
if(pNMHDR->code == TTN_NEEDTEXTA)
|
|
|
{
|
|
|
_wcstombsz(pTTTA->szText,strTipText,sizeof(pTTTA->szText));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
lstrcpyn(pTTTW->szText,strTipText,sizeof(pTTTW->szText));
|
|
|
}
|
|
|
#endif
|
|
|
*pResult = 0; //使工具条提示窗口在最上面
|
|
|
|
|
|
::SetWindowPos(pNMHDR->hwndFrom,HWND_TOP,0,0,0,0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
|
|
|
|
|
|
return TRUE;
|
|
|
}
|
|
|
return TRUE;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//功能:设置地面站位置
|
|
|
//输入:经度dX,纬度dY,高度alt
|
|
|
void CGISDlg::SetGCSPosition(const double dX, const double dY, const double alt)
|
|
|
{
|
|
|
//地面站位置
|
|
|
g_gcsLon = dX; //经度
|
|
|
g_gcsLat = dY; //纬度
|
|
|
g_gcsAlt = alt; //高度
|
|
|
|
|
|
CString str = _T("GCS");
|
|
|
|
|
|
CString strColor = _T("红色");
|
|
|
|
|
|
//基于点图层进行标注
|
|
|
AddPointShapeLayer(m_gcsPtShpLayerID, dX, dY, str, strColor, RGB(255,0,0));
|
|
|
}
|
|
|
|
|
|
//功能:导引方式一,向主程序发送导引点坐标
|
|
|
void CGISDlg::OnGuideMode1()
|
|
|
{
|
|
|
//判断地图是否已经加载,没有加载返回
|
|
|
if ( !m_bHaveAddMap ) //没有加载地图?
|
|
|
{
|
|
|
AfxMessageBox( _T( "请先加载地图!" ) );
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
m_guidePtInfo.guideMode = 1;
|
|
|
|
|
|
m_guidePointMode = 1;
|
|
|
|
|
|
m_bGuideMode = true; //导引飞行模式为真
|
|
|
|
|
|
//2023.4.3 JackLiu
|
|
|
/*
|
|
|
DrawGuidePoint(1, m_guidePtInfo.guidePtLon, m_guidePtInfo.guidePtLat);
|
|
|
m_struMapOut.cmd=MapCmd_Guide1;
|
|
|
m_struMapOut.lon = m_guidePtInfo.guidePtLon;
|
|
|
m_struMapOut.lat = m_guidePtInfo.guidePtLat;
|
|
|
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP, (int)(&m_struMapOut),0);*/
|
|
|
|
|
|
//::PostMessage(HWND_BROADCAST, WM_SEND_GUIDEPOINT_INFO , WPARAM(&m_guidePtInfo) , 1);
|
|
|
//::PostMessage(m_MsgHwnd, m_MsgID, WPARAM(&m_guidePtInfo) , 1);
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:导引方式二,向主程序发送导引点坐标
|
|
|
void CGISDlg::OnGuideMode2()
|
|
|
{
|
|
|
//判断地图是否已经加载,没有加载返回
|
|
|
if ( !m_bHaveAddMap ) //没有加载地图?
|
|
|
{
|
|
|
AfxMessageBox( _T( "请先加载地图!" ) );
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
|
|
|
m_guidePtInfo.guideMode = 2;
|
|
|
|
|
|
m_guidePointMode = 2;
|
|
|
|
|
|
m_bGuideMode = true; //导引飞行模式为真
|
|
|
|
|
|
//2023.4.3 JackLiu
|
|
|
|
|
|
/*DrawGuidePoint(2,m_guidePtInfo.guidePtLon, m_guidePtInfo.guidePtLat);
|
|
|
m_struMapOut.cmd=MapCmd_Guide2;
|
|
|
m_struMapOut.lon = m_guidePtInfo.guidePtLon;
|
|
|
m_struMapOut.lat = m_guidePtInfo.guidePtLat;
|
|
|
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP, (int)(&m_struMapOut),0);*/
|
|
|
|
|
|
//::PostMessage(m_MsgHwnd, m_MsgID, WPARAM(&m_guidePtInfo) , 2);
|
|
|
|
|
|
//::PostMessage(HWND_BROADCAST, WM_SEND_GUIDEPOINT_INFO , WPARAM(&m_guidePtInfo) , 2);
|
|
|
}
|
|
|
|
|
|
//功能:显示1号航线
|
|
|
void CGISDlg::OnShowLine1()
|
|
|
{
|
|
|
SetFlyLineShowStatus(1);
|
|
|
}
|
|
|
|
|
|
//功能:显示2号航线
|
|
|
void CGISDlg::OnShowLine2()
|
|
|
{
|
|
|
SetFlyLineShowStatus(2);
|
|
|
}
|
|
|
|
|
|
//功能:显示3号航线
|
|
|
void CGISDlg::OnShowLine3()
|
|
|
{
|
|
|
SetFlyLineShowStatus(3);
|
|
|
}
|
|
|
|
|
|
//功能:显示4号航线
|
|
|
void CGISDlg::OnShowLine4()
|
|
|
{
|
|
|
SetFlyLineShowStatus(4);
|
|
|
}
|
|
|
|
|
|
//功能:显示5号航线
|
|
|
void CGISDlg::OnShowLine5()
|
|
|
{
|
|
|
SetFlyLineShowStatus(5);
|
|
|
}
|
|
|
//功能:显示6号航线
|
|
|
void CGISDlg::OnShowLine6()
|
|
|
{
|
|
|
SetFlyLineShowStatus(6);
|
|
|
}
|
|
|
//功能:显示7号航线
|
|
|
void CGISDlg::OnShowLine7()
|
|
|
{
|
|
|
SetFlyLineShowStatus(7);
|
|
|
}
|
|
|
//功能:显示8号航线
|
|
|
void CGISDlg::OnShowLine8()
|
|
|
{
|
|
|
SetFlyLineShowStatus(8);
|
|
|
}
|
|
|
//功能:显示9号航线
|
|
|
void CGISDlg::OnShowLine9()
|
|
|
{
|
|
|
SetFlyLineShowStatus(9);
|
|
|
}
|
|
|
|
|
|
//功能:显示10号航线
|
|
|
void CGISDlg::OnShowLine10()
|
|
|
{
|
|
|
SetFlyLineShowStatus(10);
|
|
|
}
|
|
|
|
|
|
//功能:显示空投
|
|
|
void CGISDlg::OnShowLine14()
|
|
|
{
|
|
|
SetFlyLineShowStatus(14);
|
|
|
}
|
|
|
|
|
|
//功能:清除已经标绘的航线
|
|
|
//输入:航线编号lineID,从0开始计数
|
|
|
void CGISDlg::ClearDrawedLine(const int lineID)
|
|
|
{
|
|
|
if (m_pHaveDrawLineFlag[lineID])
|
|
|
{
|
|
|
//清除标绘的点矢量图层
|
|
|
ClearPointShape(m_ppPlanLineShpLayerIDArr[lineID][0]);
|
|
|
|
|
|
//清除已经标绘的航线
|
|
|
m_map.RemoveLayer(m_ppPlanLineShpLayerIDArr[lineID][1]);
|
|
|
|
|
|
m_pHaveDrawLineFlag[lineID] = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//功能:处理快捷菜单与航线显示相关的操作
|
|
|
// 1)航线已经标注,清除显示
|
|
|
// 2)航线未标注,进行显示
|
|
|
//输入:航线编号lineID
|
|
|
void CGISDlg::SetFlyLineShowStatus(const int lineID)
|
|
|
{
|
|
|
int lineIndex = lineID - 1;
|
|
|
|
|
|
//已经标绘,清除航线
|
|
|
if (m_pHaveDrawLineFlag[lineIndex])
|
|
|
{
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(lineIndex);
|
|
|
|
|
|
//刷新
|
|
|
m_map.Redraw();
|
|
|
|
|
|
//标识置false
|
|
|
m_pHaveDrawLineFlag[lineIndex] = false;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
TCHAR filter[500]=_T("航线文件(*.txt)\0*.txt\0)");
|
|
|
|
|
|
CFileDialog LineRouteDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter, NULL);
|
|
|
//LineRouteDlg.m_ofn.lpstrInitialDir = strRouteFileDir;
|
|
|
LineRouteDlg.m_ofn.lpstrFilter="txt(*.txt)\0*.txt";
|
|
|
LineRouteDlg.m_ofn.lpstrTitle = "选择显示最新生成的航线";
|
|
|
if (LineRouteDlg.DoModal() == IDOK) //用户单击OK按钮中止对话框的返回值
|
|
|
{
|
|
|
CString str = LineRouteDlg.GetPathName(); //获取文件路径名
|
|
|
//OnShowGivenLine(GetFlyLineName(lineID));
|
|
|
OnShowGivenLine(str);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateLineDisplay1( CCmdUI *pCmdUI )
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[0]); //当1号航线选中后,打上记号
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateLineDisplay2( CCmdUI *pCmdUI )
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[1]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateLineDisplay3( CCmdUI *pCmdUI )
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[2]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateLineDisplay4( CCmdUI *pCmdUI )
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[3]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateLineDisplay5( CCmdUI *pCmdUI )
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[4]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateShowLine6(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[5]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateShowLine7(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[6]);
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnUpdateShowLine8(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[7]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateShowLine9(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[8]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateShowLine10(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[9]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateShowLine14(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[13]);
|
|
|
}
|
|
|
|
|
|
//功能:显示航线
|
|
|
//输入:航线文件名称strLineFileName
|
|
|
void CGISDlg::OnShowGivenLine(const CString strLineFileName)
|
|
|
{
|
|
|
//判断地图是否已经加载,没有加载返回
|
|
|
if ( !m_bHaveAddMap ) //没有加载地图?
|
|
|
{
|
|
|
BCGPMessageBox( _T( "请先加载地图!" ) );
|
|
|
return;
|
|
|
}
|
|
|
if (_T("") == strLineFileName)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//判断文件是否存在
|
|
|
if (!SearchDirectory(strLineFileName))
|
|
|
{
|
|
|
BCGPMessageBox( _T( "航路文件不存在!" ) );
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//航线数据集合
|
|
|
DrawLineDataStruct lineDataGroup;
|
|
|
|
|
|
//初始化
|
|
|
memset(&lineDataGroup, 0, sizeof(DrawLineDataStruct));
|
|
|
|
|
|
//航线文件读取成功
|
|
|
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*/)
|
|
|
{
|
|
|
BCGPMessageBox("航线号不正确!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
int ch = lineDataGroup.linePts[lineDataGroup.pointNum-1].ch1;
|
|
|
/***************************测绘区域处理************************************/
|
|
|
if (ch == 0x03)
|
|
|
{
|
|
|
if (tmpSurveyRegionLayerID!=-1)
|
|
|
{
|
|
|
m_map.RemoveLayer(tmpSurveyRegionLayerID);
|
|
|
tmpSurveyRegionLayerID = -1;
|
|
|
}
|
|
|
|
|
|
vector<double> regionLons;
|
|
|
vector<double> regionLats;
|
|
|
for (int i = 0;i<lineDataGroup.pointNum;++i)
|
|
|
{
|
|
|
regionLons.push_back(lineDataGroup.linePts[i].dX);
|
|
|
regionLats.push_back(lineDataGroup.linePts[i].dY);
|
|
|
}
|
|
|
//添加原点
|
|
|
regionLons.push_back(lineDataGroup.linePts[0].dX);
|
|
|
regionLats.push_back(lineDataGroup.linePts[0].dY);
|
|
|
if (designSurveyLineDlg!=nullptr)
|
|
|
{
|
|
|
designSurveyLineDlg->SetSurveyRegion(regionLons,regionLats);
|
|
|
}
|
|
|
ShowSurveyRegion(surveyRegionLayerID,regionLons,regionLats);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
/***************************限制区处理************************************/
|
|
|
if (ch==0x0D) //限飞区
|
|
|
{
|
|
|
//ClearZoneLayer(restrictedZoneLayersID[lineDataGroup.lineID-1]);
|
|
|
double xPoints[5];
|
|
|
double yPoints[5];
|
|
|
for (int i = 0;i<5;++i)
|
|
|
{
|
|
|
xPoints[i] = lineDataGroup.linePts[i].dX;
|
|
|
yPoints[i] = lineDataGroup.linePts[i].dY;
|
|
|
}
|
|
|
DrawRestrictedZone(restrictedZoneLayersID[lineDataGroup.lineID-1],xPoints,yPoints,5,0);
|
|
|
return;
|
|
|
}
|
|
|
else if(ch == 0x0C) //禁飞区
|
|
|
{
|
|
|
double xPoints[5];
|
|
|
double yPoints[5];
|
|
|
for (int i = 0;i<5;++i)
|
|
|
{
|
|
|
xPoints[i] = lineDataGroup.linePts[i].dX;
|
|
|
yPoints[i] = lineDataGroup.linePts[i].dY;
|
|
|
}
|
|
|
DrawRestrictedZone(noFlyZoneLayersID[lineDataGroup.lineID-1],xPoints,yPoints,5,1);
|
|
|
return;
|
|
|
}
|
|
|
/*******************by Wu 2023.09.14****************************/
|
|
|
m_ShowedLineDataList[lineDataGroup.lineID] = lineDataGroup;
|
|
|
|
|
|
if (lineDataGroup.lineID==11) //回收航线 存储备份数据用于编辑
|
|
|
{
|
|
|
//初始化
|
|
|
//memset(&backLineDataGroup, 0, sizeof(DrawLineDataStruct));
|
|
|
backLineDataGroup = lineDataGroup;
|
|
|
|
|
|
//危险地形点检测
|
|
|
ClearDangerousTerrainPoints();
|
|
|
double height = backLineDataGroup.linePts[0].nH;
|
|
|
double pts[128][2];
|
|
|
for (int i=0;i<backLineDataGroup.linePointNum;i++)
|
|
|
{
|
|
|
pts[i][0] = backLineDataGroup.linePts[i].dX;
|
|
|
pts[i][1] = backLineDataGroup.linePts[i].dY;
|
|
|
}
|
|
|
DrawDangerousTerrainPoints(pts,backLineDataGroup.linePointNum,height);
|
|
|
}
|
|
|
/**********************************************************************************/
|
|
|
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(lineDataGroup.lineID-1);
|
|
|
|
|
|
//标绘航线
|
|
|
DrawFlyLine(lineDataGroup);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//功能:标绘导引点位置
|
|
|
//输入:导引点类型guideMode(1为导引飞行1,2为导引飞行2),经度dX,纬度dY
|
|
|
void CGISDlg::DrawGuidePoint(const BYTE guideMode, const double dX, const double dY)
|
|
|
{
|
|
|
CString str = _T("");
|
|
|
|
|
|
if (guideMode == 1) //导引点1
|
|
|
{
|
|
|
str = _T("GuidePoint1");
|
|
|
}
|
|
|
else if (guideMode == 2) //导引点2
|
|
|
{
|
|
|
str = _T("GuidePoint2");
|
|
|
}
|
|
|
|
|
|
CString strColor = _T("红色");
|
|
|
|
|
|
//基于点图层进行标注
|
|
|
AddPointShapeLayer(m_guidePtShpLayerID, dX, dY, str, strColor, RGB(255,0,0));
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:基于点矢量图层标绘目标点
|
|
|
//输入:点图层名称drawLayerID
|
|
|
// 点坐标,经度dX, 纬度dY
|
|
|
// 点名称strPtName
|
|
|
// 标绘颜色strColor
|
|
|
// 标绘字体颜色数值fontColor
|
|
|
void CGISDlg::AddPointShapeLayer(long &drawLayerID, const double dX, const double dY, const CString strPtName, const CString strColor, unsigned long fontColor)
|
|
|
{
|
|
|
//判断点矢量图层是否已经存在,存在则删除
|
|
|
if (drawLayerID != -1)
|
|
|
{
|
|
|
//清除标绘的点矢量图层
|
|
|
ClearPointShape(drawLayerID);
|
|
|
}
|
|
|
|
|
|
///////////////////////////////////新建点矢量图层标绘点目标///////////////////////////////////
|
|
|
//创建点图层
|
|
|
//CreateEmptyShapfile(drawLayerID, 0, RGB(0,255,0));
|
|
|
CreateEmptyShapfile(drawLayerID, 0, fontColor);
|
|
|
|
|
|
PtStruct pointDataArr[1];
|
|
|
pointDataArr[0].dX = dX;
|
|
|
pointDataArr[0].dY = dY;
|
|
|
|
|
|
//向点图层加入航点数据
|
|
|
AddPoints2PointShapfile(drawLayerID, pointDataArr, 1);
|
|
|
|
|
|
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
|
|
|
|
|
|
//Label集合
|
|
|
CLabels labesPtr;
|
|
|
CShapefile shp = m_map.GetShapefile(drawLayerID);
|
|
|
labesPtr = (m_map.GetShapefile(drawLayerID)).GetLabels();
|
|
|
|
|
|
labesPtr.SetFontColor(fontColor);
|
|
|
labesPtr.SetAlignment(1);
|
|
|
labesPtr.SetFontBold(TRUE);
|
|
|
labesPtr.SetFontName(_T("Times New Roman"));
|
|
|
labesPtr.SetFontSize(11);
|
|
|
labesPtr.put_FontSize2(11);
|
|
|
labesPtr.SetFrameVisible(false);
|
|
|
|
|
|
/*
|
|
|
CLabelCategory labelCategory = labesPtr.AddCategory(strColor);
|
|
|
labelCategory.SetFontColor(fontColor);
|
|
|
labelCategory.SetAlignment(1);
|
|
|
labelCategory.SetFontBold(TRUE);
|
|
|
labelCategory.SetFontName(_T("Times New Roman"));
|
|
|
labelCategory.SetFontSize(11);
|
|
|
labelCategory.SetFrameVisible(false);*/
|
|
|
|
|
|
//增加Labels
|
|
|
labesPtr.AddLabel((LPCTSTR)strPtName, dX, dY, 0, 0);
|
|
|
|
|
|
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
|
|
|
|
|
|
//重新绘制
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:清除点图层标注信息
|
|
|
//输入:点图层ID号layerID
|
|
|
void CGISDlg::ClearPointShape(long layerID)
|
|
|
{
|
|
|
if (layerID == -1)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
CLabels labesPtr;
|
|
|
CShapefile sf = m_map.GetShapefile(layerID);
|
|
|
if (sf)
|
|
|
{
|
|
|
labesPtr = sf.GetLabels();
|
|
|
//清除标注信息
|
|
|
labesPtr.RemoveCategory(0);
|
|
|
labesPtr.Clear();
|
|
|
|
|
|
//清除已经标绘的航点
|
|
|
m_map.RemoveLayer(layerID);
|
|
|
}
|
|
|
//labesPtr = (m_map.GetShapefile(layerID)).GetLabels();
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
LRESULT CGISDlg::OnCheckFlyLineShowStatus(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//航线编号
|
|
|
int lineIndex = wParam-1;
|
|
|
|
|
|
if (m_pHaveDrawLineFlag[lineIndex])
|
|
|
{
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(lineIndex);
|
|
|
|
|
|
//刷新
|
|
|
m_map.Redraw();
|
|
|
|
|
|
//标识置false
|
|
|
m_pHaveDrawLineFlag[lineIndex] = false;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 功能:设置发送导引方式消息发送句柄及消息号
|
|
|
void CGISDlg::SetMsgInfo(const HWND hwnd, const UINT msgID)
|
|
|
{
|
|
|
m_MsgHwnd = hwnd;
|
|
|
m_MsgID = msgID;
|
|
|
}
|
|
|
|
|
|
// 功能:设置航线装订消息发送句柄及消息号
|
|
|
void CGISDlg::SetLoadLineMsgInfo(const HWND hwnd, const UINT msgID)
|
|
|
{
|
|
|
m_MsgHwnd = hwnd;
|
|
|
m_LineLoadMsgID = msgID;
|
|
|
}
|
|
|
|
|
|
//功能:判断鼠标是否选中航点
|
|
|
//输入:航点数据curpoint,鼠标点击像素坐标x和y
|
|
|
//返回值:true——鼠标选中航点
|
|
|
// false——鼠标未选中航点
|
|
|
bool CGISDlg::BeMouseClickedLinePoint(const PtStruct curpoint, const long x, const long y)
|
|
|
{
|
|
|
CRect rc;
|
|
|
|
|
|
double ptPixelX = 0;
|
|
|
double ptPixelY = 0;
|
|
|
|
|
|
//像素坐标转换地理坐标
|
|
|
m_map.ProjToPixel(curpoint.dX, curpoint.dY, &ptPixelX, &ptPixelY);
|
|
|
|
|
|
rc.left = static_cast<long>(ptPixelX - 20);
|
|
|
rc.top = static_cast<long>(ptPixelY - 20);
|
|
|
rc.right = static_cast<long>(ptPixelX + 20);
|
|
|
rc.bottom = static_cast<long>(ptPixelY + 20);
|
|
|
|
|
|
CPoint xy;
|
|
|
xy.x = x;
|
|
|
xy.y = y;
|
|
|
|
|
|
if(rc.PtInRect(xy))
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
void CGISDlg::MouseUpMap1(short Button, short Shift, long x, long y)
|
|
|
{
|
|
|
m_iPtSel=-1;
|
|
|
|
|
|
}
|
|
|
|
|
|
//功能:是否进行自动漫游
|
|
|
void CGISDlg::OnAutoMove()
|
|
|
{
|
|
|
if (m_bAutoMove)
|
|
|
{
|
|
|
m_bAutoMove = false;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_bAutoMove = true;
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnDesignLine() //航线设计
|
|
|
{
|
|
|
|
|
|
if (m_bHaveAddMap)
|
|
|
{
|
|
|
//已经处于航线设计状态时,返回
|
|
|
if (m_bLineDesign)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_bLineDesign = true;
|
|
|
|
|
|
// //设计第一个航点
|
|
|
// m_bDesignFirstPoint = true;
|
|
|
}
|
|
|
|
|
|
// //清除现有的航线数据
|
|
|
// m_pFlyLineDesign->ClearCurrentData();
|
|
|
//
|
|
|
// //显示航线设计对话框
|
|
|
// m_pFlyLineDesign->ShowWindow(SW_SHOW);
|
|
|
//
|
|
|
// //显示软件
|
|
|
// m_pLineSectDlg->ShowWindow(SW_SHOW);
|
|
|
//
|
|
|
// //设置鼠标为“选择”样式
|
|
|
// m_map.SetCursorMode(3);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
BCGPMessageBox(_T("请先加载地图数据!"));
|
|
|
}
|
|
|
|
|
|
|
|
|
if(m_bLineDesign == false)
|
|
|
{
|
|
|
|
|
|
m_bLineDesign=true; //航线设计模式启动
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnData()
|
|
|
{
|
|
|
AfxMessageBox("this is test!!!");
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CGISDlg::OnUpdateAutoMov( CCmdUI *pCmdUI )
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_bAutoMove);
|
|
|
}
|
|
|
|
|
|
|
|
|
//功能:标绘回收点位置
|
|
|
//输入:导引点类型callbackMode(1为回收点1;2为回收点2),经度dX,纬度dY
|
|
|
void CGISDlg::DrawCallBackPoint(const BYTE callbackMode, const double dX, const double dY)
|
|
|
{
|
|
|
//没有加载地图
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if ((callbackMode>255) || (callbackMode<1))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
CString str;
|
|
|
str.Format(_T("CallbackPoint%d"), callbackMode);
|
|
|
|
|
|
//字体标绘颜色
|
|
|
CString strColor = _T("绿色");
|
|
|
|
|
|
//基于点图层进行标注
|
|
|
AddPointShapeLayer(m_pCallBackShapfileID[callbackMode-1], dX, dY, str, strColor, RGB(0,255,0));
|
|
|
}
|
|
|
|
|
|
//功能:取消地图区标绘的导引点
|
|
|
void CGISDlg::OnRemoveGuidePtDraw()
|
|
|
{
|
|
|
//判断点矢量图层是否已经存在,存在则删除
|
|
|
if (m_guidePtShpLayerID != -1)
|
|
|
{
|
|
|
//清除标绘的点矢量图层
|
|
|
ClearPointShape(m_guidePtShpLayerID);
|
|
|
|
|
|
m_guidePtShpLayerID = -1;
|
|
|
}
|
|
|
|
|
|
if (m_CircleGuideLayer>=0)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_CircleGuideLayer);
|
|
|
m_CircleGuideLayer = -1;
|
|
|
}
|
|
|
|
|
|
//导引点模式
|
|
|
m_guidePointMode = 0;
|
|
|
|
|
|
m_bGuideMode = false ;
|
|
|
|
|
|
//显示快捷菜单
|
|
|
CMenu menu;
|
|
|
menu.LoadMenuA(IDR_MENU2);
|
|
|
menu.CheckMenuItem(IDM_GUIDE_FLY1,MF_BYCOMMAND|MF_UNCHECKED);
|
|
|
menu.CheckMenuItem(IDM_GUIDE_FLY2,MF_BYCOMMAND|MF_UNCHECKED);
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnUpdateGuideMode1( CCmdUI *pCmdUI )
|
|
|
{
|
|
|
if (m_guidePointMode == 1)
|
|
|
{
|
|
|
pCmdUI->SetCheck(1);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
pCmdUI->SetCheck(0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnUpdateGuideMode2( CCmdUI *pCmdUI )
|
|
|
{
|
|
|
if (m_guidePointMode == 2)
|
|
|
{
|
|
|
pCmdUI->SetCheck(1);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
pCmdUI->SetCheck(0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnAddpoint() //设置为置点工作状态
|
|
|
{
|
|
|
// TODO: Add your command handler code here
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
//m_map.SetCursorMode(5);
|
|
|
m_bSetPointModel=TRUE;
|
|
|
m_bLineDesign=TRUE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
|
|
|
m_bDesignFirstPoint = false;
|
|
|
|
|
|
//设计航线时,清除已显示的航线
|
|
|
/*
|
|
|
if(m_bLineDesign)
|
|
|
{
|
|
|
for(int i=0;i<sizeof(m_pHaveDrawLineFlag) / sizeof(m_pHaveDrawLineFlag[0]);i++)
|
|
|
{
|
|
|
if(m_pHaveDrawLineFlag[i])
|
|
|
{
|
|
|
m_map.RemoveLayer(m_ppPlanLineShpLayerIDArr[i][1]);
|
|
|
m_map.RemoveLayer(m_ppPlanLineShpLayerIDArr[i][0]);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
*/
|
|
|
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnEnddesign() //结束编辑
|
|
|
{
|
|
|
// TODO: Add your command handler code here
|
|
|
|
|
|
if (m_designLinePointNum < 3 && m_designLinePointNum>0)
|
|
|
{
|
|
|
BCGPMessageBox("航点数不得少于3!!!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//m_bEndSetPoint=TRUE;
|
|
|
m_bSetPointModel=FALSE;
|
|
|
m_bLineDesign=FALSE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
|
|
|
///////Save the Designed Line
|
|
|
if (m_designLinePointNum <= 0)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//航线文件路径
|
|
|
CString strFlyLineName = _T("");
|
|
|
|
|
|
//航线编号
|
|
|
int designLineID = 0;
|
|
|
|
|
|
//航路特征字
|
|
|
int lineProperty = 0;
|
|
|
|
|
|
//航线高度
|
|
|
double lineHeight = 1500.0;
|
|
|
|
|
|
//闭合标志
|
|
|
int designLineCE = 0;
|
|
|
|
|
|
//弹出航线选择对话框
|
|
|
CSetSaveLineID dlg;
|
|
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
|
{
|
|
|
//航路文件名
|
|
|
strFlyLineName = dlg.m_strFlyLineName;
|
|
|
|
|
|
//航线编号
|
|
|
designLineID = dlg.m_designLineID;
|
|
|
|
|
|
//航路特征字
|
|
|
lineProperty = dlg.m_lineProperty;
|
|
|
|
|
|
//航线高度
|
|
|
lineHeight = dlg.m_LineHgt;
|
|
|
|
|
|
//闭合标志
|
|
|
if(dlg.m_bClosedLine==0) designLineCE+=2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//未保存时,也需清除已绘制的航线的和数据(add by jackwong 2018.08.01)
|
|
|
memset(m_pDesignLineStruct, 0, sizeof(PtStruct)*m_lineMaxPointNum); //初始化新建一条航线
|
|
|
m_designLinePointNum = 0;
|
|
|
ClearDrawingInLineDesign();
|
|
|
|
|
|
return ;
|
|
|
}
|
|
|
|
|
|
//批量航线设置
|
|
|
double azmuth,heightInterval,lineInterval,numLine;
|
|
|
bool bSaveMultiLine = false;
|
|
|
CString pathName;
|
|
|
if (g_b981AMulti && dlg.m_bCheckMultiLine)
|
|
|
{
|
|
|
SetMultiRouteDlg multiRouteDlg;
|
|
|
if (multiRouteDlg.DoModal() == IDOK )
|
|
|
{
|
|
|
azmuth = multiRouteDlg.azmuth;
|
|
|
heightInterval = multiRouteDlg.heightInterval;
|
|
|
lineInterval = multiRouteDlg.lineInterval;
|
|
|
numLine = multiRouteDlg.numLine;
|
|
|
bSaveMultiLine = true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
bSaveMultiLine = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//保存设置航线
|
|
|
CString strRouteFileDir = GetSoftwareCurrentDirectory() + _T("\\Route");
|
|
|
|
|
|
TCHAR s[10000];
|
|
|
s[0]=0;
|
|
|
CFileDialog dlgSave(FALSE, _T(".txt"), _T("*.txt"));
|
|
|
dlgSave.m_ofn.lpstrTitle=_T("保存航线文件");
|
|
|
dlgSave.m_ofn.lpstrFile=s;
|
|
|
dlgSave.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);
|
|
|
|
|
|
TCHAR filter[500]=_T("航线文件(*.txt)\0*.txt\0");
|
|
|
dlgSave.m_ofn.lpstrFilter=filter;
|
|
|
dlgSave.m_ofn.Flags|=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_CREATEPROMPT;
|
|
|
dlgSave.m_ofn.lpstrInitialDir = strRouteFileDir;
|
|
|
if (IDOK == dlgSave.DoModal())
|
|
|
{
|
|
|
strFlyLineName = dlgSave.GetPathName();
|
|
|
pathName = ExtractFileName(strFlyLineName);
|
|
|
|
|
|
////写出航线数据
|
|
|
FILE *fp = fopen(strFlyLineName, "w" );
|
|
|
if ( fp == NULL )
|
|
|
{
|
|
|
BCGPMessageBox("航线文件打开失败!!!");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
PtStruct pt;
|
|
|
memset(&pt, 0, sizeof(PtStruct));
|
|
|
|
|
|
//原点数据写入
|
|
|
fprintf(fp, "%d, %d, %.7f, %.7f, %.2f, %d, %02X, %02X\n", designLineID, 0, g_gcsLon, g_gcsLat, 0.0, 0, 0, 3);
|
|
|
|
|
|
//遍历航点集合数据
|
|
|
for ( int i = 0; i < m_designLinePointNum; i++ )
|
|
|
{
|
|
|
pt = m_pDesignLineStruct[i];
|
|
|
m_pDesignLineStruct[i].nL = designLineID;
|
|
|
m_pDesignLineStruct[i].nH = lineHeight;
|
|
|
|
|
|
//将除最后一个点的数据写入文件
|
|
|
if ( i < (m_designLinePointNum-1))
|
|
|
{
|
|
|
fprintf(fp, "%d, %d, %.7f, %.7f, %.2f, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, lineHeight, pt.nV, pt.ch1, 3);
|
|
|
}
|
|
|
else//将最后一个点的航段特征数据写入文件
|
|
|
{
|
|
|
fprintf(fp, "%d, %d, %.7f, %.7f, %.2f, %d, %02X, %02X\n", designLineID, pt.nPt, pt.dX, pt.dY, lineHeight, pt.nV, designLineCE/*pt.ch1*/, lineProperty);
|
|
|
m_pDesignLineStruct[i].ch2 = designLineCE;
|
|
|
m_pDesignLineStruct[i].ch1 = lineProperty;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
fclose( fp );
|
|
|
|
|
|
//弹出保存成功对话框
|
|
|
BCGPMessageBox(_T("航线文件保存成功!"));
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//批量航线保存
|
|
|
if (g_b981AMulti && bSaveMultiLine)
|
|
|
{
|
|
|
vector<vector<PtStruct>> resultLines;
|
|
|
GetMultiRouteLine(azmuth,lineInterval,numLine,m_pDesignLineStruct,m_designLinePointNum,resultLines);
|
|
|
SaveMultiRouteLine(pathName,heightInterval,resultLines);
|
|
|
}
|
|
|
|
|
|
memset(m_pDesignLineStruct, 0, sizeof(PtStruct)*m_lineMaxPointNum); //初始化新建一条航线
|
|
|
m_designLinePointNum = 0;
|
|
|
|
|
|
|
|
|
ClearDrawingInLineDesign();
|
|
|
int lineIndex =designLineID - 1;
|
|
|
|
|
|
if (m_pHaveDrawLineFlag[lineIndex])
|
|
|
{
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(lineIndex);
|
|
|
OnShowGivenLine(strFlyLineName/*GetFlyLineName(designLineID)*/);
|
|
|
//OnShowGivenLine(GetFlyLineName(designLineID));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
OnShowGivenLine(strFlyLineName/*GetFlyLineName(designLineID)*/);
|
|
|
}
|
|
|
//航点个数为0
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnClearpoint() //清除所有标绘
|
|
|
{
|
|
|
//m_map.SetCursorMode(5);
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
m_bPtEdit=FALSE; //编辑
|
|
|
m_bPtDel=FALSE; //删点
|
|
|
m_bSetPointModel=FALSE;
|
|
|
m_bLineDesign=TRUE;
|
|
|
m_bLDSetPoint = FALSE;
|
|
|
RemoveDesignLineData();
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnEditProper() //属性
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
/*m_map.SetCursorMode(5);
|
|
|
m_bSetPointModel=FALSE;
|
|
|
m_bLineDesign=TRUE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=TRUE;*/
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnEditpoint() //编辑
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
//m_map.SetCursorMode(5);
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
m_bSetPointModel=FALSE;
|
|
|
m_bLineDesign=TRUE;
|
|
|
m_bPtDel=FALSE;
|
|
|
m_bPtEdit=TRUE;
|
|
|
}
|
|
|
|
|
|
|
|
|
int CGISDlg::GetPtSel(int x,int y)//获取鼠标选取的点号
|
|
|
{
|
|
|
int i=0;
|
|
|
double px=0;
|
|
|
double py=0;
|
|
|
|
|
|
int dis=10.0;
|
|
|
|
|
|
for (i=0;i<m_designLinePointNum;i++)
|
|
|
{
|
|
|
//地理坐标转换像素坐标
|
|
|
m_map.ProjToPixel(m_pDesignLineStruct[i].dX,m_pDesignLineStruct[i].dY, &px, &py);
|
|
|
if (fabs(px-x)<dis&&fabs(py-y)<dis)
|
|
|
{
|
|
|
return i;
|
|
|
}
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
//重载 by Wu 2023.09.14
|
|
|
int CGISDlg::GetPtSel(PtStruct* m_pLinePtStruct,int m_PointNum,int x,int y)
|
|
|
{
|
|
|
int i=0;
|
|
|
double px=0;
|
|
|
double py=0;
|
|
|
|
|
|
int dis=10.0;
|
|
|
|
|
|
for (i=0;i<m_PointNum;i++)
|
|
|
{
|
|
|
//地理坐标转换像素坐标
|
|
|
m_map.ProjToPixel(m_pLinePtStruct[i].dX,m_pLinePtStruct[i].dY, &px, &py);
|
|
|
if (fabs(px-x)<dis&&fabs(py-y)<dis)
|
|
|
{
|
|
|
return i;
|
|
|
}
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnDelpoint() //删点
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
|
|
|
//m_map.SetCursorMode(5);
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
m_bSetPointModel=FALSE;
|
|
|
m_bLineDesign=TRUE;
|
|
|
m_bPtDel=TRUE;
|
|
|
m_bPtEdit=FALSE;
|
|
|
m_bDesignFirstPoint=true;
|
|
|
}
|
|
|
|
|
|
void CGISDlg::DrawLineDesign()
|
|
|
{
|
|
|
//清除航线设计时的标注信息
|
|
|
ClearDrawingInLineDesign();
|
|
|
//标绘出设计的航点数据
|
|
|
DrawDesignLineData();
|
|
|
}
|
|
|
|
|
|
// 功能:编辑回收航线 ------by Wu 2023.09.14
|
|
|
void CGISDlg::OnEditLine()
|
|
|
{
|
|
|
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
|
|
|
if (m_lineSelectedID > 0 && m_bSelectFeatureFlag) //回收航线是否显示
|
|
|
{
|
|
|
m_bEditLine = true;
|
|
|
|
|
|
ClearHighLightLine();
|
|
|
}
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
}
|
|
|
|
|
|
//void CGISDlg::OnBindline1()
|
|
|
//{
|
|
|
// ::PostMessage(m_MsgHwnd,m_LineLoadMsgID,1,0); //发送给主程序装订航线1
|
|
|
//}
|
|
|
void CGISDlg::OnBindline2() //发送给主程序装订航线2
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=2;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
//::PostMessage(m_MsgHwnd,m_LineLoadMsgID,2,0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnLoadMyline1() //发送给主程序装订航线1
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=1;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
//::PostMessage(m_MsgHwnd,m_LineLoadMsgID,1,0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnBindline3() //发送给主程序装订航线3
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=3;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
//::PostMessage(m_MsgHwnd,m_LineLoadMsgID,3,0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnBindline4() //发送给主程序装订航线4
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=4;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
//::PostMessage(m_MsgHwnd,m_LineLoadMsgID,4,0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnBindline5() //发送给主程序装订航线5
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=5;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
//::PostMessage(m_MsgHwnd,m_LineLoadMsgID,5,0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnBindline6() //发送给主程序装订航线6
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=6;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnBindline7() //发送给主程序装订航线7
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=7;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnBindline8() //发送给主程序装订航线8
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=8;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnBindline9()
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=9;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnBindline10()
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=10;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CGISDlg::OnLayermng() //图层管理
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_Layer->ShowWindow(SW_SHOW);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnAddgtarget()
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//void CGISDlg::OnMouseHWheel(UINT nFlags, short zDelta, CPoint pt)
|
|
|
//{
|
|
|
// // 此功能要求 Windows Vista 或更高版本。
|
|
|
// // _WIN32_WINNT 符号必须 >= 0x0600。
|
|
|
// // TODO: 在此添加消息处理程序代码和/或调用默认值
|
|
|
//
|
|
|
// CBCGPDialog::OnMouseHWheel(nFlags, zDelta, pt);
|
|
|
//}
|
|
|
|
|
|
void CGISDlg::SetRouteLine(int iLine ,PTLIST *pList)
|
|
|
{
|
|
|
|
|
|
CString sRouteDir = GetSoftwareCurrentDirectory();
|
|
|
//2015.11.24
|
|
|
CString str;
|
|
|
str.Format("%d", iLine);
|
|
|
CString m_sRoute = sRouteDir + _T( "\\route" ) + str + _T( ".txt" );
|
|
|
|
|
|
//2015.10.24 添加读取航线文件
|
|
|
// if (!SearchDirectory(m_sRoute))
|
|
|
// {
|
|
|
// str = m_sRoute + "航线不存在";
|
|
|
// MessageBox(str, "地图");
|
|
|
// }
|
|
|
//
|
|
|
// DrawLineDataStruct CXLineGroup;
|
|
|
// m_lineManage.ReadLineDataFromFile(CXLineGroup,m_sRoute);
|
|
|
|
|
|
|
|
|
// DrawLineDataStruct CXLineGroup;
|
|
|
// if (m_lineManage.ReadLineDataFromFile(CXLineGroup,m_sRoute))
|
|
|
// {
|
|
|
// int idNum = m_lineManage.line->GetCount();
|
|
|
// //int idNum = CXLineGroup.linePointNum;
|
|
|
// POSITION ps = m_lineManage.line->GetHeadPosition();
|
|
|
// for (int i = 0; i < idNum; i++)
|
|
|
// {
|
|
|
// PtStruct pt = m_lineManage.line->GetNext(ps);
|
|
|
// pList->AddTail(pt);
|
|
|
// }
|
|
|
//
|
|
|
//
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// MessageBox("航路文件错误!","地图");
|
|
|
// pList->RemoveAll();
|
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
//2016.02.19
|
|
|
// LRESULT CGISDlg::DRAW_ZK(WPARAM wParam, LPARAM lParam)
|
|
|
// {
|
|
|
// if (!m_bHaveAddMap)
|
|
|
// {
|
|
|
// return FALSE;
|
|
|
// }
|
|
|
// tagDRAWZK DrZk = m_DRAWZK;
|
|
|
//
|
|
|
// CString str="";
|
|
|
//
|
|
|
// str.Format("航线号:%02d 待飞距:%d 偏航角:%.2f 高度给定:%.2f 飞机距离:%.2f 场高:%.2f\n\
|
|
|
// 航点号:%02d 侧偏距:%d 航向给定:%.2f 空速给定:%.2f 飞机方位:%.2f",
|
|
|
// DrZk.ID_Line, DrZk.Dis_DF, DrZk.Yaw_Offset, DrZk.Heg_GD, DrZk.Dis_Air, DrZk.Heg_GRD,\
|
|
|
// DrZk.ID_Pt, DrZk.Dis_Offset, DrZk.Yaw_GD, DrZk.AirSpeed_GD, DrZk.Azi_Air);
|
|
|
//
|
|
|
//
|
|
|
// //GetDlgItem( IDC_STATIC_MAPSHOW )->EnableWindow( TRUE );
|
|
|
// //GetDlgItem(IDC_STATIC_MAPSHOW)->SetWindowText(str);
|
|
|
//
|
|
|
// return 0;
|
|
|
// }
|
|
|
|
|
|
void CGISDlg::OnNlinedesign()
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
|
|
|
m_bLDSetPoint = TRUE;
|
|
|
|
|
|
m_pLineDesign = new CLineDesign();
|
|
|
m_pLineDesign->Create(IDD_DLG_LINEDESIGN,this);
|
|
|
m_pLineDesign->ShowWindow(TRUE);
|
|
|
|
|
|
if (!m_bHaveShowLineDesign)
|
|
|
{
|
|
|
m_bHaveShowLineDesign = true;
|
|
|
//m_pLineDesign->ShowLonLat(0, 0);
|
|
|
m_pLineDesign->ShowWindow(SW_SHOW);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_bHaveShowLineDesign = false;
|
|
|
m_pLineDesign->ShowWindow(SW_HIDE);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnUpdateNlinedesign(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
// TODO: 在此添加命令更新用户界面处理程序代码
|
|
|
}
|
|
|
|
|
|
|
|
|
BOOL CGISDlg::ReadLine(int iLine,PTLIST *pList)
|
|
|
{
|
|
|
if (pList==NULL)
|
|
|
{
|
|
|
return FALSE;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
pList->RemoveAll();
|
|
|
}
|
|
|
|
|
|
if (iLine<1||iLine>14) //2015.10.12
|
|
|
{
|
|
|
return FALSE;
|
|
|
}
|
|
|
CString str;
|
|
|
CString sLineName=GetFlyLineName(iLine);
|
|
|
if (!SearchDirectory(sLineName))
|
|
|
{
|
|
|
str=sLineName+" 航线不存在";
|
|
|
MessageBox(str,"地图");
|
|
|
return FALSE;
|
|
|
}
|
|
|
|
|
|
CLineManage tpLine;
|
|
|
|
|
|
if (tpLine.OpenFlyLineFile(sLineName,iLine,true))
|
|
|
{
|
|
|
int idNum=tpLine.line.GetCount();
|
|
|
POSITION ps=tpLine.line.GetHeadPosition();
|
|
|
for (int i=0;i<idNum;i++)
|
|
|
{
|
|
|
PtStruct pt=tpLine.line.GetNext(ps);
|
|
|
pList->AddTail(pt);
|
|
|
}
|
|
|
return TRUE;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
MessageBox("航路文件错误!","地图");
|
|
|
pList->RemoveAll();
|
|
|
return FALSE;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//显示回收航线(14)
|
|
|
void CGISDlg::OnShowBackLine()
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
SetFlyLineShowStatus(14);
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
SetFlyLineShowStatus(11);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnUpdateShowBackLine(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
// TODO: 在此添加命令更新用户界面处理程序代码
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[13]);
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[10]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnShowHs11()
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
SetFlyLineShowStatus(11);
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
SetFlyLineShowStatus(7);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//应急航线 11
|
|
|
void CGISDlg::OnUpdateShowHs11(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
// TODO: 在此添加命令更新用户界面处理程序代码
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[10]);
|
|
|
}
|
|
|
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[6]);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnBindHs11()
|
|
|
{
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
m_struMapOut.ID=11;
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
m_struMapOut.ID=7;
|
|
|
}
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
//电子围栏 12
|
|
|
void CGISDlg::OnShowTc12()
|
|
|
{
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
SetFlyLineShowStatus(12);
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
SetFlyLineShowStatus(6);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnBindTc12()
|
|
|
{
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
m_struMapOut.ID=12;
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
m_struMapOut.ID=6;
|
|
|
}
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnUpdateShowTc12(CCmdUI *pCmdUI)
|
|
|
{
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[11]);
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
pCmdUI->SetCheck(m_pHaveDrawLineFlag[5]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnSize(UINT nType, int cx, int cy)
|
|
|
{
|
|
|
CBCGPDialog::OnSize(nType, cx, cy);
|
|
|
|
|
|
// TODO: 在此处添加消息处理程序代码
|
|
|
if (m_map.GetSafeHwnd())
|
|
|
{
|
|
|
CRect rc;
|
|
|
GetClientRect(&rc);
|
|
|
rc.top += 35;
|
|
|
m_map.MoveWindow(rc);
|
|
|
//RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST, 0);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnBindBackLine()
|
|
|
{
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
if (g_b981ADesktop || g_b981APad)
|
|
|
{
|
|
|
m_struMapOut.ID=14;
|
|
|
}
|
|
|
if (g_b981CDesktop)
|
|
|
{
|
|
|
m_struMapOut.ID=11;
|
|
|
}
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::UpdateDataInfo(int index,const char* key,double value)
|
|
|
{
|
|
|
switch (index)
|
|
|
{
|
|
|
case 0:
|
|
|
m_infoData.lineID = value;
|
|
|
break;
|
|
|
case 1:
|
|
|
m_infoData.ptID = value;
|
|
|
break;
|
|
|
case 2:
|
|
|
m_infoData.disDF = value;
|
|
|
break;
|
|
|
case 3:
|
|
|
m_infoData.disCP = value;
|
|
|
break;
|
|
|
case 4:
|
|
|
m_infoData.headingGD = value;
|
|
|
break;
|
|
|
case 5:
|
|
|
m_infoData.anglePH = value;
|
|
|
break;
|
|
|
case 6:
|
|
|
m_infoData.heightGD = value;
|
|
|
break;
|
|
|
case 7:
|
|
|
m_infoData.heightPC = value;
|
|
|
break;
|
|
|
case 8:
|
|
|
m_infoData.speedGD = value;
|
|
|
break;
|
|
|
case 9:
|
|
|
m_infoData.heightCG = value;
|
|
|
break;
|
|
|
case 10:
|
|
|
m_infoData.dis = value;
|
|
|
break;
|
|
|
case 11:
|
|
|
m_infoData.heading = value;
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
DrawCanvas();
|
|
|
}
|
|
|
|
|
|
//标绘地图参数
|
|
|
void CGISDlg::DrawCanvas()
|
|
|
{
|
|
|
COLORREF color = RGB(50,235,50);
|
|
|
//COLORREF colorback= RGB(0,0,0);//黑底
|
|
|
CRect rec;
|
|
|
m_map.GetClientRect(&rec);
|
|
|
|
|
|
const long leftEdge = rec.left;
|
|
|
const long topEdge = rec.top + 20;
|
|
|
const int horizonInter = 11;
|
|
|
const int verticalInter = rec.Height() / 19;
|
|
|
|
|
|
CLabels labesPtr;
|
|
|
if(m_canvasLayerID != -1)
|
|
|
{
|
|
|
labesPtr = m_map.GetDrawingLabels(m_canvasLayerID);
|
|
|
labesPtr.Clear();
|
|
|
CString str = "";
|
|
|
|
|
|
str.Format(_T("%-s%-d"),_T("航线序号:"),m_infoData.lineID);
|
|
|
labesPtr.AddLabel(str, leftEdge + horizonInter, topEdge + verticalInter * 1, 0, 0);
|
|
|
str.Format(_T("%-s%-d"),_T("航点序号:"),m_infoData.ptID);
|
|
|
labesPtr.AddLabel(str, leftEdge + horizonInter, topEdge + verticalInter * 2, 0, 0);
|
|
|
|
|
|
str.Format(_T("%-s%-d"),_T("待飞距离:"),m_infoData.disDF);
|
|
|
labesPtr.AddLabel(str, leftEdge + horizonInter, topEdge + verticalInter * 4, 0, 0);
|
|
|
str.Format(_T("%-s%-.1lf"),_T("侧偏距离:"),m_infoData.disCP);
|
|
|
labesPtr.AddLabel(str, leftEdge + horizonInter, topEdge + verticalInter * 5, 0, 0);
|
|
|
|
|
|
str.Format(_T("%-s%-.1lf"),_T("航向给定:"),m_infoData.headingGD);
|
|
|
labesPtr.AddLabel(str, rec.left + horizonInter/* - 11*/, topEdge + verticalInter * 7, 0, 0);
|
|
|
str.Format(_T("%-s%-.1lf"),_T("偏航角度:"),m_infoData.anglePH);
|
|
|
labesPtr.AddLabel(str, rec.left + horizonInter/* - 11*/, topEdge + verticalInter * 8, 0, 0);
|
|
|
|
|
|
str.Format(_T("%-s%-.1lf"),_T("高度偏差:"),m_infoData.heightPC);
|
|
|
labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 10, 0, 0);
|
|
|
str.Format(_T("%-s%-.1lf"),_T("高度给定:"),m_infoData.heightGD);
|
|
|
labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 11, 0, 0);
|
|
|
|
|
|
str.Format(_T("%-s%-.1lf"),_T("空速给定:"),m_infoData.speedGD);
|
|
|
labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 13, 0, 0);
|
|
|
str.Format(_T("%-s%-.1lf"),_T("飞行场高:"),m_infoData.heightCG);
|
|
|
labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 14, 0, 0);
|
|
|
|
|
|
str.Format(_T("%-s%-.1lf"),_T("飞机距离:"),m_infoData.dis);
|
|
|
labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 16, 0, 0);
|
|
|
str.Format(_T("%-s%-.1lf"),_T("飞机方位:"),m_infoData.heading);
|
|
|
labesPtr.AddLabel(str, rec.left + horizonInter /*- 5*/, topEdge + verticalInter * 17, 0, 0);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_canvasLayerID = m_map.NewDrawing(0);
|
|
|
labesPtr = m_map.GetDrawingLabels(m_canvasLayerID);
|
|
|
CLabelCategory left = labesPtr.AddCategory(_T(""));
|
|
|
left.SetFontColor(color);
|
|
|
left.SetAlignment(2);//0:居中;1 右对齐,2表示左对齐
|
|
|
left.SetOffsetX(0);
|
|
|
left.SetOffsetY(0);
|
|
|
left.SetFontBold(true);
|
|
|
left.SetFontName(LPCTSTR("黑体"));
|
|
|
left.SetFontSize(13);
|
|
|
left.SetFrameBackColor(RGB(0,0,0));
|
|
|
left.SetFrameVisible(TRUE);
|
|
|
left.SetFrameTransparency(0);
|
|
|
|
|
|
CLabelCategory right = labesPtr.AddCategory(_T(""));
|
|
|
right.SetFontColor(color);
|
|
|
right.SetAlignment(2);//0:右;1 居中,2表示左对齐
|
|
|
right.SetOffsetX(0);
|
|
|
right.SetOffsetY(0);
|
|
|
right.SetFontBold(true);
|
|
|
right.SetFontName(LPCTSTR("黑体"));
|
|
|
right.SetFontSize(13);
|
|
|
right.SetFrameBackColor(RGB(0,0,0));
|
|
|
right.SetFrameVisible(TRUE);
|
|
|
right.SetFrameTransparency(0);
|
|
|
}
|
|
|
//m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
void CGISDlg::SetLabelCategory(const long& shapeID, int fontSize /*= 12*/, unsigned long fontColor /*= RGB(255,0,0)*/, unsigned long frameBackColor /*= RGB(0,0,0)*/,
|
|
|
double XOffset/* = 0*/, double YOffset /*= 0*/)
|
|
|
{
|
|
|
if(shapeID == -1)
|
|
|
return;
|
|
|
|
|
|
CLabels labesPtr;
|
|
|
labesPtr = (m_map.GetShapefile(shapeID)).GetLabels();
|
|
|
|
|
|
CLabelCategory labelCategory = labesPtr.AddCategory(_T(""));
|
|
|
labelCategory.SetFontColor(fontColor);
|
|
|
labelCategory.SetAlignment(1);
|
|
|
labelCategory.SetOffsetX(XOffset);
|
|
|
labelCategory.SetOffsetY(YOffset);
|
|
|
labelCategory.SetFontBold(TRUE);
|
|
|
labelCategory.SetFontName(LPCTSTR("宋体"));
|
|
|
labelCategory.SetFontSize(fontSize);
|
|
|
labelCategory.SetFrameBackColor(frameBackColor);
|
|
|
labelCategory.SetFrameVisible(TRUE);
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnMove(int x, int y)
|
|
|
{
|
|
|
CBCGPDialog::OnMove(x, y);
|
|
|
|
|
|
// TODO: 在此处添加消息处理程序代码
|
|
|
CRect rc;
|
|
|
GetClientRect(&rc);
|
|
|
ClientToScreen(&rc);
|
|
|
/*if (m_pUavSelDlg1->GetSafeHwnd())
|
|
|
{
|
|
|
m_pUavSelDlg1->MoveWindow(rc.left,rc.top+10,50,50);
|
|
|
}
|
|
|
if (m_pUavSelDlg2->GetSafeHwnd())
|
|
|
{
|
|
|
m_pUavSelDlg2->MoveWindow(rc.left+rc.Width()/2-100,rc.top+10,50,50);
|
|
|
}
|
|
|
if (m_pUavSelDlg3->GetSafeHwnd())
|
|
|
{
|
|
|
m_pUavSelDlg3->MoveWindow(rc.left+rc.Width()-100,rc.top+10,50,50);
|
|
|
}*/
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
BOOL CGISDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
|
|
|
{
|
|
|
// TODO: 在此添加专用代码和/或调用基类
|
|
|
return CBCGPDialog::OnWndMsg(message, wParam, lParam, pResult);
|
|
|
}
|
|
|
|
|
|
//切换飞机
|
|
|
afx_msg LRESULT CGISDlg::OnSelUav(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//添加地标点
|
|
|
void CGISDlg::OnAddTarget()
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
/*if (m_pTargetDlg->GetSafeHwnd())
|
|
|
{
|
|
|
ReadTargetIni(false);
|
|
|
m_pTargetDlg->ShowWindow(SW_SHOW);
|
|
|
}*/
|
|
|
|
|
|
m_dlgMarker.ShowWindow(TRUE);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::ReadTargetIni(bool bDraw)
|
|
|
{
|
|
|
CString m_MapPath; //默认打开地图路径
|
|
|
char lonBuf[255];
|
|
|
char latBuf[255];
|
|
|
CString fileName = GetSoftwareCurrentDirectory() + "\\target.ini";
|
|
|
CString strTarget ;
|
|
|
for (int i = 1; i < 255 ; i++)
|
|
|
{
|
|
|
if (m_pTargetDlg)
|
|
|
{
|
|
|
m_pTargetDlg->SetExistFlag(i,false);
|
|
|
}
|
|
|
strTarget.Format("%d",i);
|
|
|
BOOL blon = GetPrivateProfileString(strTarget,"lon",0,lonBuf,20,fileName);
|
|
|
BOOL blat = GetPrivateProfileString(strTarget,"lat",0,latBuf,20,fileName);
|
|
|
if (blon&&blat)
|
|
|
{
|
|
|
double lon = atof(lonBuf);
|
|
|
double lat = atof(latBuf);
|
|
|
|
|
|
if (fabs(lon)>180.0||fabs(lat)>90.0)//数据非法,清除
|
|
|
{
|
|
|
WritePrivateProfileString(strTarget,"lon",NULL, fileName);
|
|
|
WritePrivateProfileString(strTarget,"lat",NULL, fileName);
|
|
|
WritePrivateProfileString(strTarget,"alt",NULL, fileName);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
m_targets[i-1].id = i;
|
|
|
m_targets[i-1].lon = lon;
|
|
|
m_targets[i-1].lat = lat;
|
|
|
|
|
|
if (bDraw)
|
|
|
{
|
|
|
AddTargetPoint(i,lon,lat);
|
|
|
}
|
|
|
if (m_pTargetDlg)
|
|
|
{
|
|
|
m_pTargetDlg->SetExistFlag(i,true);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_targets[i-1].id = -1;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
afx_msg LRESULT CGISDlg::OnDrawTarget(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_pTargetDlg->GetSafeHwnd())
|
|
|
{
|
|
|
int id = 0;
|
|
|
double lon = 0.0;
|
|
|
double lat = 0.0;
|
|
|
double alt = 0.0;
|
|
|
m_pTargetDlg->GetTargetLLA(id,lon,lat,alt);
|
|
|
if (id>0&&id<255)
|
|
|
{
|
|
|
m_targets[id-1].id = id;
|
|
|
m_targets[id-1].lon = lon;
|
|
|
m_targets[id-1].lat = lat;
|
|
|
}
|
|
|
|
|
|
AddTargetPoint(id,lon,lat);
|
|
|
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
void CGISDlg::OnShowWindow(BOOL bShow, UINT nStatus)
|
|
|
{
|
|
|
CBCGPDialog::OnShowWindow(bShow, nStatus);
|
|
|
|
|
|
// TODO: 在此处添加消息处理程序代码
|
|
|
if(bShow)
|
|
|
{
|
|
|
HCURSOR hCur = LoadCursor(NULL,IDC_ARROW);
|
|
|
::SetCursor(hCur);
|
|
|
CString dir = "";
|
|
|
CString fileName = GetSoftwareCurrentDirectory() + "\\map.ini";
|
|
|
::GetPrivateProfileString("map", "layer","",dir.GetBuffer(256),256, fileName);
|
|
|
dir.ReleaseBuffer(256);
|
|
|
if(!m_bHaveAddMap)
|
|
|
{
|
|
|
CFileFind fd;
|
|
|
if (fd.FindFile(dir))
|
|
|
{
|
|
|
Openlocalfile(dir);
|
|
|
}
|
|
|
fd.Close();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//ReadTargetIni(true);
|
|
|
}
|
|
|
|
|
|
//删除选中的目标点(因为不能确定图层中的点,所以采用全部删除再绘制方法)
|
|
|
void CGISDlg::OnTargetDelete()
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
CString strID = "";
|
|
|
strID.Format("%d",m_targetSelID);
|
|
|
|
|
|
CString fileName = GetSoftwareCurrentDirectory() + "\\target.ini";
|
|
|
WritePrivateProfileString(strID,"lon",NULL, fileName);
|
|
|
WritePrivateProfileString(strID,"lat",NULL, fileName);
|
|
|
WritePrivateProfileString(strID,"alt",NULL, fileName);
|
|
|
|
|
|
|
|
|
m_map.GetShapefile(m_targetDrawLayerID).EditClear();
|
|
|
m_map.GetShapefile(m_targetDrawLayerID).GetLabels().Clear();
|
|
|
ReadTargetIni(true);
|
|
|
m_map.Redraw();
|
|
|
m_targetSelID = 0;
|
|
|
}
|
|
|
|
|
|
//在地图上选点
|
|
|
afx_msg LRESULT CGISDlg::OnSendSelectTarget(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
m_bSelectDropPoint = true;
|
|
|
|
|
|
//设置鼠标为“选择”样式
|
|
|
m_map.SetCursorMode(3);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//显示标注点
|
|
|
afx_msg LRESULT CGISDlg::OnShowPointInMap(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
if (0 == m_longGroundID)
|
|
|
{
|
|
|
//基于点图层进行标注
|
|
|
AddPointShapeLayer(m_longGroundID, m_dlgLightRegion.m_dGroundLon, m_dlgLightRegion.m_dGroundLat, _T("GCS(LOS)"), _T("红色"), RGB(255,0,0));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
ClearPointShape(m_longGroundID);
|
|
|
|
|
|
m_longGroundID = 0;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//显示可视区域
|
|
|
afx_msg LRESULT CGISDlg::OnShowPointVisible(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_visbleCircleLayerID < 0)
|
|
|
{
|
|
|
m_gisManager->CreateEmptyAreaShapfile(m_visbleCircleLayerID,RGB(0,255,0),RGB(0,255,0),40); //绿色
|
|
|
}
|
|
|
|
|
|
for (int i=0;i<360;i++)
|
|
|
{
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_visbleCircleLayerID,2,g_structPointVisible[i].lon,g_structPointVisible[i].lat);
|
|
|
}
|
|
|
|
|
|
//区域面积为零时,清除该区域显示
|
|
|
if (0 == m_map.GetShapefile(m_visbleCircleLayerID).GetShape(0).GetArea())
|
|
|
{
|
|
|
m_map.GetShapefile(m_visbleCircleLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
|
|
|
/*structPoint *_structPoint = (structPoint*)wParam;
|
|
|
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_visbleCircleLayerID,2,_structPoint->lon,_structPoint->lat);*/
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//显示不可视区域
|
|
|
afx_msg LRESULT CGISDlg::OnShowPointNotVisible(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_notVisibleCircleLayerID < 0)
|
|
|
{
|
|
|
m_gisManager->CreateEmptyAreaShapfile(m_notVisibleCircleLayerID,RGB(255,0,0),RGB(255,0,0),40); //红色
|
|
|
}
|
|
|
|
|
|
for (int i=0;i<722;i++)
|
|
|
{
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_notVisibleCircleLayerID,2,g_structPointNotVisible[i].lon,g_structPointNotVisible[i].lat);
|
|
|
}
|
|
|
|
|
|
//区域面积为零时,清除该区域显示
|
|
|
if (0 == m_map.GetShapefile(m_notVisibleCircleLayerID).GetShape(0).GetArea())
|
|
|
{
|
|
|
m_map.GetShapefile(m_notVisibleCircleLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
|
|
|
/*structPoint *_structPoint = (structPoint*)wParam;
|
|
|
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_notVisibleCircleLayerID,2,_structPoint->lon,_structPoint->lat);*/
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//清除可视区域与不可视区域绘制图层
|
|
|
afx_msg LRESULT CGISDlg::OnSendClearShape(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_visbleCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_visbleCircleLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
if (m_notVisibleCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_notVisibleCircleLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//实时显示可视区域
|
|
|
afx_msg LRESULT CGISDlg::OnShowAreaVisible(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_visiRealCircleLayerID < 0)
|
|
|
{
|
|
|
m_gisManager->CreateEmptyAreaShapfile(m_visiRealCircleLayerID,RGB(0,255,0),RGB(0,255,0),40); //绿色
|
|
|
}
|
|
|
|
|
|
for (int i=0;i <= int(wParam);i++)
|
|
|
{
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_visiRealCircleLayerID,2,g_structPointVisiReal[i].lon,g_structPointVisiReal[i].lat);
|
|
|
}
|
|
|
|
|
|
//区域面积为零时,清除该区域显示
|
|
|
if (0 == m_map.GetShapefile(m_visiRealCircleLayerID).GetShape(0).GetArea())
|
|
|
{
|
|
|
m_map.GetShapefile(m_visiRealCircleLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
/*double _uavlon,_uavlat;
|
|
|
CalculatePtCoordinate(_uavlon, _uavlat, m_dlgLightRegion.m_dRealTime_GCSlon, m_dlgLightRegion.m_dRealTime_GCSlat, m_dlgLightRegion.m_dRealTime_AngToGCS, m_dlgLightRegion.m_dRealTime_DisToGCS, 3);
|
|
|
|
|
|
if (m_RealCircleLayerID < 0)
|
|
|
{
|
|
|
m_gisManager->CreateEmptyAreaShapfile(m_RealCircleLayerID,RGB(0,0,255),RGB(0,0,255),40);
|
|
|
}
|
|
|
|
|
|
double ptLon, ptLat;
|
|
|
for (int i = 0; i<=360;i++)
|
|
|
{
|
|
|
CalculatePtCoordinate(ptLon, ptLat, _uavlon, _uavlat, i, 2800, 3);
|
|
|
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_RealCircleLayerID,2,ptLon, ptLat);
|
|
|
}*/
|
|
|
|
|
|
m_map.Redraw();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//实时显示不可视区域
|
|
|
afx_msg LRESULT CGISDlg::OnShowAreaNotVisible(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_notVisiRealCircleLayerID < 0)
|
|
|
{
|
|
|
m_gisManager->CreateEmptyAreaShapfile(m_notVisiRealCircleLayerID,RGB(255,0,0),RGB(255,0,0),40); //红色
|
|
|
}
|
|
|
|
|
|
for (int i=0;i <= int(wParam);i++)
|
|
|
{
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_notVisiRealCircleLayerID,2,g_structPointNotVisiReal[i].lon,g_structPointNotVisiReal[i].lat);
|
|
|
}
|
|
|
|
|
|
//区域面积为零时,清除该区域显示
|
|
|
if (0 == m_map.GetShapefile(m_notVisiRealCircleLayerID).GetShape(0).GetArea())
|
|
|
{
|
|
|
m_map.GetShapefile(m_notVisiRealCircleLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//清除实时区域
|
|
|
afx_msg LRESULT CGISDlg::OnShowClearArea(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_visiRealCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_visiRealCircleLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
if (m_notVisiRealCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_notVisiRealCircleLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
/*if (m_RealCircleLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_RealCircleLayerID).EditClear();
|
|
|
}*/
|
|
|
|
|
|
m_map.Redraw();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//删除通视等高线图层
|
|
|
afx_msg LRESULT CGISDlg::OnDelLineLayer(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
for (int i=0;i<20;i++)
|
|
|
{
|
|
|
if (m_longContourLineID[i] > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_longContourLineID[i]).EditClear();
|
|
|
}
|
|
|
|
|
|
m_gisManager->CreateEmptyLineShapfile(m_longContourLineID[i],RGB(0,255,0),1.5); //绿色
|
|
|
|
|
|
if (m_longContourTextID[i] != 0)
|
|
|
{
|
|
|
ClearPointShape(m_longContourTextID[i]);
|
|
|
m_longContourTextID[i] = 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//添加点到通视等高线图层
|
|
|
afx_msg LRESULT CGISDlg::OnAddLineLayer(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
structPoint *_structPoint = (structPoint*)wParam;
|
|
|
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_longContourLineID[(int)lParam],1,_structPoint->lon,_structPoint->lat);
|
|
|
|
|
|
//标绘高度
|
|
|
if (m_longContourTextID[(int)lParam] == 0)
|
|
|
{
|
|
|
//标注
|
|
|
CString str;
|
|
|
str.Format(_T("%dm"), (int)lParam * 500);
|
|
|
|
|
|
//创建点图层
|
|
|
CreateEmptyShapfile(m_longContourTextID[(int)lParam], 0, RGB(255,0,0)); //红色
|
|
|
|
|
|
//Label集合
|
|
|
CLabels labesPtr;
|
|
|
labesPtr = (m_map.GetShapefile(m_longContourTextID[(int)lParam])).GetLabels();
|
|
|
|
|
|
CLabelCategory labelCategory = labesPtr.AddCategory(_T("红色"));
|
|
|
labelCategory.SetFontColor(RGB(255,0,0));
|
|
|
labelCategory.SetAlignment(1);
|
|
|
labelCategory.SetFontBold(TRUE);
|
|
|
labelCategory.SetFontName(_T("宋体"));
|
|
|
labelCategory.SetFontSize(11);
|
|
|
|
|
|
labesPtr.AddLabel(str, _structPoint->lon, _structPoint->lat + 0.0005, 0, 0);
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//可视域分析到GIS对话框的消息响应函数
|
|
|
afx_msg LRESULT CGISDlg::OnSendRegionToGis(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (1 == (int)wParam)
|
|
|
{
|
|
|
g_bSelectDropPoint = true;
|
|
|
|
|
|
//设置鼠标为“选择”样式
|
|
|
m_map.SetCursorMode(3);
|
|
|
}
|
|
|
else if (2 == (int)wParam)
|
|
|
{
|
|
|
if (m_longSelectLineID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_longSelectLineID).EditClear();
|
|
|
}
|
|
|
|
|
|
if (m_longLabelPlotID != 0)
|
|
|
{
|
|
|
ClearPointShape(m_longLabelPlotID);
|
|
|
m_longLabelPlotID = 0;
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
else if (3 == (int)wParam)
|
|
|
{
|
|
|
structPoint *_structPoint = (structPoint*)lParam;
|
|
|
|
|
|
if (m_longSelectLineID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_longSelectLineID).EditClear();
|
|
|
}
|
|
|
|
|
|
m_gisManager->CreateEmptyLineShapfile(m_longSelectLineID,RGB(0,255,0),2);
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_longSelectLineID,1,m_dlgLightRegion.m_dGroundLon,m_dlgLightRegion.m_dGroundLat);
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_longSelectLineID,1,_structPoint->lon,_structPoint->lat);
|
|
|
|
|
|
double _distance = 0.0, _angle = 0.0;
|
|
|
CalculateTwoPtsDistanceAzimuth(_distance, _angle, m_dlgLightRegion.m_dGroundLon,m_dlgLightRegion.m_dGroundLat,_structPoint->lon,_structPoint->lat, 3);
|
|
|
|
|
|
CString str;
|
|
|
str.Format(_T("D:%.1fkm A:%.1f°"), _distance/1000, _angle);
|
|
|
|
|
|
if (m_longLabelPlotID != 0)
|
|
|
{
|
|
|
ClearPointShape(m_longLabelPlotID);
|
|
|
m_longLabelPlotID = 0;
|
|
|
}
|
|
|
//标注距离和方位
|
|
|
AddPointShapeLayer(m_longLabelPlotID,_structPoint->lon,_structPoint->lat, str, _T("红色"), RGB(255,0,0));
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//标绘航线上的点
|
|
|
afx_msg LRESULT CGISDlg::OnDrawLinePoint(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_longLinePointID > 0)
|
|
|
{
|
|
|
ClearPointShape(m_longLinePointID);
|
|
|
|
|
|
m_longLinePointID = 0;
|
|
|
}
|
|
|
|
|
|
if (1 == (int)lParam)
|
|
|
{
|
|
|
structPoint *_structPoint = (structPoint*)wParam;
|
|
|
|
|
|
//基于点图层进行标注
|
|
|
AddPointShapeLayer(m_longLinePointID, _structPoint->lon, _structPoint->lat, _T("Pt"), _T("红色"), RGB(255,0,0));
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//显示实时碰撞检测区域
|
|
|
afx_msg LRESULT CGISDlg::OnShowCrashArea(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (1 == (int)wParam)
|
|
|
{
|
|
|
if (m_crashAreaLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_crashAreaLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
m_gisManager->CreateEmptyAreaShapfile(m_crashAreaLayerID,RGB(0,255,0),RGB(0,255,0),40); //绿色
|
|
|
|
|
|
for (int i=0;i < 360;i++)
|
|
|
{
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_crashAreaLayerID,2,g_structPointCrashReal[i].lon,g_structPointCrashReal[i].lat);
|
|
|
}
|
|
|
|
|
|
//区域面积为零时,清除该区域显示
|
|
|
if (0 == m_map.GetShapefile(m_crashAreaLayerID).GetShape(0).GetArea())
|
|
|
{
|
|
|
m_map.GetShapefile(m_crashAreaLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
else if (0 == (int)wParam)
|
|
|
{
|
|
|
if (m_crashAreaLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_crashAreaLayerID).EditClear();
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//绘制作用范围
|
|
|
afx_msg LRESULT CGISDlg::OnSendDrawFight(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_fightRegionLayerID > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_fightRegionLayerID).EditClear();
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
if (0 == (int)lParam)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
m_gisManager->CreateEmptyAreaShapfile(m_fightRegionLayerID,RGB(0,255,0),RGB(0,255,0),20);
|
|
|
|
|
|
structPoint *_structPoint = (structPoint*)wParam;
|
|
|
|
|
|
double ptLon,ptLat;
|
|
|
for (int i=0;i<=360;i++)
|
|
|
{
|
|
|
CalculatePtCoordinate(ptLon, ptLat, _structPoint->lon, _structPoint->lat, i, (int)lParam, 3);
|
|
|
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_fightRegionLayerID,2,ptLon, ptLat);
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//绘制高程区域
|
|
|
afx_msg LRESULT CGISDlg::OnSendDrawDemRegion(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (m_DemRegionLayerID[(int)lParam] > 0)
|
|
|
{
|
|
|
m_map.GetShapefile(m_DemRegionLayerID[(int)lParam]).EditClear();
|
|
|
|
|
|
m_DemRegionLayerID[(int)lParam] = -1;
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_gisManager->CreateEmptyAreaShapfile(m_DemRegionLayerID[(int)lParam],RGB(0,0,255),RGB(0,0,255),20);
|
|
|
|
|
|
structPoint *_structPoint = (structPoint*)wParam;
|
|
|
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon, _structPoint->lat);
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon + 1, _structPoint->lat);
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon + 1, _structPoint->lat+1);
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon, _structPoint->lat+1);
|
|
|
m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon, _structPoint->lat);
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//在线地图定位
|
|
|
afx_msg LRESULT CGISDlg::OnZoomToLocation(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//double lon = (double)wParam/1000000;
|
|
|
//double lat = (double)lParam/1000000;
|
|
|
double* lon = (double*)wParam;
|
|
|
double* lat = (double*)lParam;
|
|
|
ZoomToLocation(*lon,*lat);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
// 右键菜单-高程分析-高程分析
|
|
|
void CGISDlg::OnMenuLightRegion()
|
|
|
{
|
|
|
/*if (m_dlgLightRegion.GetSafeHwnd())
|
|
|
{
|
|
|
m_dlgLightRegion.ShowWindow(TRUE);
|
|
|
}*/
|
|
|
if(!m_bHaveAddMap){
|
|
|
AfxMessageBox( _T( "请先加载地图!"));
|
|
|
return;
|
|
|
}
|
|
|
g_bDemAnalysising = true;
|
|
|
g_iDemPointNum = 0;
|
|
|
}
|
|
|
|
|
|
//关闭高程分析对话框时
|
|
|
afx_msg LRESULT CGISDlg::OnSendCloseDemAlt(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//清除高程分析图层
|
|
|
for (int i=0;i<g_iDemAltPtNum;i++)
|
|
|
{
|
|
|
m_map.RemoveLayer(g_lDemAltLayerID[i]);
|
|
|
if (g_lDemAltDisLayerID[i] > 0)
|
|
|
{
|
|
|
//清除标绘的点矢量图层
|
|
|
ClearPointShape(g_lDemAltDisLayerID[i]);
|
|
|
g_lDemAltDisLayerID[i] = -1;
|
|
|
}
|
|
|
|
|
|
if (g_lDemPtNumLayerID[i] > 0)
|
|
|
{
|
|
|
//清除标绘的点矢量图层
|
|
|
ClearPointShape(g_lDemPtNumLayerID[i]);
|
|
|
g_lDemPtNumLayerID[i] = -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//航点切入
|
|
|
void CGISDlg::OnMenuEntryPoint()
|
|
|
{
|
|
|
m_struMapOut.cmd = MapCmd_EntryPoint;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
//标绘高程区域
|
|
|
void CGISDlg::OnMenuPlotdemArea()
|
|
|
{
|
|
|
if (m_dlgLightRegion.GetSafeHwnd())
|
|
|
{
|
|
|
m_dlgLightRegion.OnBnClickedButtonGetDemRegion();
|
|
|
}
|
|
|
|
|
|
m_bPlotDemArea = !m_bPlotDemArea;
|
|
|
}
|
|
|
|
|
|
//功能:改变CursorMode
|
|
|
afx_msg LRESULT CGISDlg::OnSetMapCursorMode(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
m_map.SetCursorMode((long)wParam);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//功能:显示或隐藏标记点
|
|
|
afx_msg LRESULT CGISDlg::OnDrawMarker(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (int(lParam) == 1) //隐藏标记点
|
|
|
{
|
|
|
if (g_lMarkerLayerID[(int)wParam] >= 0)
|
|
|
{
|
|
|
ClearPointShape(g_lMarkerLayerID[(int)wParam]);
|
|
|
g_lMarkerLayerID[(int)wParam] = -1;
|
|
|
}
|
|
|
|
|
|
g_bMarkerPlot[(int)wParam] = false;
|
|
|
}
|
|
|
else //显示标记点
|
|
|
{
|
|
|
if (g_lMarkerLayerID[(int)wParam] >= 0)
|
|
|
{
|
|
|
ClearPointShape(g_lMarkerLayerID[(int)wParam]);
|
|
|
g_lMarkerLayerID[(int)wParam] = -1;
|
|
|
}
|
|
|
|
|
|
//基于点图层进行标注
|
|
|
AddPointShapeLayer(g_lMarkerLayerID[(int)wParam], g_iMarkerLon[(int)wParam], g_iMarkerLat[(int)wParam], g_iMarkerName[(int)wParam], _T(""), RGB(255,0,0));
|
|
|
|
|
|
g_bMarkerPlot[(int)wParam] = true;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//清除地面站标绘
|
|
|
void CGISDlg::OnMenuClearGCS()
|
|
|
{
|
|
|
if (m_gcsPtShpLayerID != -1)
|
|
|
{
|
|
|
ClearPointShape(m_gcsPtShpLayerID);
|
|
|
m_gcsPtShpLayerID = -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//是否显示ADS飞机信息
|
|
|
void CGISDlg::OnMenuADSB()
|
|
|
{
|
|
|
m_bEnableShowADSB = !m_bEnableShowADSB;
|
|
|
}
|
|
|
|
|
|
//绘制无人机
|
|
|
LRESULT CGISDlg::OnTimerDrawUAV(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//未加载地图,返回
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
if (!m_bEnableShowADSB)
|
|
|
{
|
|
|
//清除所有ADS飞机的标绘图层
|
|
|
for(int i=0;i<MAX_PLANE_NUM_ADS;i++)
|
|
|
{
|
|
|
if (m_UAVFlyTrackLayerID_ADS[i] != -1)
|
|
|
{
|
|
|
//m_map.ClearLabels(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
//m_map.ClearDrawing(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
m_map.RemoveLayer(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
m_UAVFlyTrackLayerID_ADS[i] = -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
if (m_iTotalADSnum <= 0)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
if (m_iCurrentADSid < (m_iTotalADSnum - 1))
|
|
|
{
|
|
|
m_iCurrentADSid++;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_iCurrentADSid = 0;
|
|
|
}
|
|
|
|
|
|
static int _ADSidRecord = 0;
|
|
|
|
|
|
_ADSidRecord = m_iCurrentADSid;
|
|
|
|
|
|
//while循环,直至某个ADS飞机标绘状态为要标绘,结束循环
|
|
|
while (m_bWithin100km_ADS[m_iCurrentADSid] == false)
|
|
|
{
|
|
|
//清除ADS飞机机体标绘
|
|
|
if (m_UAVFlyTrackLayerID_ADS[m_iCurrentADSid] != -1)
|
|
|
{
|
|
|
//m_map.ClearLabels(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
//m_map.ClearDrawing(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
m_map.RemoveLayer(m_UAVFlyTrackLayerID_ADS[m_iCurrentADSid]);
|
|
|
m_UAVFlyTrackLayerID_ADS[m_iCurrentADSid] = -1;
|
|
|
}
|
|
|
|
|
|
TRACE("Remove: %d/%d\n", m_iCurrentADSid, _ADSidRecord);
|
|
|
|
|
|
if (m_iCurrentADSid < (m_iTotalADSnum - 1))
|
|
|
{
|
|
|
m_iCurrentADSid++;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_iCurrentADSid = 0;
|
|
|
}
|
|
|
|
|
|
//若再次循环到自身时,结束循环
|
|
|
if (m_iCurrentADSid == _ADSidRecord)
|
|
|
{
|
|
|
TRACE("return");
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
TRACE("ID: %d/%d\n", m_iCurrentADSid, m_iTotalADSnum);
|
|
|
|
|
|
if (m_UAVFlyTrackLayerID_ADS[m_iCurrentADSid] != -1) //已经标绘了机体
|
|
|
{
|
|
|
//m_map.ClearLabels(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
//m_map.ClearDrawing(m_UAVFlyTrackLayerID_ADS[i]);
|
|
|
m_map.RemoveLayer(m_UAVFlyTrackLayerID_ADS[m_iCurrentADSid]);
|
|
|
m_UAVFlyTrackLayerID_ADS[m_iCurrentADSid] = -1;
|
|
|
}
|
|
|
|
|
|
//创建无人机机体标绘图层
|
|
|
CreateEmptyShapfile(m_UAVFlyTrackLayerID_ADS[m_iCurrentADSid], 2, RGB(0,255,0));
|
|
|
|
|
|
//计算标绘无人机面图层的点数组
|
|
|
CalculateUAVPolygonCoordinate_ADS(m_dLon_ADS[m_iCurrentADSid], m_dLat_ADS[m_iCurrentADSid], m_dYaw_ADS[m_iCurrentADSid]);
|
|
|
|
|
|
//绘制新的无人机shp
|
|
|
for (int i=0; i<m_ptNum; i++)
|
|
|
{
|
|
|
AddOnePoint2Shapfile(m_UAVFlyTrackLayerID_ADS[m_iCurrentADSid], 2, m_ppUavPtArray_ADS[i][0], m_ppUavPtArray_ADS[i][1]);
|
|
|
}
|
|
|
|
|
|
//Label集合
|
|
|
CLabels labesPtr;
|
|
|
labesPtr = (m_map.GetShapefile(m_UAVFlyTrackLayerID_ADS[m_iCurrentADSid])).GetLabels();
|
|
|
|
|
|
//设置标注太近时是否自动隐藏
|
|
|
labesPtr.SetAvoidCollisions(FALSE);
|
|
|
|
|
|
CLabelCategory labelCategory = labesPtr.AddCategory(m_strColor_ADS[m_iCurrentADSid]);
|
|
|
labelCategory.SetFontColor(m_fontColor_ADS[m_iCurrentADSid]);
|
|
|
labelCategory.SetAlignment(1);
|
|
|
//labelCategory.SetFontBold(TRUE);
|
|
|
labelCategory.SetFontName(LPCTSTR("微软雅黑"));
|
|
|
labelCategory.SetFontSize(8);
|
|
|
|
|
|
//增加Labels
|
|
|
labesPtr.AddLabel((LPCTSTR)m_strPlaneName_ADS[m_iCurrentADSid], m_dLon_ADS[m_iCurrentADSid], m_dLat_ADS[m_iCurrentADSid], 0, 0);
|
|
|
|
|
|
//重绘
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
|
|
|
/*************************************by wu 2023.10.10**********************************************/
|
|
|
//功能:标注空投点
|
|
|
LRESULT CGISDlg::OnDrawKTPoint(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
//没有加载地图,返回
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
double* lon = (double*) wParam;
|
|
|
double* lat = (double*) lParam;
|
|
|
|
|
|
CString strLon,strLat;
|
|
|
strLon.Format(_T("%.7f"),*lon);
|
|
|
strLat.Format(_T("%.7f"),*lat);
|
|
|
|
|
|
AddPointShapeLayer(m_KTPtShpLayerID, *lon, *lat, (strLon+", "+strLat), _T(""), RGB(255,0,0));
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//功能:清除空投点
|
|
|
LRESULT CGISDlg::OnClearKTPoint(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
ClearPointShape(m_KTPtShpLayerID);
|
|
|
m_KTPtShpLayerID = -1;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//功能:显示空投航线
|
|
|
LRESULT CGISDlg::OnShowKTLine(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
CString path = (char*)wParam;
|
|
|
OnShowGivenLine(path);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//功能:显示/关闭空投航线
|
|
|
LRESULT CGISDlg::OnShowKTLine6(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
OnShowLine6();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//功能:装订空投航线
|
|
|
LRESULT CGISDlg::OnBindKTLine(WPARAM wParam, LPARAM lParam) //发送给主程序装订航线2
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=6;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
//::PostMessage(m_MsgHwnd,m_LineLoadMsgID,2,0);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//功能:装订应急点
|
|
|
LRESULT CGISDlg::OnBindEPPoint(WPARAM wParam, LPARAM lParam) //发送给主程序装订航线2
|
|
|
{
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=15;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
//::PostMessage(m_MsgHwnd,m_LineLoadMsgID,2,0);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/* 功能:获取有风险的地形点
|
|
|
* 参数:alt[in] 高度阈值
|
|
|
* vec_alt[out] 超出阈值的高度值
|
|
|
vec_lon[out] 经度
|
|
|
vec_lat[out] 纬度
|
|
|
*/
|
|
|
void CGISDlg::GetDangerousTerrainPoints(double pts[][2],int pointNum,long alt,vector<double>& vec_alt,vector<double>& vec_lon,vector<double>& vec_lat)
|
|
|
{
|
|
|
//获取地形栅格数
|
|
|
mapWindow::IGridHeaderPtr gridHeaderPtr = m_mapElevation.m_grid->GetHeader();
|
|
|
int n_gridrow = gridHeaderPtr->NumberRows;
|
|
|
int n_gridcol = gridHeaderPtr->NumberCols;
|
|
|
|
|
|
//将经纬度坐标转化为栅格行列号
|
|
|
vector<int> pts_row,pts_col;
|
|
|
TransformToXY(pts,pointNum,pts_row,pts_col);
|
|
|
//线栅格化
|
|
|
VectorToRaster vectorToRaster;
|
|
|
set<vector<int> > resultSet = vectorToRaster.GetRasterLineEx(pts_row,pts_col,n_gridrow-1,n_gridcol-1,1);
|
|
|
|
|
|
double lat,lon;
|
|
|
//提取危险点
|
|
|
for (auto it = resultSet.begin();it!=resultSet.end();it++)
|
|
|
{
|
|
|
vector<int> pt = *it;
|
|
|
int altValue = m_mapElevation.m_grid->GetValue(pt.at(1),pt.at(0));
|
|
|
if (altValue>=alt) //危险点保存
|
|
|
{
|
|
|
vec_alt.push_back(altValue);
|
|
|
//转化为经纬度
|
|
|
m_mapElevation.m_grid->CellToProj(pt.at(1),pt.at(0),&lon,&lat);
|
|
|
vec_lon.push_back(lon);
|
|
|
vec_lat.push_back(lat);
|
|
|
//int i = 0;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//标绘危险地形点
|
|
|
int CGISDlg::DrawDangerousTerrainPoints(double pts[][2],int pointNum,long alt)
|
|
|
{
|
|
|
/*
|
|
|
double lon[] = {119.711715,119.738307,119.738553,119.711715};
|
|
|
double lat[] = {32.201856,32.239036,32.178465,32.141285};
|
|
|
double pts[6][2];
|
|
|
long shpPointLayerID = -1;
|
|
|
long shpLineLayerID = -1;
|
|
|
//vector<double> vec_lon,vec_lat;
|
|
|
for(int i=0;i<4;i++)
|
|
|
{
|
|
|
pts[i][0] = lon[i];
|
|
|
pts[i][1] = lat[i];
|
|
|
}
|
|
|
*/
|
|
|
|
|
|
if(!m_mapElevation.m_isAdd)
|
|
|
{
|
|
|
//BCGPMessageBox("未添加高程信息,无法判断当前回收航线是否安全!");
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
vector<double> vec_alt;
|
|
|
vector<double> vec_lon;
|
|
|
vector<double> vec_lat;
|
|
|
GetDangerousTerrainPoints(pts,pointNum,alt,vec_alt, vec_lon, vec_lat);
|
|
|
|
|
|
if (vec_alt.size()==0)
|
|
|
{
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
//新建临时标绘图层
|
|
|
if (m_tempTerrainPointsLayerID==-1)
|
|
|
{
|
|
|
m_tempTerrainPointsLayerID = m_map.NewDrawing(1);
|
|
|
}
|
|
|
//m_map.SetShapePointType(m_tempLayerID,0,mapWindow::tkPointType::ptTriangleUp);
|
|
|
m_map.SetShapeLayerPointType(m_tempTerrainPointsLayerID,mapWindow::tkPointType::ptTriangleUp);
|
|
|
CLabels labels = m_map.GetDrawingLabels(m_tempTerrainPointsLayerID);
|
|
|
//labels.SetAutoOffset(true);
|
|
|
labels.SetFontColor(RGB(0,255,0));
|
|
|
labels.SetFontSize(8);
|
|
|
labels.SetFontBold(true);
|
|
|
labels.SetOffsetY(-10);
|
|
|
|
|
|
for (int i=0;i<vec_lon.size();i++)
|
|
|
{
|
|
|
/*
|
|
|
std::stringstream stream;
|
|
|
stream << std::setprecision(2) << vec_alt.at(i);
|
|
|
std::string alt = stream.str();
|
|
|
labels.AddLabel(alt.c_str(),vec_lon.at(i),vec_lat.at(i),0,0);
|
|
|
*/
|
|
|
m_map.DrawPointEx(m_tempTerrainPointsLayerID,vec_lon.at(i),vec_lat.at(i),8,RGB(255,0,0));
|
|
|
//m_map.DrawCircleEx(m_tempLayerID,vec_lon.at(i),vec_lat.at(i),3,RGB(255,0,0),true);
|
|
|
}
|
|
|
m_map.Redraw();
|
|
|
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
//清除危险地形点
|
|
|
void CGISDlg::ClearDangerousTerrainPoints()
|
|
|
{
|
|
|
if (m_tempTerrainPointsLayerID!=-1)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_tempTerrainPointsLayerID);
|
|
|
m_tempTerrainPointsLayerID = -1;
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 绘制临时线
|
|
|
void CGISDlg::DrawTempLine(double m_Pts[][2],int pointNum)
|
|
|
{
|
|
|
//int pointNum = 6;
|
|
|
PtStruct pts[128];
|
|
|
PtStruct linePts[128];
|
|
|
for(int i=0;i<pointNum;i++)
|
|
|
{
|
|
|
pts[i].dX = m_Pts[i][0];
|
|
|
pts[i].dY = m_Pts[i][1];
|
|
|
|
|
|
linePts[i].dX = m_Pts[i][0];
|
|
|
linePts[i].dY = m_Pts[i][1];
|
|
|
}
|
|
|
linePts[pointNum].dX = m_Pts[0][0];
|
|
|
linePts[pointNum].dY = m_Pts[0][1];
|
|
|
|
|
|
//目标标绘SHP图层
|
|
|
if(m_tempshpPointLayerID == -1)
|
|
|
{
|
|
|
CreateEmptyShapfile(m_tempshpPointLayerID,0,LineClr[10]);
|
|
|
}
|
|
|
AddPoints2PointShapfile(m_tempshpPointLayerID,pts,pointNum);
|
|
|
|
|
|
//目标标绘SHP图层
|
|
|
if(m_tempshpLineLayerID == -1)
|
|
|
{
|
|
|
CreateEmptyShapfile(m_tempshpLineLayerID,1,LineClr[10]);
|
|
|
}
|
|
|
AddPoints2LineShapfile(m_tempshpLineLayerID,linePts,pointNum+1);
|
|
|
|
|
|
//Label集合
|
|
|
CLabels labesPtr;
|
|
|
labesPtr = m_map.GetShapefile(m_tempshpLineLayerID).GetLabels();
|
|
|
|
|
|
CLabelCategory labelCategory = labesPtr.AddCategory(_T("红色"));
|
|
|
labelCategory.SetFontColor(/*RGB(255,0,0)*/LineClr[10]);
|
|
|
labelCategory.SetAlignment(1);
|
|
|
labelCategory.SetFontBold(TRUE);
|
|
|
labelCategory.SetFontName(LPCTSTR("黑体"));
|
|
|
labelCategory.SetFontSize(12);
|
|
|
labesPtr.SetAvoidCollisions(FALSE);
|
|
|
|
|
|
CString strText = _T("");
|
|
|
//标绘航点的名称
|
|
|
for (long i=0; i<pointNum; i++)
|
|
|
{
|
|
|
//标注信息
|
|
|
//strText.Format(_T("%d-%d"), lineData.lineID, lineData.pts[i].nPt);
|
|
|
strText.Format(_T("%d"), i+1);
|
|
|
//增加Labels
|
|
|
labesPtr.AddLabel((LPCTSTR)strText, pts[i].dX, pts[i].dY, 0, 0);
|
|
|
}
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
//绘制选中高亮图层
|
|
|
void CGISDlg::DrawHighLightLine(const PtStruct *pts, const int ptNum)
|
|
|
{
|
|
|
if (m_highLightLineLayerID==-1)
|
|
|
{
|
|
|
//目标标绘SHP图层
|
|
|
mapWindow::IShapefilePtr targetPtShape;
|
|
|
targetPtShape.CreateInstance("MapWinGIS.Shapefile");
|
|
|
|
|
|
targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::SHP_POLYLINE);
|
|
|
//目标标绘图层加入地图中
|
|
|
m_highLightLineLayerID = m_map.AddLayer(targetPtShape, true);
|
|
|
|
|
|
mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption;
|
|
|
pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions");
|
|
|
|
|
|
pShapeDrawingOption->LineColor = RGB(242,155,41);
|
|
|
pShapeDrawingOption->LineWidth = 2;
|
|
|
|
|
|
(m_map.GetShapefile(m_highLightLineLayerID)).SetDefaultDrawingOptions(pShapeDrawingOption);
|
|
|
}
|
|
|
|
|
|
AddPoints2LineShapfile(m_highLightLineLayerID,pts,ptNum);
|
|
|
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
|
|
|
//清除临时线
|
|
|
void CGISDlg::ClearTempLine()
|
|
|
{
|
|
|
if (m_tempshpPointLayerID!=-1)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_tempshpPointLayerID);
|
|
|
m_tempshpPointLayerID = -1;
|
|
|
m_map.GetShapefile(m_tempshpPointLayerID).Close();
|
|
|
}
|
|
|
|
|
|
if(m_tempshpLineLayerID!=-1)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_tempshpLineLayerID);
|
|
|
m_tempshpLineLayerID = -1;
|
|
|
m_map.GetShapefile(m_tempshpLineLayerID).Close();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//清除高亮线
|
|
|
void CGISDlg::ClearHighLightLine()
|
|
|
{
|
|
|
if (m_highLightLineLayerID!=-1)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_highLightLineLayerID);
|
|
|
m_highLightLineLayerID = -1;
|
|
|
m_map.GetShapefile(m_highLightLineLayerID).Close();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//转化为Grid坐标
|
|
|
void CGISDlg::TransformToXY(double pts[][2],int pointNum,vector<int>& ptsRow,vector<int>& ptsCol)
|
|
|
{
|
|
|
mapWindow::IGridHeaderPtr gridHeaderPtr = m_mapElevation.m_grid->GetHeader();
|
|
|
int n_gridrow = gridHeaderPtr->NumberRows;
|
|
|
int n_gridcol = gridHeaderPtr->NumberCols;
|
|
|
|
|
|
long col1[1],col2[1],col3[1],col4[1];
|
|
|
long row1[1],row2[1],row3[1],row4[1];
|
|
|
long col,row;
|
|
|
for (int i=0;i<pointNum;i++)
|
|
|
{
|
|
|
m_mapElevation.m_grid->ProjToCell(pts[i][0],pts[i][1],&col,&row);
|
|
|
ptsRow.push_back(row);
|
|
|
ptsCol.push_back(col);
|
|
|
i;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//提取坐标点集
|
|
|
void CGISDlg::TransformToVectorPoints(DrawLineDataStruct lineDataGroup,vector<double>& lineX,vector<double>& lineY)
|
|
|
{
|
|
|
|
|
|
for (int i=0;i<lineDataGroup.linePointNum;i++)
|
|
|
{
|
|
|
lineX.push_back(lineDataGroup.linePts[i].dX);
|
|
|
lineY.push_back(lineDataGroup.linePts[i].dY);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//剪断线
|
|
|
void CGISDlg::AddPointInLine(int ptPos,double* pt,DrawLineDataStruct& editLineDataGroup)
|
|
|
{
|
|
|
// 修改线段结构
|
|
|
int lineNum = editLineDataGroup.linePointNum;
|
|
|
editLineDataGroup.linePointNum = editLineDataGroup.linePointNum + 1;
|
|
|
for (int i=lineNum;i>ptPos;i--) //往后移动数组一位
|
|
|
{
|
|
|
editLineDataGroup.linePts[i] = editLineDataGroup.linePts[i-1];
|
|
|
editLineDataGroup.linePts[i].nPt = editLineDataGroup.linePts[i].nPt + 1; //修改航点号
|
|
|
}
|
|
|
//修改插入点数据
|
|
|
editLineDataGroup.linePts[ptPos].dX = pt[0];
|
|
|
editLineDataGroup.linePts[ptPos].dY = pt[1];
|
|
|
editLineDataGroup.linePts[ptPos].nPt = ptPos+1; //修改航点号
|
|
|
//重新修订尾点航点号
|
|
|
editLineDataGroup.linePts[editLineDataGroup.linePointNum-1].nPt = 1;
|
|
|
//复制其他属性信息
|
|
|
editLineDataGroup.linePts[ptPos].nL = editLineDataGroup.lineID;
|
|
|
editLineDataGroup.linePts[ptPos].nH = editLineDataGroup.linePts[ptPos-1].nH;
|
|
|
|
|
|
//修改点集结构
|
|
|
int ptNum = editLineDataGroup.pointNum;
|
|
|
editLineDataGroup.pointNum = editLineDataGroup.pointNum + 1;
|
|
|
for (int j=ptNum;j>ptPos;j--) //移动点集数组
|
|
|
{
|
|
|
editLineDataGroup.pts[j] = editLineDataGroup.pts[j-1];
|
|
|
editLineDataGroup.pts[j].nPt = editLineDataGroup.pts[j].nPt + 1; //修改航点号
|
|
|
}
|
|
|
//修改插入点数据
|
|
|
editLineDataGroup.pts[ptPos].dX = pt[0];
|
|
|
editLineDataGroup.pts[ptPos].dY = pt[1];
|
|
|
editLineDataGroup.pts[ptPos].nPt = ptPos + 1; //修改航点号
|
|
|
//复制其他属性信息
|
|
|
editLineDataGroup.pts[ptPos].nL = editLineDataGroup.lineID;
|
|
|
editLineDataGroup.pts[ptPos].nH = editLineDataGroup.pts[ptPos-1].nH;
|
|
|
}
|
|
|
|
|
|
//数组中删除点
|
|
|
bool CGISDlg::RemovePointInLine(int ptPos,DrawLineDataStruct& backLineDataGroup)
|
|
|
{
|
|
|
if (backLineDataGroup.pointNum<=2) //直线不能再删节点
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
// 修改线段结构
|
|
|
int lineNum = backLineDataGroup.linePointNum;
|
|
|
backLineDataGroup.linePointNum = backLineDataGroup.linePointNum - 1;
|
|
|
for (int i=ptPos;i<lineNum-2;i++) //移动线段数组
|
|
|
{
|
|
|
backLineDataGroup.linePts[i] = backLineDataGroup.linePts[i+1];
|
|
|
backLineDataGroup.linePts[i].nPt = backLineDataGroup.linePts[i].nPt -1; //修改航点号
|
|
|
}
|
|
|
if (backLineDataGroup.linePointNum==3) //变成直线,不用连接首尾点
|
|
|
{
|
|
|
backLineDataGroup.linePointNum = 2;
|
|
|
}
|
|
|
else //首尾点连接
|
|
|
{
|
|
|
if (backLineDataGroup.pts[lineNum-2].ch1!=2) //闭合航线
|
|
|
{
|
|
|
backLineDataGroup.linePts[backLineDataGroup.linePointNum-1] = backLineDataGroup.linePts[0];
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//修改点集结构
|
|
|
int ptNum = backLineDataGroup.pointNum;
|
|
|
backLineDataGroup.pointNum = backLineDataGroup.pointNum - 1;
|
|
|
for (int j=ptPos;j<ptNum-1;j++) //移动点集数组
|
|
|
{
|
|
|
backLineDataGroup.pts[j] = backLineDataGroup.pts[j+1];
|
|
|
backLineDataGroup.pts[j].nPt = backLineDataGroup.pts[j].nPt - 1; //修改航点号
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
// 是否选中线要素,若选中返回航线编号,否则返回-1
|
|
|
int CGISDlg::IsSelectLine(double* pt)
|
|
|
{
|
|
|
float tolerance = 0.001;
|
|
|
//平板模式增大选中触发范围
|
|
|
if (g_b981APad)
|
|
|
{
|
|
|
tolerance = 0.003;
|
|
|
}
|
|
|
if (m_ShowedLineDataList.size()==0)
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
for(auto i=m_ShowedLineDataList.begin();i!=m_ShowedLineDataList.end();i++)
|
|
|
{
|
|
|
//cout<<"键="<<i->first<<" 值="<<i->second<<endl;
|
|
|
std::vector<double> lineX,lineY;
|
|
|
DrawLineDataStruct lineData = i->second;
|
|
|
TransformToVectorPoints(lineData,lineX,lineY);
|
|
|
if(topologicalAnalysis.isPointInPolyLine(pt,lineX,lineY,tolerance))
|
|
|
{
|
|
|
return lineData.lineID;
|
|
|
};
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
/**************************************************************************************************/
|
|
|
|
|
|
//编辑航线时,显示航点设置对话框
|
|
|
void CGISDlg::ShowModifyPointDlg(int selectedPointID)
|
|
|
{
|
|
|
if (!m_bEditLine)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
CModifyLinePointDlg dlg;
|
|
|
dlg.m_editLineDataGroup = m_editLineDataGroup;
|
|
|
dlg.SetSelectedPointID(selectedPointID);
|
|
|
if (m_lineSelectedID!=11) //非回收航线,隐藏设置盘旋点
|
|
|
{
|
|
|
dlg.SetCirclingPointRBTNVisible(false);
|
|
|
}
|
|
|
dlg.SetLonLat(m_editLineDataGroup.pts[selectedPointID].dX,m_editLineDataGroup.pts[selectedPointID].dY);
|
|
|
if (circlingPointID == selectedPointID) //选中盘旋点,设置按钮选中
|
|
|
{
|
|
|
dlg.CheckedCirclingPoint();
|
|
|
}
|
|
|
if (dlg.DoModal() == IDOK)
|
|
|
{
|
|
|
double targetLat,targetLon;
|
|
|
int pointID;
|
|
|
dlg.GetLonLat(targetLon,targetLat,pointID);
|
|
|
//bool bb = dlg.IsCirclingPoint();
|
|
|
if (m_lineSelectedID==11) //回收航线
|
|
|
{
|
|
|
if (circlingPointID == selectedPointID) //对已经是盘旋点进行重新设置
|
|
|
{
|
|
|
if (!dlg.IsCirclingPoint()) //存储盘旋点
|
|
|
{
|
|
|
circlingPointID = -1;
|
|
|
}
|
|
|
}
|
|
|
if (dlg.IsCirclingPoint()) //存储盘旋点
|
|
|
{
|
|
|
circlingPointID = selectedPointID;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//修改点坐标
|
|
|
m_editLineDataGroup.pts[pointID-1].dX = targetLon;
|
|
|
m_editLineDataGroup.pts[pointID-1].dY = targetLat;
|
|
|
|
|
|
//修改线坐标
|
|
|
m_editLineDataGroup.linePts[pointID-1].dX = targetLon;
|
|
|
m_editLineDataGroup.linePts[pointID-1].dY = targetLat;
|
|
|
if(pointID==m_editLineDataGroup.linePointNum-1 && m_editLineDataGroup.linePts[m_editLineDataGroup.linePointNum-1].ch1==2){
|
|
|
// 如果修改的是最后一个航点且为不闭合航线
|
|
|
m_editLineDataGroup.linePts[pointID].dX = targetLon;
|
|
|
m_editLineDataGroup.linePts[pointID].dY = targetLat;
|
|
|
}
|
|
|
if (pointID==1 && m_editLineDataGroup.linePts[m_editLineDataGroup.linePointNum-1].ch1==0)
|
|
|
{ // 如果修改的是首个航点且为闭合航线
|
|
|
m_editLineDataGroup.linePts[m_editLineDataGroup.linePointNum-1].dX = targetLon;
|
|
|
m_editLineDataGroup.linePts[m_editLineDataGroup.linePointNum-1].dY = targetLat;
|
|
|
} //m_editLineDataGroup.linePts[0]->ch1==2 不闭合 0->闭合
|
|
|
|
|
|
if (m_distLabelLayer!=-1)
|
|
|
{
|
|
|
m_map.ClearDrawing(m_distLabelLayer);//清除距离和方位角标绘
|
|
|
}
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(m_editLineDataGroup.lineID-1);
|
|
|
//标绘航线
|
|
|
DrawFlyLine(m_editLineDataGroup);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//return;
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
void CGISDlg::ShowModifyPointDlg()
|
|
|
{
|
|
|
ShowModifyPointDlg(0);
|
|
|
}
|
|
|
|
|
|
//显示保存编辑对话框
|
|
|
void CGISDlg::ShowEditSaveDlg()
|
|
|
{
|
|
|
if (!m_bEditLine)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
CSaveLineEditSetting saveDlg;
|
|
|
saveDlg.DoModal();
|
|
|
int saveStatus = saveDlg.GetSaveStatus(); //-1为不保存,0为继续编辑,1为保存
|
|
|
if (saveStatus==-1)
|
|
|
{
|
|
|
//清除标绘的航线
|
|
|
ClearDrawedLine(m_editLineDataGroup.lineID-1);
|
|
|
//恢复未编辑状态
|
|
|
DrawFlyLine(m_ShowedLineDataList[m_lineSelectedID]);
|
|
|
//清除距离标绘
|
|
|
m_map.ClearDrawing(m_distLabelLayer);
|
|
|
|
|
|
m_bEditLine = false;
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
m_lineSelectedID = -1;
|
|
|
return;
|
|
|
}
|
|
|
else if (saveStatus==0)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//
|
|
|
CString dirName = "";
|
|
|
if (g_b981APad ||g_b981ADesktop)
|
|
|
{
|
|
|
switch (m_lineSelectedID)
|
|
|
{
|
|
|
case 1:
|
|
|
dirName = "航线1\\";
|
|
|
break;
|
|
|
case 2:
|
|
|
dirName = "航线2\\";
|
|
|
break;
|
|
|
case 3:
|
|
|
dirName = "航线3\\";
|
|
|
break;
|
|
|
case 4:
|
|
|
dirName = "航线4\\";
|
|
|
break;
|
|
|
case 5:
|
|
|
dirName = "航线5\\";
|
|
|
break;
|
|
|
case 11:
|
|
|
dirName = "应急航线\\";
|
|
|
break;
|
|
|
case 12:
|
|
|
dirName = "电子围栏航线\\";
|
|
|
break;
|
|
|
case 13:
|
|
|
dirName = "原路返航航线\\";
|
|
|
break;
|
|
|
case 14:
|
|
|
dirName = "回收航线\\";
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//重新保存回收航线
|
|
|
CString filename;
|
|
|
CString strRouteFileDir = GetSoftwareCurrentDirectory() + _T("\\Route\\") + dirName;
|
|
|
|
|
|
TCHAR s[10000];
|
|
|
s[0]=0;
|
|
|
CFileDialog dlg(FALSE, _T(".txt"), _T("*.txt"));
|
|
|
dlg.m_ofn.lpstrTitle=_T("保存航线文件");
|
|
|
dlg.m_ofn.lpstrFile=s;
|
|
|
dlg.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);
|
|
|
|
|
|
TCHAR filter[500]=_T("航线文件(*.txt)\0*.txt\0");
|
|
|
dlg.m_ofn.lpstrFilter=filter;
|
|
|
dlg.m_ofn.Flags|=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_CREATEPROMPT;
|
|
|
dlg.m_ofn.lpstrInitialDir = strRouteFileDir;
|
|
|
|
|
|
if (IDOK == dlg.DoModal())
|
|
|
{
|
|
|
filename = dlg.GetPathName();
|
|
|
//保存文件
|
|
|
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);
|
|
|
int n_linePts = m_editLineDataGroup.pointNum;
|
|
|
for (int i=1;i<=n_linePts;i++)
|
|
|
{
|
|
|
PtStruct linePt = m_editLineDataGroup.pts[i-1];
|
|
|
if (i<n_linePts-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);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 00, 03\n", m_editLineDataGroup.lineID, i, linePt.dX, linePt.dY,linePt.nH);
|
|
|
}
|
|
|
}
|
|
|
else if (i==n_linePts-1)
|
|
|
{
|
|
|
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);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 00, 03\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
else if (i==n_linePts)
|
|
|
{
|
|
|
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);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
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);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
fprintf(fp,"%d, %d, %lf, %lf, %.2lf, 0, 00, 01\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
fclose(fp);
|
|
|
|
|
|
OnShowGivenLine(filename);
|
|
|
//清除标绘的航线
|
|
|
//ClearDrawedLine(m_editLineDataGroup.lineID-1);
|
|
|
//标绘航线
|
|
|
//DrawFlyLine(m_editLineDataGroup);
|
|
|
m_map.ClearDrawing(m_distLabelLayer);
|
|
|
m_bEditLine = false;
|
|
|
m_bSelectFeatureFlag = false;
|
|
|
m_lineSelectedID = -1;
|
|
|
return;
|
|
|
}else
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//测量结束
|
|
|
void CGISDlg::EndPolylineMessure()
|
|
|
{
|
|
|
//删除已经标绘的直线
|
|
|
m_map.ClearDrawing(m_tempLayerID);
|
|
|
m_bMeasureDrag = false;
|
|
|
m_bEndMeasure = true;
|
|
|
m_numPolylineMeasurePts = 0;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//显示保存限飞区对话框
|
|
|
void CGISDlg::ShowSaveZoneDlg(double* xPoints,double* yPoints)
|
|
|
{
|
|
|
CSaveZoneDlg saveZoneDlg;
|
|
|
if (IDOK == saveZoneDlg.DoModal())
|
|
|
{
|
|
|
int zoneType = saveZoneDlg.GetZoneType();
|
|
|
int zoneID = saveZoneDlg.GetZoneID();
|
|
|
double height = 0.0;
|
|
|
CString str;
|
|
|
|
|
|
CString dirName = "";
|
|
|
if (zoneType == 0)//限飞区
|
|
|
{
|
|
|
//CreateDirectory("限飞区");
|
|
|
dirName = _T("限飞区\\");
|
|
|
height = saveZoneDlg.GetHeight();
|
|
|
}
|
|
|
else if(zoneType == 1)
|
|
|
{
|
|
|
//CreateDirectory("禁飞区");
|
|
|
dirName = _T("禁飞区\\");
|
|
|
}
|
|
|
|
|
|
|
|
|
//重新保存回收航线
|
|
|
CString filename;
|
|
|
CString strRouteFileDir = GetSoftwareCurrentDirectory() + _T("\\Route\\") + dirName ;
|
|
|
|
|
|
CreateDirectory(strRouteFileDir);
|
|
|
|
|
|
TCHAR s[10000];
|
|
|
s[0]=0;
|
|
|
CFileDialog dlg(FALSE, _T(".txt"), _T("*.txt"));
|
|
|
dlg.m_ofn.lpstrTitle=_T("保存文件");
|
|
|
dlg.m_ofn.lpstrFile=s;
|
|
|
dlg.m_ofn.nMaxFile=sizeof(s)/sizeof(TCHAR);
|
|
|
|
|
|
TCHAR filter[500]=_T("航线文件(*.txt)\0*.txt\0");
|
|
|
dlg.m_ofn.lpstrFilter=filter;
|
|
|
dlg.m_ofn.Flags|=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_CREATEPROMPT;
|
|
|
dlg.m_ofn.lpstrInitialDir = strRouteFileDir;
|
|
|
if (IDOK == dlg.DoModal())
|
|
|
{
|
|
|
filename = dlg.GetPathName();
|
|
|
//保存文件
|
|
|
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, 1, %lf, %lf, %.2lf, 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, 3, %lf, %lf, %.2lf, 0, 00, 03\n", zoneID, xPoints[2], yPoints[2], height);
|
|
|
if (zoneType==0) //限飞区
|
|
|
{
|
|
|
fprintf(fp,"%d, 4, %lf, %lf, %.2lf, 0, 0D, 01\n", zoneID, xPoints[3], yPoints[3], height);
|
|
|
}
|
|
|
else if (zoneType==1) //禁飞区
|
|
|
{
|
|
|
fprintf(fp,"%d, 4, %lf, %lf, %.2lf, 0, 0C, 01\n", zoneID, xPoints[3], yPoints[3], height);
|
|
|
}
|
|
|
|
|
|
fclose(fp);
|
|
|
}
|
|
|
if (m_tempZoneLayerID>=0)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_tempZoneLayerID);
|
|
|
m_tempZoneLayerID = -1;
|
|
|
}
|
|
|
//显示区域
|
|
|
OnShowGivenLine(filename);
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (m_tempZoneLayerID>=0)
|
|
|
{
|
|
|
m_map.RemoveLayer(m_tempZoneLayerID);
|
|
|
m_tempZoneLayerID = -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/*根据对角线两点坐标计算矩形的顶点
|
|
|
*point1:起点坐标
|
|
|
*point2:对角线另一点坐标
|
|
|
*xPoints:矩形顶点的x坐标
|
|
|
*yPoints:矩形顶点的y坐标
|
|
|
*/
|
|
|
void CGISDlg::ComputeRectanglePoints(double* point1,double* point2,double* xPoints,double* yPoints)
|
|
|
{
|
|
|
if((point1[0]<point2[0] && point1[1]>point2[1]) || (point1[0]>point1[1] && point1[1]<point2[1]))
|
|
|
{
|
|
|
xPoints[0] = point1[0];
|
|
|
xPoints[1] = point2[0];
|
|
|
xPoints[2] = point2[0];
|
|
|
xPoints[3] = point1[0];
|
|
|
xPoints[4] = point1[0];
|
|
|
|
|
|
yPoints[0] = point1[1];
|
|
|
yPoints[1] = point1[1];
|
|
|
yPoints[2] = point2[1];
|
|
|
yPoints[3] = point2[1];
|
|
|
yPoints[4] = point1[1];
|
|
|
}
|
|
|
if ((point1[0]<point2[0] && point1[1]<point2[1]) || (point1[0]>point2[0] && point1[1]>point2[1]))
|
|
|
{
|
|
|
xPoints[0] = point1[0];
|
|
|
xPoints[1] = point1[0];
|
|
|
xPoints[2] = point2[0];
|
|
|
xPoints[3] = point2[0];
|
|
|
xPoints[4] = point1[0];
|
|
|
|
|
|
yPoints[0] = point1[1];
|
|
|
yPoints[1] = point2[1];
|
|
|
yPoints[2] = point2[1];
|
|
|
yPoints[3] = point1[1];
|
|
|
yPoints[4] = point1[1];
|
|
|
}
|
|
|
};
|
|
|
|
|
|
//绘制限飞区
|
|
|
void CGISDlg::DrawRestrictedZone(long& layerID,double* xPoints,double* yPoints,int nPoints,int type)
|
|
|
{
|
|
|
if (layerID>=0)
|
|
|
{
|
|
|
m_map.RemoveLayer(layerID);
|
|
|
layerID = -1;
|
|
|
}
|
|
|
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
//创建面矢量shapfile
|
|
|
shapePtr->Create(mapWindow::SHP_POLYGON);
|
|
|
CreateEmptyShapfile(layerID,2,RGB(255,0,0));
|
|
|
for (long i=0; i<nPoints; i++)
|
|
|
{
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
|
|
|
//经度
|
|
|
pintPtr->x = xPoints[i];
|
|
|
//纬度
|
|
|
pintPtr->y = yPoints[i];
|
|
|
shapePtr->InsertPoint(pintPtr, &i);
|
|
|
|
|
|
//插入面矢量
|
|
|
(m_map.GetShapefile(layerID)).EditInsertShape(shapePtr, &i);
|
|
|
}
|
|
|
mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption;
|
|
|
pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions");
|
|
|
if(type == 0){//限飞区黄色
|
|
|
pShapeDrawingOption->LineColor = RGB(250,173,20);
|
|
|
pShapeDrawingOption->FillColor = RGB(254,252,233);//RGB(244,206,199);
|
|
|
//pShapeDrawingOption->LineColor = RGB(212,212,252);
|
|
|
//pShapeDrawingOption->FillColor = RGB(0,255,255);//RGB(244,206,199);
|
|
|
}else if(type==1){ //禁飞区红色
|
|
|
pShapeDrawingOption->LineColor = RGB(220,38,38);
|
|
|
pShapeDrawingOption->FillColor = RGB(254,243,243);//RGB(244,206,199);
|
|
|
}
|
|
|
pShapeDrawingOption->LineWidth = 2;
|
|
|
pShapeDrawingOption->FillTransparency = 60; //透明度
|
|
|
(m_map.GetShapefile(layerID)).SetDefaultDrawingOptions(pShapeDrawingOption);
|
|
|
};
|
|
|
|
|
|
//清除限飞区
|
|
|
void CGISDlg::ClearZoneLayer(long& zoneID)
|
|
|
{
|
|
|
if (zoneID>=0)
|
|
|
{
|
|
|
m_map.RemoveLayer(zoneID);
|
|
|
zoneID = -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void CGISDlg::arrayDouble2Variant(double *pArray,int iDimlength,VARIANT &vaArray)
|
|
|
{
|
|
|
SAFEARRAY *psa;
|
|
|
SAFEARRAYBOUND rgsabound[1];
|
|
|
rgsabound[0].lLbound=0;
|
|
|
rgsabound[0].cElements=iDimlength;
|
|
|
psa = SafeArrayCreate(VT_R8,1,rgsabound);
|
|
|
long lIndex[1];
|
|
|
for (int k=0; k < iDimlength; k++)
|
|
|
{
|
|
|
lIndex[0]=k;
|
|
|
SafeArrayPutElement(psa,lIndex,&pArray[k]);
|
|
|
}
|
|
|
vaArray.vt = VT_ARRAY|VT_R8;
|
|
|
vaArray.parray= psa;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**************************************************************************************************/
|
|
|
//设计限制区
|
|
|
void CGISDlg::OnDesignZone(){
|
|
|
m_map.SetCursorMode(mapWindow::cmNone);
|
|
|
bDrawRestrictedZone = true;
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnImportZone(){
|
|
|
//未加载地图,返回
|
|
|
if (!m_bHaveAddMap)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//弹出文件对话框
|
|
|
CFileDialog dlg(true, ".txt","*.txt",OFN_HIDEREADONLY, "限制区文件(*.txt)|*.txt|", NULL);
|
|
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
|
{
|
|
|
//读取航路文件,并标绘出来
|
|
|
OnShowGivenLine(dlg.GetPathName());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void CGISDlg::SetZoneState(long& zoneLayerID)
|
|
|
{
|
|
|
//已经标绘,清除航线
|
|
|
if (zoneLayerID>=0 )
|
|
|
{
|
|
|
//清除标绘的航线
|
|
|
ClearZoneLayer(zoneLayerID);
|
|
|
//刷新
|
|
|
m_map.Redraw();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
TCHAR filter[500]=_T("限制区文件(*.txt)\0*.txt\0)");
|
|
|
|
|
|
CFileDialog LineRouteDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter, NULL);
|
|
|
//LineRouteDlg.m_ofn.lpstrInitialDir = strRouteFileDir;
|
|
|
LineRouteDlg.m_ofn.lpstrFilter="txt(*.txt)\0*.txt";
|
|
|
LineRouteDlg.m_ofn.lpstrTitle = "选择显示最新生成的限制区";
|
|
|
if (LineRouteDlg.DoModal() == IDOK) //用户单击OK按钮中止对话框的返回值
|
|
|
{
|
|
|
CString str = LineRouteDlg.GetPathName(); //获取文件路径名
|
|
|
//OnShowGivenLine(GetFlyLineName(lineID));
|
|
|
OnShowGivenLine(str);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void CGISDlg::SetMenuZoneCheck(CMenu& menu){
|
|
|
if (restrictedZoneLayersID[0]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE1, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE1, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (restrictedZoneLayersID[1]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE2, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE2, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (restrictedZoneLayersID[2]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE3, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE3, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (restrictedZoneLayersID[3]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE4, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE4, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (restrictedZoneLayersID[4]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE5, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_RESTRICTEDZONE5, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (noFlyZoneLayersID[0]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE1, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE1, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (noFlyZoneLayersID[1]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE2, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE2, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (noFlyZoneLayersID[2]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE3, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE3, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (noFlyZoneLayersID[3]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE4, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE4, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
if (noFlyZoneLayersID[4]>=0)
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE5, MF_BYCOMMAND | MF_CHECKED );
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
menu.CheckMenuItem( IDM_SHOW_NOFLYZONE5, MF_BYCOMMAND | MF_UNCHECKED );
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//显示限飞区1-5
|
|
|
void CGISDlg::OnShowRestrictedZone1(){
|
|
|
SetZoneState(restrictedZoneLayersID[0]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnShowRestrictedZone2(){
|
|
|
SetZoneState(restrictedZoneLayersID[1]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnShowRestrictedZone3(){
|
|
|
SetZoneState(restrictedZoneLayersID[2]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnShowRestrictedZone4(){
|
|
|
SetZoneState(restrictedZoneLayersID[3]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnShowRestrictedZone5(){
|
|
|
SetZoneState(restrictedZoneLayersID[4]);
|
|
|
}
|
|
|
//显示禁飞区1-5
|
|
|
void CGISDlg::OnShowNoFlyZone1(){
|
|
|
SetZoneState(noFlyZoneLayersID[0]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnShowNoFlyZone2(){
|
|
|
SetZoneState(noFlyZoneLayersID[1]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnShowNoFlyZone3(){
|
|
|
SetZoneState(noFlyZoneLayersID[2]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnShowNoFlyZone4(){
|
|
|
SetZoneState(noFlyZoneLayersID[3]);
|
|
|
}
|
|
|
|
|
|
void CGISDlg::OnShowNoFlyZone5(){
|
|
|
SetZoneState(noFlyZoneLayersID[4]);
|
|
|
}
|
|
|
//装订限制区
|
|
|
void CGISDlg::OnBindZone()
|
|
|
{
|
|
|
m_struMapOut.cmd=MapCmd_BindZone;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
}
|
|
|
|
|
|
|
|
|
//显示航测区域
|
|
|
void CGISDlg::ShowSurveyRegion(long& layerID,vector<double>& xPoints,vector<double>& yPoints)
|
|
|
{
|
|
|
if (layerID!=-1)
|
|
|
{
|
|
|
m_map.RemoveLayer(layerID);
|
|
|
layerID = -1;
|
|
|
}
|
|
|
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
//创建面矢量shapfile
|
|
|
shapePtr->Create(mapWindow::SHP_POLYGON);
|
|
|
CreateEmptyShapfile(layerID,2,RGB(255,0,0));
|
|
|
int nPoints = xPoints.size();
|
|
|
for (long i=0; i<nPoints; i++)
|
|
|
{
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
|
|
|
//经度
|
|
|
pintPtr->x = xPoints[i];
|
|
|
//纬度
|
|
|
pintPtr->y = yPoints[i];
|
|
|
shapePtr->InsertPoint(pintPtr, &i);
|
|
|
|
|
|
//插入面矢量
|
|
|
(m_map.GetShapefile(layerID)).EditInsertShape(shapePtr, &i);
|
|
|
}
|
|
|
mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption;
|
|
|
pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions");
|
|
|
pShapeDrawingOption->LineColor = RGB(66,102,244);//RGB(212,212,252);
|
|
|
pShapeDrawingOption->FillColor = RGB(117,176,247);//RGB(0,255,255);//RGB(244,206,199);
|
|
|
|
|
|
pShapeDrawingOption->LineWidth = 2;
|
|
|
pShapeDrawingOption->FillTransparency = 40; //透明度
|
|
|
(m_map.GetShapefile(layerID)).SetDefaultDrawingOptions(pShapeDrawingOption);
|
|
|
}
|
|
|
|
|
|
//显示航测航线
|
|
|
void CGISDlg::ShowPolyline(long& layerID,vector<double>& xPoints,vector<double>& yPoints)
|
|
|
{
|
|
|
if (layerID!=-1)
|
|
|
{
|
|
|
m_map.RemoveLayer(layerID);
|
|
|
layerID = -1;
|
|
|
}
|
|
|
|
|
|
mapWindow::IShapePtr shapePtr;
|
|
|
shapePtr.CreateInstance("MapWinGIS.Shape");
|
|
|
//创建面矢量shapfile
|
|
|
shapePtr->Create(mapWindow::SHP_POLYLINE);
|
|
|
CreateEmptyShapfile(layerID,1,RGB(255,0,0));
|
|
|
int nPoints = xPoints.size();
|
|
|
for (long i=0; i<nPoints; i++)
|
|
|
{
|
|
|
mapWindow::IPointPtr pintPtr;
|
|
|
pintPtr.CreateInstance("MapWinGIS.Point");
|
|
|
|
|
|
//经度
|
|
|
pintPtr->x = xPoints[i];
|
|
|
//纬度
|
|
|
pintPtr->y = yPoints[i];
|
|
|
shapePtr->InsertPoint(pintPtr, &i);
|
|
|
|
|
|
//插入面矢量
|
|
|
(m_map.GetShapefile(layerID)).EditInsertShape(shapePtr, &i);
|
|
|
}
|
|
|
mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption;
|
|
|
pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions");
|
|
|
pShapeDrawingOption->LineColor = RGB(212,212,252);
|
|
|
|
|
|
pShapeDrawingOption->LineWidth = 2;
|
|
|
(m_map.GetShapefile(layerID)).SetDefaultDrawingOptions(pShapeDrawingOption);
|
|
|
}
|
|
|
|
|
|
//显示测绘区域
|
|
|
afx_msg LRESULT CGISDlg::OnShowSurveyRegion(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
CString path = (char*)wParam;
|
|
|
OnShowGivenLine(path);
|
|
|
//ShowSurveyRegion(surveyRegionLayerID,designSurveyLineDlg->surveyRegionLons,designSurveyLineDlg->surveyRegionLats);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//显示测绘区域
|
|
|
afx_msg LRESULT CGISDlg::OnShowSurveyLine(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
CString path = (char*)wParam;
|
|
|
OnShowGivenLine(path);
|
|
|
//ShowSurveyRegion(surveyRegionLayerID,designSurveyLineDlg->surveyRegionLons,designSurveyLineDlg->surveyRegionLats);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//显示测绘区域
|
|
|
afx_msg LRESULT CGISDlg::OnClearTmpSurveyFeature(WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (tmpSurveyRegionLayerID!=-1)
|
|
|
{
|
|
|
m_map.RemoveLayer(tmpSurveyRegionLayerID);
|
|
|
tmpSurveyRegionLayerID = -1;
|
|
|
}
|
|
|
m_map.Redraw();
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//装订测绘航线
|
|
|
afx_msg LRESULT CGISDlg::OnBindSurveyLine(WPARAM wParam,LPARAM lParam)
|
|
|
{
|
|
|
int lineID = (int)wParam;
|
|
|
// TODO: 在此添加命令处理程序代码
|
|
|
m_struMapOut.cmd=MapCmd_BindLine;
|
|
|
m_struMapOut.ID=lineID;
|
|
|
::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
//功能:显示测绘航线设计对话框
|
|
|
void CGISDlg::OnShowDesignSurveyLineDlg()
|
|
|
{
|
|
|
if (designSurveyLineDlg==nullptr)
|
|
|
{
|
|
|
designSurveyLineDlg = new DesignSurveyLineDlg();
|
|
|
}
|
|
|
designSurveyLineDlg->ShowWindow(true);
|
|
|
}
|
|
|
|
|
|
|
|
|
/****************************多机航线一键生成************************************/
|
|
|
void CGISDlg::GetMultiRouteLine(double azimuth,double lineInterval,int lineNumber,PtStruct* lineStruct,int nLinePts,vector<vector<PtStruct>>& resultLines)
|
|
|
{
|
|
|
GeoCompute geoComputer;
|
|
|
double tmpLon,tmpLat;
|
|
|
vector<PtStruct> line;
|
|
|
double dist = 0;
|
|
|
double lineAzimuth = 0;
|
|
|
for (int j=0;j< lineNumber;++j)
|
|
|
{
|
|
|
line.clear();
|
|
|
dist = lineInterval*(j+1);
|
|
|
tmpLon = lineStruct[0].dX;
|
|
|
tmpLat = lineStruct[0].dY;
|
|
|
lineAzimuth = azimuth;
|
|
|
for (int i=0;i< nLinePts;++i)
|
|
|
{
|
|
|
PtStruct line0 = lineStruct[i];
|
|
|
PtStruct line1 = lineStruct[i+1];
|
|
|
geoComputer.computeOffsetGeoPosition(tmpLon,tmpLat,lineAzimuth,dist/1000,tmpLon,tmpLat);
|
|
|
PtStruct pt;
|
|
|
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);
|
|
|
|
|
|
//CalculateTwoPtsAzimuth(azimuth,lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY,3);
|
|
|
if (i+1<nLinePts)
|
|
|
{
|
|
|
CalculateTwoPtsDistanceAzimuth(dist,lineAzimuth,lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY,3);
|
|
|
}
|
|
|
|
|
|
//dist = geoComputer.VincentyDistance(lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY);
|
|
|
}
|
|
|
resultLines.push_back(line);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void CGISDlg::SaveMultiRouteLine(CString pathDirName,double heightInterval,const vector<vector<PtStruct>>& resultLines)
|
|
|
{
|
|
|
CString saveFileName;
|
|
|
for (int i=0;i<resultLines.size();++i)
|
|
|
{
|
|
|
vector<PtStruct> line = resultLines[i];
|
|
|
CString tmp;
|
|
|
tmp.Format("-%d",i+2);
|
|
|
saveFileName = pathDirName + tmp + ".txt";
|
|
|
//保存文件
|
|
|
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));
|
|
|
}
|
|
|
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);
|
|
|
fclose(fp);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|