7.7.3 地图放大、缩小的实现(4)
上述代码通过switch语句判断当前用户的操作,调用Pan()函数实现了地图的漫游。在地图放大时先调用TrackRectangle()函数获取地图的区域,调用函数ScaleRectangle()设置放大系数,加载图层实现地图的放大。下面介绍地图缩小的实现,代码如下:
- 52 case ZOOMOUT: //定点缩小
- 53 if(x>28000)
- 54 {
- 55 MessageBox("已经到最小");
- 56 break;
- 57 }
- 58 rect=m_Map.TrackRectangle();
- 59 rect_Extent=m_Map.GetExtent(); //获得地图显示范围
- 60 if(LPDISPATCH(rect)&&rect.GetHeight()!=0&&rect.GetWidth()!=0)
- 61 {
- 62 m_CenterPoint=rect.GetCenter();
- 63 m_CenterPointm_CenterPointX=m_CenterPoint.GetX();
- 64 m_CenterPointm_CenterPointY=m_CenterPoint.GetY();
- 65 X_Scale=rect_Extent.GetHeight()/rect.GetHeight(); //设置缩小系数
- 66 Y_Scale=rect_Extent.GetWidth()/rect.GetWidth();
- 67 m_Scale=X_Scale;
- 68 if(X_Scale<Y_Scale)
- 69 m_Scale=Y_Scale;
- 70 rect_Extent.ScaleRectangle(m_Scale);
- 71 }
- 72 else
- 73 {
- 74 m_CenterPoint=m_Map.ToMapPoint(float(X),float(Y)); //转换成空间坐标
- 75 m_CenterPointm_CenterPointX=m_CenterPoint.GetX();
- 76 m_CenterPointm_CenterPointY=m_CenterPoint.GetY();
- 77 rect_Extent=m_Map.GetExtent(); //设置放大系数
- 78 rect_Extent.ScaleRectangle(1.111111); //获得地图显示范围
- 79 }
- 80 m_Map.SetExtent(rect_Extent); //设置地图显示范围
- 81 m_Map.CenterAt(m_CenterPointX,m_CenterPointY); //使图形居中
- 82 Number--;
- 83 if(!bControlFlag)
- 84 HideLayer();
- 85 break;
第52~85行代码为地图缩小的实现。获取鼠标按下的坐标后,设置比例系数,通过SetExtent()函数实现地图缩小。
上述代码为地图的缩小,地图的缩小同地图的放大是类似的,可以通过变量Number的递减完成。下面分别实现了全图、道路属性、地物属性等数据显示,相关代码如下:
- 86 case FULLSHOW: //全图显示
- 87 m_Map.SetExtent(m_Map.GetExtent());
- 88 break;
- 89 case GetDisP1toP2: //测量两点距离
- 90 if(m_mouseDownNum==0)
- 91 m_startPoint=m_Map.ToMapPoint(float(X),float(Y));
- 92 else
- 93 m_endPoint=m_Map.ToMapPoint(float(X),float(Y));
- 94 m_mouseDownNum++;
- 95 break;
- 96 case GetAttribute //获取道路属性
- 97 GetSelectAttribute(X,Y);
- 98 break;
- 99 case SELECTPOINT: //获得地物属性
- 100 GetPointAttribute(strName,X,Y);
- 101 break;
- 102 }
- 103 CMoPoint m_CurrentPoint;
- 104 if(!m_CurrentPoint.CreateDispatch("MapObjects2.Point")) //点的地理坐标
- 105 return;
- 106 m_CurrentPoint=m_Map.ToMapPoint(float(X),float(Y));
- 107 CString m_CoordinateStr,m_XCoordinateStr,m_YCoordinateStr;
- 108 m_XCoordinateStr.Format("%f",m_CurrentPoint.GetX());
- 109 m_YCoordinateStr.Format("%f",m_CurrentPoint.GetY());
- 110 m_CoordinateStr="地理坐标:X:"+m_XCoordinateStr+",Y:"+m_YCoordinateStr;
- 111 CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; //获取框架窗口指针
- 112 CStatusBar *pStatus=&pFrame->m_wndStatusBar; //获取状态栏窗口指针
- 113 if(pStatus)
- 114 {
- 115 pStatus->SetPaneText(1,m_CoordinateStr); //在状态栏上输出信息
- 116 pStatus->SetPaneText(2,str); //在状态栏上输出信息
- 117 }
- 118 }
第86~101行代码实现了全图、道路属性、地物属性等操作的数据显示。
第103~117行代码为将鼠标单击位置的坐标转换成地图的地理坐标显示在状态栏中,并把比例尺显示在状态栏中。
上述代码中的case语句实现用户的其他操作,然后通过AfxGetApp()->m_pMainWnd获取到主框架的指针,通过调用函数SetPaneText()完成了状态栏中坐标等数据的更新。
注意:switch括号中的变量为DWORD类型是我们在头文件中定义的,判断当前的操作,而case 后面的参数为各种操作是在头文件中定义的宏。