調皮↙不搗蛋的博客——歡迎光臨

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
AO叠置分析
最近使用delphi写的

网上delphi +AO的资料不多
存此备查!

implementation
function DoClip(var MapControl1:TMapControl;var InputLayerName:WideString;
                var OverlayLayerName:WideString;Tol:Double):Boolean;
 var
   pLayer1,pLayer2:ILayer;
   pfeaLayer1,pFeaLayer2:IFeatureLayer;
   pInputTable,pOverlayTable:ITable;
   pInputFeaClass:IFeatureClass;
   pFeaClassName:IFeatureClassName;
   pInputFeaType:TOleEnum;
   pNewWSName:IWorkspaceName ;
   pDatasetName:IDatasetName ;
   pSR:ISpatialReference;
   pBGP:IBasicGeoprocessor ;
   pOutputFeaClass : IFeatureClass;
   pOutputFeaLayer :IFeatureLayer ;

   LayerName:WideString;
   hr:integer;
 begin
   //MapControl1.Map.Get_Layer(0,pLayer1);
   //MapControl1.Map.Get_Layer(1,pLayer2);
   if (GetLayerByName(InputLayerName,Mapcontrol1,pLayer1)) and
      (GetLayerByName(OverlayLayerName,Mapcontrol1,pLayer2))then
      begin
           pFealayer1:=pLayer1 as IFeatureLayer;
           pFealayer2:=pLayer2 as IFeatureLayer;
      end
   else
   begin
     ShowMessage('查找图层出错');
     result:=false;
     exit;
   end;


   pInputTable := pFeaLayer1 as ITable;
   pOverlayTable := pFeaLayer2 as ITable;

   pFeaLayer1.Get_FeatureClass(pInputFeaClass);

   if (pInputTable=Nil) or (pOverlayTable=Nil) then
   showMessage('Table Check Failed');

   pFeaClassName := CoFeatureClassName.Create as IFeatureClassName;

   pInputFeaClass.Get_FeatureType(pInputFeaType);
   pFeaClassName.Set_FeatureType(pInputFeaType);

   pFeaClassName.Set_ShapeFieldName('Shape');

   pInputFeaClass.Get_ShapeType(pInputFeaType);
   pFeaClassName.Set_ShapeType(pInputFeaType);

   pNewWSName:=CoWorkspaceName.Create as IWorkspaceName;
   pNewWSName.Set_PathName('d:\temp');
   pNewWSName.Set_WorkspaceFactoryProgID('esriDataSourcesFile.ShapefileWorkspaceFactory');

   pDatasetName:= pFeaClassName as IDatasetName;
   pLayer1.Get_Name(LayerName);
   pDatasetName.Set_Name(LayerName+'_Clip');
   pDatasetName._Set_WorkspaceName(pNewWSName);

   tol:=0;
   pBGP := CoBasicGeoprocessor.Create as IBasicGeoProcessor;
   MapControl1.Map.Get_SpatialReference(pSR);
   pBGP.Set_SpatialReference(pSR);

   try
     hr:=pBGP.Clip(pInputTable,false,pOverlayTable,false,tol,
                   pFeaClassName,pOutputFeaClass);
   finally
     if hr<0 then
     begin
         ShowMessage('执行Clip出现错误');
         result:=false;
     end;

   end;
   pOutputFeaLayer := CoFeatureLayer.Create as IFeatureLayer;
   pOutputFeaLayer._Set_FeatureClass(pOutputFeaClass);
   pOutputFeaClass.Get_AliasName(LayerName);
   pOutputFeaLayer.Set_Name(LayerName);
   MapControl1.Map.AddLayer(pOutputFeaLayer);
   result:=true;
 end;
//根据图层名找到图层,找到图层返回true,否则返回false
function GetLayerByName(var LayerName:WideString;var MapControl1:TMapControl;
                         out pLayer:ILayer):Boolean;
var
i,layerCount:Integer;
tempName:widestring;
pLayerTemp:ILayer;

begin
  MapControl1.Map.Get_LayerCount(layerCount);
  for i := 0 to layerCount-1 do
  begin
    MapControl1.Map.Get_Layer(i,pLayerTemp);
    pLayerTemp.Get_Name(tempName);
    if tempName=LayerName then
    begin
       MapControl1.Map.Get_Layer(i,pLayer);
       result:=true;
       exit;
    end;
  end;
  result:=false;
end;
end.

posted on 2009-07-19 21:49  調皮↙不搗蛋  阅读(384)  评论(0编辑  收藏  举报