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