?? environment.cpp
字號(hào):
#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;
}
}
//-----------------------------------------------------------------------------------------
// 功能:計(jì)算地圖比例尺
// 返回值:地圖比例尺
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();
// 計(jì)算pts點(diǎn)對(duì)象數(shù)組定義的點(diǎn)之間的長(zhǎng)度
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;
}
//-----------------------------------------------------------------------------------------
// 計(jì)算一條線的長(zhǎng)度
// 參數(shù)MPoint*表示一點(diǎn)對(duì)象數(shù)組
// 參數(shù)nSize表示點(diǎn)對(duì)象數(shù)組中點(diǎn)對(duì)象的個(gè)數(shù)
// 返回值為線的長(zhǎng)度
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;
// 計(jì)算緯度
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;
// 計(jì)算經(jīng)度
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;
//以弧度為單位的經(jīng)緯度數(shù)值
double rB = B / 180 * 3.1415926;
double rL = (L - nCenterLongi) / 180 * 3.1415926; //同時(shí)計(jì)算了中央經(jīng)線
//1980坐標(biāo)系參數(shù)
const double a = 6378245.00; //長(zhǎng)軸
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;
//該緯度點(diǎn)到赤道的子午線弧長(zhǎng)
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 = "";
// 根據(jù)地物類型,設(shè)置szSubType變量
switch ((MapDisp)disp)
{
case MO_ALL:
nType = 1;
break;
case MO_HOSPITAL:
szSubType = "醫(yī)院";
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 = "站點(diǎn)";
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;
}
//-----------------------------------------------------------------------------------------
// 功能:設(shè)置圖層是否可見
void CEnvironment::SetLayerVisible(int disp, bool bVisible, double dScale)
{
int nType = 2;
CString szSubType = "";
// 根據(jù)地物類型設(shè)置nType與szSubType變量
switch(disp)
{
case MO_ALL:
nType = 1;
break;
case MO_HOSPITAL:
szSubType = "醫(yī)院";
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 = "站點(diǎn)";
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;
// 設(shè)置圖層的可見性
m_layerInfos[i].layer.SetVisible(m_layerInfos[i].bVisible);
}
else
{
m_layerInfos[i].bVisible = bVisible;
if (m_layerInfos[i].dScale > dScale)
// 設(shè)置圖層的可見性
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;
}
}
}
}
//-----------------------------------------------------------------------------------------
// 根據(jù)圖層的名稱得到該圖層在地圖的圖層集合中的索引值
// 參數(shù)CString szName:圖層的名稱
// 返回值:圖層在圖層集合中的索引值
int CEnvironment::GetLayerIndexByName(CString szName)
{
int nIndex = -1;
for (int i=0; i<m_nLayerNum; i ++)
{
if (szName == m_layerInfos[i].szName)
{
// 如果圖層的名稱等于輸入的參數(shù),則表示找到
nIndex = i;
// 退出循環(huán)
break;
}
}
return nIndex;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -