📄 namegisview.cpp
字号:
// NameGisView.cpp : CNameGisView 类的实现
//
#include "stdafx.h"
#include "NameGis.h"
#include "Environment.h"
#include "MainFrm.h"
#include "MoLayers.h"
#include "MoGeoDataset.h"
#include "MoLabelPlacer.h"
#include "MoTextSymbol.h"
#include "NameGisDoc.h"
#include "MapHelper.h"
#include "AppApi.h"
#include "HawkView.h"
#include "MapControlView.h"
#include "NameQuryDlg.h"
#include "Crack.h"
#include "BusQueryDlg.h"
#include "NameIndexDlg.h"
#include "NameGisView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#import "MoSymbol.dll" named_guids
using namespace MOSYMBOLLib;
// CNameGisView
IMPLEMENT_DYNCREATE(CNameGisView, CFormView)
BEGIN_MESSAGE_MAP(CNameGisView, CFormView)
ON_WM_SIZE()
ON_UPDATE_COMMAND_UI(ID_FEATURE_ALL, OnUpdateAllFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_SHOP, OnUpdateShopFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_TOUR, OnUpdateTourFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_SCHOOL, OnUpdateSchoolFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_HOSPITAL, OnUpdateHospitalFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_HOTEL, OnUpdateHotelFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_BANK, OnUpdateBankFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_GASSTATION, OnUpdateStationFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_MOVIE, OnUpdateMovieFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_RESTAURANT, OnUpdateRestFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_WC, OnUpdateWCFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_POST, OnUpdatePostFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_LIBRARY, OnUpdateLibraryFtr)
ON_UPDATE_COMMAND_UI(ID_FEATURE_BUSSTATION, OnUpdateBusStaFtr)
ON_COMMAND(ID_FEATURE_ALL, OnShowAllFeature)
ON_COMMAND(ID_FEATURE_SHOP, OnShowShopFeature)
ON_COMMAND(ID_FEATURE_TOUR, OnShowTourFeature)
ON_COMMAND(ID_FEATURE_SCHOOL, OnShowSchoolFeature)
ON_COMMAND(ID_FEATURE_HOSPITAL, OnShowHospitalFeature)
ON_COMMAND(ID_FEATURE_HOTEL, OnShowHotelFeature)
ON_COMMAND(ID_FEATURE_BANK, OnShowBankFeature)
ON_COMMAND(ID_FEATURE_GASSTATION, OnShowStationFeature)
ON_COMMAND(ID_FEATURE_MOVIE, OnShowMovieFeature)
ON_COMMAND(ID_FEATURE_RESTAURANT, OnShowRestaurantFeature)
ON_COMMAND(ID_FEATURE_WC, OnShowWCFeature)
ON_COMMAND(ID_FEATURE_POST, OnShowPostFeature)
ON_COMMAND(ID_FEATURE_LIBRARY, OnShowLibraryFeature)
ON_COMMAND(ID_FEATURE_BUSSTATION, OnShowBusStationFeature)
ON_COMMAND(ID_MAP_ZOOMIN, OnZoomIn)
ON_UPDATE_COMMAND_UI(ID_MAP_ZOOMIN, OnUpdateZoomIn)
ON_COMMAND(ID_MAP_ZOOMOUT, OnZoomOut)
ON_UPDATE_COMMAND_UI(ID_MAP_ZOOMOUT, OnUpdateZoomOut)
ON_COMMAND(ID_MAP_FULLEXTENT, OnFullExtent)
ON_COMMAND(ID_MAP_PAN, OnPanMap)
ON_UPDATE_COMMAND_UI(ID_MAP_PAN, OnUpdatePanMap)
ON_COMMAND(ID_MAP_POINTSEL, OnPointSelect)
ON_UPDATE_COMMAND_UI(ID_MAP_POINTSEL, OnUpdatePointSel)
ON_COMMAND(ID_MAP_RECTSEL, OnRectSelect)
ON_UPDATE_COMMAND_UI(ID_MAP_RECTSEL, OnUpdateRectSel)
ON_COMMAND(ID_MAP_POLYSEL, OnPolySelect)
ON_UPDATE_COMMAND_UI(ID_MAP_POLYSEL, OnUpdatePolySel)
ON_COMMAND(ID_MAP_INFO, OnMapInfo)
ON_UPDATE_COMMAND_UI(ID_MAP_INFO, OnUpdateMapInfo)
ON_COMMAND(ID_MAP_NAMEQUERY, OnNameQuery)
ON_COMMAND(ID_MAP_NEARESTNAME, OnNearestName)
ON_COMMAND(ID_MAP_BUSQUERY, OnBusQuery)
ON_COMMAND(ID_MAP_NAMEINDEX, OnNameIndex)
ON_COMMAND(ID_MAP_NEARESTPATH, OnNearestPath)
ON_UPDATE_COMMAND_UI(ID_MAP_NEARESTPATH, OnUpdateNrstPath)
ON_COMMAND(ID_MAP_LINEMEASURE, OnLineMeasure)
ON_UPDATE_COMMAND_UI(ID_MAP_LINEMEASURE, OnUpdateLnMsu)
ON_COMMAND(ID_MAP_AREAMEASURE, OnAreaMeasure)
ON_UPDATE_COMMAND_UI(ID_MAP_AREAMEASURE, OnUpdateAreaMsu)
ON_COMMAND(ID_MAP_INDEX, OnMapIndex)
ON_COMMAND(ID_MAP_LAYERCONTROL, OnLayerControl)
ON_COMMAND(ID_MAP_OUTPUT, OnOutputMap)
ON_COMMAND(ID_MAP_PRINT, OnPrintMap)
ON_COMMAND(ID_MAP_HELP, OnShowHelp)
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
// CNameGisView 构造/销毁
//----------------------------------------------------------------------------------------------
CNameGisView::CNameGisView()
: CFormView(CNameGisView::IDD)
{
m_pInfoDlg = NULL;
m_pNearestDlg = NULL;
m_netLayer1 = NULL;
m_x = 0.0;
m_y = 0.0;
m_lastX = 0.0;
m_lastY = 0.0;
}
//----------------------------------------------------------------------------------------------
CNameGisView::~CNameGisView()
{
if(m_pInfoDlg)
{
delete m_pInfoDlg;
m_pInfoDlg = NULL;
}
if(m_pNearestDlg)
{
delete m_pNearestDlg;
m_pNearestDlg = NULL;
}
if(m_netLayer1)
{
delete m_netLayer1;
m_netLayer1 = NULL;
}
}
//----------------------------------------------------------------------------------------------
void CNameGisView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_MAP1, m_Map);
DDX_Control(pDX, IDC_MAPTIP_STATIC, m_NameLabel);
}
BOOL CNameGisView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
return CFormView::PreCreateWindow(cs);
}
void CNameGisView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
// CNameGisView 诊断
#ifdef _DEBUG
void CNameGisView::AssertValid() const
{
CFormView::AssertValid();
}
void CNameGisView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CNameGisDoc* CNameGisView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CNameGisDoc)));
return (CNameGisDoc*)m_pDocument;
}
#endif //_DEBUG
// CNameGisView 消息处理程序
//-----------------------------------------------------------------------------------------
void CNameGisView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
if (m_Map.m_hWnd) // 首先需要判断地图控件窗口是否已经创建
// 将地图控件的大小调整为视图窗口的大小
m_Map.SetWindowPos(0, 0, 0, cx, cy, SWP_NOZORDER);
}
//-----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// 功能:装载图层
// 参数:无
// 返回值:void
void CNameGisView::LoadLayers()
{
CEnvironment* environment = &(((CMainFrame*)AfxGetMainWnd())->m_environment);
// 得到地图包含的图层集
CMoLayers layers(m_Map.GetLayers());
// 清空图层集
layers.Clear();
m_Map.SetScrollBars(false);
// 分点、线、多边形3类图层分别依次加入
for (int m = 0; m < 3; m ++)
{
for (int i = 0; i < environment->m_nLayerNum; i ++)
{
CMoMapLayer layer;
// 创建图层对象接口
layer.CreateDispatch(TEXT("MapObjects2.MapLayer"));
CMoGeoDataset gds;
// 通过FindGeoDataset方法得到指定名称的数据集
gds = environment->m_db.FindGeoDataset(environment->m_layerInfos[i].szFileName);
// 设置图层的数据集
layer.SetGeoDataset(gds);
if (layer.GetValid())
{
switch (m)
{
case 0:
if (layer.GetShapeType() != 23) //moShapeTypePolygon
continue;
break;
case 1:
if (layer.GetShapeType() != 22) //moShapeTypeLine)
continue;
break;
case 2:
if (layer.GetShapeType() != 21) //moShapeTypePoint
continue;
break;
default:
continue;
}
environment->m_layerInfos[i].layer = layer;
// 在图层集(即地图)中加入该图层
layers.Add(environment->m_layerInfos[i].layer);
//设置图层是否显示
if (!environment->m_layerInfos[i].bVisible)
environment->m_layerInfos[i].layer.SetVisible(false);
//设置注记
if (environment->m_layerInfos[i].bLable
&& (environment->CalcScale(&m_Map) < environment->m_layerInfos[i].dScale))
{
CMoLabelPlacer myRD;
myRD.CreateDispatch(TEXT("MapObjects2.LabelPlacer"));
myRD.SetField("名称");
myRD.SetDrawBackground(environment->m_layerInfos[i].bBackground);
myRD.SetAllowDuplicates(false);
myRD.SetMaskLabels(false);
if (environment->m_layerInfos[i].layer.GetShapeType() == 22) //moShapeTypeLine
myRD.SetPlaceAbove(true);
else
myRD.SetPlaceAbove(false);
myRD.SetPlaceOn(true);
CMoFont fnt;
// 类似于CreateDispatch
fnt.InitializeFont();
fnt.SetName(TEXT(((CMainFrame*)AfxGetMainWnd())->FONTNAME));
fnt.SetSize(environment->m_layerInfos[i].nFontSize);
// 设置默认的符号
myRD.GetDefaultSymbol().SetFont(fnt);
environment->m_layerInfos[i].layer.SetRenderer(myRD);
}
//设置符号
switch (environment->m_layerInfos[i].layer.GetShapeType())
{
case 21: // moShapeTypePoint
//点符号
if (environment->m_layerInfos[i].nCharacterIndex >= 0 )
{
CMoFont fnt;
fnt.InitializeFont();
fnt.SetName(environment->m_layerInfos[i].szFontName);
environment->m_layerInfos[i].layer.GetSymbol().SetFont(fnt);
environment->m_layerInfos[i].layer.GetSymbol().SetCharacterIndex(
(short)environment->m_layerInfos[i].nCharacterIndex);
environment->m_layerInfos[i].layer.GetSymbol().SetStyle(4);
environment->m_layerInfos[i].layer.GetSymbol().SetSymbolType(0); // moPointSymbol;
environment->m_layerInfos[i].layer.GetSymbol().SetSize(
(short)environment->m_layerInfos[i].nSymSize);
}
else
{
environment->m_layerInfos[i].layer.GetSymbol().SetSize(
(short)environment->m_layerInfos[i].nSymSize);
}
break;
case 22: // moShapeTypeLine
//线符号
if (environment->m_layerInfos[i].nCharacterIndex >= 0
&& environment->m_layerInfos[i].nCharacterIndex < 5)
{
environment->m_layerInfos[i].layer.GetSymbol().SetStyle(
(short)environment->m_layerInfos[i].nCharacterIndex);
}
else if (environment->m_layerInfos[i].nCharacterIndex > 0 )
{
// 设置铁路符号
// 由于MapObjects自带的符号中没有铁路符号,因此需要利用MoSymbol.dll
IMoPensetPtr ps;
try
{
HRESULT hr;
hr = ps.CreateInstance(CLSID_MoPenset);
if(FAILED(hr))
_com_issue_error(hr);
}
catch(_com_error& e)
{
CString str = "创建对象错误,错误信息为:" + CString(e.ErrorMessage());
AfxMessageBox(str);
break;
}
ps->Load("LineStyle.lin");
environment->m_layerInfos[i].layer.GetSymbol().SetCustom(
ps->GetItem(environment->m_layerInfos[i].nCharacterIndex));
}
environment->m_layerInfos[i].layer.GetSymbol().SetSize(
(short)environment->m_layerInfos[i].nSymSize);
break;
case 23: // moShapeTypePolygon
environment->m_layerInfos[i].layer.GetSymbol().SetOutline(false);
if (environment->m_layerInfos[i].nCharacterIndex >= 0
&& environment->m_layerInfos[i].nCharacterIndex <= 10)
{
environment->m_layerInfos[i].layer.GetSymbol().SetStyle(
(short)environment->m_layerInfos[i].nCharacterIndex);
}
else if (100 == environment->m_layerInfos[i].nCharacterIndex)
{
SetPolygonLayerColor(environment->m_layerInfos[i].layer,
"名称","颜色",false);
}
break;
}
//设置颜色
if (environment->m_layerInfos[i].nSymColor != environment->SYMBOL_COLOR_NONE)
{
environment->m_layerInfos[i].layer.GetSymbol().SetColor(
environment->m_layerInfos[i].nSymColor);
}
}
}
}
// 装载额外图层
// 关于最短路经的图层
m_netLayer.CreateDispatch(_T("MapObjects2.MapLayer"));
m_netLayer.SetGeoDataset(environment->m_db.FindGeoDataset("street"));
m_netLayer.SetVisible(FALSE);
m_Map.GetLayers().Add(m_netLayer);
}
//----------------------------------------------------------------------------------------------
// 功能:根据每个图层的显示比例而设置图层是否显示
void CNameGisView::ReShowLayers()
{
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 (dScale < environment->m_layerInfos[i].dShowScale)
{
environment->m_layerInfos[i].layer.SetVisible(true);
}
else
{
environment->m_layerInfos[i].layer.SetVisible(false);
}
}
}
//----------------------------------------------------------------------------------------------
void CNameGisView::OnUpdateAllFtr(CCmdUI* pCmdUI)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
CEnvironment* environment = &(pMainWnd->m_environment);
if (environment->GetLayerVisible(MO_HOSPITAL ) &&
environment->GetLayerVisible(MO_HOTEL ) &&
environment->GetLayerVisible(MO_POST ) &&
environment->GetLayerVisible(MO_SCHOOL ) &&
environment->GetLayerVisible(MO_STATION ) &&
environment->GetLayerVisible(MO_SHOP ) &&
environment->GetLayerVisible(MO_TOUR ))
{
// 如果所有地物类型都可见,则设置为按下状态
pCmdUI->SetCheck(TRUE);
}
else
{
pCmdUI->SetCheck(FALSE);
}
}
//----------------------------------------------------------------------------------------------
void CNameGisView::OnUpdateShopFtr(CCmdUI* pCmdUI)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
if (pMainWnd->m_environment.GetLayerVisible(MO_SHOP))
// 如果商店地物可见,则设置按钮为按下状态
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
//----------------------------------------------------------------------------------------------
void CNameGisView::OnUpdateTourFtr(CCmdUI* pCmdUI)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
if (pMainWnd->m_environment.GetLayerVisible(MO_TOUR))
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
//----------------------------------------------------------------------------------------------
void CNameGisView::OnUpdateSchoolFtr(CCmdUI* pCmdUI)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
if (pMainWnd->m_environment.GetLayerVisible(MO_SCHOOL))
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
//----------------------------------------------------------------------------------------------
void CNameGisView::OnUpdateHospitalFtr(CCmdUI* pCmdUI)
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
if (pMainWnd->m_environment.GetLayerVisible(MO_HOSPITAL))
pCmdUI->SetCheck(TRUE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -