Example #1
0
        /// 合并列表中所有多边形
        /// </summary>
        /// <param name="orifeature">保留源对象</param>
        /// <param name="geolist">图形列表</param>
        /// <returns></returns>
        public void CreatePolygonFromExistingGeometries(IFeatureLayer lyr, IFeature orifeature, List <IGeometry> geolist)
        {
            int            i            = 0;
            IGeometry      geometry     = null;
            IFeatureClass  Featureclass = lyr.FeatureClass;
            IWorkspaceEdit workspace    = (IWorkspaceEdit)(Featureclass as IDataset).Workspace;

            workspace.StartEditing(false);
            workspace.StartEditOperation();
            //合并图形
            ITopologicalOperator2 topologicalOperator2 = orifeature.ShapeCopy as ITopologicalOperator2;

            for (i = 0; i < geolist.Count; i++)
            {
                IGeometry geo = geolist[i];
                if (geometry != null)
                {
                    topologicalOperator2 = geometry as ITopologicalOperator2;
                }
                ITopologicalOperator opertor = geo as ITopologicalOperator;
                opertor.Simplify();
                topologicalOperator2.IsKnownSimple_2 = false;
                topologicalOperator2.Simplify();
                geometry = topologicalOperator2.Union(geo);
            }
            //更新图形对象
            IGeometry geoCombined = (IGeometry)geometry;

            orifeature.Shape = geoCombined as IGeometry;
            orifeature.Store();

            workspace.StopEditOperation();
            workspace.StopEditing(true);
        }
Example #2
0
 /// <summary>
 /// 求面的并
 /// </summary>
 /// <param name="taskLayout"></param>
 /// <param name="satelliteResault"></param>
 /// <returns></returns>
 public static IPolygon UnionPolygon(IPolygon polygonOne, IPolygon polygonTwo)
 {
     try
     {
         if (polygonOne == null && polygonTwo != null)
         {
             return(polygonTwo);
         }
         else if (polygonOne != null && polygonTwo == null)
         {
             return(polygonOne);
         }
         else
         {
             ITopologicalOperator2 pTopologicalOperator = polygonOne as ITopologicalOperator2;
             IGeometry             pGeometry            =
                 pTopologicalOperator.Union(polygonTwo) as IGeometry;
             if (!pGeometry.IsEmpty)
             {
                 IPolygon unionPolygon = pGeometry as IPolygon;
                 return(unionPolygon);
             }
             else
             {
                 return(null);
             }
         }
     }
     catch (System.Exception ex)
     {
         return(null);
     }
 }
Example #3
0
 public void OnMouseDown(int button, int shift, int x, int y)
 {
     try
     {
         IPoint         point        = this._hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
         IFeatureClass  featureClass = Editor.UniqueInstance.TargetLayer.FeatureClass;
         ISpatialFilter queryFilter  = new SpatialFilterClass {
             Geometry      = point,
             GeometryField = featureClass.ShapeFieldName,
             SubFields     = featureClass.ShapeFieldName,
             SpatialRel    = esriSpatialRelEnum.esriSpatialRelWithin
         };
         IFeatureCursor o       = Editor.UniqueInstance.TargetLayer.Search(queryFilter, false);
         IFeature       feature = o.NextFeature();
         Marshal.ReleaseComObject(o);
         o = null;
         if ((feature != null) && (feature.OID != this._feature.OID))
         {
             feature = Editor.UniqueInstance.TargetLayer.FeatureClass.GetFeature(feature.OID);
             ITopologicalOperator2 shape = this._feature.Shape as ITopologicalOperator2;
             shape.IsKnownSimple_2 = false;
             shape.Simplify();
             shape = feature.Shape as ITopologicalOperator2;
             shape.IsKnownSimple_2 = false;
             shape.Simplify();
             shape = shape.Union(this._feature.Shape) as ITopologicalOperator2;
             shape.IsKnownSimple_2 = false;
             shape.Simplify();
             Editor.UniqueInstance.StartEditOperation();
             Editor.UniqueInstance.AddAttribute = false;
             List <IFeature> pFeatureList = new List <IFeature> {
                 this._feature,
                 feature
             };
             IFeature resultFeature = Editor.UniqueInstance.TargetLayer.FeatureClass.CreateFeature();
             resultFeature.Shape = shape as IGeometry;
             if (AttributeManager.AttributeCombineHandleClass.AttributeCombine(pFeatureList, ref resultFeature) == DialogResult.OK)
             {
                 resultFeature.Store();
                 foreach (IFeature feature3 in pFeatureList)
                 {
                     feature3.Delete();
                 }
                 IFeatureSelection targetLayer = Editor.UniqueInstance.TargetLayer as IFeatureSelection;
                 targetLayer.Clear();
                 targetLayer.Add(resultFeature);
                 this._hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection | esriViewDrawPhase.esriViewGeography, Editor.UniqueInstance.TargetLayer, resultFeature.Extent);
             }
             Editor.UniqueInstance.StopEditOperation("combineex");
         }
     }
     catch (Exception exception)
     {
         Editor.UniqueInstance.AbortEditOperation();
         this._mErrOpt.ErrorOperate(this._mSubSysName, "ShapeEdit.CombineEx", "OnMouseDown", exception.GetHashCode().ToString(), exception.Source, exception.Message, "", "", "");
     }
 }
Example #4
0
        //public List<ErrorEntity> CheckOverLap(string idname,IFeatureLayer pLayer)
        //{
        //    ArrayList arraylist = new ArrayList();

        //    IQueryFilter filter = new QueryFilterClass();
        //    filter.SubFields = pLayer.FeatureClass.OIDFieldName + "," + pLayer.FeatureClass.ShapeFieldName;
        //    IFeatureCursor cursor = pLayer.FeatureClass.Search(filter, true);
        //    List<ErrorEntity> listErrorEntity = new List<ErrorEntity>();
        //    IFeature pFeature = null;
        //    IFeature feature;
        //    while ((pFeature = cursor.NextFeature()) != null)
        //    {
        //        ITopologicalOperator2 @operator = (ITopologicalOperator2)pFeature.ShapeCopy;
        //        @operator.IsKnownSimple_2 = false;
        //        @operator.Simplify();
        //        IIdentify pIdentify = pLayer as IIdentify;
        //        IArray pIDs = pIdentify.Identify((IGeometry)pFeature.ShapeCopy);
        //        if (pIDs != null && pIDs.Count > 1)
        //        {
        //            //取第一个实体
        //            for (int i = 0; i < pIDs.Count; i++)
        //            {
        //                feature = (pIDs.get_Element(i) as IRowIdentifyObject).Row as IFeature;
        //                if (feature != null && pFeature.OID != feature.OID && (!arraylist.Contains(pFeature.OID + "" + feature.OID) && !arraylist.Contains(feature.OID + "" + pFeature.OID)))
        //                {
        //                    arraylist.Add(pFeature.OID + "" + feature.OID);
        //                    IGeometry item = feature.ShapeCopy;
        //                    IGeometry geometry3 = @operator.Intersect(item, esriGeometryDimension.esriGeometry2Dimension);
        //                    if (!geometry3.IsEmpty)
        //                    {
        //                        Console.WriteLine(pFeature.OID + "-" + feature.OID);
        //                        listErrorEntity.Add(new ErrorEntity(idname, pFeature.OID.ToString(), "自重叠", feature.OID.ToString(), ErrType.OverLap, geometry3));
        //                    }
        //                }
        //            }
        //        }
        //    }
        //    return listErrorEntity;
        //}

        public List <ErrorEntity> CheckOverLap(string idname, IFeatureLayer pLayer)
        {
            List <ErrorEntity> listErrorEntity = new List <ErrorEntity>();

            IFeatureClass IN_FeatureClass = pLayer.FeatureClass;

            IList <IGeometry> list          = new List <IGeometry>();
            ISpatialFilter    spatialFilter = new SpatialFilterClass();

            spatialFilter.GeometryField = IN_FeatureClass.ShapeFieldName;
            spatialFilter.SubFields     = IN_FeatureClass.OIDFieldName + "," + IN_FeatureClass.ShapeFieldName;
            spatialFilter.SpatialRel    = esriSpatialRelEnum.esriSpatialRelOverlaps;

            IFeatureCursor pFeatureCursor = IN_FeatureClass.Search(null, false);
            IFeature       pFeature       = pFeatureCursor.NextFeature();

            while (pFeature != null)
            {//记录集循环
                spatialFilter.Geometry = pFeature.ShapeCopy;
                IFeatureCursor featureCursor = IN_FeatureClass.Search(spatialFilter, true);
                IFeature       tFeature      = featureCursor.NextFeature();//遍历查询结果
                if (tFeature != null)
                {
                    IGeometry pGeometry = new PolygonClass();
                    pGeometry = tFeature.ShapeCopy;
                    while (tFeature != null)
                    {
                        ITopologicalOperator2 iUnionTopo = pGeometry as ITopologicalOperator2;
                        pGeometry = iUnionTopo.Union(tFeature.Shape);
                        tFeature  = featureCursor.NextFeature();//移动到下一条记录
                    }
                    ITopologicalOperator2 pRo           = (ITopologicalOperator2)pFeature.ShapeCopy;
                    IGeometry             pIntersectGeo = new PolygonClass();
                    pIntersectGeo = pRo.Intersect(pGeometry, esriGeometryDimension.esriGeometry2Dimension) as IPolygon;
                    if (pIntersectGeo != null && !pIntersectGeo.IsEmpty)
                    {
                        listErrorEntity.Add(new ErrorEntity(idname, pFeature.OID.ToString(), "自重叠", "", ErrType.OverLap, pIntersectGeo));
                    }
                }
                Marshal.ReleaseComObject(featureCursor);
                pFeature = pFeatureCursor.NextFeature();//移动到下一条记录
            }
            Marshal.ReleaseComObject(pFeature);
            Marshal.ReleaseComObject(spatialFilter);

            return(listErrorEntity);
        }
Example #5
0
 private void InitOtherLayer(IGeometry pGeo)
 {
     if (this._linkLayers != null)
     {
         ISpatialFilter filter = new SpatialFilterClass {
             Geometry = pGeo
         };
         foreach (IFeatureLayer layer in this._linkLayers)
         {
             if (layer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon)
             {
                 filter.SubFields     = layer.FeatureClass.ShapeFieldName;
                 filter.GeometryField = layer.FeatureClass.ShapeFieldName;
                 filter.SpatialRel    = esriSpatialRelEnum.esriSpatialRelTouches;
                 IFeatureCursor o        = layer.FeatureClass.Search(filter, false);
                 IFeature       pFeature = o.NextFeature();
                 IFeature       feature2 = o.NextFeature();
                 IFeature       feature3 = o.NextFeature();
                 Marshal.ReleaseComObject(o);
                 o = null;
                 if (((pFeature != null) && (feature2 != null)) && (feature3 == null))
                 {
                     ITopologicalOperator2 shapeCopy = pFeature.ShapeCopy as ITopologicalOperator2;
                     shapeCopy.IsKnownSimple_2 = false;
                     shapeCopy.Simplify();
                     shapeCopy = feature2.ShapeCopy as ITopologicalOperator2;
                     shapeCopy.IsKnownSimple_2 = false;
                     shapeCopy.Simplify();
                     if (!shapeCopy.Intersect(pFeature.ShapeCopy, esriGeometryDimension.esriGeometry1Dimension).IsEmpty)
                     {
                         IRelationalOperator operator2 = shapeCopy.Union(pFeature.ShapeCopy) as IRelationalOperator;
                         if (operator2.Contains(this._editBound))
                         {
                             this._las.Add(new LinkArgs(pFeature));
                             this._las.Add(new LinkArgs(feature2));
                             Marshal.ReleaseComObject(o);
                             o = null;
                         }
                     }
                 }
             }
         }
     }
 }
Example #6
0
        //<CSCM>
        //********************************************************************************
        //** 函 数 名: UnionTwoGeometry
        //** 版    权: CopyRight (C)
        //** 创 建 人: 杨旭斌
        //** 功能描述: 合并二个图形成一个图形
        //** 创建日期:
        //** 修 改 人:
        //** 修改日期:
        //** 修改时间: 20070818
        //** 参数列表: pOriGeometry (IGeometry)需要合并的二个图形
        //             pDesOrigeometry (IGeometry)
        //             bHasErr合并过程中是否产生了错误
        //             sErrDes 错误描述
        //** 版    本:1.0
        //*********************************************************************************
        //</CSCM>
        public static IGeometry UnionTwoGeometry(IGeometry pOriGeometry, IGeometry pDesGeometry, ref bool bHasErr, ref string sErrDes)
        {
            //bHasErr = false;
            //sErrDes = "";

            IGeometry             functionReturnValue = default(IGeometry);
            ITopologicalOperator2 pTopoOperator       = default(ITopologicalOperator2);
            IGeometry             pGeometry           = default(IGeometry);

            //如果图形为空,则置为nothing
            bHasErr = false;
            sErrDes = "";
            if (pOriGeometry != null && pDesGeometry != null)
            {
                if (pOriGeometry.SpatialReference == null & pDesGeometry.SpatialReference != null)
                {
                    if (pOriGeometry.SpatialReference.FactoryCode != pDesGeometry.SpatialReference.FactoryCode)
                    {
                        bHasErr = true;
                        sErrDes = "二个图形的投影坐标系不相同,不能进行求交。";
                        return(null);
                    }
                }
            }
            if (pOriGeometry != null)
            {
                if (pOriGeometry.IsEmpty == true)
                {
                    pOriGeometry = null;
                }
            }
            if (pDesGeometry != null)
            {
                if (pDesGeometry.IsEmpty == true)
                {
                    pDesGeometry = null;
                }
            }
            try
            {
                if (pOriGeometry != null && pDesGeometry != null)
                {
                    pTopoOperator = (ITopologicalOperator2)pOriGeometry;
                    pGeometry     = pTopoOperator.Union(pDesGeometry);
                    pTopoOperator = (ITopologicalOperator2)pGeometry;
                    pTopoOperator.IsKnownSimple_2 = false;
                    pTopoOperator.Simplify();
                    functionReturnValue = (IGeometry)pTopoOperator;
                    return(functionReturnValue);
                }
                else if (pOriGeometry != null)
                {
                    return(pOriGeometry);
                }
                else if (pDesGeometry != null)
                {
                    return(pDesGeometry);
                }
                else
                {
                    return(null);
                }
            }
            catch
            {
                functionReturnValue = null;
            }
            return(functionReturnValue);
        }
Example #7
0
        //public static void CreateFishNet(string inTemplate, int width, int height, string outFishNet)
        //{
        //    IFeatureClass inFeatureClass = null;
        //    IFeatureClass outFeatureClass = null;
        //    ISpatialReference spatialReference = null;
        //    IEnvelope extent = null;
        //    try
        //    {
        //        inFeatureClass = EngineAPI.OpenFeatureClass(inTemplate);
        //        spatialReference = (inFeatureClass as IGeoDataset).SpatialReference;
        //        if (!CreateShpFile(outFishNet, spatialReference))
        //        {
        //            throw new Exception("创建矢量文件失败!");
        //        }
        //        outFeatureClass = EngineAPI.OpenFeatureClass(outFishNet);

        //        extent = (inFeatureClass as IGeoDataset).Extent;
        //        double extentW = extent.Width;
        //        double extentH = extent.Height;
        //        double extenXmin = extent.XMin;
        //        double extenYmin = extent.YMin;

        //        int columCount = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(extentW / width)));
        //        int rowCount = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(extentH / height)));
        //        for (int j = 0; j < rowCount * columCount; j++)
        //        {
        //            int row = j / columCount;
        //            int col = j % columCount;

        //            IEnvelope rect = new EnvelopeClass();
        //            rect.SpatialReference = spatialReference;
        //            rect.XMin = extenXmin + col * width;
        //            rect.XMax = rect.XMin + width;
        //            rect.YMin = extenYmin + row * height;
        //            rect.YMax = rect.YMin + height;
        //            IElement ele = new RectangleElementClass
        //            {
        //                Geometry = rect
        //            };

        //            IFeature pFeature = outFeatureClass.CreateFeature();
        //            pFeature.Shape = ele.Geometry;
        //            pFeature.Store();
        //        }

        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }
        //    finally
        //    {
        //        if (spatialReference != null)
        //            Marshal.ReleaseComObject(spatialReference);
        //        if (extent != null)
        //            Marshal.ReleaseComObject(extent);
        //        if (inFeatureClass != null)
        //            Marshal.ReleaseComObject(inFeatureClass);
        //        if (outFeatureClass != null)
        //            Marshal.ReleaseComObject(outFeatureClass);
        //    }

        //}

        public static void Sampling(string inFirstUnit, string firstUnit_Name, string layer, string inSecondUnit, string inCultivation, SamplePara para, string outSample)
        {
            IFeatureClass     inFirstF         = null;
            IFeatureClass     inSecondF        = null;
            IFeatureClass     inCultivationF   = null;
            IFeatureClass     outFeatureClass  = null;
            ISpatialReference spatialReference = null;

            try
            {
                //耕地和一级抽样单元相交处理
                string instert = System.IO.Path.Combine(ConstDef.PATH_TEMP, DateTime.Now.ToFileTime().ToString() + ".shp");
                string msg     = string.Empty;
                if (!EnviVars.instance.GpExecutor.Intersect(inFirstUnit + ";" + inCultivation, instert, out msg))
                {
                    throw new Exception(msg);
                }
                //读取一级抽样单元
                inFirstF = EngineAPI.OpenFeatureClass(inFirstUnit);
                //读取二级渔网
                inSecondF        = EngineAPI.OpenFeatureClass(inSecondUnit);
                spatialReference = (inFirstF as IGeoDataset).SpatialReference;
                //创建二级抽样单元矢量
                if (!CreateShpFile(outSample, spatialReference, firstUnit_Name, layer))
                {
                    throw new Exception("创建二级抽样单元矢量文件失败!");
                }
                outFeatureClass = EngineAPI.OpenFeatureClass(outSample);
                //读取一级抽样单元与耕地相交结果
                inCultivationF = EngineAPI.OpenFeatureClass(instert);
                //一级单元抽样个数
                int            firstUnitCount = inFirstF.FeatureCount(null);
                int            nameIndex      = inFirstF.FindField(firstUnit_Name);
                int            layerIndex     = inFirstF.FindField(layer);
                IFeature       pFFirst        = null;
                IFeatureCursor pFCFirst       = inFirstF.Search(null, false);
                IFeatureBuffer pFeatureBuffer = outFeatureClass.CreateFeatureBuffer();
                IFeatureCursor pInsertCursor  = outFeatureClass.Insert(true);
                while ((pFFirst = pFCFirst.NextFeature()) != null)
                {
                    string       fUnitName    = pFFirst.get_Value(nameIndex).ToString();
                    IQueryFilter pQFIntersect = new QueryFilterClass();
                    pQFIntersect.WhereClause = "\"" + firstUnit_Name + "\"" + " = '" + fUnitName + "'";
                    IFeatureCursor pFeatureCursor = inCultivationF.Search(pQFIntersect, false);
                    //指定一级抽样单元内耕地geometry合并
                    IFeature unionFeature = inCultivationF.CreateFeature();
                    IFeature pFeature     = null;
                    while ((pFeature = pFeatureCursor.NextFeature()) != null)
                    {
                        IGeometry             geometry  = unionFeature.Shape;
                        ITopologicalOperator2 unionTopo = geometry as ITopologicalOperator2;
                        unionFeature.Shape = unionTopo.Union(pFeature.ShapeCopy);
                    }
                    //Marshal.ReleaseComObject(pFeatureCursor);
                    //获取与耕地合并geometry相交的二级格网
                    ISpatialFilter pSFSecond = new SpatialFilterClass();
                    pSFSecond.Geometry   = unionFeature.Shape;
                    pSFSecond.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                    pFeatureCursor       = inSecondF.Search(pSFSecond, false);
                    List <IFeature> sUnitFList = new List <IFeature>();
                    while ((pFeature = pFeatureCursor.NextFeature()) != null)
                    {
                        sUnitFList.Add(pFeature);
                    }
                    if (pFeatureCursor != null)
                    {
                        Marshal.ReleaseComObject(pFeatureCursor);
                    }
                    int sampleNum = 0;
                    if (para.isNum)
                    {
                        sampleNum = para.sampleNum;
                    }
                    else
                    {
                        sampleNum = Convert.ToInt32(sUnitFList.Count * para.sampleRate);
                    }

                    if (sUnitFList.Count > sampleNum)
                    {
                        //从相交的二级格网中随机抽样指定个数,并存出
                        Random ran = new Random();
                        for (int j = 0; j < sampleNum; j++)
                        {
                            //System.Threading.Thread.Sleep(100);
                            int range    = sUnitFList.Count - 1;
                            int selected = ran.Next(0, range);
                            pFeatureBuffer.Shape = sUnitFList[selected].ShapeCopy;
                            pFeatureBuffer.set_Value(2, j);
                            pFeatureBuffer.set_Value(3, fUnitName);
                            pFeatureBuffer.set_Value(4, pFFirst.get_Value(layerIndex));
                            pInsertCursor.InsertFeature(pFeatureBuffer);
                            sUnitFList.RemoveAt(selected);
                        }
                    }
                    else
                    {
                        //throw new Exception("选择的样本数大于样本总量!");

                        for (int j = 0; j < sUnitFList.Count; j++)
                        {
                            pFeatureBuffer.Shape = sUnitFList[j].ShapeCopy;
                            pFeatureBuffer.set_Value(2, j);
                            pFeatureBuffer.set_Value(3, fUnitName);
                            pFeatureBuffer.set_Value(4, pFFirst.get_Value(layerIndex));
                            pInsertCursor.InsertFeature(pFeatureBuffer);
                            //pFeature = outFeatureClass.CreateFeature();
                            //pFeature.Shape = sUnitFList[j].ShapeCopy;
                            ////secondUnitCount++;
                            //pFeature.set_Value(2, j);
                            //pFeature.set_Value(3, fUnitName);
                            //pFeature.set_Value(4, pFFirst.get_Value(layerIndex));
                            //pFeature.Store();
                        }
                    }
                }
                pInsertCursor.Flush();
                if (pFeatureBuffer != null)
                {
                    Marshal.ReleaseComObject(pFeatureBuffer);
                }
                if (pInsertCursor != null)
                {
                    Marshal.ReleaseComObject(pInsertCursor);
                }
                if (pFCFirst != null)
                {
                    Marshal.ReleaseComObject(pFCFirst);
                }
                //for (int i = 0; i < firstUnitCount; i++)
                //{
                //    IFeature pFeature = inFirstF.GetFeature(i);
                //    string fUnitName = pFeature.Table.GetRow(i).get_Value(nameIndex).ToString();
                //    IQueryFilter pQueryFilter = new QueryFilterClass();
                //    pQueryFilter.WhereClause = "\"" + firstUnit_Name + "\"" + " = '" +  fUnitName + "'";
                //    IFeatureCursor pFeatureCursor = inCultivationF.Search(pQueryFilter, false);
                //    //ISelectionSet pSelectionSet = inCultivationF.Select(pQueryFilter, esriSelectionType.esriSelectionTypeSnapshot, esriSelectionOption.esriSelectionOptionNormal, null);
                //    //IPolygon polygon =(pSelectionSet as IPolygon);
                //    //指定一级抽样单元内耕地geometry合并
                //    IFeature unionFeature = inCultivationF.CreateFeature();
                //    while ((pFeature = pFeatureCursor.NextFeature()) != null)
                //    {
                //        IGeometry geometry = unionFeature.Shape;
                //        ITopologicalOperator2 unionTopo = geometry as ITopologicalOperator2;
                //        unionFeature.Shape = unionTopo.Union(pFeature.ShapeCopy);
                //    }
                //    //获取与耕地合并geometry相交的二级格网
                //    ISpatialFilter pSpatialFilter = new SpatialFilterClass();
                //    pSpatialFilter.Geometry = unionFeature.Shape;
                //    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                //    pFeatureCursor = inSecondF.Search(pSpatialFilter, false);
                //    List<IFeature> sUnitFList = new List<IFeature>();
                //    while ((pFeature = pFeatureCursor.NextFeature()) != null)
                //    {
                //        sUnitFList.Add(pFeature);
                //    }
                //    if (sUnitFList.Count < sampleNum)
                //    {
                //        throw new Exception("选择的样本数大于样本总量!");
                //    }
                //    //从相交的二级格网中随机抽样指定个数,并存出
                //    for (int j = 0; j < sampleNum; j++)
                //    {
                //        System.Threading.Thread.Sleep(100);
                //        Random ran = new Random();
                //        int range = sUnitFList.Count - 1;
                //        int selected = ran.Next(0, range);
                //        pFeature = outFeatureClass.CreateFeature();
                //        pFeature.Shape = sUnitFList[selected].ShapeCopy;
                //        secondUnitCount++;
                //        pFeature.set_Value(2,secondUnitCount);
                //        pFeature.Store();
                //        sUnitFList.RemoveAt(selected);
                //    }
                //}
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (spatialReference != null)
                {
                    Marshal.ReleaseComObject(spatialReference);
                }
                if (outFeatureClass != null)
                {
                    Marshal.ReleaseComObject(outFeatureClass);
                }
                if (inCultivationF != null)
                {
                    Marshal.ReleaseComObject(inCultivationF);
                }
                if (inSecondF != null)
                {
                    Marshal.ReleaseComObject(inSecondF);
                }
                if (inFirstF != null)
                {
                    Marshal.ReleaseComObject(inFirstF);
                }
            }
        }
Example #8
0
        public void InitLinkage(IPoint mousePoint, double buffer)
        {
            this._isVertexEditing = false;
            this._editOrigShape   = null;
            this._editBound       = null;
            this._las.Clear();
            IFeatureClass  featureClass = Editor.UniqueInstance.TargetLayer.FeatureClass;
            ISpatialFilter queryFilter  = new SpatialFilterClass {
                Geometry      = (mousePoint as ITopologicalOperator).Buffer(buffer),
                GeometryField = featureClass.ShapeFieldName,
                SubFields     = featureClass.ShapeFieldName,
                SpatialRel    = esriSpatialRelEnum.esriSpatialRelIntersects
            };
            IFeatureCursor o        = Editor.UniqueInstance.TargetLayer.Search(queryFilter, false);
            IFeature       pFeature = o.NextFeature();

            if (pFeature == null)
            {
                Marshal.ReleaseComObject(o);
                o = null;
                this.ClearUp();
            }
            else
            {
                IFeature feature = o.NextFeature();
                if (feature == null)
                {
                    Marshal.ReleaseComObject(o);
                    o = null;
                    this.ClearUp();
                }
                else if (o.NextFeature() != null)
                {
                    Marshal.ReleaseComObject(o);
                    o = null;
                    this.ClearUp();
                }
                else
                {
                    pFeature = Editor.UniqueInstance.TargetLayer.FeatureClass.GetFeature(pFeature.OID);
                    feature  = Editor.UniqueInstance.TargetLayer.FeatureClass.GetFeature(feature.OID);
                    IGeometry             pGeometry = null;
                    IGeometry             shapeCopy = pFeature.ShapeCopy;
                    IGeometry             other     = feature.ShapeCopy;
                    ITopologicalOperator2 @operator = shapeCopy as ITopologicalOperator2;
                    @operator.IsKnownSimple_2 = false;
                    @operator.Simplify();
                    ITopologicalOperator2 operator2 = other as ITopologicalOperator2;
                    operator2.IsKnownSimple_2 = false;
                    operator2.Simplify();
                    pGeometry = @operator.Intersect(other, esriGeometryDimension.esriGeometry1Dimension);
                    if (pGeometry.IsEmpty)
                    {
                        this.ClearUp();
                    }
                    else
                    {
                        if ((pGeometry as IGeometryCollection).GeometryCount > 1)
                        {
                            IHitTest test            = pGeometry as IHitTest;
                            IPoint   hitPoint        = null;
                            double   hitDistance     = 0.0;
                            int      hitPartIndex    = -1;
                            int      hitSegmentIndex = -1;
                            bool     bRightSide      = false;
                            if (!test.HitTest(mousePoint, buffer, esriGeometryHitPartType.esriGeometryPartBoundary, hitPoint, ref hitDistance, ref hitPartIndex, ref hitSegmentIndex, ref bRightSide))
                            {
                                return;
                            }
                            pGeometry = (pGeometry as IGeometryCollection).get_Geometry(hitPartIndex);
                        }
                        pGeometry = GISFunFactory.UnitFun.ConvertPoject(pGeometry, this._viewMap.FocusMap.SpatialReference);
                        IPolyline polyline = null;
                        if (pGeometry.GeometryType != esriGeometryType.esriGeometryPolyline)
                        {
                            IPath path = pGeometry as IPath;
                            if ((path != null) && path.IsClosed)
                            {
                                this.ClearUp();
                                return;
                            }
                            IPointCollection newPoints = pGeometry as IPointCollection;
                            polyline = new PolylineClass {
                                SpatialReference = pGeometry.SpatialReference
                            };
                            (polyline as IPointCollection).AddPointCollection(newPoints);
                        }
                        IGeometry geometry4 = @operator.Union(other);
                        this._editBound = GISFunFactory.UnitFun.ConvertPoject(geometry4, this._viewMap.FocusMap.SpatialReference);
                        this._las.Add(new LinkArgs(pFeature));
                        this._las.Add(new LinkArgs(feature));
                        this.InitOtherLayer(pGeometry);
                        if (polyline != null)
                        {
                            this._editOrigShape = (polyline as IClone).Clone() as IGeometry;
                            Editor.UniqueInstance.LinageShape       = polyline;
                            Editor.UniqueInstance.ReservedLinkShape = polyline;
                        }
                        else
                        {
                            this._editOrigShape = (pGeometry as IClone).Clone() as IGeometry;
                            Editor.UniqueInstance.LinageShape       = pGeometry;
                            Editor.UniqueInstance.ReservedLinkShape = pGeometry;
                        }
                        this._isVertexEditing = true;
                    }
                }
            }
        }