📄 public_tgisview.cpp
字号:
else
pCmdUI->SetCheck(FALSE);
}
//----------------------------------------------------------------------------
void CPublic_TGISView::OnUpdateBankFtr(CCmdUI* pCmdUI)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
if (pMainWnd->m_environment.GetLayerVisible(MO_BANK))
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
//---------------------------------------------------------------------------
void CPublic_TGISView::OnUpdateGovFtr(CCmdUI* pCmdUI)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
if (pMainWnd->m_environment.GetLayerVisible(MO_GOV))
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
//-------------------------------------------------------------------
void CPublic_TGISView::OnUpdatePostFtr(CCmdUI* pCmdUI)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
if (pMainWnd->m_environment.GetLayerVisible(MO_POST))
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
//-------------------------------------------------------------------------------
void CPublic_TGISView::OnUpdateBusStaFtr(CCmdUI* pCmdUI)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
if (pMainWnd->m_environment.GetLayerVisible(MO_BUSSTATION))
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowAllFeature()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); // 地图比例尺
// 判断当前地物的显示状态
BOOL bVisibled = environment->GetLayerVisible(MO_HOSPITAL);
// 如果没有显示,则显示所有地物
environment->SetLayerVisible(MO_BANK, !bVisibled, dScale);
environment->SetLayerVisible(MO_GOV, !bVisibled,dScale);
environment->SetLayerVisible(MO_HOSPITAL, !bVisibled, dScale);
environment->SetLayerVisible(MO_HOTEL, !bVisibled, dScale);
environment->SetLayerVisible(MO_POST,!bVisibled, dScale);
environment->SetLayerVisible(MO_SCHOOL, !bVisibled, dScale);
environment->SetLayerVisible(MO_SHOP, !bVisibled, dScale);
environment->SetLayerVisible(MO_BUSSTATION, !bVisibled, dScale);
environment->SetLayerVisible(MO_TOUR, !bVisibled, dScale);
m_map.SetExtent(m_map.GetExtent());
pMainWnd->ReloadLayerCtrlView();
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowShopFeature()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); // 地图比例尺
// 判断当前地物的显示状态
BOOL bVisibled = environment->GetLayerVisible(MO_SHOP);
environment->SetLayerVisible(MO_SHOP, !bVisibled, dScale);
m_map.SetExtent(m_map.GetExtent());
pMainWnd->ReloadLayerCtrlView();
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowTourFeature()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); // 地图比例尺
// 判断当前地物的显示状态
BOOL bVisibled = environment->GetLayerVisible(MO_TOUR);
environment->SetLayerVisible(MO_TOUR, !bVisibled, dScale);
m_map.SetExtent(m_map.GetExtent());
pMainWnd->ReloadLayerCtrlView();
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowSchoolFeature()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); // 地图比例尺
// 判断当前地物的显示状态
BOOL bVisibled = environment->GetLayerVisible(MO_SCHOOL);
environment->SetLayerVisible(MO_SCHOOL, !bVisibled, dScale);
m_map.SetExtent(m_map.GetExtent());
pMainWnd->ReloadLayerCtrlView();
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowHospitalFeature()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); // 地图比例尺
// 判断医院的显示状态
BOOL bVisibled = environment->GetLayerVisible(MO_HOSPITAL);
environment->SetLayerVisible(MO_HOSPITAL, !bVisibled, dScale);
m_map.SetExtent(m_map.GetExtent());
pMainWnd->ReloadLayerCtrlView();
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowHotelFeature()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); // 地图比例尺
// 判断宾馆的显示状态
BOOL bVisibled = environment->GetLayerVisible(MO_HOTEL);
environment->SetLayerVisible(MO_HOTEL, !bVisibled, dScale);
m_map.SetExtent(m_map.GetExtent());
pMainWnd->ReloadLayerCtrlView();
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowBankFeature()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); // 地图比例尺
// 判断银行的显示状态
BOOL bVisibled = environment->GetLayerVisible(MO_BANK);
environment->SetLayerVisible(MO_BANK, !bVisibled, dScale);
m_map.SetExtent(m_map.GetExtent());
pMainWnd->ReloadLayerCtrlView();
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowGovFeature()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); //地图比例尺
// 判断加油站的显示状态
BOOL bVisibled = environment->GetLayerVisible(MO_GOV);
environment->SetLayerVisible(MO_GOV, !bVisibled, dScale);
m_map.SetExtent(m_map.GetExtent());
pMainWnd->ReloadLayerCtrlView();
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowPostFeature()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); // 地图比例尺
// 判断邮局的显示状态
BOOL bVisibled = environment->GetLayerVisible(MO_POST);
environment->SetLayerVisible(MO_POST, !bVisibled, dScale);
m_map.SetExtent(m_map.GetExtent());
pMainWnd->ReloadLayerCtrlView();
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnShowBusStationFeature()
{
CBusQueryDlg busDlg;
busDlg.DoModal();
}
////////////////////////////////////////////////
//------------------------------------------------------------------------------
//功能:缩放时,重新设置注记、符号的大小
void CPublic_TGISView::ReLabelLayers()
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
double dScale = environment->CalcScale(&m_map); //地图比例尺
//放大缩小时,循环设置图层的符号和注记
for (int i = 0; i < environment->m_nLayerNum; i ++)
{
//图层不显示,下一个循环
if (!environment->m_layerInfos[i].bVisible)
continue;
//重新设置注记
if (environment->m_layerInfos[i].bLable &&
environment->CalcScale(&m_map)<environment->m_layerInfos[i].dScale)
{
CMoLabelPlacer myRD = environment->m_layerInfos[i].layer.GetRenderer();
if (myRD != NULL && myRD.GetField() != "")
{
CMoTextSymbol textSym(myRD.GetDefaultSymbol());
CMoFont fnt;
fnt.InitializeFont();
fnt.SetName(textSym.GetFont().GetName());
fnt.SetSize(ReCalcFontSize(
environment->m_layerInfos[i].nFontSize,dScale));
textSym.SetFont(fnt.GetFontDispatch());
}
else
{
if ( myRD == NULL)
{
//设置注记
myRD.CreateDispatch(_T("MapObjects2.LabelPlacer"));
}
if(myRD.GetField() == "")
myRD.SetField("名称");
myRD.SetDrawBackground(environment->m_layerInfos[i].bBackground) ;
myRD.SetAllowDuplicates(TRUE);
myRD.SetMaskLabels(FALSE);
if (environment->m_layerInfos[i].layer.GetShapeType() == moShapeTypeLine)
myRD.SetPlaceAbove(TRUE);
else
myRD.SetPlaceAbove(FALSE);
myRD.SetPlaceOn(TRUE);
CMoFont fnt;
fnt.InitializeFont();
fnt.SetName(pMainWnd->FONTNAME);
fnt.SetSize(ReCalcFontSize(
environment->m_layerInfos[i].nFontSize,dScale));
myRD.GetDefaultSymbol().SetFont(fnt.GetFontDispatch());
environment->m_layerInfos[i].layer.SetRenderer(myRD);
}
}
else
{
//显示比例尺小于注记显示比例尺,则不显示注记
if (environment->m_layerInfos[i].bLable)
{
CMoLabelPlacer myRD = environment->m_layerInfos[i].layer.GetRenderer();
if (myRD != NULL)
myRD.SetField("");
}
}
//重新设置图层的符号
if (environment->m_layerInfos[i].layer.GetSymbol() != NULL
&& environment->m_layerInfos[i].layer.GetShapeType() == moShapeTypePoint)
{
environment->m_layerInfos[i].layer.GetSymbol().SetSize(
ReCalcFontSize(environment->m_layerInfos[i].nSymSize, dScale));
}
}
//街道注记
if (environment->m_layerRoad)
{
CMoLabelPlacer roadRD = environment->m_layerRoad.GetRenderer();
if (dScale < 100000)
{
roadRD.SetField("名称");
CMoTextSymbol textSym(roadRD.GetDefaultSymbol());
CMoFont fnt;
fnt.InitializeFont();
fnt.SetName(textSym.GetFont().GetName());
fnt.SetSize(ReCalcFontSize(10,dScale));
textSym.SetFont(fnt.GetFontDispatch());
}
else
{
roadRD.SetField("");
}
}
}
//--------------------------------------------------------------------------
// 功能:根据显示比例,返回符号和注记的大小。
// <param name="nSize">short,原始大小</param>
// <param name="dScale">double,当前显示比例</param>
// <returns>short,返回计算后的符号和注记的大小</returns>
short CPublic_TGISView::ReCalcFontSize(short nSize, double dScale)
{
if (dScale > 15000)
return nSize;
if (dScale > 10000)
return (short)(nSize * 1.0);
return (short)(nSize * 1.0);
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------
//放大
void CPublic_TGISView::OnZoomIn()
{
if(m_nCurTool == ID_MAP_ZOOMIN)
{
m_nCurTool = NULL;
m_map.SetMousePointer(moArrow);
}
else
{
m_nCurTool = ID_MAP_ZOOMIN;
m_map.SetMousePointer(moZoomIn);
}
}
//-------------------------------------------------------------------------
void CPublic_TGISView::OnUpdateZoomIn(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_nCurTool == ID_MAP_ZOOMIN);
}
//----------------------------------------------------------------------
//缩小
void CPublic_TGISView::OnZoomOut()
{
if(m_nCurTool == ID_MAP_ZOOMOUT)
{
m_nCurTool = NULL;
m_map.SetMousePointer(moArrow);
}
else
{
m_nCurTool = ID_MAP_ZOOMOUT;
m_map.SetMousePointer(moZoomOut);
}
}
//------------------------------------------------------------------------------
void CPublic_TGISView::OnUpdateZoomOut(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_nCurTool == ID_MAP_ZOOMOUT);
}
//------------------------------------------------------------------------------
//显示全部
void CPublic_TGISView::OnFullExtent()
{
m_map.SetExtent(m_map.GetFullExtent());
ReLabelLayers();
ReShowLayers();
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CHawkView* pHawkView = (CHawkView*)(pMainWnd->m_wndSplitter2.GetPane(1,0));
pHawkView->m_HawkMap.SetExtent(pHawkView->m_HawkMap.GetExtent());
}
//--------------------------------------------------------------------------------
//漫游函数
void CPublic_TGISView::OnPanMap()
{
if(m_nCurTool == ID_MAP_PAN)
{
m_nCurTool = NULL;
m_map.SetMousePointer(moArrow);
}
else
{
m_nCurTool = ID_MAP_PAN;
m_map.SetMousePointer(moPan);
}
}
//-------------------------------------------------------------------------------
void CPublic_TGISView::OnUpdatePanMap(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_nCurTool == ID_MAP_PAN);
}
BEGIN_EVENTSINK_MAP(CPublic_TGISView, CFormView)
//{{AFX_EVENTSINK_MAP(CPublic_TGISView)
ON_EVENT(CPublic_TGISView, IDC_MAP1, -605 /* MouseDown */, OnMouseDownMap1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
ON_EVENT(CPublic_TGISView, IDC_MAP1, -606 /* MouseMove */, OnMouseMoveMap1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
ON_EVENT(CPublic_TGISView, IDC_MAP1, 3 /* AfterLayerDraw */, OnAfterLayerDrawMap1, VTS_I2 VTS_BOOL VTS_I4)
ON_EVENT(CPublic_TGISView, IDC_MAP1, 4 /* AfterTrackingLayerDraw */, OnAfterTrackingLayerDrawMap1, VTS_I4)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CPublic_TGISView::OnMouseDownMap1(short Button, short Shift, long X, long Y)
{
// TODO: Add your control notification handler code here
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((float)X, (float)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((float)X, (float)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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -