📄 public_tgisview.cpp
字号:
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((float)X, (float)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_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 CPublic_TGISView::OnMouseMoveMap1(short Button, short Shift, long X, long Y)
{
// TODO: Add your control notification handler code here
// 在状态栏中显示当前鼠标位置处的经纬度值
CMoPoint point;
point = m_map.ToMapPoint((float)X, (float)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 CPublic_TGISView::OnAfterLayerDrawMap1(short index, BOOL canceled, long hDC)
{
// TODO: Add your control notification handler code here
//确保重画一次
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 < 250000)
{
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 < 200000)
{
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 (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 = (long) pt.x;
pts[nTemp].y = (long) pt.y;
// if(nTemp >= 1)
// {
// Polyline((HDC)hDC, pts, nTemp);
// m_map.CenterAt(pMainWnd->m_environment.m_buses->pts[i].x,
// pMainWnd->m_environment.m_buses->pts[i].y);
// Sleep(100);
// }
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 = (long)pt.x;
pts[j].y = (long)pt.y;
}
::Polyline((HDC)hDC, pts, pMainWnd->m_environment.m_drawLine[i].nPointNumber);
delete pts;
pts = NULL;
}
}
}
//----------------------------------------------------------------------------------------------
// 点选择
void CPublic_TGISView::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 CPublic_TGISView::OnUpdatePointSel(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_nCurTool == ID_MAP_POINTSEL);
}
//----------------------------------------------------------------------------------------------
// 矩形选择
void CPublic_TGISView::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 CPublic_TGISView::OnUpdateRectSel(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_nCurTool == ID_MAP_RECTSEL);
}
//----------------------------------------------------------------------------------------------
// 多边形选择
void CPublic_TGISView::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 CPublic_TGISView::OnUpdatePolySel(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_nCurTool == ID_MAP_POLYSEL);
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnMapInfo()
{
if(m_nCurTool == ID_MAP_INFO)
{
m_nCurTool = NULL;
m_map.SetMousePointer(moArrow);
}
else
{
m_nCurTool = ID_MAP_INFO;
m_map.SetMousePointer(moIdentify);
}
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnUpdateMapInfo(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_nCurTool == ID_MAP_INFO);
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnNameQuery() //打开目标查询对话框
{
CNameQuryDlg NameQuryDlg;
NameQuryDlg.DoModal();
}
//------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// 在下拉列表框中加入“地名类型”数据表中大类名称
// 参数CComboBox* pComboBox表示在该下拉列表框中加入大类名称
BOOL CPublic_TGISView::LoadFilter(CComboBox* pComboBox)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CDaoDatabase* tmpDB = new CDaoDatabase;
try
{
tmpDB->Open(pMainWnd->m_environment.m_szDBName);
}
catch (CDaoException* e)
{
DisplayDaoException(e);
delete tmpDB;
e->Delete();
return FALSE;
}
CDaoRecordset rs(tmpDB);
try
{
pComboBox->ResetContent();
pComboBox->AddString("(全部类型)");
CString strQuery = "Select [大类] from [地名类型] where 大类 <> '武汉纵览'";
rs.Open(dbOpenDynaset,strQuery);
while(!rs.IsEOF())
{
COleVariant var;
var = rs.GetFieldValue("大类");
pComboBox->AddString(CCrack::strVARIANT(var));
rs.MoveNext();
}
pComboBox->SetCurSel(0);
}
catch (CDaoException* e)
{
DisplayDaoException(e);
tmpDB->Close();
delete tmpDB;
e->Delete();
return FALSE;
}
if(tmpDB)
{
if(tmpDB->IsOpen())
{
tmpDB->Close();
}
delete tmpDB;
tmpDB = NULL;
}
return TRUE;
}
//----------------------------------------------------------------------------------------------
// 在下拉列表框中加入某大类的所有中类名称
// 参数pComboBox表示在该下拉列表框中加入名称
// 参数szFilter表示大类
BOOL CPublic_TGISView::LoadFilter2(CComboBox* pComboBox, CString szFilter, bool bLayerType)
{
CString szFilter2 = "";
if (szFilter != "(全部类型)")
{
szFilter2 = "where 大类 = '" + szFilter + "'";
}
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CDaoDatabase* tmpDB = new CDaoDatabase;
try
{
tmpDB->Open(pMainWnd->m_environment.m_szDBName);
}
catch (CDaoException* e)
{
DisplayDaoException(e);
delete tmpDB;
e->Delete();
return FALSE;
}
CDaoRecordset rs(tmpDB);
try
{
pComboBox->ResetContent();
pComboBox->AddString("(全部子类型)");
CString strQuery = "Select [中类] from [地名中类型]";
strQuery += szFilter2;
rs.Open(dbOpenDynaset,strQuery);
while(!rs.IsEOF())
{
COleVariant var;
var = rs.GetFieldValue("中类");
CString str = CCrack::strVARIANT(var);
if(bLayerType && str == "街道")
rs.MoveNext();
else
{
pComboBox->AddString(str);
rs.MoveNext();
}
}
pComboBox->SetCurSel(0);
}
catch (CDaoException* e)
{
DisplayDaoException(e);
tmpDB->Close();
delete tmpDB;
e->Delete();
return FALSE;
}
if(tmpDB)
{
if(tmpDB->IsOpen())
{
tmpDB->Close();
}
delete tmpDB;
tmpDB = NULL;
}
return TRUE;
}
//---------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// 查找最近地物
void CPublic_TGISView::OnNearestName()
{
m_nCurTool = ID_MAP_NEARESTNAME;
if(m_pNearestDlg == NULL)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -