// GISDlg.cpp : implementation file // #include "stdafx.h" #include "GISDlg.h" #include #include "label.h" //#include #include "shapedrawingoptions.h" #include "shape.h" #include "labelcategory.h" #include "ScreenCapture.h" #include "SetSaveLineID.h" //#include "8BMapDLL_type.h" #include #include #include #include "vectortoraster.h" #include "SaveLineEditSetting.h" #include "ModifyLinePointDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CGISDlg dialog const double DEG2RAD = 0.017453292519943295769236907684886127134428718885417; DWORD LineClr[15] = {RGB(0,255,0),RGB(255,0,0), RGB(0,0,255),RGB(128,128,0), RGB(0,0,0),RGB(0,255,0),RGB(255,0,0), RGB(0,0,255),RGB(128,128,0), RGB(0,0,0),RGB(0,255,0),RGB(255,0,0), RGB(0,0,255),RGB(124,252,0/*127,255,170*/), RGB(0,0,0)}; //常发数据定时器回调函数 void FAR PASCAL CatchMTimerDraw(WORD IDEvent, WORD uReserved, DWORD dwUser,DWORD dwReserved1,DWORD dwReserve2) { ::PostMessage(g_mapHwnd, WM_SEND_DRAWUAV, FALSE, 0); } CGISDlg::CGISDlg(CWnd* pParent /*=NULL*/) : CBCGPDialog(CGISDlg::IDD, pParent) { EnableVisualManagerStyle(TRUE, TRUE); //{{AFX_DATA_INIT(CGISDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_MsgHwnd = NULL; m_MsgID = 0; //导引点的消息ID m_LineLoadMsgID=0; //装订航线 m_drawPlanFlyLine = -1; //经纬度对话框显示标识 m_bHaveShowLonLatDlg = false; //新航线设计对话框显示标识 m_bHaveShowLineDesign = false; //2点之间的水平距离界面显示的标识 m_bHaveShowDistanceDlg = false; //是否已经加载了地图 m_bHaveAddMap = false; for (int i = 0;i<3;i++) { //航迹标绘图层ID m_flyTrackLayerID[i] = -1; //UAV航迹标绘图层ID m_UAVFlyTrackLayerID[i] = -1; //是否已经标绘了无人机的飞行轨迹 m_bFirstDrawUAVTrack[i] = false; m_drawTrackPtNum[i] = 0; } // for (int i = 0;i功能***********************************/ /*****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;iDestroyObject(); m_gisManager = NULL; } } void CGISDlg::DoDataExchange(CDataExchange* pDX) { CBCGPDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_MAP1, m_map); } BEGIN_MESSAGE_MAP(CGISDlg, CBCGPDialog) //{{AFX_MSG_MAP(CGISDlg) ON_WM_MOUSEMOVE() // ON_WM_MOUSEWHEEL() ON_COMMAND(ID_ADDPOINT, OnAddpoint) ON_MESSAGE(WM_SET_LAYER_STATUS, OnSetLayerStatus) ON_MESSAGE(WM_CLOSE_LONLAT_DIALOG, OnCloseLonLatDialog) ON_MESSAGE(WM_CLOSE_DISTANCE_DIALOG, OnCloseShowDistanceDialog) ON_MESSAGE(WM_CLOSE_LINEDESIGN_DIALOG, OnCloseLineDesignDialog) ON_MESSAGE(WM_ADD_LINE_POINT, OnAddLinePoint) //增加航点 ON_MESSAGE(WM_EDIT_LINE_POINT, OnEditLinePoint) //编辑航点 ON_MESSAGE(WM_DELETE_LINE_POINT, OnDeleteLinePoint) //删除航点 ON_MESSAGE(WM_SAVE_LINE_POINTS, OnSaveLinePoints) //保存航线 ON_COMMAND(IDT_BUTTON1, OnAddMapData) //加载地图数据 ON_COMMAND(IDT_BUTTON2, OnAddRasterImage) //加载栅格影像数据 ON_COMMAND(IDT_BUTTON3, OnAddFlyLineData) //加载航线数据 ON_COMMAND(IDT_BUTTON4, OnLayerManage) //图层管理 ON_COMMAND(IDT_BUTTON5, OnRemoveAllLayers) //清除所有图层 ON_COMMAND(IDM_DESIGN_MYFLYLINE, OnFlyLineDesign) //航线设计 2015.11.25 屏蔽航线设计对话框 ON_COMMAND(IDT_BUTTON6, OnMenuLinePtCtrlShow/*OnMapSelect*/) //地图选择 ON_COMMAND(IDT_BUTTON7, OnMapZoomIn) //地图放大 ON_COMMAND(IDT_BUTTON8, OnMapZoomOut) //地图缩小 ON_COMMAND(IDT_BUTTON9, OnMapMove) //地图漫游 ON_COMMAND(IDT_BUTTON10, OnMapFullScreen) //地图全景显示 ON_COMMAND(IDT_BUTTON11, OnEraseTrack) //清除航迹 ON_COMMAND(IDT_BUTTON12, OnShowLonLatInfo) //显示经纬度信息 ON_COMMAND(IDT_BUTTON13, OnSurvey) //测量2点之间的距离 ON_COMMAND(IDT_BUTTON14, OnShowCtrlMenu/*OnPrint*/) //航线属性 //打印输出 ON_COMMAND(IDT_BUTTON15, OnZhangCW) //打印输出 ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipsNotify) //按钮文字提示 ON_COMMAND(IDM_GUIDE_FLY1, OnGuideMode1) ON_COMMAND(IDM_DESIGN_MYFLYLINE, OnDesignLine) ON_UPDATE_COMMAND_UI(IDM_GUIDE_FLY1, OnUpdateGuideMode1) ON_COMMAND(IDM_GUIDE_FLY2, OnGuideMode2) ON_UPDATE_COMMAND_UI(IDM_GUIDE_FLY2, OnUpdateGuideMode2) ON_COMMAND(IDM_SHOW_LINE1, OnShowLine1) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE1, OnUpdateLineDisplay1) ON_COMMAND(IDM_SHOW_LINE2, OnShowLine2) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE2, OnUpdateLineDisplay2) ON_COMMAND(IDM_SHOW_LINE3, OnShowLine3) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE3, OnUpdateLineDisplay3) ON_COMMAND(IDM_SHOW_LINE4, OnShowLine4) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE4, OnUpdateLineDisplay4) ON_COMMAND(IDM_SHOW_LINE5, OnShowLine5) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE5, OnUpdateLineDisplay5) ON_COMMAND(IDM_AUTO_MOVE, OnAutoMove) ON_UPDATE_COMMAND_UI(IDM_AUTO_MOVE, OnUpdateAutoMov) ON_MESSAGE(WM_CHECK_FLY_LINE_STATUS, OnCheckFlyLineShowStatus) ON_COMMAND(IDM_REMOVE_GUIDE_DRAW, OnRemoveGuidePtDraw) ON_COMMAND(IDM_OPEN_FLYLINE, OnAddFlyLineData) ON_COMMAND(ID_ENDDESIGN, OnEnddesign) //}}AFX_MSG_MAP ON_COMMAND(ID_CLEARPOINT, OnClearpoint) ON_COMMAND(ID_EDITPOINT, OnEditpoint) ON_COMMAND(ID_DELPOINT, OnDelpoint) //ON_COMMAND(IDM_BINDLINE1, &CGISDlg::OnBindline1) ON_COMMAND(IDM_BINDLINE2, OnBindline2) ON_COMMAND(ID_LOAD_MYLINE1, OnLoadMyline1) ON_COMMAND(IDM_BINDLINE3, OnBindline3) ON_COMMAND(IDM_BINDLINE4, OnBindline4) ON_COMMAND(IDM_BINDLINE5, OnBindline5) ON_COMMAND(IDM_LAYERMNG, OnLayermng) ON_COMMAND(IDM_ADDGTARGET, OnAddgtarget) //ON_MESSAGE(MESSAGE_DRAWZK, &CGISDlg::DRAW_ZK) // ON_WM_MOUSEHWHEEL() ON_COMMAND(ID_NLINEDESIGN, &CGISDlg::OnNlinedesign) ON_UPDATE_COMMAND_UI(ID_NLINEDESIGN, &CGISDlg::OnUpdateNlinedesign) ON_COMMAND(ID_SHOW_BACKLINE, &CGISDlg::OnShowBackLine) ON_UPDATE_COMMAND_UI(ID_SHOW_BACKLINE, &CGISDlg::OnUpdateShowBackLine) ON_COMMAND(ID_SHOW_HS11, &CGISDlg::OnShowHs11) ON_UPDATE_COMMAND_UI(ID_SHOW_HS11, &CGISDlg::OnUpdateShowHs11) ON_COMMAND(ID_BIND_HS11, &CGISDlg::OnBindHs11) ON_COMMAND(ID_SHOW_TC12, &CGISDlg::OnShowTc12) ON_COMMAND(ID_BIND_TC12, &CGISDlg::OnBindTc12) ON_UPDATE_COMMAND_UI(ID_SHOW_TC12, &CGISDlg::OnUpdateShowTc12) ON_WM_SIZE() ON_COMMAND(ID_BIND_BACKLINE, &CGISDlg::OnBindBackLine) ON_WM_MOVE() ON_MESSAGE(WM_SEL_UAV, &CGISDlg::OnSelUav) ON_COMMAND(ID_ADD_TARGET, &CGISDlg::OnAddTarget) ON_MESSAGE(WM_DRAW_TARGET, &CGISDlg::OnDrawTarget) ON_WM_SHOWWINDOW() ON_COMMAND(ID_TARGET_DELETE, &CGISDlg::OnTargetDelete) ON_MESSAGE(WM_SEND_SELECTTARGET, &CGISDlg::OnSendSelectTarget) ON_MESSAGE(WM_SEND_CLOSEDEMALT, &CGISDlg::OnSendCloseDemAlt) ON_MESSAGE(WM_SHOW_POINTINMAP, &CGISDlg::OnShowPointInMap) ON_MESSAGE(WM_SHOW_ISVISIBLE, &CGISDlg::OnShowPointVisible) ON_MESSAGE(WM_SHOW_NOTVISIBLE, &CGISDlg::OnShowPointNotVisible) ON_MESSAGE(WM_SEND_CLEARSHAPE, &CGISDlg::OnSendClearShape) ON_MESSAGE(WM_SHOW_VISI_REALTIME, &CGISDlg::OnShowAreaVisible) ON_MESSAGE(WM_SHOW_NOTVISI_REALTIME, &CGISDlg::OnShowAreaNotVisible) ON_MESSAGE(WM_SHOW_VISI_DELETE, &CGISDlg::OnShowClearArea) ON_MESSAGE(WM_ADD_LINELAYER, &CGISDlg::OnAddLineLayer) ON_MESSAGE(WM_DEL_LINELAYER, &CGISDlg::OnDelLineLayer) ON_MESSAGE(WM_SEND_REGIONTOGIS, &CGISDlg::OnSendRegionToGis) ON_MESSAGE(WM_DRAW_LINEPOINT, &CGISDlg::OnDrawLinePoint) ON_MESSAGE(WM_SHOW_CRASH_REALTIME, &CGISDlg::OnShowCrashArea) ON_MESSAGE(WM_SEND_DRAWFIGHT, &CGISDlg::OnSendDrawFight) ON_MESSAGE(WM_SEND_DRAWDEMREGION, &CGISDlg::OnSendDrawDemRegion) ON_MESSAGE(WM_SEND_MAPLOCATION,&CGISDlg::OnZoomToLocation) ON_COMMAND(ID__MENU_LIGHTREGION, &CGISDlg::OnMenuLightRegion) ON_COMMAND(ID_MENU_ENTRYPOINT, &CGISDlg::OnMenuEntryPoint) ON_COMMAND(ID_MENU_PLOTDEMAREA, &CGISDlg::OnMenuPlotdemArea) ON_MESSAGE(WM_SEND_MAPCURSORMODE, &CGISDlg::OnSetMapCursorMode) //设置Map CursorMode ON_MESSAGE(WM_SEND_DRAWMARKER, &CGISDlg::OnDrawMarker) //显示或隐藏标记点 ON_COMMAND(ID_MENU_CLEARGCS, &CGISDlg::OnMenuClearGCS) ON_COMMAND(ID_MENU_ADSB, &CGISDlg::OnMenuADSB) ON_MESSAGE(WM_SEND_DRAWUAV, &CGISDlg::OnTimerDrawUAV) //绘制无人机 //航线编辑 // -----by Wu 2023.09.14 ON_COMMAND(ID_SELECT_LINE, OnMapSelect) //选择航线 ON_COMMAND(ID_EDIT_NODE, OnEditLine) //编辑航线 ON_COMMAND(ID_EDIT_LINE, ShowModifyPointDlg) //修改航点 ON_COMMAND(ID_EDIT_SAVE, ShowEditSaveDlg) //保存编辑 /* ON_COMMAND(ID_MODIFY_LINEPOINT, OnMapSelect); //修改航点航线 ON_COMMAND(ID_EDIT_SAVE, OnMapSelect); //保存编辑*/ /* //新增航线6-8 ON_COMMAND(IDM_SHOW_LINE6, &CGISDlg::OnShowLine6) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE6, &CGISDlg::OnUpdateShowLine6) ON_COMMAND(IDM_SHOW_LINE7, &CGISDlg::OnShowLine7) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE7, &CGISDlg::OnUpdateShowLine7) ON_COMMAND(IDM_SHOW_LINE8, &CGISDlg::OnShowLine8) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE8, &CGISDlg::OnUpdateShowLine8) ON_COMMAND(IDM_BINDLINE6, &CGISDlg::OnBindline6) ON_COMMAND(IDM_BINDLINE7, &CGISDlg::OnBindline7) ON_COMMAND(IDM_BINDLINE8, &CGISDlg::OnBindline8) ON_COMMAND(IDM_SHOW_LINE9, &CGISDlg::OnShowLine9) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE9, &CGISDlg::OnUpdateShowLine9) ON_COMMAND(IDM_SHOW_LINE10, &CGISDlg::OnShowLine10) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE10, &CGISDlg::OnUpdateShowLine10) ON_COMMAND(IDM_BINDLINE9, &CGISDlg::OnBindline9) ON_COMMAND(IDM_BINDLINE10, &CGISDlg::OnBindline10)*/ //空投航线 ON_COMMAND(IDM_SHOW_LINE14, &CGISDlg::OnShowLine14) ON_UPDATE_COMMAND_UI(IDM_SHOW_LINE14, &CGISDlg::OnUpdateShowLine14) 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); //地图显示区宽度、高度倒数 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 = "53d93c1a8b3400b050817ac001bdb60e";//个人Key,日访问上限1w次。 //string key = "5ff7526440d3a7dab78037697c4679fa"; 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(18);//设置缩放条最大18级 //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(3); m_bLDSetPoint = FALSE; if (!m_bEditLine) //非航线编辑模式下可选 { m_bSelectFeatureFlag = true; // by Wu } else { m_map.SetCursorMode(5); } } //地图全景显示 void CGISDlg::OnMapFullScreen() { m_bSetPointModel=FALSE; //m_bLineDesign=FALSE; m_bPtDel=FALSE; m_bPtEdit=FALSE; m_map.ZoomToMaxExtents(); m_map.SetCursorMode(4); m_bLDSetPoint = FALSE; m_bSelectFeatureFlag = false; } //功能:测量2点之间的距离 void CGISDlg::OnSurvey() { m_bSelectFeatureFlag = false; m_bSetPointModel=FALSE; // m_bLineDesign=FALSE; m_bPtDel=FALSE; m_bPtEdit=FALSE; m_bLDSetPoint = FALSE; m_map.SetCursorMode(mapWindow::tkCursorMode::cmNone); //多点测距 if (m_bPolylineMeasure) { ClearPloylineMeasure(); m_bPolylineMeasure = false; m_numPolylineMeasurePts = 0; m_bMeasureDrag = false; } else { m_bPolylineMeasure = true; } /* //重置 m_pHZDistanceDlg->ResetCoordinateData(); if (!m_bHaveShowDistanceDlg) { m_bHaveShowDistanceDlg = true; //显示软件界面 m_pHZDistanceDlg->ShowWindow(SW_SHOW); } else { m_bHaveShowDistanceDlg = false; //隐藏软件界面 m_pHZDistanceDlg->ShowWindow(SW_HIDE); }*/ } //清除航迹 void CGISDlg::OnEraseTrack() { EraseTrack(0); EraseTrack(1); EraseTrack(2); } //清除航迹 void CGISDlg::EraseTrack(int uavid) { if (uavid<0||uavid>2) { return; } m_bSetPointModel=FALSE; //m_bLineDesign=FALSE; m_bPtDel=FALSE; m_bPtEdit=FALSE; m_bLDSetPoint = FALSE; //已经标绘了无人机的飞行轨迹,清除航迹 if (m_bFirstDrawUAVTrack[uavid]) { //清除无人机的标绘图层 if (m_flyTrackLayerID[uavid] != -1) { m_map.RemoveLayer(m_flyTrackLayerID[uavid]); } if (m_UAVFlyTrackLayerID[uavid] != -1) { m_map.RemoveLayer(m_UAVFlyTrackLayerID[uavid]); } m_bFirstDrawUAVTrack[uavid] = false; m_map.Redraw(); } } //清除标绘的所有目标点数据 void CGISDlg::OnEraseAllTargets() { //标绘的目标点个数大于0时 if (m_targetPointNum > 0) { //清除所有标绘的Label m_map.ClearLabels(m_targetDrawLayerID); m_map.ClearDrawing(m_targetDrawLayerID); m_targetDrawLayerID = -1; m_map.Redraw(); } } //功能:增加无人机的飞行航点,绘制出无人机的飞行航迹 //输入:无人机的当前的经度dX,纬度dY,航向角yaw, 都以(°为单位) void CGISDlg::AddFlyPoint(int uavId,const double dX, const double dY, const double yaw,bool control) { //未加载地图,返回 if (!m_bHaveAddMap) { return; } //对输入的经纬度数值范围进行检查,看是否有效 double fabsLon = fabs(dX); double fabsLat = fabs(dY); //判断数据范围是否有效 if ((fabsLon<=0.000001) || (fabsLon>180) || (fabsLat<=0.000001) || (fabsLat>90) || (yaw<0) || (yaw>360)) { return; } if (m_bAutoMove) { //自动漫游,使飞机显示在地图中间 if (control) { AutomaticMoveMap(dX, dY); } } //标绘航迹点数zcw m_drawTrackPtNum[uavId]++; //增加了航迹点数,由200-》2000 2017.07.05 if (m_drawTrackPtNum[uavId] >= 100) { //清除航迹 EraseTrack(uavId); m_drawTrackPtNum[uavId] = 0; } //绘制UAV的飞行轨迹 DrawUAV(uavId,dX, dY, yaw,control); /*static int num = 0; if (num == 1) { DrawCanvas(); num = 0; } num++;*/ //实时通视分析 //m_dlgLightRegion.AnalysisRealTime(dY, distance, angleGU, g_gcsLon, g_gcsLat); //m_dlgLightRegion.DrawVisiAreaRealTime(dY, distance, angleGU, g_gcsLon, g_gcsLat); m_dlgLightRegion.DrawCrashAreaRealTime(dY, dX, dY); //刷新地图(每5帧刷新一次) m_map.Redraw(); } void CGISDlg::AddFlyPoint_ADS(const int uavNum, const int uavid, const double lon, const double lat, const double yaw, const bool control, const CString strPlaneName) { //未加载地图,返回 if (!m_bHaveAddMap) { return; } //对输入的经纬度数值范围进行检查,看是否有效 double fabsLon = fabs(lon); double fabsLat = fabs(lat); //判断数据范围是否有效 if ((fabsLon<=0.000001) || (fabsLon>180) || (fabsLat<=0.000001) || (fabsLat>90) || (yaw<0) || (yaw>360)) { return; } //绘制UAV的飞行轨迹 DrawUAV_ADS(uavNum, uavid, lon, lat, yaw, control, strPlaneName); //刷新地图(每5帧刷新一次) m_map.Redraw(); } void CGISDlg::Openlocalfile(CString file) { int error=0; CString filetype=GetFileType(file); CString filename=GetFileName(file); filetype.MakeLower(); if(filetype.Compare("shp")==0) { mapWindow::IShapefilePtr shape; shape.CreateInstance("MapWinGIS.Shapefile"); if( !shape->Open((_bstr_t)file,NULL)) { error=1; } _bstr_t pro=shape->GetProjection(); //设置地图的背景色为白色 m_map.SetBackColor(RGB(255,255,255)); int shpLayerPose = m_map.AddLayer(shape,true); //移动到底端 m_map.MoveLayerBottom(shpLayerPose); m_Layer->AddLayerInfo(filename,1); //是否已经加载了地图 m_bHaveAddMap = true; } else if(filetype.Compare("img")==0) { mapWindow::IImagePtr image; image.CreateInstance("MapWinGIS.Image"); if( !image->Open((_bstr_t)file,mapWindow::IMG_FILE,true,NULL)) { error=1; } //设置地图的背景色为白色 m_map.SetBackColor(RGB(255,255,255)); m_map.AddLayer(image,true); m_Layer->AddLayerInfo(filename,2); //是否已经加载了地图 m_bHaveAddMap = true; } else if(filetype.Compare("tif")==0) { mapWindow::IImagePtr image; image.CreateInstance("MapWinGIS.Image"); if( !image->Open((_bstr_t)file,mapWindow::TIFF_FILE,true,NULL)) { error=1; } //设置地图的背景色为白色 m_map.SetBackColor(RGB(255,255,255)); int tiffLayerID = m_map.AddLayer(image,true); m_Layer->AddLayerInfo(filename,2); //是否已经加载了地图 m_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); //航线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_b98CADesktop) { //航线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 )->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 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 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 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 (m_bHaveShowDistanceDlg && (Button == 1)) { //像素坐标转换地理坐标 m_map.PixelToProj(x,y, &dX, &dY); //设置点的经度、纬度 m_pHZDistanceDlg->SetPtCoordinate(dX, dY); } /***************************************多点测距 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 (m_lineSelectedID==11) //暂时屏蔽回收航线 { 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 lineX,lineY; TransformToVectorPoints(m_editLineDataGroup,lineX,lineY); int addPointPos = topologicalAnalysis.isPointInPolyLine(pt,lineX,lineY); if (addPointPos==0) //点击点不在线上 { return; } if (m_lineSelectedID==11) { if (addPointPos>m_editLineDataGroup.linePointNum-4) return; //回收航线屏蔽4,5,6长边不让编辑 } //计算添加点坐标 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 (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)//置点 { 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;iShowLonLat(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) //航线编辑时,停止编辑 { 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: { 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); } 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 (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(); } } } void CGISDlg::MouseMoveMap1(short Button, short Shift, long x, long y) { if (Button == 2) { return; } //显示经纬度坐标时 if (m_bHaveShowLonLatDlg && m_pLonLatDlg ->GetAutoEditStatus()) { double dX = 0; double dY = 0; m_map.PixelToProj(x,y, &dX, &dY); //软件界面显示 m_pLonLatDlg->SetLonLatInfo(dX, dY); } /*****************************************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 (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(0,0,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); //显示线段的距离和方位 /* if (g_lDemAltDisLayerID[g_iDemPointNum-1]!=-1) { m_map.ClearDrawing(g_lDemAltDisLayerID[g_iDemPointNum-1]); } g_lDemAltDisLayerID[g_iDemPointNum-1] = m_map.NewDrawing(1);*/ //DrawLineLabel(g_lDemAltDisLayerID[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); } /////////////////////新建点矢量图层标绘点目标/////////////////////////////////// //创建点图层 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(); } //功能:显示两点所连线段的距离和方位 void CGISDlg::DrawLineLabel(long &drawLayerID, const double ptLon1, const double ptLat1, const double ptLon2, const double ptLat2) { //没有加载地图,返回 if (!m_bHaveAddMap) { return; } 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 (drawLayerID > 0) { //清除标绘的点矢量图层 ClearPointShape(drawLayerID); drawLayerID = -1; } if (_T("") != str) { //创建点图层 CreateEmptyShapfile(drawLayerID, 0, RGB(255,0,0)); //红色 //Label集合 CLabels labesPtr; labesPtr = (m_map.GetShapefile(drawLayerID)).GetLabels(); //labesPtr = m_map.GetDrawingLabels(drawLayerID); labesPtr.SetFontColor(RGB(255,255,0)); labesPtr.SetAlignment(1); labesPtr.SetFontBold(TRUE); labesPtr.SetFontName(_T("Times New Roman")); labesPtr.SetFontSize(10); //CLabelCategory labelCategory = labesPtr.AddCategory(_T("")); /* labelCategory.SetFontColor(RGB(255,255,0)); labelCategory.SetAlignment(1); labelCategory.SetFontBold(TRUE); labelCategory.SetFontName(_T("Times New Roman")); labelCategory.SetFontSize(10);*/ labesPtr.AddLabel((LPCTSTR)str, textLon, textLat, 0, 0); //4.9版本此处有问题,会导致程序崩溃 } //重绘 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.SetAvoidCollisions(false); /* CLabelCategory labelCategory = drawLabels.AddCategory(_T("dist")); labelCategory.SetFontName(_T("黑体")); labelCategory.SetFontSize(12); labelCategory.SetOffsetX(8); labelCategory.SetFrameVisible(true); labelCategory.SetFrameTransparency(180); */ 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; iClearCurrentData(); //显示航线设计对话框 //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; kShowWindow(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_map.ClearLabels(m_designLineLayerID); } void CGISDlg::MouseWheel(short zDelta) { m_bSetPointModel=FALSE; //m_bHaveShowLineDesign = TRUE; //m_bLDSetPoint = FALSE; //m_bLineDesign=FALSE; m_bPtDel=FALSE; m_bPtEdit=FALSE; if (m_bHaveAddMap) { //滚轮放大、缩小 m_map.ZoomIn(0.0005 * zDelta); } } //功能:增加目标点,在地图显示区标绘出来 //输入:目标点号nPt,经度dX,纬度dY void CGISDlg::AddTargetPoint(const int nPt, const double dX, const double dY) { //没有加载地图 if (!m_bHaveAddMap) { return; } CString str; str.Format(_T("Target%d"), nPt); //字体标绘颜色 CString strColor = _T("绿色"); //基于点图层进行标注 AddPointShapeLayer(m_targetDrawLayerID, dX, dY, str, strColor, RGB(0,255,0)); } //功能:在矢量图层中动态标绘出无人机 //输入:经度dX,纬度dY,航向角yaw //说明:创建专门用于绘制无人机的矢量面图层,每次先删除上次标绘的Shp,再重新标绘 void CGISDlg::DrawUAV(int uavid, const double dX, const double dY, const double yaw,bool control) { if (uavid<0||uavid>2) { return; } //2017.03 by ZCW /* //第一次标绘航迹,新建标绘图层 if (!m_bFirstDrawUAVTrack) { //创建无人机轨迹线标绘图层 CreateEmptyShapfile(m_flyTrackLayerID, 1, RGB(255,0,0)); //创建无人机机体标绘图层 CreateEmptyShapfile(m_UAVFlyTrackLayerID, 2, RGB(255,0,0)); m_bFirstDrawUAVTrack = true; } else { //清除标绘无人机的轨迹 m_map.RemoveLayer(m_UAVFlyTrackLayerID); //创建无人机机体标绘图层 CreateEmptyShapfile(m_UAVFlyTrackLayerID, 2, RGB(255,0,0)); } //增加无人机轨迹点 AddOnePoint2Shapfile(m_flyTrackLayerID, 1, dX, dY); //计算标绘无人机面图层的点数组 CalculateUAVPolygonCoordinate(dX, dY, yaw); // AddUAVPoints2Polygon(m_UAVFlyTrackLayerID); //绘制新的无人机shp for (int i=0; iTrackPopupMenu( 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; iSetLineSectStatus(); 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; i1) { 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)) || (deletePtID<0)) { return 0; } //根据删除点的点号,更新航点数据集合 for (int i=deletePtID; iShowWindow(SW_HIDE); return 0; } //功能:创建空的shpfile图层 //输入:矢量图层类型shpType(0为—点图层;1为线图层;2为面图层) //输入:绘制颜色drawColor //输出:矢量图层ID号shpLayerID, void CGISDlg::CreateEmptyShapfile(long &shpLayerID, const int shpType, const unsigned long drawColor) { long fieldIndex = 0; //目标标绘SHP图层 mapWindow::IShapefilePtr targetPtShape; targetPtShape.CreateInstance("MapWinGIS.Shapefile"); //创建空的图层 if (shpType == 0) //点图层 { targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::SHP_POINT); } else if (shpType == 1) //线图层 { targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::SHP_POLYLINE); } else if (shpType == 2) //面图层 { targetPtShape->CreateNewWithShapeID(_T(""), mapWindow::SHP_POLYGON); } else { shpLayerID = -1; return; } //增加field表单1 mapWindow::IFieldPtr fieldPtr1; fieldPtr1.CreateInstance("MapWinGIS.Field"); fieldPtr1->Key = (_bstr_t)("X"); fieldPtr1->Type = mapWindow::DOUBLE_FIELD; targetPtShape->EditInsertField(fieldPtr1, &fieldIndex, NULL); //增加field表单2 mapWindow::IFieldPtr fieldPtr2; fieldPtr2.CreateInstance("MapWinGIS.Field"); fieldPtr2->Key = (_bstr_t)("Y"); fieldPtr2->Type = mapWindow::DOUBLE_FIELD; targetPtShape->EditInsertField(fieldPtr2, &fieldIndex, NULL); //目标标绘图层加入地图中 shpLayerID = m_map.AddLayer(targetPtShape, true); mapWindow::IShapeDrawingOptionsPtr pShapeDrawingOption; pShapeDrawingOption.CreateInstance("MapWinGIS.ShapeDrawingOptions"); if (shpType == 0) //点图层 { pShapeDrawingOption->FillColor = drawColor; pShapeDrawingOption->PointSize = 20; //pShapeDrawingOption->SetDefaultPointSymbol(mapWindow::tkDefaultPointSymbol::dpsDiamond); //pShapeDrawingOption->PutFillColor(drawColor); //pShapeDrawingOption->PutPointSize(18); pShapeDrawingOption->PutPointType(mapWindow::tkPointSymbolType::ptSymbolStandard); pShapeDrawingOption->PutPointShape(mapWindow::tkPointShapeType::ptShapeStar); //m_map.SetShapeLayerPointType(shpLayerID, mapWindow::ptDiamond); //m_map.SetShapeLayerStippleColor(shpLayerID, drawColor); } else if (shpType == 1) //线图层 { pShapeDrawingOption->LineColor = drawColor; pShapeDrawingOption->LineWidth = 2; } else if (shpType == 2) //面图层 { pShapeDrawingOption->FillColor = drawColor; } (m_map.GetShapefile(shpLayerID)).SetDefaultDrawingOptions(pShapeDrawingOption); } //功能:向shpfile点图层中增加航点数据 //输入:矢量图层ID号shpLayerID // 航点数据集合pts,航点个数ptNum void CGISDlg::AddPoints2PointShapfile(const long shpLayerID, const PtStruct *pts, const int ptNum) { for (long i=0; iCreate(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; ix = pts[i].dX; //纬度 pintPtr->y = pts[i].dY; shapePtr->InsertPoint(pintPtr, &i); } //插入线图层矢量 (m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &i); } //功能:向shpfile图层中增加航点数据 //输入:矢量图层ID号shpLayerID,矢量图层类型shpType(0为—点图层;1为线图层;2为面图层) // 航点数据集合pts,航点个数ptNum void CGISDlg::AddPoints2Shapfile(const long shpLayerID, const int shpType, const PtStruct *pts, const int ptNum) { long i = 0; //向点图层中加入航点数据 if (shpType == 0) //点图层 { for (i=0; iCreate(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; ix = pts[i].dX; //纬度 pintPtr->y = pts[i].dY; shapePtr->InsertPoint(pintPtr, &i); } //插入面矢量 (m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &i); } } //功能:基于shpfile面图层标绘方法绘制UAV void CGISDlg::AddUAVPoints2Polygon(const long shpLayerID) { //创建面图层 mapWindow::IShapePtr shapePtr; shapePtr.CreateInstance("MapWinGIS.Shape"); shapePtr->Create(mapWindow::SHP_POLYGON); long shpNum = 0; for (int i=0; i<18; i++) { mapWindow::IPointPtr pintPtr; pintPtr.CreateInstance("MapWinGIS.Point"); //经度 pintPtr->x = m_ppUavPtArray[i][0]; //纬度 pintPtr->y = m_ppUavPtArray[i][1]; //向当前shp中插入一个航点数据 shapePtr->InsertPoint(pintPtr, &shpNum); } shpNum = 0; (m_map.GetShapefile(shpLayerID)).EditClear(); //将shpfile文件中插入shp文件 (m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &shpNum); } //功能:向shpfile图层中增加1个航点数据 //输入:矢量图层ID号shpLayerID,shp类型shpType // 航点数据,经度—dX; 纬度—dY void CGISDlg::AddOnePoint2Shapfile(const long shpLayerID, const int shpType, const double dX, const double dY) { mapWindow::IPointPtr pintPtr; pintPtr.CreateInstance("MapWinGIS.Point"); //经度 pintPtr->x = dX; //纬度 pintPtr->y = dY; //shpfile文件中的shp图层个数 long shpNum = (m_map.GetShapefile(shpLayerID)).GetNumShapes(); //判断是否已经存在该shp图层,不存在,创建新的shp图层 if (shpNum == 0) { mapWindow::IShapePtr shapePtr; shapePtr.CreateInstance("MapWinGIS.Shape"); if (shpType == 0) //点图层 { shapePtr->Create(mapWindow::SHP_POINT); } else if (shpType == 1) //线图层 { shapePtr->Create(mapWindow::SHP_POLYLINE); } else if (shpType == 2) //面图层 { shapePtr->Create(mapWindow::SHP_POLYGON); } //向当前shp中插入一个航点数据 shapePtr->InsertPoint(pintPtr, &shpNum); //将shpfile文件中插入shp文件 (m_map.GetShapefile(shpLayerID)).EditInsertShape(shapePtr, &shpNum); } else { //获得当前的shp CShape shape = (m_map.GetShapefile(shpLayerID)).GetShape(shpNum-1); //当前的航点个数 long curLinePts = shape.GetNumPoints(); //向当前shp中插入一个航点数据 shape.InsertPoint(pintPtr, &curLinePts); } } //功能:在地图显示区标绘出装订的飞行航线数据 //输入:航线数据体集合linePtArray,航线的航点个数ptNum //说明:地图显示器已经标绘了该航线,则清除标绘,重新标绘航线 void CGISDlg::DrawBindingLine(const PtStruct *linePtArray, const int ptNum) { if (ptNum == 0 ) { return; } //航线数据集合 DrawLineDataStruct lineDataArr; //航点数据体转标绘的航线数据集合 m_lineManage.LinePoint2DrawLinePoints(lineDataArr, linePtArray, ptNum); //清除标绘的航线 ClearDrawedLine(lineDataArr.lineID-1); //拷贝数据到航线集合中 m_pFlyLines[lineDataArr.lineID-1] = lineDataArr; //地图标绘出航线 //DrawFlyLine(m_pFlyLines[lineDataArr.lineID-1]); DrawFlyLine(lineDataArr); } //功能:标绘飞行航线 //输入:航线数据lineData void CGISDlg::DrawFlyLine(const DrawLineDataStruct lineData) { //field索引值 long fieldIndex = 0; //航线索引号 int lineID = lineData.lineID-1; //没有目标标绘SHP图层,创建该图层 if (!m_pHaveDrawLineFlag[lineID]) { //创建点图层 CreateEmptyShapfile(m_ppPlanLineShpLayerIDArr[lineID][0], 0, /*RGB(0,255,0)*/LineClr[lineID]); //创建线图层 CreateEmptyShapfile(m_ppPlanLineShpLayerIDArr[lineID][1], 1, /*RGB(0,255,0)*/LineClr[lineID]); //创建线图层成功 m_pHaveDrawLineFlag[lineID] = true; } //向点图层加入航点数据 AddPoints2PointShapfile(m_ppPlanLineShpLayerIDArr[lineID][0], lineData.pts, lineData.pointNum); //向线图层加入航点数据 AddPoints2LineShapfile(m_ppPlanLineShpLayerIDArr[lineID][1], lineData.linePts, lineData.linePointNum); /////////////////////往SHP图层中加入目标点标注信息/////////////////////////////// //Label集合 CLabels labesPtr; labesPtr = (m_map.GetShapefile(m_ppPlanLineShpLayerIDArr[lineID][0])).GetLabels(); //CLabelCategory labelCategory = labesPtr.AddCategory(_T("红色")); //labelCategory.SetFontColor(/*RGB(255,0,0)*/LineClr[lineID]); //labelCategory.SetAlignment(1); //labelCategory.SetFontBold(TRUE); //labelCategory.SetFontName(LPCTSTR("黑体")); //labelCategory.SetFontSize(12); //labesPtr.SetAvoidCollisions(FALSE); labesPtr.SetFontColor(/*RGB(255,0,0)*/LineClr[lineID]); labesPtr.SetAlignment(1); labesPtr.SetFontBold(true); labesPtr.SetFontName(LPCTSTR("黑体")); labesPtr.SetFontSize(16); labesPtr.put_FontSize2(16); labesPtr.SetFrameVisible(false); labesPtr.SetAvoidCollisions(FALSE); CString strText = _T(""); //标绘航点的名称 for (long i=0; i(m_rcDesignGISWindow.left*cx); gisRect.top = static_cast(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; icode == 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_guidePtInfo.guideMode = 2; m_guidePointMode = 2; m_bGuideMode = true; //导引飞行模式为真 //2023.4.3 JackLiu /*DrawGuidePoint(2,m_guidePtInfo.guidePtLon, m_guidePtInfo.guidePtLat); m_struMapOut.cmd=MapCmd_Guide2; m_struMapOut.lon = m_guidePtInfo.guidePtLon; m_struMapOut.lat = m_guidePtInfo.guidePtLat; ::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP, (int)(&m_struMapOut),0);*/ //::PostMessage(m_MsgHwnd, m_MsgID, WPARAM(&m_guidePtInfo) , 2); //::PostMessage(HWND_BROADCAST, WM_SEND_GUIDEPOINT_INFO , WPARAM(&m_guidePtInfo) , 2); } //功能:显示1号航线 void CGISDlg::OnShowLine1() { SetFlyLineShowStatus(1); } //功能:显示2号航线 void CGISDlg::OnShowLine2() { SetFlyLineShowStatus(2); } //功能:显示3号航线 void CGISDlg::OnShowLine3() { SetFlyLineShowStatus(3); } //功能:显示4号航线 void CGISDlg::OnShowLine4() { SetFlyLineShowStatus(4); } //功能:显示5号航线 void CGISDlg::OnShowLine5() { SetFlyLineShowStatus(5); } //功能:显示6号航线 void CGISDlg::OnShowLine6() { SetFlyLineShowStatus(6); } //功能:显示7号航线 void CGISDlg::OnShowLine7() { SetFlyLineShowStatus(7); } //功能:显示8号航线 void CGISDlg::OnShowLine8() { SetFlyLineShowStatus(8); } //功能:显示9号航线 void CGISDlg::OnShowLine9() { SetFlyLineShowStatus(9); } //功能:显示10号航线 void CGISDlg::OnShowLine10() { SetFlyLineShowStatus(10); } //功能:显示空投 void CGISDlg::OnShowLine14() { SetFlyLineShowStatus(14); } //功能:清除已经标绘的航线 //输入:航线编号lineID,从0开始计数 void CGISDlg::ClearDrawedLine(const int lineID) { if (m_pHaveDrawLineFlag[lineID]) { //清除标绘的点矢量图层 ClearPointShape(m_ppPlanLineShpLayerIDArr[lineID][0]); //清除已经标绘的航线 m_map.RemoveLayer(m_ppPlanLineShpLayerIDArr[lineID][1]); m_pHaveDrawLineFlag[lineID] = false; } } //功能:处理快捷菜单与航线显示相关的操作 // 1)航线已经标注,清除显示 // 2)航线未标注,进行显示 //输入:航线编号lineID void CGISDlg::SetFlyLineShowStatus(const int lineID) { int lineIndex = lineID - 1; //已经标绘,清除航线 if (m_pHaveDrawLineFlag[lineIndex]) { //清除标绘的航线 ClearDrawedLine(lineIndex); //刷新 m_map.Redraw(); //标识置false m_pHaveDrawLineFlag[lineIndex] = false; } else { TCHAR filter[500]=_T("航线文件(*.txt)\0*.txt\0)"); CFileDialog LineRouteDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter, NULL); /*LineRouteDlg.m_ofn.lpstrInitialDir = strRouteFileDir;*/ LineRouteDlg.m_ofn.lpstrFilter="txt(*.txt)\0*.txt"; LineRouteDlg.m_ofn.lpstrTitle = "选择显示最新生成的航线"; if (LineRouteDlg.DoModal() == IDOK) //用户单击OK按钮中止对话框的返回值 { CString str = LineRouteDlg.GetPathName(); //获取文件路径名 OnShowGivenLine(str/*GetFlyLineName(lineID)*/); } } } void CGISDlg::OnUpdateLineDisplay1( CCmdUI *pCmdUI ) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[0]); //当1号航线选中后,打上记号 } void CGISDlg::OnUpdateLineDisplay2( CCmdUI *pCmdUI ) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[1]); } void CGISDlg::OnUpdateLineDisplay3( CCmdUI *pCmdUI ) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[2]); } void CGISDlg::OnUpdateLineDisplay4( CCmdUI *pCmdUI ) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[3]); } void CGISDlg::OnUpdateLineDisplay5( CCmdUI *pCmdUI ) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[4]); } void CGISDlg::OnUpdateShowLine6(CCmdUI *pCmdUI) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[5]); } void CGISDlg::OnUpdateShowLine7(CCmdUI *pCmdUI) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[6]); } void CGISDlg::OnUpdateShowLine8(CCmdUI *pCmdUI) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[7]); } void CGISDlg::OnUpdateShowLine9(CCmdUI *pCmdUI) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[8]); } void CGISDlg::OnUpdateShowLine10(CCmdUI *pCmdUI) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[9]); } void CGISDlg::OnUpdateShowLine14(CCmdUI *pCmdUI) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[13]); } //功能:显示航线 //输入:航线文件名称strLineFileName void CGISDlg::OnShowGivenLine(const CString strLineFileName) { //判断地图是否已经加载,没有加载返回 if ( !m_bHaveAddMap ) //没有加载地图? { BCGPMessageBox( _T( "请先加载地图!" ) ); return; } if (_T("") == strLineFileName) { return; } //判断文件是否存在 if (!SearchDirectory(strLineFileName)) { BCGPMessageBox( _T( "航路文件不存在!" ) ); return; } //航线数据集合 DrawLineDataStruct lineDataGroup; //初始化 memset(&lineDataGroup, 0, sizeof(DrawLineDataStruct)); //航线文件读取成功 if (m_lineManage.ReadLineDataFromFile(lineDataGroup, strLineFileName)) { //判断航线号是否正确(lineID取值1-8,10-11,13)(add by jackwong 2018.08.01) if(lineDataGroup.lineID<1 || /*(*/lineDataGroup.lineID>14 /*&& lineDataGroup.lineID<10)*/ /*|| lineDataGroup.lineID==14 *//*|| lineDataGroup.lineID>13*/) { BCGPMessageBox("航线号不正确!"); return; } /*******************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(ptPixelX - 20); rc.top = static_cast(ptPixelY - 20); rc.right = static_cast(ptPixelX + 20); rc.bottom = static_cast(ptPixelY + 20); CPoint xy; xy.x = x; xy.y = y; if(rc.PtInRect(xy)) { return true; } return false; } void CGISDlg::MouseUpMap1(short Button, short Shift, long x, long y) { m_iPtSel=-1; } //功能:是否进行自动漫游 void CGISDlg::OnAutoMove() { if (m_bAutoMove) { m_bAutoMove = false; } else { m_bAutoMove = true; } } void CGISDlg::OnDesignLine() //航线设计 { if (m_bHaveAddMap) { //已经处于航线设计状态时,返回 if (m_bLineDesign) { return; } else { m_bLineDesign = true; // //设计第一个航点 // m_bDesignFirstPoint = true; } // //清除现有的航线数据 // m_pFlyLineDesign->ClearCurrentData(); // // //显示航线设计对话框 // m_pFlyLineDesign->ShowWindow(SW_SHOW); // // //显示软件 // m_pLineSectDlg->ShowWindow(SW_SHOW); // // //设置鼠标为“选择”样式 // m_map.SetCursorMode(3); } else { BCGPMessageBox(_T("请先加载地图数据!")); } if(m_bLineDesign == false) { m_bLineDesign=true; //航线设计模式启动 } } void CGISDlg::OnData() { AfxMessageBox("this is test!!!"); } void CGISDlg::OnUpdateAutoMov( CCmdUI *pCmdUI ) { pCmdUI->SetCheck(m_bAutoMove); } //功能:标绘回收点位置 //输入:导引点类型callbackMode(1为回收点1;2为回收点2),经度dX,纬度dY void CGISDlg::DrawCallBackPoint(const BYTE callbackMode, const double dX, const double dY) { //没有加载地图 if (!m_bHaveAddMap) { return; } if ((callbackMode>255) || (callbackMode<1)) { return; } CString str; str.Format(_T("CallbackPoint%d"), callbackMode); //字体标绘颜色 CString strColor = _T("绿色"); //基于点图层进行标注 AddPointShapeLayer(m_pCallBackShapfileID[callbackMode-1], dX, dY, str, strColor, RGB(0,255,0)); } //功能:取消地图区标绘的导引点 void CGISDlg::OnRemoveGuidePtDraw() { //判断点矢量图层是否已经存在,存在则删除 if (m_guidePtShpLayerID != -1) { //清除标绘的点矢量图层 ClearPointShape(m_guidePtShpLayerID); m_guidePtShpLayerID = -1; } //导引点模式 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 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;iAddTail(pt); } return TRUE; } else { MessageBox("航路文件错误!","地图"); pList->RemoveAll(); return FALSE; } } //显示回收航线(14) void CGISDlg::OnShowBackLine() { // TODO: 在此添加命令处理程序代码 if (g_b981ADesktop || g_b981APad) { SetFlyLineShowStatus(14); } if (g_b98CADesktop) { SetFlyLineShowStatus(11); } } void CGISDlg::OnUpdateShowBackLine(CCmdUI *pCmdUI) { // TODO: 在此添加命令更新用户界面处理程序代码 if (g_b981ADesktop || g_b981APad) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[13]); } if (g_b98CADesktop) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[10]); } } void CGISDlg::OnShowHs11() { // TODO: 在此添加命令处理程序代码 if (g_b981ADesktop || g_b981APad) { SetFlyLineShowStatus(11); } if (g_b98CADesktop) { SetFlyLineShowStatus(7); } } //应急航线 11 void CGISDlg::OnUpdateShowHs11(CCmdUI *pCmdUI) { // TODO: 在此添加命令更新用户界面处理程序代码 if (g_b981ADesktop || g_b981APad) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[10]); } if (g_b98CADesktop) { pCmdUI->SetCheck(m_pHaveDrawLineFlag[6]); } } void CGISDlg::OnBindHs11() { m_struMapOut.cmd=MapCmd_BindLine; if (g_b981ADesktop || g_b981APad) { m_struMapOut.ID=11; } if (g_b98CADesktop) { 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_b98CADesktop) { SetFlyLineShowStatus(6); } } void CGISDlg::OnBindTc12() { m_struMapOut.cmd=MapCmd_BindLine; if (g_b981ADesktop || g_b981APad) { m_struMapOut.ID=12; } if (g_b98CADesktop) { 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_b98CADesktop) { 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_b98CADesktop) { m_struMapOut.ID=11; } ::SendMessage(GetParent()->GetSafeHwnd(),MESSAGE_B8MAP,(int)(&m_struMapOut),0); } void CGISDlg::UpdateDataInfo(int index,const char* key,double value) { switch (index) { case 0: m_infoData.lineID = value; break; case 1: m_infoData.ptID = value; break; case 2: m_infoData.disDF = value; break; case 3: m_infoData.disCP = value; break; case 4: m_infoData.headingGD = value; break; case 5: m_infoData.anglePH = value; break; case 6: m_infoData.heightGD = value; break; case 7: m_infoData.heightPC = value; break; case 8: m_infoData.speedGD = value; break; case 9: m_infoData.heightCG = value; break; case 10: m_infoData.dis = value; break; case 11: m_infoData.heading = value; break; default: break; } DrawCanvas(); } //标绘地图参数 void CGISDlg::DrawCanvas() { COLORREF color = RGB(50,235,50); //COLORREF colorback= RGB(0,0,0);//黑底 CRect rec; m_map.GetClientRect(&rec); const long leftEdge = rec.left; const long topEdge = rec.top + 20; const int horizonInter = 11; const int verticalInter = rec.Height() / 19; CLabels labesPtr; if(m_canvasLayerID != -1) { labesPtr = m_map.GetDrawingLabels(m_canvasLayerID); labesPtr.Clear(); CString str = ""; str.Format(_T("%-s%-d"),_T("航线序号:"),m_infoData.lineID); labesPtr.AddLabel(str, leftEdge + horizonInter, topEdge + verticalInter * 1, 0, 0); str.Format(_T("%-s%-d"),_T("航点序号:"),m_infoData.ptID); labesPtr.AddLabel(str, leftEdge + horizonInter, topEdge + verticalInter * 2, 0, 0); str.Format(_T("%-s%-d"),_T("待飞距离:"),m_infoData.disDF); labesPtr.AddLabel(str, leftEdge + horizonInter, topEdge + verticalInter * 4, 0, 0); str.Format(_T("%-s%-.1lf"),_T("侧偏距离:"),m_infoData.disCP); labesPtr.AddLabel(str, leftEdge + horizonInter, topEdge + verticalInter * 5, 0, 0); str.Format(_T("%-s%-.1lf"),_T("航向给定:"),m_infoData.headingGD); labesPtr.AddLabel(str, rec.left + horizonInter/* - 11*/, topEdge + verticalInter * 7, 0, 0); str.Format(_T("%-s%-.1lf"),_T("偏航角度:"),m_infoData.anglePH); labesPtr.AddLabel(str, rec.left + horizonInter/* - 11*/, topEdge + verticalInter * 8, 0, 0); str.Format(_T("%-s%-.1lf"),_T("高度偏差:"),m_infoData.heightPC); labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 10, 0, 0); str.Format(_T("%-s%-.1lf"),_T("高度给定:"),m_infoData.heightGD); labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 11, 0, 0); str.Format(_T("%-s%-.1lf"),_T("空速给定:"),m_infoData.speedGD); labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 13, 0, 0); str.Format(_T("%-s%-.1lf"),_T("飞行场高:"),m_infoData.heightCG); labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 14, 0, 0); str.Format(_T("%-s%-.1lf"),_T("飞机距离:"),m_infoData.dis); labesPtr.AddLabel(str, rec.left + horizonInter, topEdge + verticalInter * 16, 0, 0); str.Format(_T("%-s%-.1lf"),_T("飞机方位:"),m_infoData.heading); labesPtr.AddLabel(str, rec.left + horizonInter /*- 5*/, topEdge + verticalInter * 17, 0, 0); } else { m_canvasLayerID = m_map.NewDrawing(0); labesPtr = m_map.GetDrawingLabels(m_canvasLayerID); CLabelCategory left = labesPtr.AddCategory(_T("")); left.SetFontColor(color); left.SetAlignment(2);//0:居中;1 右对齐,2表示左对齐 left.SetOffsetX(0); left.SetOffsetY(0); left.SetFontBold(true); left.SetFontName(LPCTSTR("黑体")); left.SetFontSize(13); left.SetFrameBackColor(RGB(0,0,0)); left.SetFrameVisible(TRUE); left.SetFrameTransparency(0); CLabelCategory right = labesPtr.AddCategory(_T("")); right.SetFontColor(color); right.SetAlignment(2);//0:右;1 居中,2表示左对齐 right.SetOffsetX(0); right.SetOffsetY(0); right.SetFontBold(true); right.SetFontName(LPCTSTR("黑体")); right.SetFontSize(13); right.SetFrameBackColor(RGB(0,0,0)); right.SetFrameVisible(TRUE); right.SetFrameTransparency(0); } //m_map.Redraw(); } void CGISDlg::SetLabelCategory(const long& shapeID, int fontSize /*= 12*/, unsigned long fontColor /*= RGB(255,0,0)*/, unsigned long frameBackColor /*= RGB(0,0,0)*/, double XOffset/* = 0*/, double YOffset /*= 0*/) { if(shapeID == -1) return; CLabels labesPtr; labesPtr = (m_map.GetShapefile(shapeID)).GetLabels(); CLabelCategory labelCategory = labesPtr.AddCategory(_T("")); labelCategory.SetFontColor(fontColor); labelCategory.SetAlignment(1); labelCategory.SetOffsetX(XOffset); labelCategory.SetOffsetY(YOffset); labelCategory.SetFontBold(TRUE); labelCategory.SetFontName(LPCTSTR("宋体")); labelCategory.SetFontSize(fontSize); labelCategory.SetFrameBackColor(frameBackColor); labelCategory.SetFrameVisible(TRUE); } void CGISDlg::OnMove(int x, int y) { CBCGPDialog::OnMove(x, y); // TODO: 在此处添加消息处理程序代码 CRect rc; GetClientRect(&rc); ClientToScreen(&rc); /*if (m_pUavSelDlg1->GetSafeHwnd()) { m_pUavSelDlg1->MoveWindow(rc.left,rc.top+10,50,50); } if (m_pUavSelDlg2->GetSafeHwnd()) { m_pUavSelDlg2->MoveWindow(rc.left+rc.Width()/2-100,rc.top+10,50,50); } if (m_pUavSelDlg3->GetSafeHwnd()) { m_pUavSelDlg3->MoveWindow(rc.left+rc.Width()-100,rc.top+10,50,50); }*/ } BOOL CGISDlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) { // TODO: 在此添加专用代码和/或调用基类 return CBCGPDialog::OnWndMsg(message, wParam, lParam, pResult); } //切换飞机 afx_msg LRESULT CGISDlg::OnSelUav(WPARAM wParam, LPARAM lParam) { return 0; } //添加地标点 void CGISDlg::OnAddTarget() { // TODO: 在此添加命令处理程序代码 /*if (m_pTargetDlg->GetSafeHwnd()) { ReadTargetIni(false); m_pTargetDlg->ShowWindow(SW_SHOW); }*/ m_dlgMarker.ShowWindow(TRUE); } void CGISDlg::ReadTargetIni(bool bDraw) { CString m_MapPath; //默认打开地图路径 char lonBuf[255]; char latBuf[255]; CString fileName = GetSoftwareCurrentDirectory() + "\\target.ini"; CString strTarget ; for (int i = 1; i < 255 ; i++) { if (m_pTargetDlg) { m_pTargetDlg->SetExistFlag(i,false); } strTarget.Format("%d",i); BOOL blon = GetPrivateProfileString(strTarget,"lon",0,lonBuf,20,fileName); BOOL blat = GetPrivateProfileString(strTarget,"lat",0,latBuf,20,fileName); if (blon&&blat) { double lon = atof(lonBuf); double lat = atof(latBuf); if (fabs(lon)>180.0||fabs(lat)>90.0)//数据非法,清除 { WritePrivateProfileString(strTarget,"lon",NULL, fileName); WritePrivateProfileString(strTarget,"lat",NULL, fileName); WritePrivateProfileString(strTarget,"alt",NULL, fileName); continue; } m_targets[i-1].id = i; m_targets[i-1].lon = lon; m_targets[i-1].lat = lat; if (bDraw) { AddTargetPoint(i,lon,lat); } if (m_pTargetDlg) { m_pTargetDlg->SetExistFlag(i,true); } } else { m_targets[i-1].id = -1; } } } afx_msg LRESULT CGISDlg::OnDrawTarget(WPARAM wParam, LPARAM lParam) { if (m_pTargetDlg->GetSafeHwnd()) { int id = 0; double lon = 0.0; double lat = 0.0; double alt = 0.0; m_pTargetDlg->GetTargetLLA(id,lon,lat,alt); if (id>0&&id<255) { m_targets[id-1].id = id; m_targets[id-1].lon = lon; m_targets[id-1].lat = lat; } AddTargetPoint(id,lon,lat); } return 0; } void CGISDlg::OnShowWindow(BOOL bShow, UINT nStatus) { CBCGPDialog::OnShowWindow(bShow, nStatus); // TODO: 在此处添加消息处理程序代码 if(bShow) { HCURSOR hCur = LoadCursor(NULL,IDC_ARROW); ::SetCursor(hCur); CString dir = ""; CString fileName = GetSoftwareCurrentDirectory() + "\\map.ini"; ::GetPrivateProfileString("map", "layer","",dir.GetBuffer(256),256, fileName); dir.ReleaseBuffer(256); if(!m_bHaveAddMap) { CFileFind fd; if (fd.FindFile(dir)) { Openlocalfile(dir); } fd.Close(); } } //ReadTargetIni(true); } //删除选中的目标点(因为不能确定图层中的点,所以采用全部删除再绘制方法) void CGISDlg::OnTargetDelete() { // TODO: 在此添加命令处理程序代码 CString strID = ""; strID.Format("%d",m_targetSelID); CString fileName = GetSoftwareCurrentDirectory() + "\\target.ini"; WritePrivateProfileString(strID,"lon",NULL, fileName); WritePrivateProfileString(strID,"lat",NULL, fileName); WritePrivateProfileString(strID,"alt",NULL, fileName); m_map.GetShapefile(m_targetDrawLayerID).EditClear(); m_map.GetShapefile(m_targetDrawLayerID).GetLabels().Clear(); ReadTargetIni(true); m_map.Redraw(); m_targetSelID = 0; } //在地图上选点 afx_msg LRESULT CGISDlg::OnSendSelectTarget(WPARAM wParam, LPARAM lParam) { m_bSelectDropPoint = true; //设置鼠标为“选择”样式 m_map.SetCursorMode(3); return 0; } //显示标注点 afx_msg LRESULT CGISDlg::OnShowPointInMap(WPARAM wParam, LPARAM lParam) { if (!m_bHaveAddMap) { return 0; } if (0 == m_longGroundID) { //基于点图层进行标注 AddPointShapeLayer(m_longGroundID, m_dlgLightRegion.m_dGroundLon, m_dlgLightRegion.m_dGroundLat, _T("GCS(LOS)"), _T("红色"), RGB(255,0,0)); } else { ClearPointShape(m_longGroundID); m_longGroundID = 0; } return 0; } //显示可视区域 afx_msg LRESULT CGISDlg::OnShowPointVisible(WPARAM wParam, LPARAM lParam) { if (m_visbleCircleLayerID < 0) { m_gisManager->CreateEmptyAreaShapfile(m_visbleCircleLayerID,RGB(0,255,0),RGB(0,255,0),40); //绿色 } for (int i=0;i<360;i++) { m_gisManager->AddOnePoint2Shapfile(m_visbleCircleLayerID,2,g_structPointVisible[i].lon,g_structPointVisible[i].lat); } //区域面积为零时,清除该区域显示 if (0 == m_map.GetShapefile(m_visbleCircleLayerID).GetShape(0).GetArea()) { m_map.GetShapefile(m_visbleCircleLayerID).EditClear(); } m_map.Redraw(); /*structPoint *_structPoint = (structPoint*)wParam; m_gisManager->AddOnePoint2Shapfile(m_visbleCircleLayerID,2,_structPoint->lon,_structPoint->lat);*/ return 0; } //显示不可视区域 afx_msg LRESULT CGISDlg::OnShowPointNotVisible(WPARAM wParam, LPARAM lParam) { if (m_notVisibleCircleLayerID < 0) { m_gisManager->CreateEmptyAreaShapfile(m_notVisibleCircleLayerID,RGB(255,0,0),RGB(255,0,0),40); //红色 } for (int i=0;i<722;i++) { m_gisManager->AddOnePoint2Shapfile(m_notVisibleCircleLayerID,2,g_structPointNotVisible[i].lon,g_structPointNotVisible[i].lat); } //区域面积为零时,清除该区域显示 if (0 == m_map.GetShapefile(m_notVisibleCircleLayerID).GetShape(0).GetArea()) { m_map.GetShapefile(m_notVisibleCircleLayerID).EditClear(); } m_map.Redraw(); /*structPoint *_structPoint = (structPoint*)wParam; m_gisManager->AddOnePoint2Shapfile(m_notVisibleCircleLayerID,2,_structPoint->lon,_structPoint->lat);*/ return 0; } //清除可视区域与不可视区域绘制图层 afx_msg LRESULT CGISDlg::OnSendClearShape(WPARAM wParam, LPARAM lParam) { if (m_visbleCircleLayerID > 0) { m_map.GetShapefile(m_visbleCircleLayerID).EditClear(); } if (m_notVisibleCircleLayerID > 0) { m_map.GetShapefile(m_notVisibleCircleLayerID).EditClear(); } m_map.Redraw(); return 0; } //实时显示可视区域 afx_msg LRESULT CGISDlg::OnShowAreaVisible(WPARAM wParam, LPARAM lParam) { if (m_visiRealCircleLayerID < 0) { m_gisManager->CreateEmptyAreaShapfile(m_visiRealCircleLayerID,RGB(0,255,0),RGB(0,255,0),40); //绿色 } for (int i=0;i <= int(wParam);i++) { m_gisManager->AddOnePoint2Shapfile(m_visiRealCircleLayerID,2,g_structPointVisiReal[i].lon,g_structPointVisiReal[i].lat); } //区域面积为零时,清除该区域显示 if (0 == m_map.GetShapefile(m_visiRealCircleLayerID).GetShape(0).GetArea()) { m_map.GetShapefile(m_visiRealCircleLayerID).EditClear(); } /*double _uavlon,_uavlat; CalculatePtCoordinate(_uavlon, _uavlat, m_dlgLightRegion.m_dRealTime_GCSlon, m_dlgLightRegion.m_dRealTime_GCSlat, m_dlgLightRegion.m_dRealTime_AngToGCS, m_dlgLightRegion.m_dRealTime_DisToGCS, 3); if (m_RealCircleLayerID < 0) { m_gisManager->CreateEmptyAreaShapfile(m_RealCircleLayerID,RGB(0,0,255),RGB(0,0,255),40); } double ptLon, ptLat; for (int i = 0; i<=360;i++) { CalculatePtCoordinate(ptLon, ptLat, _uavlon, _uavlat, i, 2800, 3); m_gisManager->AddOnePoint2Shapfile(m_RealCircleLayerID,2,ptLon, ptLat); }*/ m_map.Redraw(); return 0; } //实时显示不可视区域 afx_msg LRESULT CGISDlg::OnShowAreaNotVisible(WPARAM wParam, LPARAM lParam) { if (m_notVisiRealCircleLayerID < 0) { m_gisManager->CreateEmptyAreaShapfile(m_notVisiRealCircleLayerID,RGB(255,0,0),RGB(255,0,0),40); //红色 } for (int i=0;i <= int(wParam);i++) { m_gisManager->AddOnePoint2Shapfile(m_notVisiRealCircleLayerID,2,g_structPointNotVisiReal[i].lon,g_structPointNotVisiReal[i].lat); } //区域面积为零时,清除该区域显示 if (0 == m_map.GetShapefile(m_notVisiRealCircleLayerID).GetShape(0).GetArea()) { m_map.GetShapefile(m_notVisiRealCircleLayerID).EditClear(); } m_map.Redraw(); return 0; } //清除实时区域 afx_msg LRESULT CGISDlg::OnShowClearArea(WPARAM wParam, LPARAM lParam) { if (m_visiRealCircleLayerID > 0) { m_map.GetShapefile(m_visiRealCircleLayerID).EditClear(); } if (m_notVisiRealCircleLayerID > 0) { m_map.GetShapefile(m_notVisiRealCircleLayerID).EditClear(); } /*if (m_RealCircleLayerID > 0) { m_map.GetShapefile(m_RealCircleLayerID).EditClear(); }*/ m_map.Redraw(); return 0; } //删除通视等高线图层 afx_msg LRESULT CGISDlg::OnDelLineLayer(WPARAM wParam, LPARAM lParam) { for (int i=0;i<20;i++) { if (m_longContourLineID[i] > 0) { m_map.GetShapefile(m_longContourLineID[i]).EditClear(); } m_gisManager->CreateEmptyLineShapfile(m_longContourLineID[i],RGB(0,255,0),1.5); //绿色 if (m_longContourTextID[i] != 0) { ClearPointShape(m_longContourTextID[i]); m_longContourTextID[i] = 0; } } m_map.Redraw(); return 0; } //添加点到通视等高线图层 afx_msg LRESULT CGISDlg::OnAddLineLayer(WPARAM wParam, LPARAM lParam) { structPoint *_structPoint = (structPoint*)wParam; m_gisManager->AddOnePoint2Shapfile(m_longContourLineID[(int)lParam],1,_structPoint->lon,_structPoint->lat); //标绘高度 if (m_longContourTextID[(int)lParam] == 0) { //标注 CString str; str.Format(_T("%dm"), (int)lParam * 500); //创建点图层 CreateEmptyShapfile(m_longContourTextID[(int)lParam], 0, RGB(255,0,0)); //红色 //Label集合 CLabels labesPtr; labesPtr = (m_map.GetShapefile(m_longContourTextID[(int)lParam])).GetLabels(); CLabelCategory labelCategory = labesPtr.AddCategory(_T("红色")); labelCategory.SetFontColor(RGB(255,0,0)); labelCategory.SetAlignment(1); labelCategory.SetFontBold(TRUE); labelCategory.SetFontName(_T("宋体")); labelCategory.SetFontSize(11); labesPtr.AddLabel(str, _structPoint->lon, _structPoint->lat + 0.0005, 0, 0); } m_map.Redraw(); return 0; } //可视域分析到GIS对话框的消息响应函数 afx_msg LRESULT CGISDlg::OnSendRegionToGis(WPARAM wParam, LPARAM lParam) { if (1 == (int)wParam) { g_bSelectDropPoint = true; //设置鼠标为“选择”样式 m_map.SetCursorMode(3); } else if (2 == (int)wParam) { if (m_longSelectLineID > 0) { m_map.GetShapefile(m_longSelectLineID).EditClear(); } if (m_longLabelPlotID != 0) { ClearPointShape(m_longLabelPlotID); m_longLabelPlotID = 0; } m_map.Redraw(); } else if (3 == (int)wParam) { structPoint *_structPoint = (structPoint*)lParam; if (m_longSelectLineID > 0) { m_map.GetShapefile(m_longSelectLineID).EditClear(); } m_gisManager->CreateEmptyLineShapfile(m_longSelectLineID,RGB(0,255,0),2); m_gisManager->AddOnePoint2Shapfile(m_longSelectLineID,1,m_dlgLightRegion.m_dGroundLon,m_dlgLightRegion.m_dGroundLat); m_gisManager->AddOnePoint2Shapfile(m_longSelectLineID,1,_structPoint->lon,_structPoint->lat); double _distance = 0.0, _angle = 0.0; CalculateTwoPtsDistanceAzimuth(_distance, _angle, m_dlgLightRegion.m_dGroundLon,m_dlgLightRegion.m_dGroundLat,_structPoint->lon,_structPoint->lat, 3); CString str; str.Format(_T("D:%.1fkm A:%.1f°"), _distance/1000, _angle); if (m_longLabelPlotID != 0) { ClearPointShape(m_longLabelPlotID); m_longLabelPlotID = 0; } //标注距离和方位 AddPointShapeLayer(m_longLabelPlotID,_structPoint->lon,_structPoint->lat, str, _T("红色"), RGB(255,0,0)); } return 0; } //标绘航线上的点 afx_msg LRESULT CGISDlg::OnDrawLinePoint(WPARAM wParam, LPARAM lParam) { if (m_longLinePointID > 0) { ClearPointShape(m_longLinePointID); m_longLinePointID = 0; } if (1 == (int)lParam) { structPoint *_structPoint = (structPoint*)wParam; //基于点图层进行标注 AddPointShapeLayer(m_longLinePointID, _structPoint->lon, _structPoint->lat, _T("Pt"), _T("红色"), RGB(255,0,0)); } return 0; } //显示实时碰撞检测区域 afx_msg LRESULT CGISDlg::OnShowCrashArea(WPARAM wParam, LPARAM lParam) { if (1 == (int)wParam) { if (m_crashAreaLayerID > 0) { m_map.GetShapefile(m_crashAreaLayerID).EditClear(); } m_gisManager->CreateEmptyAreaShapfile(m_crashAreaLayerID,RGB(0,255,0),RGB(0,255,0),40); //绿色 for (int i=0;i < 360;i++) { m_gisManager->AddOnePoint2Shapfile(m_crashAreaLayerID,2,g_structPointCrashReal[i].lon,g_structPointCrashReal[i].lat); } //区域面积为零时,清除该区域显示 if (0 == m_map.GetShapefile(m_crashAreaLayerID).GetShape(0).GetArea()) { m_map.GetShapefile(m_crashAreaLayerID).EditClear(); } m_map.Redraw(); } else if (0 == (int)wParam) { if (m_crashAreaLayerID > 0) { m_map.GetShapefile(m_crashAreaLayerID).EditClear(); } m_map.Redraw(); } return 0; } //绘制作用范围 afx_msg LRESULT CGISDlg::OnSendDrawFight(WPARAM wParam, LPARAM lParam) { if (m_fightRegionLayerID > 0) { m_map.GetShapefile(m_fightRegionLayerID).EditClear(); m_map.Redraw(); } if (0 == (int)lParam) { return 0; } m_gisManager->CreateEmptyAreaShapfile(m_fightRegionLayerID,RGB(0,255,0),RGB(0,255,0),20); structPoint *_structPoint = (structPoint*)wParam; double ptLon,ptLat; for (int i=0;i<=360;i++) { CalculatePtCoordinate(ptLon, ptLat, _structPoint->lon, _structPoint->lat, i, (int)lParam, 3); m_gisManager->AddOnePoint2Shapfile(m_fightRegionLayerID,2,ptLon, ptLat); } m_map.Redraw(); return 0; } //绘制高程区域 afx_msg LRESULT CGISDlg::OnSendDrawDemRegion(WPARAM wParam, LPARAM lParam) { if (m_DemRegionLayerID[(int)lParam] > 0) { m_map.GetShapefile(m_DemRegionLayerID[(int)lParam]).EditClear(); m_DemRegionLayerID[(int)lParam] = -1; m_map.Redraw(); } else { m_gisManager->CreateEmptyAreaShapfile(m_DemRegionLayerID[(int)lParam],RGB(0,0,255),RGB(0,0,255),20); structPoint *_structPoint = (structPoint*)wParam; m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon, _structPoint->lat); m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon + 1, _structPoint->lat); m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon + 1, _structPoint->lat+1); m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon, _structPoint->lat+1); m_gisManager->AddOnePoint2Shapfile(m_DemRegionLayerID[(int)lParam],2,_structPoint->lon, _structPoint->lat); m_map.Redraw(); } return 0; } //在线地图定位 afx_msg LRESULT CGISDlg::OnZoomToLocation(WPARAM wParam, LPARAM lParam) { //double lon = (double)wParam/1000000; //double lat = (double)lParam/1000000; double* lon = (double*)wParam; double* lat = (double*)lParam; ZoomToLocation(*lon,*lat); return 0; } void CGISDlg::OnMenuLightRegion() { /*if (m_dlgLightRegion.GetSafeHwnd()) { m_dlgLightRegion.ShowWindow(TRUE); }*/ g_bDemAnalysising = true; g_iDemPointNum = 0; } //关闭高程分析对话框时 afx_msg LRESULT CGISDlg::OnSendCloseDemAlt(WPARAM wParam, LPARAM lParam) { //清除高程分析图层 for (int i=0;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;iGetSafeHwnd(),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& vec_alt,vector& vec_lon,vector& vec_lat) { //获取地形栅格数 mapWindow::IGridHeaderPtr gridHeaderPtr = m_mapElevation.m_grid->GetHeader(); int n_gridrow = gridHeaderPtr->NumberRows; int n_gridcol = gridHeaderPtr->NumberCols; //将经纬度坐标转化为栅格行列号 vector pts_row,pts_col; TransformToXY(pts,pointNum,pts_row,pts_col); //线栅格化 VectorToRaster vectorToRaster; set > 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 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 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 vec_alt; vector vec_lon; vector 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;iCreateNewWithShapeID(_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& ptsRow,vector& 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;iProjToCell(pts[i][0],pts[i][1],&col,&row); ptsRow.push_back(row); ptsCol.push_back(col); i; } } //提取坐标点集 void CGISDlg::TransformToVectorPoints(DrawLineDataStruct lineDataGroup,vector& lineX,vector& lineY) { for (int i=0;iptPos;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