1.从shp文件加载图层数据。
2.实现图层管理的一些功能,如:图层显示/隐藏、图层叠加顺序调整、图层的删除。
一、添加从shp文件加载图层数据功能
首先去掉MapContrl属性里面默认打开的地图文档或默认加载的图层,然后在工具栏添加新的按钮,按钮ID和提示文本如下:
ID_ADD_LAYER_FRMSHP "从shp文件加载图层\n从shp文件加载图层"
接下来为类添加该按钮的响应函数,并在函数中添加如下代码(红色部分):
// 从shp文件加载数据
void CAOExStep1View::OnAddLayerFrmshp()
{
// 显示选择shp文件的对话框
const TCHAR * szFilters = _T("shp File (*.shp)|*.shp||");
CFileDialog mDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST|
OFN_HIDEREADONLY, szFilters);
if (mDlg.DoModal() == IDCANCEL) return;
// 获取文件路径和名称
CString sztemp = mDlg.GetPathName();
CString szFileName,szPath;
szFileName = sztemp.Left(sztemp.ReverseFind('\\')+1);
szPath = sztemp.Mid(sztemp.ReverseFind('\\')+1);
// 添加新图层
m_ipMapControl->AddShapeFile(CComBSTR(szFileName),CComBSTR(szPath));
}
保存修改编译,运行点击加载图层工具栏按钮就可以看到如下画面:
二、添加图层管理功能
首先在工具栏添加新的按钮,按钮ID和提示文本如下:
ID_LAYER_MANAGE "图层管理\n图层管理"
然后我们添加一个图层管理的对话框,在里面添加一个Listctrl三个按钮,如下图:
几个控件的ID分别为:
IDC_LIST_LAYER
IDC_BTN_UP
IDC_BTN_DOWN
IDC_BTN_DEL
其中IDC_LIST_LAYER的样式为Report。
设置完毕,为该对话框添加类ClayerManageDlg,并且为IDC_LIST_LAYER添加一个控件变量CListCtrl m_listLayer,再添加几个按钮的响应函数,以及对话框初始化函数(OnInitDialog())。然后再添加如下函数和成员变量:
void RefreshMap(); // 刷新地图
BOOL GetAllLayer(); // 获取所有图层
IMapControl3Ptr m_ipMapControl; // 地图控件
CImageList m_ImageList;// LIST图形列表
m_ipMapControl用来保存传递过来的MapControl指针,我们更改一下默认的构造函数,在对话框构造函数里面初始化改变量,代码如下:
// LayerManageDlg.h : header file 下面为头文件中函数内容
CLayerManageDlg(IMapControl3Ptr ipMapControl,CWnd* pParent = NULL
// LayerManageDlg.cpp : implementation file 下面为cpp文件中函数内容
CLayerManageDlg::CLayerManageDlg(IMapControl3Ptr ipMapControl,CWnd* pParent /*=NULL*/)
: CDialog(CLayerManageDlg::IDD, pParent)
{
m_ipMapControl = ipMapControl;
}
在对话框初始化函数里面我们需要加入如下代码以初始化ListCtrl并获取图层:
// 新建ImageList,然后从ICON里面加载
m_ImageList.Create(16, 16, ILC_COLOR32, 0, 1);
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_LAYER));
// 设置LIST图像列表,样式,添加Column
m_listLayer.SetImageList(&m_ImageList,LVSIL_SMALL);
m_listLayer.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT);
m_listLayer.InsertColumn(0,"图层名称",LVCFMT_LEFT,200);
GetAllLayer(); // 获取当前地图的图层并添加到LIST中