C++获取IMapControl2Ptr中的所有图层信息并加载到CComboBox控件中

获取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对象,加载后的图层信息如红框中所示):

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值