⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 namegisview.cpp

📁 电子地图 地理信息系统二次开发实例教程-C#和MapObjects实现程序源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// 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 + -