📄 mapshow.cpp
字号:
// MapShow.cpp: implementation of the CMapShow class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MapShow.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMapShow::CMapShow()
{
m_ColorIsland=RGB(220,180,34);
m_ColorSea=RGB(150,255,255);
m_ColorLonLatLine=RGB(220,220,220);
}
CMapShow::~CMapShow()
{
}
void CMapShow::DrawLngLatLine(CDC *pDC)
{
CFont * font=new CFont(); //?
int iSize = int( 15 );
int width = int(10*iSize*0.5); //10 chars
font->CreateFont(iSize, 0, 0, 0,
FW_NORMAL, TRUE, FALSE,FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, VARIABLE_PITCH | FF_DONTCARE, "Times New Roman");
CFont * pOldFont=(CFont*)pDC->SelectObject(font);
//pDC->SetBkMode(TRANSPARENT);
CPen pen(PS_DOT,0,m_ColorLonLatLine);
CPen* oldPen = pDC->SelectObject(&pen);
int r=5;
int m=(int)ceil((m_LonEnd-m_LonBegin)/m_grid);
int n=(int)ceil((m_LatEnd-m_LatBegin)/m_grid);
int i;
int x1,y1;
CString str;
int min;
double lon,lat;
//draw longitude line
for(i=0;i<m;i++)
{
x1=(int)(i*m_grid*m_PixelPerLon);
pDC->MoveTo(x1,m_p0.y);
pDC->LineTo(x1,m_p0.y+m_MapSizeY);
lon=m_LonBegin+i*m_grid;
min = int((lon - int(lon))*60);
if(min<10)
//str.Format("%d°0%d′00″E",int(lng),min);
str.Format("%d°0%d′E",int(lon),min);
else
//str.Format("%d°%d′00″E",int(lng),min);
str.Format("%d°%d′E",int(lon),min);
pDC->TextOut(x1+r,m_p0.y+r,str);
}
//draw lat line
for(i=n;i>0;i--)
{
y1=(int)(i*m_grid*m_PixelPerLat);
pDC->MoveTo(m_p0.x,y1);
pDC->LineTo(m_p0.x+m_MapSizeX,y1);
lat=m_LatBegin+(n-i)*m_grid;
min = int((lat - int(lat))*60);
if(min<10)
//str.Format("%d°0%d′00″E",int(lat),min);
str.Format("%d°0%d′N",int(lat),min);
else
//str.Format("%d°%d′00″E",int(lat),min);
str.Format("%d°%d′N",int(lat),min);
pDC->TextOut(m_p0.x+r,y1-r-iSize,str);
}
pDC->SelectObject(oldPen);
pDC->SelectObject(pOldFont);
delete font;
}
void CMapShow::DrawMap(CDC *pDC)
{
CBrush brushIsland(m_ColorIsland);
CBrush brushSea(m_ColorSea);
CBrush * oldBrush;
//////////////////////////////////////////////////////////////////
//画海岸边界线,包括地图边界
//画背景为海
oldBrush = pDC->SelectObject(&brushSea);
pDC->Rectangle(m_p0.x,m_p0.y,m_p0.x+m_MapSizeX,m_p0.y+m_MapSizeY);
pDC->SelectObject(oldBrush);
// use Polygon
oldBrush = pDC->SelectObject(&brushIsland);
for(int j=0;j<m_NumRgnView;j++)
{
ASSERT( m_RgnViewLon[j][0] == m_RgnViewLon[j][m_NumPntView[j]-1]
&& m_RgnViewLat[j][0] == m_RgnViewLat[j][m_NumPntView[j]-1]
);
if( m_RgnIsSeaView[j] ) continue;
POINT * p = new POINT[m_NumPntView[j]];
for(int i=0;i<m_NumPntView[j];i++)
{
p[i].x = m_p0.x + int((m_RgnViewLon[j][i]-m_LonBegin)*
m_PixelPerLon);
p[i].y = m_p0.y + int((m_LatEnd-m_RgnViewLat[j][i])*
m_PixelPerLat);
}
pDC->Polygon(p,m_NumPntView[j]);
delete p;
}
pDC->SelectObject(oldBrush);
}
void CMapShow::SetViewEnvironment()
{
m_KmPerLat=6380*atan(1)/45;
m_KmPerLon=6380*cos((m_NorthView + m_SouthView)*atan(1)/90)*
atan(1)/45;
m_PixelPerLat=m_KmPerLat*m_PixelPerKm;
m_PixelPerLon=m_KmPerLon*m_PixelPerKm;
// m_grid = 0.25;
double delta = fmod(m_WestView,m_grid);
m_LonBegin = m_WestView;
if(delta>EPS&&delta<m_grid-EPS) m_LonBegin += m_grid - delta;
delta = fmod(m_EastView,m_grid);
m_LonEnd = m_EastView;
if(delta>EPS&&delta<m_grid-EPS) m_LonEnd -= delta;
delta = fmod(m_SouthView,m_grid);
m_LatBegin = m_SouthView;
if(delta>EPS&&delta<m_grid-EPS) m_LatBegin += m_grid - delta;
delta = fmod(m_NorthView,m_grid);
m_LatEnd = m_NorthView;
if(delta>EPS&&delta<m_grid-EPS) m_LatEnd -= delta;
m_MapSizeX=(int)((m_LonEnd-m_LonBegin)*m_PixelPerLon);
m_MapSizeY=(int)((m_LatEnd-m_LatBegin)*m_PixelPerLat);
}
void CMapShow::SetParameter(CPoint p0, double PixelPerKm,
double grid)
{
m_p0=p0;
m_PixelPerKm=PixelPerKm;
m_grid=grid;
}
void CMapShow::SetColor(COLORREF ColorIsland, COLORREF ColorSea,
COLORREF ColorLonLatLine)
{
m_ColorIsland=ColorIsland;
m_ColorSea=ColorSea;
m_ColorLonLatLine=ColorLonLatLine;
}
void CMapShow::GetData(double EastView,
double WestView,
double NorthView,
double SouthView,
CArray<CArray<double,double>,CArray<double,double> &> &RgnViewLon,
CArray<CArray<double,double>,CArray<double,double> &> &RgnViewLat,
int NumRgnView,
CArray<int,int> &NumPntView,
CArray<bool,bool> &RgnIsSeaView,
CArray<double,double> &RgnEastView,
CArray<double,double> &RgnSouthView,
CArray<double,double> &RgnWestView,
CArray<double,double> &RgnNorthView )
{
m_EastView=EastView;
m_WestView=WestView;
m_NorthView=NorthView;
m_SouthView=SouthView;
m_NumRgnView=NumRgnView;
m_RgnEastView.SetSize(m_NumRgnView);
m_RgnWestView.SetSize(m_NumRgnView);
m_RgnSouthView.SetSize(m_NumRgnView);
m_RgnNorthView.SetSize(m_NumRgnView);
m_RgnViewLon.SetSize(m_NumRgnView);
m_RgnViewLat.SetSize(m_NumRgnView);
m_NumPntView.SetSize(m_NumRgnView);
m_RgnIsSeaView.SetSize(m_NumRgnView);
int i,j;
for(i=0;i<m_NumRgnView;i++)
{
m_RgnIsSeaView[i]=RgnIsSeaView[i];
m_NumPntView[i]=NumPntView[i];
m_RgnEastView[i]=RgnEastView[i];
m_RgnWestView[i]=RgnWestView[i];
m_RgnSouthView[i]=RgnSouthView[i];
m_RgnNorthView[i]=RgnNorthView[i];
m_RgnViewLon[i].SetSize(m_NumPntView[i]);
m_RgnViewLat[i].SetSize(m_NumPntView[i]);
for(j=0;j<m_NumPntView[i];j++)
{
m_RgnViewLon[i][j]=RgnViewLon[i][j];
m_RgnViewLat[i][j]=RgnViewLat[i][j];
}
}
}
bool CMapShow::PointToLonLat(int x, int y, double &Lon, double &Lat)
{
if(x<m_p0.x||x>m_p0.x+m_MapSizeX||y<m_p0.y||y>m_p0.y+m_MapSizeY)
{
return false;
}
Lon=(x-m_p0.x)/m_PixelPerLon+m_LonBegin;
Lat=m_LatEnd-(y-m_p0.y)/m_PixelPerLat;
return true;
}
bool CMapShow::LonLatToPoint(double Lon, double Lat, int &x, int &y)
{
if(Lon<m_LonBegin||Lon>m_LonEnd||Lat<m_LatBegin||Lat>m_LatEnd)
{
return false;
}
x=(int)(m_p0.x+(Lon-m_LonBegin)*m_PixelPerLon);
y=(int)(m_p0.y+(m_LatEnd-Lat)*m_PixelPerLat);
return true;
}
bool CMapShow::LoadMapData(CString MapFileName)
{
CFile file;
if( ! file.Open(MapFileName,CFile::modeRead) )
return false;
//read map data
file.Read(&m_WestView,sizeof(double));
file.Read(&m_EastView,sizeof(double));
file.Read(&m_SouthView,sizeof(double));
file.Read(&m_NorthView,sizeof(double));
file.Read(&m_NumRgnView,sizeof(int)); //区域数
ASSERT(m_NumRgnView<1000);
m_RgnEastView.SetSize(m_NumRgnView); //每个区域
m_RgnWestView.SetSize(m_NumRgnView);
m_RgnSouthView.SetSize(m_NumRgnView);
m_RgnNorthView.SetSize(m_NumRgnView); //范围组成的数组
m_RgnViewLon.SetSize(m_NumRgnView);
m_RgnViewLat.SetSize(m_NumRgnView);
m_NumPntView.SetSize(m_NumRgnView); //point number of each region
m_RgnIsSeaView.SetSize(m_NumRgnView); //the region is sea or island
//////////////////////////////////////////////////////////////
int i,j;
for(i=0;i<m_NumRgnView;i++)
{
file.Read(&m_RgnIsSeaView[i],sizeof(bool));
file.Read(&m_RgnWestView[i],sizeof(double));
file.Read(&m_RgnEastView[i],sizeof(double));
file.Read(&m_RgnSouthView[i],sizeof(double));
file.Read(&m_RgnNorthView[i],sizeof(double));
file.Read(&m_NumPntView[i],sizeof(int));
m_RgnViewLon[i].SetSize(m_NumPntView[i]);
m_RgnViewLat[i].SetSize(m_NumPntView[i]);
for(j=0;j<m_NumPntView[i];j++)
{
file.Read(&m_RgnViewLon[i][j],sizeof(double));
file.Read(&m_RgnViewLat[i][j],sizeof(double));
}
ASSERT( m_RgnViewLon[i][0] ==
m_RgnViewLon[i][m_NumPntView[i]-1] && m_RgnViewLat[i][0] ==
m_RgnViewLat[i][m_NumPntView[i]-1] );
}
file.Close();
return true;
}
void CMapShow::GetMapSize(int &MapSizeX, int &MapSizeY)
{
MapSizeX=m_MapSizeX;
MapSizeY=m_MapSizeY;
}
void CMapShow::MarkSites(CDC *pDC,double SiteLon,double SiteLat,
short shape)
{
//map shape: ★▲●■○△□☆
int amp = 9 ;
POINT* p;
int SiteX,SiteY;
LonLatToPoint(SiteLon,SiteLat,SiteX,SiteY);
//draw site flag
double theta1;
double theta2;
double a1;
double a2;
double b1;
double b2;
double r;
CBrush brush,*pOldBrush;
brush.CreateSolidBrush(RGB(255,0,0));
CFont font,*pOldFont;
font.CreateFont(15, 0, 0, 0,
FW_NORMAL, FALSE, FALSE,FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, VARIABLE_PITCH | FF_DONTCARE,
"幼圆");
switch(shape)
{
case 1: //○
amp=5;
pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(SiteX-amp,SiteY-amp,SiteX+amp,SiteY+amp);
pDC->SelectObject(pOldBrush);
brush.DeleteObject();
break;
case 2: //□
pOldBrush=pDC->SelectObject(&brush);
pDC->Rectangle(SiteX-amp,SiteY-amp,SiteX+amp,SiteY+amp);
pDC->SelectObject(pOldBrush);
brush.DeleteObject();
break;
case 3: //△
p = new POINT[3];
p[0].x = SiteX;
p[0].y = SiteY - amp;
p[1].x = SiteX - int(amp*sqrt(3)/2);
p[1].y = SiteY + amp/2;
p[2].x = SiteX + int(amp*sqrt(3)/2);
p[2].y = p[1].y;
pOldBrush=pDC->SelectObject(&brush);
pDC->Polygon(p,3);
pDC->SelectObject(pOldBrush);
brush.DeleteObject();
delete []p;
break;
case 4: //☆
p = new POINT[10];
theta1 = atan(1)*72.0/45.0;
theta2 = theta1*0.75;
a1 = amp*sin(theta1);
a2 = amp*cos(theta1);
b1 = amp*sin(theta2);
b2 = amp*cos(theta2);
p[0].x = SiteX;
p[0].y = SiteY - amp;
p[2].x = SiteX - int(a1);
p[2].y = SiteY - int(a2);
p[4].x = SiteX - int(b2);
p[4].y = SiteY + int(b1);
p[6].x = SiteX + int(b2);
p[6].y = p[4].y;
p[8].x = SiteX + int(a1);
p[8].y = p[2].y;
p[1].x = SiteX - int(b2*(amp-a2)/(amp+b1));
p[1].y = p[2].y;
r = sin(theta2/3)/sin(theta2);
p[3].x = SiteX - int(a1*r);
p[3].y = SiteY + int(a2*r);
p[5].x = SiteX;
p[5].y = SiteY + int(amp*r);
p[7].x = 2*SiteX - p[3].x;
p[7].y = p[3].y;
p[9].x = 2*SiteX - p[1].x;
p[9].y = p[1].y;
pOldBrush=pDC->SelectObject(&brush);
pDC->Polygon(p,10);
pDC->SelectObject(pOldBrush);
brush.DeleteObject();
delete []p;
break;
default:
break;
}
pOldFont=pDC->SelectObject(&font);
pDC->TextOut(SiteX-25,SiteY-20,"朱家尖");
pDC->SelectObject(pOldFont);
font.DeleteObject();
/*
//site name
CString str("");
if(pDoc->bShowSiteNo[n] & pDoc->bShowSiteName[n])
str.Format("%d %s",pDoc->iSiteNo[n],pDoc->cSiteName[n]);
else if(pDoc->bShowSiteNo[n])
str.Format("%d",pDoc->iSiteNo[n]);
else //(bShowSiteName[n])
str.Format("%s",pDoc->cSiteName[n]);
pDC->TextOut( iOrgViewX + int(pDoc->iSiteNameX[n]*dEnlarge),
iOrgViewY + int(pDoc->iSiteNameY[n]*dEnlarge),
str );
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -