You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8778 lines
216 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 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<255;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; //盘旋引导图层
//多机子航线
for (int i=0;i<20;++i)
{
for (int j=0;j<20;++j)
{
m_subLineLayerID[i][j]=-1;
m_subLinePtLayerID[i][j]=-1;
m_pHaveDrawCopyLineFlag[i][j] = -1;
}
}
m_bShowCopyLine = false;
/*******************************测绘航线********************************/
surveyRegionLayerID = -1;
tmpSurveyRegionLayerID = -1;
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;
testLayer = -1;
}
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_COPE_LINE, ShowMultiRouteSetting) //批量航线
/*
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>255)
{
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);
if (surveyRegionLons.size()>2)
{
TopologicalAnalysis analysis;
Point2D p;
p.x = dX;
p.y = dY;
if(!analysis.isPointInPolygon(p,surveyRegionLons,surveyRegionLats)) //禁止绘制凹多边形
{
surveyRegionLons.push_back(dX);
surveyRegionLats.push_back(dY);
}
}
else
{
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>255)
{
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图层
//输入矢量图层类型shpType0为—点图层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矢量图层类型shpType0为—点图层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号shpLayerIDshp类型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
{
/*
if (g_b981AMulti && lineData.pts[0].ch1 > 1)
{
strText.Format(_T("%d(%d)-%d"), lineData.lineID, lineData.pts[0].ch1,lineData.pts[i].nPt);
}
else*/
strText.Format(_T("%d-%d"), lineData.lineID, lineData.pts[i].nPt);
}
//增加Labels
labesPtr.AddLabel((LPCTSTR)strText, lineData.pts[i].dX, lineData.pts[i].dY, 0, 0);
}
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
//重新绘制
m_map.Redraw();
}
//功能:标绘飞行航线(批量航线)
//输入航线数据lineData
void CGISDlg::DrawCopyFlyLine(const DrawLineDataStruct lineData)
{
//field索引值
long fieldIndex = 0;
//航线索引号
int lineID = lineData.lineID-1;
//子航线索引号
int sublineID = lineData.pts[0].ch1-1;
/*
map<long,long> subLineLayerIDs;
map<long,long> subLinePtLayerIDs;
if (m_subLineLayerID.find(lineData.lineID)!=m_subLineLayerID.end())
{
subLineLayerIDs = m_subLineLayerID[lineData.lineID];
}
if (m_subLinePtLayerID.find(lineData.lineID)!=m_subLinePtLayerID.end())
{
subLinePtLayerIDs = m_subLinePtLayerID[lineData.lineID];
}*/
//没有目标标绘SHP图层创建该图层
if (m_subLineLayerID[lineID][sublineID] ==-1)
{
//创建线图层
CreateEmptyShapfile(m_subLineLayerID[lineID][sublineID], 1, /*RGB(0,255,0)*/LineClr[lineID]);
//创建线图层成功
m_pHaveDrawCopyLineFlag[lineID][sublineID] = true;
}
//没有目标标绘SHP图层创建该图层
if (m_subLinePtLayerID[lineID][sublineID] ==-1)
{
//创建点图层
CreateEmptyShapfile(m_subLinePtLayerID[lineID][sublineID], 0, /*RGB(0,255,0)*/LineClr[lineID]);
//创建线图层成功
m_pHaveDrawCopyLineFlag[lineID][sublineID] = true;
}
//向点图层加入航点数据
AddPoints2PointShapfile(m_subLinePtLayerID[lineID][sublineID], lineData.pts, lineData.pointNum);
//向线图层加入航点数据
AddPoints2LineShapfile(m_subLineLayerID[lineID][sublineID], lineData.linePts, lineData.linePointNum);
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
//Label集合
CLabels labesPtr;
labesPtr = (m_map.GetShapefile(m_subLinePtLayerID[lineID][sublineID])).GetLabels();
labesPtr.SetFontColor(/*RGB(255,0,0)*/LineClr[lineID]);
labesPtr.SetAlignment(1);
labesPtr.SetFontBold(true);
labesPtr.SetFontName(LPCTSTR("黑体"));
labesPtr.SetFontSize(16);
labesPtr.put_FontSize2(16);
labesPtr.SetFrameVisible(false);
labesPtr.SetAvoidCollisions(FALSE);
CString strText = _T("");
//标绘航点的名称
for (long i=0; i<lineData.pointNum; i++)
{
//标注信息
if ( 14 ==lineData.lineID)
{
strText.Format(_T("自主着陆点(%d)") /*lineData.lineID, */ /*lineData.pts[i].nPt*/,lineData.pts[0].ch1);
}
else
{
strText.Format(_T("%d(%d)-%d"), lineData.lineID, lineData.pts[0].ch1,lineData.pts[i].nPt);
}
//增加Labels
labesPtr.AddLabel((LPCTSTR)strText, lineData.pts[i].dX, lineData.pts[i].dY, 0, 0);
}
/////////////////////往SHP图层中加入目标点标注信息///////////////////////////////
//重新绘制
m_map.Redraw();
}
//功能:根据地图控件的显示分辨率移动地图控件
//说明:根据显示分辨率和设计分辨率之间的几何关系
//输入制定显示的区域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;
}
}
//功能:清除已经标绘的航线(多机子航线)
//输入航线编号lineID从0开始计数
void CGISDlg::ClearDrawedCopyLine(const int lineID,const int sublineID)
{
if (m_pHaveDrawCopyLineFlag[lineID][sublineID])
{
//清除标绘的点矢量图层
ClearPointShape(m_subLinePtLayerID[lineID][sublineID]);
//清除已经标绘的航线
m_map.RemoveLayer(m_subLineLayerID[lineID][sublineID]);
m_pHaveDrawCopyLineFlag[lineID][sublineID] = false;
m_subLineLayerID[lineID][sublineID] = -1;
m_subLinePtLayerID[lineID][sublineID] = -1;
}
}
//功能:处理快捷菜单与航线显示相关的操作
// 1)航线已经标注,清除显示
// 2)航线未标注,进行显示
//输入航线编号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;
if (g_b981AMulti)
{
for (int i=0;i<10;++i)
{
if (m_pHaveDrawCopyLineFlag[lineIndex][i])
{
ClearDrawedCopyLine(lineIndex,i);
//刷新
m_map.Redraw2(mapWindow::RedrawMinimal);
//m_map.Redraw();
m_pHaveDrawCopyLineFlag[lineIndex][i] = false;
}
}
}
}
else
{
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);
if (g_b981AMulti)
{
CString tmp;
m_bShowCopyLine = true;
for (int i=2;i<=10;++i)
{
tmp.Format("-%d",i);
CString dirPath = ExtractDirPath(str);
CString fileName = ExtractFileName(str,false);
CString fileType = ExtractFileType(str);
CString pathName = dirPath + "\\" + fileName + tmp + "." + fileType;
OnShowGivenLine(pathName);
}
m_bShowCopyLine = false;
}
}
}
}
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) && !m_bShowCopyLine)
{
BCGPMessageBox( _T( "航路文件不存在!" ) );
return;
}
//航线数据集合
DrawLineDataStruct lineDataGroup;
//初始化
memset(&lineDataGroup, 0, sizeof(DrawLineDataStruct));
//航线文件读取成功
if (m_lineManage.ReadLineDataFromFile(lineDataGroup, strLineFileName))
{
//判断航线号是否正确lineID取值1-8,10-11,13add by jackwong 2018.08.01
if(lineDataGroup.lineID<1 || lineDataGroup.lineID>14 )
{
BCGPMessageBox("航线号不正确!");
return;
}
m_lineFullPathName[lineDataGroup.lineID] = strLineFileName;
if (lineDataGroup.pts[0].ch1>1)
{
//清除标绘的航线
ClearDrawedCopyLine(lineDataGroup.lineID-1,lineDataGroup.pts[0].ch1);
//标绘航线
DrawCopyFlyLine(lineDataGroup);
return;
}
int ch = lineDataGroup.linePts[lineDataGroup.pointNum-1].ch1;
/***************************测绘区域处理************************************/
if (ch == 0x03)
{
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);
}
}
//功能:标绘导引点位置
//输入导引点类型guideMode1为导引飞行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);
}
//功能:标绘回收点位置
//输入导引点类型callbackMode1为回收点12为回收点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;
int singlePointNumber;
if (g_b981AMulti && dlg.m_bCheckMultiLine)
{
SetMultiRouteDlg multiRouteDlg;
multiRouteDlg.SetPointNumber(m_designLinePointNum);
if (multiRouteDlg.DoModal() == IDOK )
{
azmuth = multiRouteDlg.azmuth;
heightInterval = multiRouteDlg.heightInterval;
lineInterval = multiRouteDlg.lineInterval;
numLine = multiRouteDlg.numLine;
singlePointNumber = multiRouteDlg.GetHPointNumber();
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,false);
////写出航线数据
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,singlePointNumber);
vector<CString>savePathNameArr;
SaveMultiRouteLine(pathName,heightInterval,savePathNameArr,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);//01 居中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, %.7f, %.7f, %.2f, 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, %.7f, %.7f, %.2f, 0, 01, 03\n", m_editLineDataGroup.lineID, i, linePt.dX, linePt.dY,linePt.nH);
}
else
{
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 03\n", m_editLineDataGroup.lineID, i, linePt.dX, linePt.dY,linePt.nH);
}
}
else if (i==n_linePts-1)
{
if (m_lineSelectedID==11 && g_b981CDesktop) //回收航线
{
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 07\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
}
else
{
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 03\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
}
}
else if (i==n_linePts)
{
if (m_lineSelectedID==11 && g_b981CDesktop) //回收航线
{
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 0B\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
}
else
{
if (linePt.ch1==2) //开合航线
{
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 02, 01\n", m_editLineDataGroup.lineID,i,linePt.dX,linePt.dY,linePt.nH);
}
else
{
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 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, %.7f, %.7f, %.2f, 0, 00, 03\n", zoneID, 0.0, 0.0, 0.0);
fprintf(fp,"%d, 1, %.7f, %.7f, %.2f, 0, 00, 03\n", zoneID, xPoints[0], yPoints[0], height);
fprintf(fp,"%d, 2, %.7f, %.7f, %.2f, 0, 00, 03\n", zoneID, xPoints[1], yPoints[1], height);
fprintf(fp,"%d, 3, %.7f, %.7f, %.2f, 0, 00, 03\n", zoneID, xPoints[2], yPoints[2], height);
if (zoneType==0) //限飞区
{
fprintf(fp,"%d, 4, %.7f, %.7f, %.2f, 0, 0D, 01\n", zoneID, xPoints[3], yPoints[3], height);
}
else if (zoneType==1) //禁飞区
{
fprintf(fp,"%d, 4, %.7f, %.7f, %.2f, 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,int hPtOffset)
{
GeoCompute geoComputer;
double tmpLon,tmpLat;
vector<PtStruct> line;
double dist = 0;
double lineAzimuth = 0;
//bool bOneOffset = false;
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];
/*
if (hPtOffset>0 && i!=(hPtOffset-1)) //仅某一点水平方向偏移
{
tmpLon = lineStruct[i].dX;
tmpLat = lineStruct[i].dY;
bOneOffset = true;
}
else
{*/
if (hPtOffset == 0)
{
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);
if (i+1<nLinePts)
{
CalculateTwoPtsDistanceAzimuth(dist,lineAzimuth,lineStruct[i].dX,lineStruct[i].dY,lineStruct[i+1].dX,lineStruct[i+1].dY,3);
}
}
else//仅某一点水平方向偏移
{
PtStruct pt;
pt.nH = lineStruct[i].nH;
pt.nL = lineStruct[i].nL;
pt.nPt = lineStruct[i].nPt;
pt.nV = lineStruct[i].nV;
pt.ch1 = lineStruct[i].ch1;
pt.ch2 = lineStruct[i].ch2;
if (i!=(hPtOffset-1))
{
pt.dX = lineStruct[i].dX;
pt.dY = lineStruct[i].dY;
}
else
{
geoComputer.computeOffsetGeoPosition(lineStruct[i].dX,lineStruct[i].dY,lineAzimuth,dist/1000,tmpLon,tmpLat);
pt.dX = tmpLon;
pt.dY = tmpLat;
//int i = 0;
}
line.push_back(pt);
}
}
resultLines.push_back(line);
}
}
void CGISDlg::SaveMultiRouteLine(CString pathDirName,double heightInterval,vector<CString>& savePathNameArr,const vector<vector<PtStruct>>& resultLines)
{
CString saveFileName;
for (int i=0;i<resultLines.size();++i)
{
vector<PtStruct> line = resultLines[i];
CString tmp;
tmp.Format("-%d",i+2);
saveFileName = pathDirName + tmp + ".txt";
savePathNameArr.push_back(saveFileName);
//保存文件
FILE* fp = fopen(saveFileName,"w");
fprintf(fp,"%d, 0, %.7f, %.7f, %.2f, 0, 00, 03\n", line[0].nL, 0.0, 0.0, 0.0);
int j = 0;
for (j;j<line.size()-1;++j)
{
if (j==0) //第一个航线存储批量航线子航线号
{
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, %02X, 03\n", line[j].nL, j+1,line[j].dX, line[j].dY,line[j].nH + heightInterval*(i+1),i+2);
}
else
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, 00, 03\n", line[j].nL, j+1,line[j].dX, line[j].dY,line[j].nH + heightInterval*(i+1));
}
fprintf(fp,"%d, %d, %.7f, %.7f, %.2f, 0, %02X, 01\n", line[j].nL, j+1,line[j].dX, line[j].dY,line[j].nH + heightInterval*(i+1),line[j].ch1);
fclose(fp);
}
}
void CGISDlg::ShowMultiRouteSetting()
{
if (!m_bSelectFeatureFlag || m_lineSelectedID==-1) return;
//批量航线设置
double azmuth,heightInterval,lineInterval,numLine;
bool bSaveMultiLine = false;
CString pathName;
vector<CString>pathNameArr;
if (g_b981AMulti)
{
SetMultiRouteDlg multiRouteDlg;
DrawLineDataStruct selectLineData = m_ShowedLineDataList[m_lineSelectedID];
multiRouteDlg.SetPointNumber(selectLineData.pointNum);
if (multiRouteDlg.DoModal() == IDOK )
{
azmuth = multiRouteDlg.azmuth;
heightInterval = multiRouteDlg.heightInterval;
lineInterval = multiRouteDlg.lineInterval;
numLine = multiRouteDlg.numLine;
bSaveMultiLine = true;
int hPtNumber = multiRouteDlg.GetHPointNumber();
CString selectLinePath = m_lineFullPathName[m_lineSelectedID];
if (ExtractFileType(selectLinePath) == ".route") return; // 已装订的航线不允许批量生成
CString dirPath = ExtractDirPath(selectLinePath);
CString fileName = ExtractFileName(selectLinePath,false);
pathName = dirPath + "\\" + fileName;
//批量航线保存
vector<vector<PtStruct>> resultLines;
GetMultiRouteLine(azmuth,lineInterval,numLine,selectLineData.pts,selectLineData.pointNum,resultLines,hPtNumber);
SaveMultiRouteLine(pathName,heightInterval,pathNameArr,resultLines);
}
else
{
bSaveMultiLine = false;
}
}
ClearHighLightLine();
m_bSelectFeatureFlag = false;
m_lineSelectedID==-1;
m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone);
for (int i=0;i<pathNameArr.size();++i)
{
OnShowGivenLine(pathNameArr.at(i));
}
}
void CGISDlg::OnShowTargetPoint(double lon,double lat,int pixelSize)
{
if (testLayer!=-1)
{
m_map.ClearDrawing(testLayer);
testLayer = -1;
}
testLayer = m_map.NewDrawing(1);
m_map.DrawPointEx(testLayer,lon,lat,pixelSize,RGB(255,0,0));
//m_map.Redraw2(mapWindow::tkRedrawType::RedrawMinimal);
m_map.Redraw();
}