📄 imagemap.cpp
字号:
y2 = m_lImageHeight - y2 - 1;
}
CRect rcDib(x1, y1, x2, y2);
rcDib.NormalizeRect();
m_pDib->PaintDIB(pdc->m_hDC, &rcDc, &rcDib);
}
else if(!m_bSetMBRC)
{
MessageBox(NULL, _T("必须在DrawMap之前调用SetMapMBRC"), _T("错误"), MB_OK);
}
}
int CImageMap::DrawMap()
{
if(!m_bIsLoadMap) return 0;//地图未加载
CDC *pdc = NULL;
HDC hdc = NULL;
if(m_hWnd)
{
//获取窗口显示DC
hdc = GetDC(m_hWnd);
pdc = CDC::FromHandle(hdc);
}
if(m_memDC.GetSafeHdc() == NULL)
{
//如果pdc = NULL,则创建和屏幕DC兼容的DC
m_memDC.CreateCompatibleDC(pdc);
//创建空白内存位图
m_Bitmap.CreateCompatibleBitmap(pdc, m_x2 - m_x1, m_y2 - m_y1);
m_pOldBitmap = m_memDC.SelectObject(&m_Bitmap);
}
m_memDC.FillRect(CRect(0, 0, m_x2, m_y2), &CBrush(RGB(255, 255, 255)));
//先在内存DC中绘制地图
DrawMap(&m_memDC);
//把地图显示在屏幕上
if(m_hWnd && pdc)
{
pdc->BitBlt(0, 0, m_x2 - m_x1, m_y2 - m_y1, &m_memDC, 0, 0, SRCCOPY);
ReleaseDC(m_hWnd, hdc); //释放dc
}
return 1;
}
int CImageMap::ZoomIn()//放大
{
double cx1 = m_cx, cy1 = m_cy,
cx2 = m_cx, cy2 = m_cy;
//求出屏幕中心点坐标对应的地图坐标
ScreenToMap(&cx1, &cy1);
m_dZoomFactor *= m_dZoomAmount;
m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;
ScreenToMap(&cx2, &cy2);
//求出屏幕中心点坐标偏移量
m_dOffsetX += fabs(cx2 - cx1);
m_dOffsetY += fabs(cy2 - cy1);
int ret = DrawMap();
return ret;
}
int CImageMap::ZoomIn(long x, long y)//以指定点放大
{
double cx1 = x, cy1 = y,
cx2 = x, cy2 = y;
//求出x,y点坐标对应的地图坐标
ScreenToMap(&cx1, &cy1);
m_dZoomFactor *= m_dZoomAmount;
m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;
ScreenToMap(&cx2, &cy2);
//求出x,y点坐标偏移量
m_dOffsetX += fabs(cx2 - cx1);
m_dOffsetY += fabs(cy2 - cy1);
int ret = DrawMap();
return ret;
}
int CImageMap::ZoomOut()//缩小
{
double cx1 = m_cx, cy1 = m_cy,
cx2 = m_cx, cy2 = m_cy;
//求出屏幕中心点坐标对应的地图坐标
ScreenToMap(&cx1, &cy1);
m_dZoomFactor /= m_dZoomAmount;
m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;
ScreenToMap(&cx2, &cy2);
//求出屏幕中心点坐标偏移量
m_dOffsetX -= fabs(cx2 - cx1);
m_dOffsetY -= fabs(cy2 - cy1);
int ret = DrawMap();
return ret;
}
int CImageMap::ZoomOut(long x, long y)//以指定点缩小
{
double cx1 = x, cy1 = y,
cx2 = x, cy2 = y;
//求出x,y点坐标对应的地图坐标
ScreenToMap(&cx1, &cy1);
m_dZoomFactor /= m_dZoomAmount;
m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;
ScreenToMap(&cx2, &cy2);
//求出x,y点坐标偏移量
m_dOffsetX -= fabs(cx2 - cx1);
m_dOffsetY -= fabs(cy2 - cy1);
int ret = DrawMap();
return ret;
}
int CImageMap::ZoomIn(POINT pt1, POINT pt2)
{
if(pt2.x == pt1.x) return 0;
if(pt2.y == pt1.y) return 0;
//调整坐标
if(pt1.x > pt2.x)
{
long tmx = pt1.x;
pt1.x = pt2.x;
pt2.x = tmx;
}
if(pt1.y > pt2.y)
{
long tmy = pt1.y;
pt1.y = pt2.y;
pt2.y = tmy;
}
double x, y;
double blc, blc1, blc2;
blc1 = (m_x2 - m_x1)/double(pt2.x - pt1.x);
blc2 = (m_y2 - m_y1)/double(pt2.y - pt1.y);
if(blc1 < blc2)
{
blc = blc1;
x = pt1.x;
long cy = long((m_y2 - m_y1)/blc1);
y = pt1.y - (cy - pt2.y + pt1.y)/2;
}
else
{
blc = blc2;
y = pt1.y;
long cx = long((m_x2 - m_x1)/blc2);
x = pt1.x - (cx - pt2.x + pt1.x)/2;
}
ScreenToMap(&x, &y);
m_dZoomFactor *= blc;
m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;
m_dOffsetX = x;
m_dOffsetY = y;
int ret = DrawMap();
return ret;
}
int CImageMap::ZoomOut(POINT pt1, POINT pt2)
{
if(pt2.x == pt1.x) return 0;
if(pt2.y == pt1.y) return 0;
//调整坐标
if(pt1.x > pt2.x)
{
long tmx = pt1.x;
pt1.x = pt2.x;
pt2.x = tmx;
}
if(pt1.y > pt2.y)
{
long tmy = pt1.y;
pt1.y = pt2.y;
pt2.y = tmy;
}
double blc, blc1, blc2;
blc1 = (m_x2 - m_x1)/double(pt2.x - pt1.x);
blc2 = (m_y2 - m_y1)/double(pt2.y - pt1.y);
if(blc1 > blc2)
blc = blc2;
else
blc = blc1;
double cx1, cy1, cx2, cy2;
cx1 = cx2 = (pt1.x + pt2.x)/2;
cy1 = cy2 = (pt1.y + pt2.y)/2;
//求出矩形中心点坐标对应的地图坐标
ScreenToMap(&cx1, &cy1);
m_dZoomFactor /= blc;
m_dScale = m_dScaleAll * m_dZoomFactor/m_dZoomOrigin;
ScreenToMap(&cx2, &cy2);
//求出中心点坐标偏移量
m_dOffsetX -= fabs(cx2 - cx1);
m_dOffsetY -= fabs(cy2 - cy1);
int ret = DrawMap();
return ret;
}
int CImageMap::ZoomToAll() //显示全图
{
m_dZoomFactor = m_dZoomOrigin;
m_dScale = m_dScaleAll;
double x1 = m_x1, y1 = m_y1,
x2 = m_x2, y2 = m_y2;
ScreenToMap(&x1, &y1);
ScreenToMap(&x2, &y2);
m_dOffsetX = m_rcRect.x1 + (m_rcRect.x2 - m_rcRect.x1)/2 - (x2 - x1)/2;
m_dOffsetY = m_rcRect.y1 + (m_rcRect.y2 - m_rcRect.y1)/2 - (y2 - y1)/2;
int ret = DrawMap();
return ret;
}
int CImageMap::MoveLeft()
{
double x2 = m_rcRect.x2,
y2 = m_rcRect.y2;
MapToScreen(&x2, &y2);
double cx = m_nShiftSize, cy = 0;
ScreenToMap(&cx, &cy);
m_dOffsetX = cx;
int ret = DrawMap();
return ret;
}
int CImageMap::MoveRight()
{
double x1 = m_rcRect.x2,
y1 = m_rcRect.y2;
MapToScreen(&x1, &y1);
double cx = m_nShiftSize, cy = 0;
ScreenToMap(&cx, &cy);
m_dOffsetX -= cx - m_dOffsetX;
int ret = DrawMap();
return ret;
}
int CImageMap::MoveUp()
{
double x2 = m_rcRect.x2,
y2 = m_rcRect.y2;
MapToScreen(&x2, &y2);
double cy = m_nShiftSize, cx = 0;
ScreenToMap(&cx, &cy);
m_dOffsetY = cy;
int ret = DrawMap();
return ret;
}
int CImageMap::MoveDown()
{
double x1 = m_rcRect.x2,
y1 = m_rcRect.y2;
MapToScreen(&x1, &y1);
double cy = m_nShiftSize, cx = 0;
ScreenToMap(&cx, &cy);
m_dOffsetY -= cy - m_dOffsetY;
int ret = DrawMap();
return ret;
}
//以给定尺寸平移地图,dx=+左移,=-右移;dy=+上移,=-下移
int CImageMap::MoveMap(long dx, long dy, BOOL bRedraw)
{
if(!m_bIsLoadMap) return 0;
if(bRedraw)
{
double ddx = dx, ddy = dy;
ScreenToMap(&ddx, &ddy);
m_dOffsetX -= ddx - m_dOffsetX;
m_dOffsetY -= ddy - m_dOffsetY;
DrawMap();
}
else
{
long xSrc, ySrc, wSrc, hSrc;
long xDes, yDes;
if(dx > 0)
{
xSrc = 0;
wSrc = m_x2 - dx;
xDes = dx;
}
else
{
xSrc = -dx;
wSrc = m_x2 + dx;
xDes = 0;
}
if(dy > 0)
{
ySrc = 0;
hSrc = m_y2 - dy;
yDes = dy;
}
else
{
ySrc = -dy;
hSrc = m_y2 + dy;
yDes = 0;
}
if(m_hWnd)
{
HDC dc = GetDC(m_hWnd);
::BitBlt(dc, xDes, yDes, wSrc, hSrc, m_memDC.m_hDC, xSrc, ySrc, SRCCOPY);
if(dx > 0)
PatBlt(dc, 0, 0, dx, m_y2 - m_y1, WHITENESS);
else
PatBlt(dc, m_x2 + dx, 0, -dx, m_y2 - m_y1, WHITENESS);
if(dy > 0)
PatBlt(dc, 0, 0, m_x2 - m_x1, dy, WHITENESS);
else
PatBlt(dc, 0, m_y2 + dy, m_x2 - m_x1, -dy, WHITENESS);
ReleaseDC(m_hWnd, dc);
}
}
return 1;
}
//把地图的中心定位到指定的点
void CImageMap::CenterAt(double x, double y)
{
x = fabs(x);
y = -fabs(y);
double x1 = 0, y1 = 0;
double x2 = m_cx, y2 = m_cy;
ScreenToMap(&x1, &y1);
ScreenToMap(&x2, &y2);
m_dOffsetX = x - fabs(x2 - x1);
m_dOffsetY = y - fabs(y2 - y1);
DrawMap();
}
double CImageMap::Distance(double lon1, double lat1, double lon2, double lat2)
{
#define a_2d 6378137
#define e_2d 0.006694380
#define h_2d 15
#define DEG_2_RAD 0.01745329252
#define RAD_2_DEG 57.29577951290
double x_rads = fabs(lon1) * DEG_2_RAD;
double y_rads = fabs(lat1) * DEG_2_RAD;
double n_2ds = a_2d/sqrt(1 - e_2d * sin(y_rads) * sin(y_rads));
double x_2d = (n_2ds + h_2d) * cos(y_rads) * cos(x_rads);
double y_2d = (n_2ds + h_2d) * cos(y_rads) * sin(x_rads);
double z_2d = (n_2ds * (1 - e_2d) + h_2d) * sin(y_rads);
double x_radm = fabs(lon2) * DEG_2_RAD;
double y_radm = fabs(lat2) * DEG_2_RAD;
double n_2dm = a_2d/sqrt(1 - e_2d * sin(y_radm) * sin(y_radm));
double x_2d_mark = (n_2dm + h_2d) * cos(y_radm) * cos(x_radm);
double y_2d_mark = (n_2dm + h_2d) * cos(y_radm) * sin(x_radm);
double z_2d_mark = (n_2dm * (1 - e_2d) + h_2d) * sin(y_radm);
double t1 = x_2d * x_2d + y_2d * y_2d + z_2d * z_2d;
double t = (t1 - (x_2d * x_2d_mark + y_2d * y_2d_mark + z_2d * z_2d_mark))/t1;
double tempx = x_2d_mark + (t-1) * x_2d;
double tempy = y_2d_mark + (t-1) * y_2d;
double tempz = z_2d_mark + (t - 1) * z_2d;
double hy1 = (x_2d * x_2d + y_2d * y_2d)/z_2d * tempz - x_2d * tempx - y_2d * tempy;
double hy2 = sqrt(x_2d * x_2d + y_2d * y_2d + ((x_2d * x_2d + y_2d * y_2d)/z_2d) * ((x_2d * x_2d + y_2d * y_2d)/z_2d));
double hy3 = sqrt(tempx * tempx + tempy * tempy + tempz * tempz);
double hy = hy1/(hy2 * hy3);
hy = acos(hy) * RAD_2_DEG;
double condition = (y_2d - x_2d) * tempx + (x_2d * x_2d - x_2d * y_2d) * tempy/y_2d;
double distance = (x_2d_mark - x_2d) * (x_2d_mark - x_2d) + (y_2d_mark - y_2d) * (y_2d_mark - y_2d) + (z_2d_mark - z_2d) * (z_2d_mark - z_2d);
distance = sqrt(distance);
return distance;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -