📄 namegisview.cpp
字号:
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 + -