获取IMapControl2Ptr控件中所有图层,如该图层是复合图层,则递归找其下级,直至找到简单图层即IFeatureLayerPtr为止。同时,每次向下查找时,都要将复合图层的名称作为前缀加载到目标要素图层的前面,方便识别。
首先,我们实现根据传入的ILayerPtr获取IFeatureLayerPtr集合的方法。map<CString,IFeatureLayerPtr>中,key为图层别名,IFeatureLayerPtr为要素图层对象。
void CDialogExport::GetFeatureLayer(ILayerPtr ipLayer, CString sPrefixName, map<CString, IFeatureLayerPtr>& mapFeatureLayer)
{
ICompositeLayerPtr ipCompositeLayer = (ICompositeLayerPtr)ipLayer;
if (nullptr != ipCompositeLayer)
{
BSTR bstrName;
ipLayer->get_Name(&bstrName);
CString csName = (CString)bstrName;
::SysFreeString(bstrName);
CString sNewPrefix = (!sPrefixName.IsEmpty()) ? sPrefixName + " - " + csName : csName;
long lCount;
ipCompositeLayer->get_Count(&lCount);
for (int n = 0; n < lCount; n++)
{
ILayerPtr ipNewLayer;
ipCompositeLayer->get_Layer(n, &ipNewLayer);
GetFeatureLayer(ipNewLayer, sNewPrefix, mapFeatureLayer);
}
}
IFeatureLayerPtr ipFeatureLayer = (IFeatureLayerPtr)ipLayer;
FEATURELAYERINFO info;
AELayerTool::GetTheFeatureLayerInfo(ipFeatureLayer, info);
if (nullptr != info.ipFeatureLayer)
{
CString sName = (!sPrefixName.IsEmpty()) ? sPrefixName + " - " + info.strAlias : info.strAlias;
sName = sName + " : " + info.strName;
mapFeatureLayer.insert(pair<CString, IFeatureLayerPtr>(sName, info.ipFeatureLayer));
}
}
其中,BOOL AELayerTool::GetTheFeatureLayerInfo(const IFeatureLayerPtr& ipFeatureLayer, FEATURELAYERINFO &info)为获取一个要素图层所有信息(图层名、别名、要素类对象等)的方法。
然后,我们调用这个方法:
map<CString, IFeatureLayerPtr> CDialogExport::InitMapLayerInfo(IMapControl2Ptr& ipMapControl)
{
map<CString, IFeatureLayerPtr> mapLayerPair;
long lLayerCount;
ipMapControl->get_LayerCount(&lLayerCount);
for (int n = 0; n < lLayerCount; n++)
{
ILayerPtr ipLayer;
ipMapControl->get_Layer(n, &ipLayer);
GetFeatureLayer(ipLayer, _T(""), mapLayerPair);
}
return mapLayerPair;
}
这样便能获取所有图层的别称(包含上级复合图层名称)、图层名等信息。
在初始化的时候,调用该方法获取图层信息,并绑定到CComBox控件上。
map<CString, IFeatureLayerPtr> mapInfo;
mapInfo = InitMapLayerInfo(m_ipMapControl);
map<CString, IFeatureLayerPtr>::iterator iterMap = mapInfo.begin();
int nRow = 0;
for (; iterMap != mapInfo.end(); iterMap++)
{
int nCurrent = m_comboSourceTable.InsertString(nRow, iterMap->first);
m_comboSourceTable.SetItemData(nCurrent, (DWORD_PTR)(IFeatureLayer*)iterMap->second);
nRow++;
}
if (nRow > 0)
m_comboSourceTable.SetCurSel(0);
效果是这样的(左侧为地图控件,即传入的IMapControl2Ptr对象,加载后的图层信息如红框中所示):