gisempire100
捉鬼专家
捉鬼专家
  • 注册日期2004-08-13
  • 发帖数552
  • QQ
  • 铜币2462枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1026回复:0

AE中2种方式overlay

楼主#
更多 发布于:2008-01-03 15:39
<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>
喜欢0 评分0
A friend is never known till a man has need. ...CL
游客

返回顶部