C# Arcgis Engine 之相交分析( Intersect)线段相交求交点坐标。

   在网上查找了许多参考代码,梳理后实现想要的功能,在此做一个记录。

具体代码如下: 

首先为了方便查找所需图层,获取图层的编号

//获取图层编号
        private int Layer_Count(string name)
        {
            int Count = 0;
            mainfrm.axMapControl1.Map.ClearSelection();//清除地图的选择
            int pLayerCount = mainfrm.axMapControl1.LayerCount;
            string str = "";
            for (int i = 0; i < pLayerCount; i++)
            {
                str = mainfrm.axMapControl1.Map.get_Layer(i).Name;
                if (str == name)
                {
                    Count = i;
                }
            }
            return Count;
        }

 

//两个线要素遍历,求交点点集 

{

            int count = 0;
           ILayer inputLayer1 = mainfrm.axMapControl1.Map.get_Layer(Layer_Count(Name));

            IFeatureLayer inputFeatureLyr1 = inputLayer1 as IFeatureLayer;//将ILayer转换为IFeaturelayer,为了对图层上的要素进行编辑  
            IFeatureClass inputFtClass1 = inputFeatureLyr1.FeatureClass;
            IWorkspaceEdit w1 = (inputFtClass1 as IDataset).Workspace as IWorkspaceEdit;//定义一个工作编辑工作空间,用于开启前图层的编辑状态  

            IFeatureCursor inputFeatureCursor = inputFeatureLyr1.Search(null, true);

            IFeature pFeature1 = inputFeatureCursor.NextFeature();


            while (pFeature1 != null)
            {

                ITopologicalOperator pTopological = (pFeature1.Shape) as ITopologicalOperator;
                ILayer inputLayer2 = mainfrm.axMapControl1.Map.get_Layer(Layer_Count(name));
             
                IFeatureLayer inputFeatureLyr2 = inputLayer2 as IFeatureLayer;//将ILayer转换为IFeaturelayer,为了对图层上的要素进行编辑  
                IFeatureClass inputFtClass2 = inputFeatureLyr2.FeatureClass;


                IFeatureCursor pFeatureCursor2 = inputFtClass2.Search(null, true);
                IFeature pFeature2;

                pFeature2 = pFeatureCursor2.NextFeature();
                //IFields pFields = inputFtClass2.Fields;
                for (int i = 0; i < count; i++)
                {
                    pFeature2 = pFeatureCursor2.NextFeature();
                }
                while (pFeature2 != null)
                {
                    IGeometry pGeoInterscet = pTopological.Intersect(pFeature2.Shape, esriGeometryDimension.esriGeometry0Dimension);

                    if (!pGeoInterscet.IsEmpty)
                    {
                        IPointCollection pColl = pGeoInterscet as IPointCollection;
                        List<double> Xlist = new List<double>();
                        
                        for (int i = 0; i < pColl.PointCount; i++)
                        {
                            IPoint pPoint = pColl.Point[i];
                            Create_Point(pPoint);                            
                         
                        }


                    }
                    pFeature2 = pFeatureCursor2.NextFeature();
                }
                count++;
                pFeature1 = inputFeatureCursor.NextFeature();
                this.Hide();
            }

        }

 //获得点集后,创建点要素

private void Create_Point(IPoint pPoint)
        {
            ILayer outputLayer = mainfrm.axMapControl1.Map.get_Layer(Layer_Count(name));

            IFeatureLayer outFeatureLyr = outputLayer as IFeatureLayer;
            IFeatureClass outFeatCls = outFeatureLyr.FeatureClass;
            IDataset outDataset = outFeatCls as IDataset;
            IWorkspace outpWS = outDataset.Workspace;
            IWorkspaceEdit outpWorkspaceEdit = outpWS as IWorkspaceEdit;
            outpWorkspaceEdit.StartEditing(false);
            outpWorkspaceEdit.StartEditOperation();
            IFeatureBuffer pfeatureBuffer;
            IFeatureCursor pFeatureCuror;
            IFeature outpFeature;
            pfeatureBuffer = outFeatCls.CreateFeatureBuffer();
            pFeatureCuror = outFeatCls.Insert(true);
            outpFeature = pfeatureBuffer as IFeature;
            IGeometry pPointGeo = pPoint as IGeometry;
            outpFeature.Shape = pPointGeo;
            pFeatureCuror.InsertFeature(pfeatureBuffer);
            outpWorkspaceEdit.StopEditOperation();
            outpWorkspaceEdit.StopEditing(true);
            mainfrm.axMapControl1.ActiveView.Refresh();           
        }

 //设置点要素保存路径

SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Shape文件(*.shp)|*.shp";
            saveFileDialog.Title = "保存shp文件";
            saveFileDialog.CheckFileExists = false;
            DialogResult dialogResult = saveFileDialog.ShowDialog();
            IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
            int index;
            string fileName;
            string filePath;
            string fileFullPath;
            if (dialogResult == DialogResult.OK)
            {
                //保存文件地址
                fileFullPath = saveFileDialog.FileName;
                index = fileFullPath.LastIndexOf("\\");
                fileName = fileFullPath.Substring(index + 1);
                filePath = fileFullPath.Substring(0, index);
                if (System.IO.File.Exists(saveFileDialog.FileName))//检查文件是否存在
                {
                    if (MessageBox.Show("该文件夹下已经有同名文件,替换原文件?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                    {
                        IFeatureWorkspace FWS = pWorkspaceFactory.OpenFromFile(filePath, 0) as IFeatureWorkspace;
                        IFeatureClass pFeatureClass = FWS.OpenFeatureClass(fileName);
                        IDataset pDataset = pFeatureClass as IDataset;
                        pDataset.Delete();

                    }
                    //System.IO.File.Delete(saveFileDialog.FileName);
                    else
                        return;
                }              

            }
            else
            {
                fileFullPath = null;
                return;
            }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值