⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 namegisview.cpp

📁 电子地图 地理信息系统二次开发实例教程-C#和MapObjects实现程序源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
ON_EVENT(CNameGisView, IDC_MAP1, DISPID_MOUSEMOVE, MouseMoveMap1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
ON_EVENT(CNameGisView, IDC_MAP1, 3, AfterLayerDrawMap1, VTS_I2 VTS_BOOL VTS_I4)
END_EVENTSINK_MAP()
//----------------------------------------------------------------------------------------------
void CNameGisView::MouseDownMap1(short Button, short Shift, long X, long Y)
{
	CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();

	if(m_nCurTool == ID_MAP_ZOOMIN) // 放大
	{
		double dScale = pMainWnd->m_environment.CalcScale(&m_Map);
		if (dScale < pMainWnd->MAX_SCALE)
			return;
        
		CMoRectangle rect;
		rect = m_Map.TrackRectangle();
        
		dScale = pMainWnd->m_environment.CalcScale(&m_Map, rect);
		double dWidth = rect.GetWidth();
		double dHeight = rect.GetHeight(); 
        
		if ((dWidth < 0.00005) || ( dHeight < 0.00005) 
			|| (dScale < pMainWnd->MAX_SCALE))
		{
			CMoPoint  pt = m_Map.ToMapPoint(X, Y); 
			CMoRectangle r = m_Map.GetExtent();
			r.ScaleRectangle(0.6667);
			r.Offset(-(r.GetCenter().GetX() - pt.GetX()),
				-(r.GetCenter().GetY() - pt.GetY() ));
			m_Map.SetExtent(r);
		}
		else
		{
			m_Map.SetExtent(rect);
		}
        
		ReLabelLayers();
		ReShowLayers();
        
		CHawkView* pHawkView = (CHawkView*)(pMainWnd->
			                m_wndSplitter2.GetPane(1,0));
		pHawkView->m_HawkMap.SetExtent(pHawkView->m_HawkMap.GetExtent());
	}
	else if(m_nCurTool == ID_MAP_ZOOMOUT) // 缩小
	{
		CMoRectangle rect;
		rect = m_Map.TrackRectangle();
		if ((rect == NULL) || (rect.GetWidth() < 0.00005) 
			|| (rect.GetHeight() < 0.00005))
		{
			rect = m_Map.GetExtent();
			rect.ScaleRectangle(1.5);
		}
		else
		{	
			double dRate = m_Map.GetExtent().GetWidth() / rect.GetWidth() * 10;  
			rect.ScaleRectangle(dRate);
		}
		
		m_Map.SetExtent(rect);
		CHawkView* pHawkView = (CHawkView*)(pMainWnd->
			              m_wndSplitter2.GetPane(1,0));
		pHawkView->m_HawkMap.SetExtent(pHawkView->m_HawkMap.GetExtent());
		ReLabelLayers();
		ReShowLayers();
	}
	else if(m_nCurTool == ID_MAP_PAN) // 漫游
	{
		m_Map.Pan(); 
		CHawkView* pHawkView = (CHawkView*)(pMainWnd->
			              m_wndSplitter2.GetPane(1,0));
		pHawkView->m_HawkMap.SetExtent(pHawkView->m_HawkMap.GetExtent());
	}
	else if(m_nCurTool == ID_MAP_POINTSEL) // 点选择
	{
		CMoPoint  pt;
		pt = m_Map.ToMapPoint(X, Y);
		// 执行空间点查询
		pMainWnd->m_environment.ExecuteSpatialByPoint(&m_Map, pt); 
		m_Map.SetExtent(m_Map.GetExtent()) ; 		
		CMapControlView* pCtrlView = (CMapControlView*)(pMainWnd->m_wndSplitter2.GetPane(0,0));
		pCtrlView->m_OperaTab.SetCurSel(2);
		pCtrlView->m_MapIndexTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_LayerTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_ResultListBox.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_ContentBtn.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_PositingBtn.ModifyStyle(0, WS_VISIBLE, 0);
		// 输出查询结果
		pCtrlView->OutputResult(); 
		// 刷新控件
		pCtrlView->Invalidate(TRUE);
	}
	else if(m_nCurTool == ID_MAP_RECTSEL) // 矩形选择
	{
		CMoRectangle rect;
		rect = m_Map.TrackRectangle(); 
		// 执行空间矩形查询
		pMainWnd->m_environment.ExecuteSpatialByRect(rect, 5); 
		m_Map.SetExtent(m_Map.GetExtent()) ; 		
		CMapControlView* pCtrlView = (CMapControlView*)(pMainWnd->m_wndSplitter2.GetPane(0,0));
		pCtrlView->m_OperaTab.SetCurSel(2);
		pCtrlView->m_MapIndexTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_LayerTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_ResultListBox.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_ContentBtn.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_PositingBtn.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->OutputResult(); 
		pCtrlView->Invalidate(TRUE);
	}
	else if(m_nCurTool == ID_MAP_POLYSEL) // 多边形选择
	{
		CMoPolygon  poly;
		poly = m_Map.TrackPolygon();
		// 执行空间多边形查询
		pMainWnd->m_environment.ExecuteSpatialByPolygon(poly, 5); 
		m_Map.SetExtent(m_Map.GetExtent()) ; 		
		CMapControlView* pCtrlView = (CMapControlView*)(pMainWnd->m_wndSplitter2.GetPane(0,0));
		pCtrlView->m_OperaTab.SetCurSel(2);
		pCtrlView->m_MapIndexTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_LayerTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_ResultListBox.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_ContentBtn.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_PositingBtn.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->OutputResult(); 
		pCtrlView->Invalidate(TRUE);
	}
	else if(m_nCurTool == ID_MAP_INFO) // 信息
	{
		if(m_pInfoDlg == NULL)
		{
			m_pInfoDlg = new CInfoDlg();
			if(m_pInfoDlg)
			{
				BOOL ret = m_pInfoDlg->Create(IDD_DIALOG_INFO, this);
				if(!ret)   // 创建失败
				{
					AfxMessageBox("创建对话框失败!");
					return;
				}

				m_pInfoDlg->Identify(X, Y); 
				m_pInfoDlg->ShowWindow(SW_SHOW);
			}
			else
				AfxMessageBox("创建对话框失败!");
		}
		else
		{
			m_pInfoDlg->Identify(X, Y); 
			m_pInfoDlg->ShowWindow(SW_SHOW);
		}
	}
	else if(m_nCurTool == ID_MAP_NEARESTNAME)
	{
		if(pMainWnd->m_environment.m_MapOpr == MO_SEACHBYDIST)
		{
			CMoPoint pt;
			pt = m_Map.ToMapPoint(X, Y);
			
			m_Map.SetMousePointer(moHourglass);

			CMapControlView* pCtrlView = (CMapControlView*)(pMainWnd->m_wndSplitter2.GetPane(0,0));
			long nCount = pMainWnd->m_environment.SearchByDistance (pt.GetX(), pt.GetY(), 
				                                     pMainWnd->m_environment.m_dDistance, 
													 &(pCtrlView->m_ResultListBox));
			pCtrlView->m_OperaTab.SetCurSel(2);
			pCtrlView->m_MapIndexTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
			pCtrlView->m_LayerTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
			pCtrlView->m_ResultListBox.ModifyStyle(0, WS_VISIBLE, 0);
			pCtrlView->m_ContentBtn.ModifyStyle(0, WS_VISIBLE, 0);
			pCtrlView->m_PositingBtn.ModifyStyle(0, WS_VISIBLE, 0);
			pCtrlView->Invalidate(TRUE);
            
			pMainWnd->m_environment.m_MapOpr = MO_NULL;
			m_Map.SetMousePointer(moArrow);
		}
	}
	else if(m_nCurTool == ID_MAP_NEARESTPATH)
	{
		if (pMainWnd->m_environment.m_cloestPath->pt1 == NULL)
		{
			CMoPoint pt;
			pt = m_Map.ToMapPoint(X, Y);

			pMainWnd->m_environment.m_cloestPath->pt1 = new MPoint();
			pMainWnd->m_environment.m_cloestPath->pt1->x = pt.GetX(); 
			pMainWnd->m_environment.m_cloestPath->pt1->y = pt.GetY(); 
			pMainWnd->m_environment.m_cloestPath->pt2 = NULL; 
		}
		else
		{
			CWaitCursor waitCursor;
			if(m_netLayer1 == NULL )
			{
				m_netLayer1 = new CNetLayer(m_netLayer);
				m_netLayer1->ReadNetTable();
			}
            
			CMoPoint pt;
			pt = m_Map.ToMapPoint(X, Y);
            
			pMainWnd->m_environment.m_cloestPath->pt2 = new MPoint();
			pMainWnd->m_environment.m_cloestPath->pt2->x = pt.GetX(); 
			pMainWnd->m_environment.m_cloestPath->pt2->y = pt.GetY(); 
            
			double x1,y1,x2,y2;
			x1 = pMainWnd->m_environment.m_cloestPath->pt1->x;
			y1 = pMainWnd->m_environment.m_cloestPath->pt1->y;
			x2 = pMainWnd->m_environment.m_cloestPath->pt2->x;
			y2 = pMainWnd->m_environment.m_cloestPath->pt2->y;
            
			if(pMainWnd->m_environment.m_cloestPath->pt2)
			{
				delete pMainWnd->m_environment.m_cloestPath->pt1;
				pMainWnd->m_environment.m_cloestPath->pt1 = NULL;
				delete pMainWnd->m_environment.m_cloestPath->pt2;
				pMainWnd->m_environment.m_cloestPath->pt2 = NULL;
			}
            
			m_path.RemoveAll();
			bool bOK = m_netLayer1->PathAnalysis(x1, y1, x2, y2, &m_path); 
            
			if (!bOK)
				return;
            
			if(pMainWnd->m_environment.m_drawLine)
			{
				for(int i=0; i<pMainWnd->m_environment.m_nSelectedLineNum; i++)
				{
					if(pMainWnd->m_environment.m_drawLine[i].pPoint)
					{
						delete pMainWnd->m_environment.m_drawLine[i].pPoint;
						pMainWnd->m_environment.m_drawLine[i].pPoint = NULL;
					}
				}
				delete pMainWnd->m_environment.m_drawLine;
				pMainWnd->m_environment.m_drawLine = NULL;
			}
			pMainWnd->m_environment.m_nSelectedLineNum = 1;
			pMainWnd->m_environment.m_drawLine = new MLine[1];
			pMainWnd->m_environment.m_drawLine[0].nPointNumber = m_path.GetCount()/2;
			pMainWnd->m_environment.m_drawLine[0].pPoint = new MPoint[pMainWnd->m_environment.m_drawLine[0].nPointNumber];
			int j = 0;
			for (int i = 0; i<m_path.GetCount(); i+=2)
			{
				double dX = m_path.GetAt(m_path.FindIndex(i));
				double dY = m_path.GetAt(m_path.FindIndex(i+1));
				pMainWnd->m_environment.m_drawLine[0].pPoint[j].x = dX;
				pMainWnd->m_environment.m_drawLine[0].pPoint[j].y = dY;
				j ++;	
			}
            
			m_Map.SetExtent(m_Map.GetExtent()); 
		}
	}
	else if(m_nCurTool == ID_MAP_LINEMEASURE)
	{
		CMoLine line;
		line = m_Map.TrackLine();
		double dLength = pMainWnd->m_environment.GetLineLength(line); 
		CString str;
		str.Format("您选择的线路长度:%f米。", dLength);
		AfxMessageBox(str);
	}
	else if(m_nCurTool == ID_MAP_AREAMEASURE)
	{
		CMoPolygon  poly;
		poly = m_Map.TrackPolygon();
		double dLength,dArea;
		dLength = pMainWnd->m_environment.GetPolygonLength(poly);
		dArea = pMainWnd->m_environment.GetPolygonArea(poly);
		CString str;
		str.Format("您选择的区域周长:%f米,面积:%f平方米。", dLength, dArea);
		AfxMessageBox(str); 
	}
}
//----------------------------------------------------------------------------------------------
void CNameGisView::MouseMoveMap1(short Button, short Shift, long X, long Y)
{
	// 在状态栏中显示当前鼠标位置处的经纬度值
	CMoPoint point;
	point = m_Map.ToMapPoint(X, Y);
	CString str;
	str.Format("东经=%f, 北纬=%f", point.GetX(), point.GetY());
	CStatusBar* pBar = &((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar;
	int index=pBar->CommandToIndex(ID_ROW_COL);
	pBar->SetPaneText(index,str);

	// 为快速显示地名而设置成员变量的值
	if(m_Map.GetMousePointer() == moArrow)
	{
		m_lastX = m_x;
		m_lastY = m_y;
		m_x = X;
		m_y = Y;		
	}
}
//----------------------------------------------------------------------------------------------
void CNameGisView::AfterLayerDrawMap1(short index, BOOL canceled, long hDC)
{
	//确保重画一次
	if (index != 0)
		return;
    
	CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
	long dScale = (long)pMainWnd->m_environment.CalcScale(&m_Map);	//地图比例尺

	CString str;
	str.Format("比例尺=1:%d", dScale);
	CStatusBar* pBar = &((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar;
	int nIndex=pBar->CommandToIndex(ID_MAP_SCALE);
	// 在状态栏的第3个窗格显示地图显示比例尺
	pBar->SetPaneText(nIndex,str);

	// 绘画选中的地物
	if (dScale < 100000)
	{
		pMainWnd->m_environment.DrawRecordset(&m_Map);
		if (pMainWnd->m_environment.m_selectedFeature != NULL)
		{
			pMainWnd->m_environment.DrawSelectedShape(&m_Map); 
		}
	}

	// 绘画公交车站
	if (pMainWnd->m_environment.m_buses != NULL && dScale < 30000)
	{
		HPEN tempPen = CreatePen(PS_SOLID, 7, RGB(255, 0, 0));
        SelectObject((HDC)hDC, tempPen);

		// 先统计有效点的个数
		int nCount = 0;
		for (int i=0; i<pMainWnd->m_environment.m_buses->nNum; i ++)
		{
			if (pMainWnd->m_environment.m_buses->pts[i].x < 0 || 
				pMainWnd->m_environment.m_buses->pts[i].y < 0)
				continue;
			else
				nCount ++;
		}
		POINT* pts = new POINT[nCount];
		int nTemp = 0;
		for (int i=0; i<pMainWnd->m_environment.m_buses->nNum; i ++)
		{
			if (pMainWnd->m_environment.m_buses->pts[i].x < 0 || 
				pMainWnd->m_environment.m_buses->pts[i].y < 0)
				continue;
            
			MPoint pt = pMainWnd->m_environment.FromMapPoint(&m_Map,
				        pMainWnd->m_environment.m_buses->pts[i].x,
						pMainWnd->m_environment.m_buses->pts[i].y);
			pts[nTemp].x = pt.x;
			pts[nTemp].y = pt.y;
			nTemp ++;
		}

		// 绘制
		::Polyline((HDC)hDC, pts, nCount);
		delete pts;
		pts = NULL;
	}

	// 绘画公交线路,或最短路经
	if (pMainWnd->m_environment.m_drawLine != NULL && dScale < 200000)
	{
		HPEN tempPen = CreatePen(PS_SOLID, 7, RGB(255, 0, 0));
		SelectObject((HDC)hDC, tempPen);
        
		for (int i = 0; i<pMainWnd->m_environment.m_nSelectedLineNum; i ++)
		{
			POINT* pts = new POINT[pMainWnd->m_environment.m_drawLine[i].nPointNumber];
			for (int j = 0; j<pMainWnd->m_environment.m_drawLine[i].nPointNumber; j ++)
			{
				MPoint pt = pMainWnd->m_environment.FromMapPoint(&m_Map, 
 					        pMainWnd->m_environment.m_drawLine[i].pPoint[j].x, 
					        pMainWnd->m_environment.m_drawLine[i].pPoint[j].y);
				pts[j].x = pt.x;
				pts[j].y = pt.y;
			}
			
			::Polyline((HDC)hDC, pts, pMainWnd->m_environment.m_drawLine[i].nPointNumber);
			delete pts;
			pts = NULL;
		}
	}
}
//----------------------------------------------------------------------------------------------
// 点选择
void CNameGisView::OnPointSelect()
{
	if(m_nCurTool == ID_MAP_POINTSEL)
	{
		m_nCurTool = NULL;
		m_Map.SetMousePointer(moArrow);
	}
	else
	{
		m_nCurTool = ID_MAP_POINTSEL;
		m_Map.SetMousePointer(moArrowQuestion);
	}
}
//----------------------------------------------------------------------------------------------
void CNameGisView::OnUpdatePointSel(CCmdUI* pCmdUI)
{
	pCmdUI->SetCheck( m_nCurTool == ID_MAP_POINTSEL);
}
//----------------------------------------------------------------------------------------------
// 矩形选择
void CNameGisView::OnRectSelect()
{
	if(m_nCurTool == ID_MAP_RECTSEL)
	{
		m_nCurTool = NULL;
		m_Map.SetMousePointer(moArrow);
	}
	else
	{
		m_nCurTool = ID_MAP_RECTSEL;
		m_Map.SetMousePointer(moArrowQuestion);
	}
}
//----------------------------------------------------------------------------------------------
void CNameGisView::OnUpdateRectSel(CCmdUI* pCmdUI)
{
	pCmdUI->SetCheck( m_nCurTool == ID_MAP_RECTSEL);
}
//----------------------------------------------------------------------------------------------
// 多边形选择
void CNameGisView::OnPolySelect()
{
	if(m_nCurTool == ID_MAP_POLYSEL)
	{
		m_nCurTool = NULL;
		m_Map.SetMousePointer(moArrow);
	}
	else
	{
		m_nCurTool = ID_MAP_POLYSEL;
		m_Map.SetMousePointer(moArrowQuestion);
	}
}
//----------------------------------------------------------------------------------------------
void CNameGisView::OnUpdatePolySel(CCmdUI* pCmdUI)
{
	pCmdUI->SetCheck( m_nCurTool == ID_MAP_POLYSEL);
}
//----------------------------------------------------------------------------------------------
void CNameGisView::OnMapInfo()
{
	if(m_nCurTool == ID_MAP_INFO)
	{
		m_nCurTool = NULL;
		m_Map.SetMousePointer(moArrow);
	}
	else
	{
		m_nCurTool = ID_MAP_INFO;
		m_Map.SetMousePointer(moIdentify);
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -