📄 queryview.cpp
字号:
{//获取几何对象
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 + -