|
阅读:1026回复:0
AE中2种方式overlay
<div>最近在研究ae中实现overlay的方法,终于发现了2个方法。(针对shapefile)</div>
<br> <div>方法一:利用ITopology接口:</div> <br> <div>void COverlayDlg::Overlay(ILayerPtr inputLayer, ILayerPtr OverlayLayer,IFeatureClassPtr ipNewClass)<br>{<br> <br> int mode=m_modeCombo.GetCurSel();</div> <div> IFeatureLayerPtr ipPutlayer(inputLayer);<br> IFeatureClassPtr ipPutClass;<br> ipPutlayer->get_FeatureClass(;ipPutClass);<br> IFeatureClassPtr ipOutClass;<br> IFeatureLayerPtr ipOverlayer(OverlayLayer);<br> ipOverlayer->get_FeatureClass(;ipOutClass);<br> <br> IQueryFilterPtr ipQF(CLSID_QueryFilter);<br> long number1,number2;<br> ipPutClass->FeatureCount(ipQF,;number1);<br> ipPutClass->FeatureCount(ipQF,;number2);</div> <div><br> IActiveViewPtr ipView=p_View->m_ctrlMap.GetActiveView();</div> <div> ITopologicalOperatorPtr ipTo;<br> IFeaturePtr ipFeature1,ipFeature2;<br> IGeometryPtr ipGeo1,ipGeo2,ipNew;<br> for(long i=0;i<number1;i++)<br> for(long j=0;j<number2;j++)<br> {<br> ipPutClass->GetFeature(i,;ipFeature1);<br> ipOutClass->GetFeature(j,;ipFeature2);<br> ipFeature1->get_Shape(;ipGeo1);<br> ipFeature2->get_Shape(;ipGeo2);<br> ipTo=ipGeo1;<br> switch(mode)<br> {<br> case 0:<br> ipTo->Intersect(ipGeo2,esriGeometry2Dimension,;ipNew);<br> break;<br> case 1:<br> ipTo->Union(ipGeo2,;ipNew);<br> break;<br> case 2:<br> ipTo->Difference(ipGeo2,;ipNew);<br> }<br> IFeaturePtr ipFeature;<br> ipNewClass->CreateFeature(;ipFeature);<br> ipFeature->putref_Shape(ipNew);<br> ipFeature->Store();<br> }</div> <div> ipView->Refresh();<br>}</div> <br> <div>这种方法是一个一个feature的创建,存入featureclass接口中。</div> <br> <br> <div>方法二:利用IBasicGeoprocess接口</div> <br> <br> <div>//把第一个图层和第0个图层叠置</div> <br> <div> IFeatureLayerPtr ipFeaLay;<br> IFeatureClassPtr ipFeaCls;<br> HRESULT hr;<br> <br> ILayerPtr ipLay;<br> IMapPtr ipMap(m_ctrlMap.GetMap());<br> hr=ipMap->get_Layer(0,;ipLay);<br> ipFeaLay=ipLay;<br> if(ipFeaLay)<br> {<br> hr=ipFeaLay->get_FeatureClass(;ipFeaCls);<br> if (FAILED(hr)) return;<br> }<br> ITablePtr ipInPutTable(ipLay);</div> <div> hr=ipMap->get_Layer(1,;ipLay);<br></div> <div> ipFeaLay=ipLay;<br> if(ipFeaLay!=0)<br> hr=ipFeaLay->get_FeatureClass(;ipFeaCls);<br> <br> ITablePtr ipOverlayTable(ipLay); <br> hr=ipDatasetName->putref_WorkspaceName(ipWSName);<br> if(FAILED(hr)) return;<br> IBasicGeoprocessorPtr ipBGP(CLSID_BasicGeoprocessor);<br> IFeatureClassPtr ipOutputFeaCls;</div> <div> hr=ipBGP->Intersect(ipInPutTable,VARIANT_FALSE,ipOverlayTable,VARIANT_FALSE,double(0),ipFeaClsName,;ipOutputFeaCls);<br></div> <div> IFeatureLayerPtr ipOutputFeaLay(CLSID_FeatureLayer);<br> ipOutputFeaLay->putref_FeatureClass(ipOutputFeaCls);<br> BSTR OutFeaClsAliName;<br> hr=ipOutputFeaCls->get_AliasName(;OutFeaClsAliName);<br> if(FAILED(hr)) return;<br> hr=ipOutputFeaLay->put_Name(OutFeaClsAliName);<br> if(FAILED(hr)) return;<br> hr=ipMap->AddLayer(ipOutputFeaLay);<br> if(FAILED(hr)) return;</div> <div> IActiveViewPtr ipAV(ipMap);<br> ipAV->Refresh();</div> <br> </p> <div> </div> <div>大家可以分析比较以下2种方法,根据具体情况选择使用</div> |
|
|