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

📄 environment.cpp

📁 程序编写环境为Visual Studio.NET 2002
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "StdAfx.h"
#include "environment.h"
#include <math.h>
#include "MoPoint.h"
#include "MoPolygon.h"
#include "MapObjects2.h"
#include "MainFrm.h"
#include "NameGisView.h"
#include "AppApi.h"
#include "Crack.h"
//-----------------------------------------------------------------------------------------
CEnvironment::CEnvironment(void)
{
	m_MapOpr = MO_NULL;
	
	m_selSymbol.CreateDispatch(TEXT("MapObjects2.Symbol"));
	m_selSymbol.SetSymbolType(0);  
	m_selSymbol.SetColor(0xff);  
	
	m_szDBName = "";
	m_szSDBPath = "";
	m_AppPath = "";
	m_szHelpPath = "";

	m_nCurrMapIndex = -1;
	m_nMapNum = -1;
	m_mapInfos = NULL;
	
	m_nLayerNum = -1;
	m_layerInfos = NULL;

	m_nIndexNum = -1;
	m_indexInfos = NULL;

	m_szfntStation = "";
	m_chStation = 'a';
	m_nfntStation = 10;

	m_nSelectedLineNum = 0;

	m_selectedFeature = NULL;
	m_selectedSymbol = NULL;
	m_selectedSymbolSize = -1;

	m_selectedScale = -1.0;
	m_buses = NULL;
	m_drawLine = NULL;

	m_cloestPath = new CloestPath(); 
}
//-----------------------------------------------------------------------------------------
CEnvironment::~CEnvironment(void)
{
	// 释放资源
	if(m_layerInfos)
	{
		delete []m_layerInfos;
		m_layerInfos = NULL;
	}
	if(m_mapInfos)
	{
		delete []m_mapInfos;
		m_mapInfos = NULL;
	}
	if(m_indexInfos)
	{
		delete []m_indexInfos;
		m_indexInfos = NULL;
	}

	if(m_drawLine)
	{
		for(int i=0; i<m_nSelectedLineNum; i++)
		{
			if(m_drawLine[i].pPoint)
			{
				delete m_drawLine[i].pPoint;
				m_drawLine[i].pPoint = NULL;
			}
		}
		delete m_drawLine;
		m_drawLine = NULL;
	}

	if(m_buses)
	{
		delete m_buses;
		m_buses = NULL;
	}
}
//-----------------------------------------------------------------------------------------
// 功能:计算地图比例尺
// 返回值:地图比例尺
double CEnvironment::CalcScale(CMap1* map)
{
	HWND hWnd = (HWND)map->GetHWnd();
	HDC hDC = GetDC(hWnd);
	double dpix = GetDeviceCaps(hDC, LOGPIXELSX);
	
	MPoint* pts = new MPoint[2];
	CMoRectangle extent = map->GetExtent();
	pts[0].x = extent.GetLeft();
	pts[0].y = extent.GetTop();
	pts[1].x = extent.GetRight();
	pts[1].y = extent.GetTop();
	
	// 计算pts点对象数组定义的点之间的长度
	double dLen1 = CalcLenght(pts,2);
	CRect rect;
	map->GetWindowRect(&rect);
	double dLen2 = rect.Width() / dpix * 2.54 /100;

	delete pts;
	pts = NULL;

	return dLen1 / dLen2;
}
//-----------------------------------------------------------------------------------------
// 计算一条线的长度
// 参数MPoint*表示一点对象数组
// 参数nSize表示点对象数组中点对象的个数
// 返回值为线的长度
double CEnvironment::CalcLenght(MPoint* pt,int nSize)
{
	double dLength = 0;
	double x1=0,x2=0,y1=0,y2=0;
	int nCenterL = ((int)(pt[0].x)/6+1)*6-3; 

	for(int i=0;i<nSize-1;i++)
	{
		CalGuassFromLB(pt[i].x, pt[i].y, &x1, &y1, nCenterL);
		CalGuassFromLB(pt[i+1].x, pt[i+1].y, &x2, &y2, nCenterL);
		dLength += sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	}

	return dLength;
}
//-----------------------------------------------------------------------------------------
void CEnvironment::CalGuassFromLB(double dLongitude, double dLatitude, 
								  double* dX, double* dY, long nCenterL)
{			
	int CenterL = (int)nCenterL;

	SubGussFs(dX, dY, dLatitude, dLongitude, CenterL);
	nCenterL = (long)CenterL;
}
//-----------------------------------------------------------------------------------------
void CEnvironment::SubGussFs(double X,double Y,double L0, double* B, double* L)
{
	double p=57.29577951472;
	const double a=6.378245000e+06;
	const double e2=0.00669342162297;
	const double e12=0.00673852541468;
	const double c0=0.157046064172e-06;
	const double c1=0.005051773759;
	const double c2=0.000029837302;
	const double c3=0.000000238189;

	double bf0 = c0*X;
	double bf0c = cos(bf0);
	double bf0s = sin(bf0);
	double bf = bf0 + bf0c * (c1 * bf0s - c2 * pow(bf0s, 3) + c3 * pow(bf0s, 5));
	double bt = tan(bf);
	double bc = cos(bf);
	double bs = sin(bf);
	double bi = e12 * pow(bc,2);
	double v2 = 1.0e+0 +bi;
	double bn = a/sqrt(1.0-e2* pow(bs,2));
	double yn=Y/bn;

	// 计算纬度
	double b1 = -v2 * bt * pow(yn, 2) / 2.0;
	double b2 = -(5.0 + 3.0 * pow(bt, 2) + bi - 9.0 * bi* pow(bt, 2)) 
		        * b1 * pow(yn, 2) / 12.0;
	double b3 = (61.0 + 90.0 * pow(bt, 2) + 45.0 * pow(bt, 4)) * b1 * pow(yn, 4)/ 360.0;
	*B = bf + b1 + b2 + b3;
	*B = *B * p;

	// 计算经度
	double l1 = yn/bc;
	double l2 = -(1.0 + 2.0 * pow(bt, 2) + bi) * l1 * pow(yn, 2) / 6.0;
	double l3 = (5.0 + 28.0 * pow(bt , 2) + 24.0 * pow(bt, 4) 
		         + 6.0 * bi + 8.0 * bi * pow(bt, 2)) 
				 * l1 * pow(yn, 4) / 120.0;
	*L = l1 + l2 + l3;
	*L = *L * p;

	*L += L0;
	if(*L > 360.0)
		*L -= 360.0;
}
//-----------------------------------------------------------------------------------------
void CEnvironment::SubGussFs(double* X, double* Y,double B,double L,int nCenterLongi)
{
	//高斯投影分带
	int nzonenum;
	if(nCenterLongi==0)
	{
		nzonenum = (int)L/6+1;
		nCenterLongi = nzonenum*6-3;
	}
	else
		nzonenum = (int)nCenterLongi/6+1;

	//以弧度为单位的经纬度数值
	double rB = B / 180 * 3.1415926;
	double rL = (L - nCenterLongi) / 180 * 3.1415926;		//同时计算了中央经线
	//1980坐标系参数
	const double a = 6378245.00;		//长轴
	const double b = 6356863.50;		//短轴
	double sqre1 = ( a * a - b * b) / ( a * a);	//第一偏心率平方
	//B:纬度
	//L:精度
	//子午圈曲率半径
	double sinb = sin(rB);
	double cosb = cos(rB);
	double M = a *(1 - sqre1) / (1 - sqre1 * sinb * sinb) / sqrt( 1 - sqre1 * sinb * sinb);
	//卯酉圈曲率半径
	double N = a / sqrt(1 - sqre1 * sinb * sinb);
	double sqrita = N / M - 1;

	//该纬度点到赤道的子午线弧长
	double s = a * (1 - sqre1 ) * (1.00505117739 * rB - 0.00506237764 / 2 
		        * sin(2*rB) + 0.0000106245 / 4 * sin(4*rB) - 0.00000002081 / 
				6 * sin(6 * rB));

	double tanb = tan(rB);
	*X = s + rL * rL * N / 2 * sinb * cosb + rL * rL * rL * rL * N / 24 
		 * sinb * cosb * cosb *cosb * (5 - tanb * tanb + 9 * sqrita * sqrita + 4 * sqrita);
	*Y = rL * N * cosb + rL * rL * rL * N / 6 * cosb * cosb * cosb * 
		(1 - tanb * tanb + sqrita) + rL * rL * rL * rL * rL * N / 120 
		* cosb * cosb * cosb * cosb * cosb * 
		(5 - 18 * tanb * tanb + tanb * tanb * tanb * tanb);
	*Y = *Y + 500000 + nzonenum * 1.0e+6;
}
//-----------------------------------------------------------------------------------------
// 得到某类地物所在图层是否可见
bool CEnvironment::GetLayerVisible(int disp)
{
	bool bVisible = true;
	int  nType = 2;
	CString szSubType = "";

	// 根据地物类型,设置szSubType变量
	switch ((MapDisp)disp)
	{
		case MO_ALL:
			nType = 1;
			break;
		case MO_HOSPITAL:
			szSubType = "医院";
			break;
		case MO_SCHOOL:
			szSubType = "教育";
			break;
		case MO_SHOP:
			szSubType = "零售";
			break;
		case MO_TOUR:
			szSubType = "旅游";
			break;
		case MO_GAS:
			break;
		case MO_HOTEL: 
			szSubType = "住宿";
			break;
		case MO_LIBRAY:
			szSubType = "图书馆";
			nType = 3;
			break;
		case MO_MOVIE:
			szSubType = "影剧院、音乐厅";
			nType = 3;
			break;
		case MO_POST:
			szSubType = "邮政";
			break;
		case MO_RESTAURANT:
			szSubType = "餐饮";
			break;
		case MO_WC:
			szSubType = "dddd";
			break;
		case MO_STATION:
			szSubType = "站点";
			nType = 4;
			break;
	}

	int nCount = 0;
	for (int i = 0; i<m_nLayerNum; i ++)
	{
		if (m_layerInfos[i].bCanControl) 
		{
			switch (nType)
			{
				case 1:
					nCount ++;
					if (!m_layerInfos[i].bVisible)
					{
						return false;
					}
					break;
				case 2:
					if (szSubType == m_layerInfos[i].szSubType)
					{
						nCount ++;
						if (!m_layerInfos[i].bVisible)
						{
							return false;
						}
					}
					break;
				case 3:
					if (szSubType == m_layerInfos[i].szSubType2)
					{
						nCount ++;
						if (!m_layerInfos[i].bVisible)
						{
							return false;
						}
					}
					break;
				case 4:
					if (szSubType == m_layerInfos[i].szSubType3)
					{
						nCount ++;
						if (!m_layerInfos[i].bVisible)
						{
							return false;
						}
					}
					break;
			}
		}
	}		

	if (0 == nCount)
		bVisible = false;
	return bVisible;
}
//-----------------------------------------------------------------------------------------
// 功能:设置图层是否可见
void CEnvironment::SetLayerVisible(int disp, bool bVisible, double dScale)
{
	int  nType = 2;
	CString szSubType = "";
    
	// 根据地物类型设置nType与szSubType变量
	switch(disp)
	{
	case MO_ALL:
		nType = 1;
		break;
	case MO_HOSPITAL:
		szSubType = "医院";
		break;
	case MO_SCHOOL:
		szSubType = "教育";
		break;
	case MO_SHOP:
		szSubType = "零售";
		break;
	case MO_TOUR:
		szSubType = "旅游";
		break;
	case MO_GAS:
		break;
	case MO_HOTEL: 
		szSubType = "住宿";
		break;
	case MO_LIBRAY:
		szSubType = "图书馆";
		nType = 3;
		break;
	case MO_MOVIE:
		szSubType = "影剧院、音乐厅";
		nType = 3;
		break;
	case MO_POST:
		szSubType = "邮政";
		break;
	case MO_RESTAURANT:
		szSubType = "餐饮";
		break;
	case MO_WC:
		szSubType = "厕所";
		break;
	case MO_STATION:
		szSubType = "站点";
		nType = 4;
		break;
	}
    
	for (int i = 0; i < m_nLayerNum; i ++)
	{
		if(m_layerInfos[i].bCanControl) 
		{
			switch (nType)
			{
			case 1:
				if (!bVisible)
				{
					m_layerInfos[i].bVisible = bVisible;
					// 设置图层的可见性
					m_layerInfos[i].layer.SetVisible(m_layerInfos[i].bVisible);
				}
				else
				{
					m_layerInfos[i].bVisible = bVisible;

					if (m_layerInfos[i].dScale > dScale)
						// 设置图层的可见性
						m_layerInfos[i].layer.SetVisible(m_layerInfos[i].bVisible);
				}
				break;
			case 2:
				if (szSubType == m_layerInfos[i].szSubType)
				{
					if (!bVisible)
					{
						m_layerInfos[i].bVisible = bVisible;
						m_layerInfos[i].layer.SetVisible(m_layerInfos[i].bVisible);
					}
					else
					{
						m_layerInfos[i].bVisible = bVisible;
                        
						if (m_layerInfos[i].dScale > dScale)
							m_layerInfos[i].layer.SetVisible(m_layerInfos[i].bVisible);
					}
				}
				break;
			case 3:
				if (szSubType == m_layerInfos[i].szSubType2)
				{
					if (!bVisible)
					{
						m_layerInfos[i].bVisible = bVisible;
						m_layerInfos[i].layer.SetVisible(m_layerInfos[i].bVisible);
					}
					else
					{
						m_layerInfos[i].bVisible = bVisible;

						if (m_layerInfos[i].dScale > dScale)
							m_layerInfos[i].layer.SetVisible(m_layerInfos[i].bVisible);
					}
				}
				break;
			case 4:
				if (szSubType == m_layerInfos[i].szSubType3)
				{
					if (!bVisible)
					{
						m_layerInfos[i].bVisible = bVisible;
						m_layerInfos[i].layer.SetVisible(m_layerInfos[i].bVisible);
					}
					else
					{
						m_layerInfos[i].bVisible = bVisible;

						if (m_layerInfos[i].dScale > dScale)
							m_layerInfos[i].layer.SetVisible(m_layerInfos[i].bVisible);
					}
				}
				break;
			}
		}
	}
}
//-----------------------------------------------------------------------------------------
// 根据图层的名称得到该图层在地图的图层集合中的索引值
// 参数CString szName:图层的名称
// 返回值:图层在图层集合中的索引值
int CEnvironment::GetLayerIndexByName(CString szName)
{
	int nIndex = -1;

	for (int i=0; i<m_nLayerNum; i ++)
	{		
		if (szName == m_layerInfos[i].szName)
		{
			// 如果图层的名称等于输入的参数,则表示找到
			nIndex = i;
			// 退出循环
			break;
		}
	}

	return nIndex;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -