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

📄 queryview.cpp

📁 Embedded vc++下开发的地图查询程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{//获取几何对象
		CSeGeometry	*seGeometry=NULL;
		m_pRecordset->GetGeometry(seGeometry);			
		if(seGeometry)
		{
			CDC *pDC=GetDC();
			CSePoint2D	pntCenter;	
			//获取几何对象中心点
			seGeometry->GetCentroid(pntCenter) ;
			//获取记录当前的ID
			LONG nID = m_pRecordset->GetID();
			//获取选择集并先清空
			CSeRandomSelection* pSelection=m_MapWnd.GetSelection();
			pSelection->ReleaseAll();
			//将对象的ID加入到选择集中
			pSelection->m_pDataset = m_pRecordset->GetDataset();
			pSelection->Add(nID);
			//高亮显示所选对象	
			pSelection->Hilight(pDC,m_MapWnd.GetDrawParam()); 
			//将对象的中心点设置成地图中心点
			m_MapWnd.SetCenter(pntCenter);	
			m_MapWnd.Refresh();//刷新
			
			ReleaseDC(pDC);			
			delete	seGeometry; //释放几何对象指针
			seGeometry=NULL;
		}
	}
}

void CQueryView::OnRecordFirst() 
{//显示查询出来的第一个记录
	if(m_pRecordset && !m_pRecordset->IsBOF())
	{
		m_pRecordset->MoveFirst();
		ShowResult();		
	}	
}

void CQueryView::OnRecordLast() 
{//显示查询出来的最后一个记录
	if(m_pRecordset && !m_pRecordset->IsEOF())
	{
		m_pRecordset->MoveLast();
		ShowResult();
	}	
}

void CQueryView::OnRecordNext() 
{//显示查询出来的当前记录的下一个记录
	if(m_pRecordset && !m_pRecordset->IsEOF())
	{
		m_pRecordset->MoveNext();
		ShowResult();
	}	
}

void CQueryView::OnRecordPrev() 
{//显示查询出来的当前记录的前一个记录
	if(m_pRecordset && !m_pRecordset->IsBOF())
	{
		m_pRecordset->MovePrev();
		ShowResult();
	}	
}

void CQueryView::OnRecordStop() 
{//释放查询记录,并隐藏查询结果查看工具条
	if(m_pRecordset)
	{//释放查询结果
		m_pRecordset->GetDataset()->ReleaseRecordset(m_pRecordset);
		Invalidate(true);
	}
	m_nUserAction = USER_ACTION_NONE;
	//隐藏工具条
	((CMainFrame*)GetParentFrame())->m_wndRecordBar.ShowWindow(SW_HIDE);
	((CMainFrame*)GetParentFrame())->RecalcLayout();	 
	m_MapWnd.ClearSelection(); //地图上有属性查询时的选择对象,清空
	m_MapWnd.Refresh();	
}

void CQueryView::OnUpdateRecordFirst(CCmdUI* pCmdUI) 
{//设置工具条是否可用
	pCmdUI->Enable(m_pRecordset && !m_pRecordset->IsBOF());	
}

void CQueryView::OnUpdateRecordLast(CCmdUI* pCmdUI) 
{//设置工具条是否可用
	pCmdUI->Enable(m_pRecordset && !m_pRecordset->IsEOF());
}

void CQueryView::OnUpdateRecordNext(CCmdUI* pCmdUI) 
{//设置工具条是否可用
	pCmdUI->Enable(m_pRecordset && !m_pRecordset->IsEOF());	
}

void CQueryView::OnUpdateRecordPrev(CCmdUI* pCmdUI) 
{//设置工具条是否可用
	pCmdUI->Enable(m_pRecordset && !m_pRecordset->IsBOF());	
}
//============================鼠标响应==============================
void CQueryView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{//响应鼠标双击操作
	m_MapWnd.OnLButtonDblClk(nFlags, point);//重载
	long nUnits = 1;
	double dRatio = 1;
	long nDisUnits = 1;
	double dEathRadius = 1.0;
	//获取大地坐标系参数
	GetEarthParam(dEathRadius);
	//获取坐标系统参数
	GetSysCoorParam(nUnits,dRatio,nDisUnits);
	CString strUnits = _T("米");//距离单位
	switch( m_nUserAction )
	{				
	case USER_ACTION_MEASURE_DISTANCE:
		{//量算距离
			
			double dLength = 0.0;
			//将像素坐标转换为地图坐标,m_arrPoint保存的是像素坐标
			m_MapWnd.GetDrawParam()->ClientToMap( m_arrPoint.GetData(), m_arrPoint.GetSize() );
			
			//根据点串,创建几何线对象
			CSeGeoLine geoLine;
			geoLine.Make(m_arrPoint.GetData(),m_arrPoint.GetSize());					
			if( nUnits > 0 )		//非经纬度坐标
			{//计算长度
				dLength = geoLine.GetLength( false,dRatio, dEathRadius);		//获取线对象的长度
			}
			else				//经纬度坐标
			{//计算长度
				dLength = geoLine.GetLength( true,dRatio, dEathRadius );	//获取线对象的长度
			}
			//在状态栏中显示长度
			CString strLength;
			strLength.Format( _T("长度:%.2f"), dLength );
			strLength = strLength + strUnits;
			CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
			pFrame->m_wndStatusBar.SetPaneText(0,strLength);
			//将点串清空
			m_arrPoint.RemoveAll();
			break;
		}
	case USER_ACTION_MEASURE_AREA:
		{//量算面积
			//将像素坐标转换为地图坐标,m_arrPoint保存的是像素坐标
			m_MapWnd.GetDrawParam()->ClientToMap( m_arrPoint.GetData(), m_arrPoint.GetSize() );
			//根据点串,创建面对象
			CSeGeoRegion seRegion;
			seRegion.Make( m_arrPoint.GetData(), m_arrPoint.GetSize() );
			
			double dArea = 0;
			if( nUnits )	//非经纬度坐标
			{//计算面积
				dArea = seRegion.GetArea( false,dRatio, dEathRadius);
			}
			else			//经纬度坐标
			{//计算面积
				dArea = seRegion.GetArea( true,dRatio, dEathRadius );
			}
			//在状态栏中显示面积
			CString strArea = _T(""); 
			strArea.Format(_T("面积:%.2f"),dArea);
			strArea =strArea + strUnits+_T("^2");
			CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
			pFrame->m_wndStatusBar.SetPaneText(0,strArea);
			//将点串清空
			m_arrPoint.RemoveAll();
			break;
		}
	}
	CView::OnLButtonDblClk(nFlags, point);
}

void CQueryView::OnLButtonDown(UINT nFlags, CPoint point) 
{//响应鼠标左键按下操作
	CDC *pDC = GetDC();
	m_MapWnd.OnLButtonDown(nFlags, point);//重载
	switch( m_nUserAction)
	{
	case USER_ACTION_MEASURE_DISTANCE:
		{//量算距离
			m_arrPoint.Add( point );//将点保存起来			
			if ( m_arrPoint.GetSize() >=2 )
			{//画出线的轨迹
				pDC->Polyline( m_arrPoint.GetData(), m_arrPoint.GetSize() );
			}
			break;
		}
	case USER_ACTION_MEASURE_AREA:
		{//量算面积
			m_arrPoint.Add( point );//将点保存起来			
			if ( m_arrPoint.GetSize() >2 )
			{//画出面的轨迹
				pDC->Polygon( m_arrPoint.GetData(), m_arrPoint.GetSize() );
			}
			break;
		}		
	case USER_ACTION_QUERY_BY_DISTANCE:
	case USER_ACTION_QUERY_BY_BUFFER_COMPOUND:
		{//对象缓冲查询和对象缓冲复合查询
			//打开查询对话框
			CDlgQuery dlg;
			dlg.m_pMapWnd = &m_MapWnd;
			dlg.m_nQueryMode = m_nUserAction;//设置查询模式
			if ( dlg.DoModal() == IDOK )
			{//获取查询结果
				m_pRecordset = dlg.m_pQueryRecord;
			}
			break;
		}	
	case USER_ACTION_QUERY_BY_BOUNDS_COMPOUND:
	case USER_ACTION_QUERY_BY_BOUNDS:
		{//矩形区域查询和范围复合查询
			
			m_arrPoint.Add( point );	//将点保存起来
			m_rcBounds.SetRect( point, point);//先初始化bound
			break;
		}
	case USER_ACTION_OBJECT_PROPERTY:
		{//显示对象的属性
			//如果地图中有选中的对象
			CSeRandomSelection *pSelection = m_MapWnd.GetSelection();
			if ( pSelection && pSelection->GetCount() > 0 )
			{
				CDlgObjectProperty dlgProperty;
				//将选择集转换为记录集
				m_pRecordset = pSelection->ToRecordset();
				dlgProperty.m_pRecordset = m_pRecordset;
				//打开对象属性对话框
				dlgProperty.DoModal();
				if ( m_pRecordset ) 
				{//清空记录集
					m_pRecordset->GetDataset()->ReleaseRecordset( m_pRecordset );	
				}
				pSelection->ReleaseAll();//清空选择集
			}
		}
		break;
	}
	//在量算面积和长度后,任意点击鼠标左键,就可以隐藏状态栏
	if ( !m_MapWnd.GetAction() ==  CSeDrawParameters::uaNull || !( m_nUserAction == USER_ACTION_MEASURE_DISTANCE ||
		m_nUserAction == USER_ACTION_MEASURE_AREA ))
	{//隐藏状态栏
		CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
		pFrame->m_wndStatusBar.ShowWindow( SW_HIDE );
		pFrame->RecalcLayout();	
	}	
	ReleaseDC( pDC );
	CView::OnLButtonDown(nFlags, point);
}

void CQueryView::OnLButtonUp(UINT nFlags, CPoint point) 
{//响应鼠标左键弹起操作
	m_MapWnd.OnLButtonUp(nFlags, point);
	switch( m_nUserAction)
	{
	case USER_ACTION_QUERY_BY_BOUNDS:
	case USER_ACTION_QUERY_BY_BOUNDS_COMPOUND:
		{ //矩形区域查询和范围复合查询
			m_arrPoint.Add( point ); //保存点
			//将点从像素坐标转换为地理坐标
			m_MapWnd.GetDrawParam()->ClientToMap( m_arrPoint.GetData(), m_arrPoint.GetSize() );
			
			CDlgQuery dlg;
			dlg.m_nQueryMode = m_nUserAction;//设置查询模式
			dlg.m_pMapWnd = &m_MapWnd;
			
			CPoint pntFirst = m_arrPoint.GetAt( 0 );
			CPoint pntEnd = m_arrPoint.GetAt( 1 );
			CSeRect2D rcBound;
			//设置查询的bound
			if( pntFirst.x > pntEnd.x )
			{
				dlg.m_dMaxX = pntFirst.x;
				dlg.m_dMinX = pntEnd.x;
			}
			else
			{
				dlg.m_dMaxX = pntEnd.x;
				dlg.m_dMinX = pntFirst.x;
			}
			
			if( pntFirst.y > pntEnd.y )
			{
				dlg.m_dMaxY = pntFirst.y;
				dlg.m_dMinY = pntEnd.y;
			}
			else
			{
				dlg.m_dMaxY = pntEnd.y;
				dlg.m_dMinY = pntFirst.y;
			}
			//打开查询对话框
			if ( dlg.DoModal() == IDOK )
			{
				//获取查询结果			
				m_pRecordset = dlg.m_pQueryRecord;
				//清空点串
				m_arrPoint.RemoveAll();
			}
		}
	}
	CView::OnLButtonUp(nFlags, point);	
}

void CQueryView::OnMouseMove(UINT nFlags, CPoint point) 
{//响应鼠标移动操作
	m_MapWnd.OnMouseMove(nFlags, point);//重载

	if( m_nUserAction==USER_ACTION_QUERY_BY_BOUNDS || m_nUserAction == USER_ACTION_QUERY_BY_BOUNDS_COMPOUND)
	{//画出鼠标选择的bound
		CPoint pntFirst = m_arrPoint.GetAt(0);
		CRect rcOldRect(m_rcBounds);
		int xDis=point.x-pntFirst.x;
		int yDis=point.y-pntFirst.y;

		if(xDis>0 && yDis>0)
		{
			m_rcBounds.SetRect(pntFirst,point);
		}
		else if(xDis>0 && yDis<0)
		{
			m_rcBounds.left=pntFirst.x;
			m_rcBounds.top=point.y;
			m_rcBounds.right=point.x;
			m_rcBounds.bottom=pntFirst.y;
		}
		else if(xDis<0 && yDis<0)
		{
			m_rcBounds.SetRect(point,pntFirst); 
		}
		else if(xDis<0 && yDis>0)
		{
			m_rcBounds.left=point.x;
			m_rcBounds.top=pntFirst.y;
			m_rcBounds.right=pntFirst.x;
			m_rcBounds.bottom=point.y;
		}

		//画出矩形区域
		CDC *pDC=GetDC();
		CBrush newBrush(RGB(0,250,0));
		CBrush *oldBrush=pDC->SelectObject(&newBrush);
	    CSize size(2,2);
		 
		pDC->DrawDragRect(m_rcBounds,size,rcOldRect,size,&newBrush,&newBrush);		
	
		pDC->SelectObject(oldBrush);
	
		newBrush.DeleteObject();
		ReleaseDC(pDC);
	}
	if ( m_nUserAction == USER_ACTION_MEASURE_DISTANCE || m_nUserAction == USER_ACTION_MEASURE_AREA )
	{//量算时,按住鼠标不放,在状态栏中显示鼠标点坐标
		long nUnits = 1;
		double dRadio = 1;
		long nDisUnits = 1;
		//获取坐标系统参数
		GetSysCoorParam(nUnits,dRadio,nDisUnits);
		//将鼠标点从像素坐标转换为地理坐标
		CPoint geoPoint = point;
		m_MapWnd.GetDrawParam()->ClientToMap(&geoPoint);
		//旋转点
		CSeOperator::RotatePoint(geoPoint, m_MapWnd.GetDrawParam()->GetCenter(),
			m_MapWnd.GetDrawParam()->GetMapRotationAngleCosValue(),
			m_MapWnd.GetDrawParam()->GetMapRotationAngleSinValue());
		//获取点的X,Y坐标
		double dx = geoPoint.x;
		double dy = geoPoint.y;
		CString strUnitsName = _T("");
		
		if(nUnits)
		{
			dx /= (nUnits*dRadio);
			dy /= (nUnits*dRadio);
			strUnitsName = gGetCoordUnitsChineseName( nUnits );
		}
		else
		{
			dx /= (3600000*dRadio);
			dy /= (3600000*dRadio);
			strUnitsName = _T("度");
		}
		//在状态栏中显示坐标
		CString strPoint = _T("");
		strPoint.Format(_T("(%.5f,%.5f)%s"),dx,dy,strUnitsName);
		CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
		pMainWnd->m_wndStatusBar.SetPaneText( 0, strPoint);
	}
	CView::OnMouseMove(nFlags, point);
}

//=============================其他=====================================
void CQueryView::GetSysCoorParam(long &nUnits, double &dRatio, long &nDisUnits)
{//获取坐标系统参数
	CSeDataSource *pDataSource = theApp.m_WorkSpace.GetDataSourceAt( 0 );
	if(pDataSource)
	{
		nUnits = pDataSource->GetCoordUnits();		//获得坐标系统的单位(ID)
		dRatio = pDataSource->GetCoordRatio();		//获得坐标系统的转换比率
		nDisUnits = pDataSource->GetDistUnits();	//获得距离单位		
	}
}

void CQueryView::GetEarthParam(double &dEarthRadius/*地球半径*/)
{//获取大地坐标系参数
	CSeDataSource *pDataSource = theApp.m_WorkSpace.GetDataSourceAt(0);
	if( pDataSource && pDataSource->GetPJSysInfo() )
	{
		dEarthRadius = pDataSource->GetPJSysInfo()->dPriAxis;
	}
	else
		dEarthRadius = 6378245 ;
}

void CQueryView::OnUpdateQueryBySql(CCmdUI* pCmdUI) 
{//设置菜单状态
	pCmdUI->SetCheck( m_nUserAction == USER_ACTION_QUERY_BY_SQL);
}

void CQueryView::OnUpdateQueryByDistance(CCmdUI* pCmdUI) 
{//设置菜单状态
	pCmdUI->SetCheck( m_nUserAction == USER_ACTION_QUERY_BY_DISTANCE);
}

void CQueryView::OnUpdateQueryByBounds(CCmdUI* pCmdUI) 
{//设置菜单状态
	pCmdUI->SetCheck( m_nUserAction == USER_ACTION_QUERY_BY_BOUNDS);
}

void CQueryView::OnUpdateQueryByCompound1(CCmdUI* pCmdUI) 
{//设置菜单状态
	pCmdUI->SetCheck( m_nUserAction == USER_ACTION_QUERY_BY_BOUNDS_COMPOUND);
}

void CQueryView::OnUpdateQueryByCompound2(CCmdUI* pCmdUI) 
{//设置菜单状态
	pCmdUI->SetCheck( m_nUserAction == USER_ACTION_QUERY_BY_BUFFER_COMPOUND);
}

⌨️ 快捷键说明

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