Esempio n. 1
0
        private double[][] EdgeCorrection(int intNFeatureCount, int intNDistBnd, IFeature pFeature, double[,] arrXYPts, double dblDistInc, double dblBeginDist)
        {
            double[][]            dblWeightCnt = new double[intNFeatureCount][];
            ITopologicalOperator2 pTopoOpt     = (ITopologicalOperator2)pFeature.ShapeCopy;

            for (int i = 0; i < intNFeatureCount; i++)
            {
                IPoint pFromPts = new PointClass();
                pFromPts.X      = arrXYPts[i, 0];
                pFromPts.Y      = arrXYPts[i, 1];
                dblWeightCnt[i] = new double[intNDistBnd];
                ITopologicalOperator pTopoBuffer = pFromPts as ITopologicalOperator;

                for (int l = intNDistBnd; l > 0; l--)
                {
                    if (l == intNDistBnd)
                    {
                        double   dblWeight        = 0;
                        double   dblRefDist       = l * dblDistInc + dblBeginDist;
                        IPolygon polygon          = pTopoBuffer.Buffer(dblRefDist) as IPolygon;
                        IArea    pPolyArea        = polygon as IArea;
                        IArea    pIntersectedArea = (IArea)pTopoOpt.Intersect(polygon, esriGeometryDimension.esriGeometry2Dimension);

                        dblWeight = pIntersectedArea.Area / pPolyArea.Area;
                        dblWeightCnt[i][l - 1] = dblWeight;
                    }
                    else
                    {
                        if (dblWeightCnt[i][l] != 1)
                        {
                            double   dblWeight        = 0;
                            double   dblRefDist       = l * dblDistInc + dblBeginDist;
                            IPolygon polygon          = pTopoBuffer.Buffer(dblRefDist) as IPolygon;
                            IArea    pPolyArea        = polygon as IArea;
                            IArea    pIntersectedArea = (IArea)pTopoOpt.Intersect(polygon, esriGeometryDimension.esriGeometry2Dimension);

                            dblWeight = pIntersectedArea.Area / pPolyArea.Area;
                            dblWeightCnt[i][l - 1] = dblWeight;
                        }
                        else
                        {
                            dblWeightCnt[i][l - 1] = 1;
                        }
                    }
                }
            }
            //if (dblWeightCnt[l - 1] < 0.5)
            //    MessageBox.Show("11");
            return(dblWeightCnt);
        }
Esempio n. 2
0
        //<CSCM>
        //********************************************************************************
        //** 函 数 名: CutFeatByGeometry
        //** 版    权: CopyRight (C)
        //** 创 建 人: 杨旭斌
        //** 功能描述: 根据传入的图形,剪切需要被剪切的要素
        //** 创建日期:
        //** 修 改 人:
        //** 修改日期:
        //** 修改时间: 2006-10-13
        //** 参数列表: pOriGeometry (IGeometry)'需要被剪切的要素
        //             pRefGeometry (IGeometry)'参照要素
        //             EnumGeometryDimension (esriGeometryDimension)'返回的图形的维数
        //               线:esriGeometry1Dimension 用于面剪切线;
        //               面:esriGeometry2Dimension 用于面剪切面
        //** 版    本:1.0
        //*********************************************************************************
        //</CSCM>
        public static IGeometry CutFeatByGeometry(ref IGeometry pOriGeometry, ref IGeometry pRefGeometry, ref esriGeometryDimension EnumGeometryDimension)
        {
            IGeometry             functionReturnValue = default(IGeometry);
            ITopologicalOperator2 pTopoOperator       = default(ITopologicalOperator2);
            ITopologicalOperator2 pTopoOperator2      = default(ITopologicalOperator2);
            //原要素和参照要素相交的部分
            IGeometry pGeometry = default(IGeometry);

            // ERROR: Not supported in C#: OnErrorStatement
            try
            {
                pTopoOperator = (ITopologicalOperator2)pRefGeometry;
                pTopoOperator.IsKnownSimple_2 = false;
                pTopoOperator.Simplify();
                pTopoOperator2 = (ITopologicalOperator2)pOriGeometry;
                pTopoOperator2.IsKnownSimple_2 = false;
                pTopoOperator2.Simplify();
                //根据不同的需要返回点,线,面等相交的部分
                pGeometry     = pTopoOperator2.Intersect((IGeometry)pTopoOperator, EnumGeometryDimension);
                pTopoOperator = (ITopologicalOperator2)pGeometry;
                pTopoOperator.IsKnownSimple_2 = false;
                pTopoOperator.Simplify();
                functionReturnValue = (IGeometry)pTopoOperator;
                return(functionReturnValue);
            }
            catch (Exception)
            {
                functionReturnValue = null;
                return(functionReturnValue);
            }
        }
Esempio n. 3
0
        //<CSCM>
        //********************************************************************************
        //** 函 数 名: IntersectTwoGeometry
        //** 版    权: CopyRight (C)
        //** 创 建 人: 杨旭斌
        //** 功能描述: 二个图形求差
        //** 创建日期:
        //** 修 改 人:
        //** 修改日期:
        //** 修改时间: 20070818
        //** 参数列表: pOriGeometry (IGeometry)
        //         pDesGeometry (IGeometry)
        //** 版    本:1.0
        //*********************************************************************************
        //</CSCM>
        public static IGeometry IntersectTwoGeometry(IGeometry pOriGeometry, IGeometry pDesGeometry)
        {
            IGeometry             functionReturnValue = default(IGeometry);
            ITopologicalOperator2 pTopoOperator       = default(ITopologicalOperator2);
            ITopologicalOperator2 pTopoOperator2      = default(ITopologicalOperator2);
            IGeometry             pGeometry           = default(IGeometry);

            // ERROR: Not supported in C#: OnErrorStatement
            try
            {
                pTopoOperator = (ITopologicalOperator2)pOriGeometry;
                pTopoOperator.IsKnownSimple_2 = false;
                pTopoOperator.Simplify();

                pTopoOperator2 = (ITopologicalOperator2)pDesGeometry;
                pTopoOperator2.IsKnownSimple_2 = false;
                pTopoOperator2.Simplify();
                pGeometry     = pTopoOperator.Intersect((IGeometry)pTopoOperator2, esriGeometryDimension.esriGeometry2Dimension);
                pTopoOperator = (ITopologicalOperator2)pGeometry;
                pTopoOperator.IsKnownSimple_2 = false;
                pTopoOperator.Simplify();
                functionReturnValue = (IGeometry)pTopoOperator;
                return(functionReturnValue);
            }
            catch (Exception)
            {
                functionReturnValue = null;
                return(functionReturnValue);
            }
        }
Esempio n. 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);
        }
Esempio n. 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;
                         }
                     }
                 }
             }
         }
     }
 }
Esempio n. 6
0
        internal static List <IGeometry> spatialIntersect(IGeometry pGeometry, List <IGeometry> inputGeometryList)
        {
            List <IGeometry> resultGeoList = new List <IGeometry>();

            if (pGeometry.GeometryType == esriGeometryType.esriGeometryPoint || pGeometry.GeometryType == esriGeometryType.esriGeometryMultipoint)
            {
                resultGeoList.Add(pGeometry);
                return(resultGeoList);
            }

            foreach (IGeometry geo in inputGeometryList)
            {
                ITopologicalOperator2 topoOper  = pGeometry as ITopologicalOperator2;
                IGeometry             resultGeo = topoOper.Intersect(geo, esriGeometryDimension.esriGeometry2Dimension);
                if (resultGeo != null)
                {
                    resultGeoList.Add(resultGeo);
                }
            }

            return(resultGeoList);
        }
Esempio n. 7
0
 /// <summary>
 /// 求面的交
 /// </summary>
 /// <param name="taskLayout"></param>
 /// <param name="satelliteResault"></param>
 /// <returns></returns>
 public static IPolygon IntersectPolygon(IPolygon polygonOne, IPolygon polygonTwo)
 {
     try
     {
         ITopologicalOperator2 pTopologicalOperator = polygonOne as ITopologicalOperator2;
         IGeometry             pGeometry            =
             pTopologicalOperator.Intersect(polygonTwo, esriGeometryDimension.esriGeometry2Dimension) as
             IGeometry;
         if (!pGeometry.IsEmpty)
         {
             IPolygon intersectPolygon = pGeometry as IPolygon;
             return(intersectPolygon);
         }
         else
         {
             return(null);
         }
     }
     catch (System.Exception ex)
     {
         return(null);
     }
 }
Esempio n. 8
0
        public bool Snap(IGeometry igeometry_0, IPoint ipoint_0, double double_0)
        {
            bool      flag;
            int       i;
            IHitTest  shape;
            IGeometry geometry;

            if (!EditorLicenseProviderCheck.Check())
            {
                flag = false;
            }
            else if (this.ifeatureCache_0.Count != 0)
            {
                bool   flag1      = false;
                double num        = 0;
                int    num1       = 0;
                int    num2       = 0;
                bool   flag2      = true;
                IPoint pointClass = new ESRI.ArcGIS.Geometry.Point();
                object value      = Missing.Value;
                IArray arrayClass = new Array();
                for (i = 0; i < this.ifeatureCache_0.Count; i++)
                {
                    shape = (IHitTest)this.ifeatureCache_0.Feature[i].Shape;
                    if ((shape is IPolyline ? true : shape is IPolygon) &&
                        shape.HitTest(ipoint_0, double_0, esriGeometryHitPartType.esriGeometryPartBoundary, pointClass,
                                      ref num, ref num1, ref num2, ref flag2))
                    {
                        arrayClass.Add(shape);
                    }
                }
                IPointCollection multipointClass = new Multipoint();
                IArray           arrayClass1     = new Array() as IArray;
                for (i = 0; i < arrayClass.Count; i++)
                {
                    ITopologicalOperator2 element = (ITopologicalOperator2)arrayClass.Element[i];
                    for (int j = 0; j < arrayClass.Count; j++)
                    {
                        if (i != j)
                        {
                            if (((IGeometry)arrayClass.Element[i]).GeometryType !=
                                ((IGeometry)arrayClass.Element[j]).GeometryType)
                            {
                                geometry = element.IntersectMultidimension((IGeometry)arrayClass.Element[j]);
                                if (geometry != null)
                                {
                                    IGeometryCollection geometryCollection = geometry as IGeometryCollection;
                                    if (geometryCollection != null)
                                    {
                                        for (int k = 0; k < geometryCollection.GeometryCount; k++)
                                        {
                                            geometry = geometryCollection.Geometry[k];
                                            if (geometry is IPointCollection)
                                            {
                                                multipointClass.AddPointCollection((IPointCollection)geometry);
                                            }
                                            else if (geometry is IPointCollection)
                                            {
                                                multipointClass.AddPoint((IPoint)geometry, ref value, ref value);
                                            }
                                        }
                                    }
                                }
                            }
                            else
                            {
                                geometry = element.Intersect((IGeometry)arrayClass.Element[j],
                                                             esriGeometryDimension.esriGeometry0Dimension);
                                if (geometry != null)
                                {
                                    if (geometry is IPointCollection)
                                    {
                                        multipointClass.AddPointCollection((IPointCollection)geometry);
                                    }
                                    else if (geometry is IPointCollection)
                                    {
                                        multipointClass.AddPoint((IPoint)geometry, ref value, ref value);
                                    }
                                }
                            }
                        }
                    }
                }
                shape = (IHitTest)multipointClass;
                if (shape.HitTest(ipoint_0, double_0, esriGeometryHitPartType.esriGeometryPartVertex, pointClass,
                                  ref num, ref num1, ref num2, ref flag2))
                {
                    ipoint_0.PutCoords(pointClass.X, pointClass.Y);
                    flag1 = true;
                }
                flag = flag1;
            }
            else
            {
                flag = false;
            }
            return(flag);
        }
Esempio n. 9
0
 public void OnMouseDown(int button, int shift, int x, int y)
 {
     if (button != 2)
     {
         try
         {
             IFeatureLayer targetLayer = Editor.UniqueInstance.TargetLayer;
             if (targetLayer != null)
             {
                 IFeatureClass featureClass = targetLayer.FeatureClass;
                 if (featureClass != null)
                 {
                     IPoint         pGeometry   = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
                     ISpatialFilter queryFilter = new SpatialFilterClass {
                         Geometry      = pGeometry,
                         GeometryField = featureClass.ShapeFieldName,
                         SubFields     = featureClass.ShapeFieldName,
                         SpatialRel    = esriSpatialRelEnum.esriSpatialRelWithin
                     };
                     IFeatureCursor o        = targetLayer.Search(queryFilter, false);
                     IFeature       feature  = o.NextFeature();
                     IFeature       feature2 = o.NextFeature();
                     Marshal.ReleaseComObject(o);
                     o = null;
                     if ((feature != null) && (feature2 != null))
                     {
                         feature  = featureClass.GetFeature(feature.OID);
                         feature2 = featureClass.GetFeature(feature2.OID);
                         ITopologicalOperator2 shape     = feature.Shape as ITopologicalOperator2;
                         IGeometry             geometry1 = feature2.Shape;
                         IGeometry             other     = shape.Intersect(feature2.Shape, esriGeometryDimension.esriGeometry2Dimension);
                         if (!other.IsEmpty)
                         {
                             pGeometry = GISFunFactory.UnitFun.ConvertPoject(pGeometry, other.SpatialReference) as IPoint;
                             IGeometryCollection geometrys = other as IGeometryCollection;
                             if (geometrys.GeometryCount > 1)
                             {
                                 for (int i = 0; i < geometrys.GeometryCount; i++)
                                 {
                                     IGeometry inGeometry = geometrys.get_Geometry(i);
                                     if (!inGeometry.IsEmpty)
                                     {
                                         if (inGeometry.GeometryType == esriGeometryType.esriGeometryRing)
                                         {
                                             object missing = System.Type.Missing;
                                             IGeometryCollection geometrys2 = new PolygonClass();
                                             geometrys2.AddGeometry(inGeometry, ref missing, ref missing);
                                             IPolygon polygon = geometrys2 as IPolygon;
                                             inGeometry = polygon;
                                         }
                                         IRelationalOperator operator2 = inGeometry as IRelationalOperator;
                                         if ((operator2 != null) && operator2.Contains(pGeometry))
                                         {
                                             other = inGeometry;
                                             break;
                                         }
                                     }
                                 }
                             }
                             else
                             {
                                 IRelationalOperator operator3 = other as IRelationalOperator;
                                 if (!operator3.Contains(pGeometry))
                                 {
                                     return;
                                 }
                             }
                             if (other != null)
                             {
                                 feature  = Editor.UniqueInstance.TargetLayer.FeatureClass.GetFeature(feature.OID);
                                 feature2 = Editor.UniqueInstance.TargetLayer.FeatureClass.GetFeature(feature2.OID);
                                 IList <IFeature> pList = new List <IFeature> {
                                     feature,
                                     feature2
                                 };
                                 OverlapSublot sublot = new OverlapSublot(this.m_hookHelper.Hook, pList)
                                 {
                                     Text = "合并",
                                     Tip  = "请选择要保留重叠部分的小班ID"
                                 };
                                 if (sublot.ShowDialog() == DialogResult.OK)
                                 {
                                     int      selectedIndex = sublot.SelectedIndex;
                                     IFeature feature3      = null;
                                     if (selectedIndex == 0)
                                     {
                                         feature3 = feature2;
                                     }
                                     else
                                     {
                                         feature3 = feature;
                                     }
                                     if (other.GeometryType != esriGeometryType.esriGeometryPolygon)
                                     {
                                         IPolygon polygon2 = new PolygonClass {
                                             SpatialReference = other.SpatialReference
                                         };
                                         IPointCollection newPoints = other as IPointCollection;
                                         (polygon2 as IPointCollection).AddPointCollection(newPoints);
                                         other = polygon2;
                                     }
                                     IGeometry geometry3 = (feature3.Shape as ITopologicalOperator2).Difference(other);
                                     if (geometry3.IsEmpty)
                                     {
                                         Editor.UniqueInstance.StartEditOperation();
                                         feature3.Delete();
                                         Editor.UniqueInstance.StopEditOperation();
                                     }
                                     else
                                     {
                                         Editor.UniqueInstance.StartEditOperation();
                                         feature3.Shape = geometry3;
                                         feature3.Store();
                                         Editor.UniqueInstance.StopEditOperation();
                                         IFeatureSelection selection = Editor.UniqueInstance.TargetLayer as IFeatureSelection;
                                         selection.Add(feature);
                                         selection.Add(feature2);
                                     }
                                     this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection | esriViewDrawPhase.esriViewGeography, null, this.m_hookHelper.ActiveView.Extent);
                                 }
                                 sublot = null;
                                 MessageBox.Show("修改完成!", "提示");
                             }
                         }
                     }
                 }
             }
         }
         catch (Exception exception)
         {
             Editor.UniqueInstance.AbortEditOperation();
             this.mErrOpt.ErrorOperate(this.mSubSysName, "ShapeEdit.OverlapCombine", "OnMouseDown", exception.GetHashCode().ToString(), exception.Source, exception.Message, "", "", "");
             MessageBox.Show("修改出错!", "提示");
         }
     }
 }
Esempio n. 10
0
        public override void OnMouseUp(int Button, int Shift, int X, int Y)
        {
            IPoint point = this.m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);

            try
            {
                IFeatureLayer  targetLayer  = Editor.UniqueInstance.TargetLayer;
                IFeatureClass  featureClass = targetLayer.FeatureClass;
                ISpatialFilter queryFilter  = null;
                queryFilter = new SpatialFilterClass {
                    Geometry      = point,
                    GeometryField = featureClass.ShapeFieldName,
                    SpatialRel    = esriSpatialRelEnum.esriSpatialRelWithin
                };
                IFeature         feature = null;
                IFeatureCursor   cursor  = targetLayer.Search(queryFilter, false);
                IFeature         item    = cursor.NextFeature();
                int              num     = 0;
                IList <IFeature> pList   = new List <IFeature>();
                while (item != null)
                {
                    if ((this.m_Feature1 != null) && (item.OID == this.m_Feature1.OID))
                    {
                        item = cursor.NextFeature();
                    }
                    else
                    {
                        feature = item;
                        num++;
                        pList.Add(item);
                        item = cursor.NextFeature();
                    }
                }
                if (num < 1)
                {
                    MessageBox.Show("当前无要素可进行裁切!", "提示");
                }
                else
                {
                    if (num > 1)
                    {
                        OverlapSublot sublot = new OverlapSublot(this.m_hookHelper.Hook, pList)
                        {
                            Text = "裁切",
                            Tip  = "超过一个要素被选中,请选择需要的小班ID"
                        };
                        if (sublot.ShowDialog() == DialogResult.OK)
                        {
                            int selectedIndex = sublot.SelectedIndex;
                            feature = pList[selectedIndex];
                        }
                        else
                        {
                            MessageBox.Show("超过一个要素被选中,无法进行裁切!", "提示");
                            return;
                        }
                    }
                    IFeatureSelection selection = Editor.UniqueInstance.TargetLayer as IFeatureSelection;
                    if (this.m_Feature1 == null)
                    {
                        this.m_Feature1 = feature;
                        selection.Add(this.m_Feature1);
                        this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
                        this._cursor = ToolCursor.Erase22;
                    }
                    else
                    {
                        this.m_Feature2 = feature;
                        selection.Add(this.m_Feature2);
                        this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
                        IGeometry             shapeCopy = this.m_Feature1.ShapeCopy;
                        IGeometry             other     = this.m_Feature2.ShapeCopy;
                        ITopologicalOperator2 @operator = shapeCopy as ITopologicalOperator2;
                        @operator.IsKnownSimple_2 = false;
                        @operator.Simplify();
                        IGeometry geometry3 = @operator.Intersect(other, esriGeometryDimension.esriGeometry2Dimension);
                        if (geometry3.IsEmpty)
                        {
                            MessageBox.Show("选中两个要素无相交部分,无法进行裁切!", "提示");
                            this.m_Feature1 = null;
                            this.m_Feature2 = null;
                            this._cursor    = ToolCursor.Erase2;
                        }
                        else
                        {
                            ITopologicalOperator2 operator2 = geometry3 as ITopologicalOperator2;
                            operator2.IsKnownSimple_2 = false;
                            operator2.Simplify();
                            IGeometry geometry4 = (other as ITopologicalOperator2).Difference(geometry3);
                            if (geometry4.IsEmpty)
                            {
                                MessageBox.Show("选中两个要素完全重合,无法进行裁切!", "提示");
                                this.m_Feature1 = null;
                                this.m_Feature2 = null;
                                this._cursor    = ToolCursor.Erase2;
                            }
                            else
                            {
                                Editor.UniqueInstance.CheckOverlap = false;
                                Editor.UniqueInstance.StartEditOperation();
                                this.m_Feature2.Shape = geometry4;
                                this.m_Feature2.Store();
                                Editor.UniqueInstance.StopEditOperation();
                                Editor.UniqueInstance.CheckOverlap = true;
                                this.m_Feature1 = null;
                                this.m_Feature2 = null;
                                this._cursor    = ToolCursor.Erase2;
                                (Editor.UniqueInstance.TargetLayer as IFeatureSelection).Clear();
                                this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection | esriViewDrawPhase.esriViewGeography, null, null);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                Editor.UniqueInstance.AbortEditOperation();
                this.m_Feature1 = null;
                this.m_Feature2 = null;
                this._cursor    = ToolCursor.Erase2;
                this.mErrOpt.ErrorOperate(this.mSubSysName, "ShapeEdit.Erase2", "OnMouseUp", exception.GetHashCode().ToString(), exception.Source, exception.Message, "", "", "");
            }
        }
Esempio n. 11
0
 public void OnDblClick()
 {
     if (this._isLineStarted)
     {
         this._snapPoint = null;
         try
         {
             this._isLineStarted = false;
             this._linePoints.RemoveAll();
             IPolyline         other       = this._feedback.Stop();
             IFeatureSelection targetLayer = Editor.UniqueInstance.TargetLayer as IFeatureSelection;
             IEnumIDs          iDs         = targetLayer.SelectionSet.IDs;
             iDs.Reset();
             IFeature srcFeature = Editor.UniqueInstance.TargetLayer.FeatureClass.GetFeature(iDs.Next());
             if (other.SpatialReference != srcFeature.Shape.SpatialReference)
             {
                 other.Project(srcFeature.Shape.SpatialReference);
                 other.SpatialReference = srcFeature.Shape.SpatialReference;
             }
             ITopologicalOperator2 shape = srcFeature.Shape as ITopologicalOperator2;
             if (shape != null)
             {
                 shape.IsKnownSimple_2 = false;
                 shape.Simplify();
                 ITopologicalOperator2 operator2 = other as ITopologicalOperator2;
                 operator2.IsKnownSimple_2 = false;
                 operator2.Simplify();
                 IGeometry geometry = null;
                 if (srcFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline)
                 {
                     geometry = shape.Intersect(other, esriGeometryDimension.esriGeometry0Dimension);
                 }
                 else
                 {
                     geometry = shape.Intersect(other, esriGeometryDimension.esriGeometry1Dimension);
                 }
                 if (!geometry.IsEmpty)
                 {
                     IGeometry geometry2;
                     IGeometry geometry3;
                     shape.Cut(other, out geometry3, out geometry2);
                     if ((geometry3 != null) && (geometry2 != null))
                     {
                         (geometry3 as ITopologicalOperator).Simplify();
                         (geometry2 as ITopologicalOperator).Simplify();
                         IFeatureClass featureClass = Editor.UniqueInstance.TargetLayer.FeatureClass;
                         IFeature      feature      = featureClass.CreateFeature();
                         IFeature      feature3     = featureClass.CreateFeature();
                         feature.Shape  = geometry3;
                         feature3.Shape = geometry2;
                         IAttributeSplit attributeSplitHandleClass = AttributeManager.AttributeSplitHandleClass;
                         if (attributeSplitHandleClass != null)
                         {
                             try
                             {
                                 Editor.UniqueInstance.StartEditOperation();
                                 Editor.UniqueInstance.AddAttribute = false;
                                 List <IFeature> pFeatureList = null;
                                 pFeatureList = new List <IFeature> {
                                     feature,
                                     feature3
                                 };
                                 attributeSplitHandleClass.AttributeSplit(srcFeature, ref pFeatureList);
                                 feature  = pFeatureList[0];
                                 feature3 = pFeatureList[1];
                                 feature.Store();
                                 feature3.Store();
                                 srcFeature.Delete();
                                 Editor.UniqueInstance.StopEditOperation("split");
                                 targetLayer.Clear();
                                 targetLayer.Add(feature);
                                 this._hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection | esriViewDrawPhase.esriViewGeography, null, null);
                             }
                             catch (Exception exception)
                             {
                                 Editor.UniqueInstance.AbortEditOperation();
                                 this._mErrOpt.ErrorOperate(this._mSubSysName, "ShapeEdit.Split", "OnDblClick", exception.GetHashCode().ToString(), exception.Source, exception.Message, "", "", "");
                             }
                         }
                     }
                 }
             }
         }
         catch (Exception exception2)
         {
             this._mErrOpt.ErrorOperate(this._mSubSysName, "ShapeEdit.Split", "OnDblClick", exception2.GetHashCode().ToString(), exception2.Source, exception2.Message, "", "", "");
         }
     }
 }
Esempio n. 12
0
        private IPoint method_8(IPoint ipoint_0, IFeatureCache2 ifeatureCache2_0, double double_0)
        {
            int              i;
            IGeometry        geometry;
            double           num        = 0;
            int              num1       = 0;
            int              num2       = 0;
            bool             flag       = true;
            IPoint           point      = null;
            List <IGeometry> geometries = new List <IGeometry>();

            for (i = 0; i < ifeatureCache2_0.Count; i++)
            {
                IFeature feature = ifeatureCache2_0.Feature[i];
                if ((feature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline
                    ? true
                    : feature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon))
                {
                    IPoint   pointClass = new ESRI.ArcGIS.Geometry.Point();
                    IHitTest shape      = (IHitTest)feature.Shape;
                    if (
                        shape.HitTest(ipoint_0, double_0, esriGeometryHitPartType.esriGeometryPartBoundary, pointClass,
                                      ref num, ref num1, ref num2, ref flag) && num <= double_0)
                    {
                        IGeometryCollection geometryCollection = shape as IGeometryCollection;
                        if (geometryCollection != null)
                        {
                            ISegmentCollection segmentCollection =
                                geometryCollection.Geometry[num1] as ISegmentCollection;
                            if (segmentCollection != null)
                            {
                                //segmentCollection.Segment[num2] is ICircularArc;
                            }
                        }
                    }
                }
            }
            IPointCollection multipointClass = new Multipoint();

            for (i = 0; i < geometries.Count; i++)
            {
                ITopologicalOperator2 item = (ITopologicalOperator2)geometries[i];
                for (int j = 0; j < geometries.Count; j++)
                {
                    if (i != j)
                    {
                        if (geometries[i].GeometryType != geometries[j].GeometryType)
                        {
                            geometry = item.IntersectMultidimension(geometries[j]);
                            if (geometry != null)
                            {
                                IGeometryCollection geometryCollection1 = geometry as IGeometryCollection;
                                if (geometryCollection1 != null)
                                {
                                    for (int k = 0; k < geometryCollection1.GeometryCount; k++)
                                    {
                                        geometry = geometryCollection1.Geometry[k];
                                        if (geometry is IPointCollection)
                                        {
                                            multipointClass.AddPointCollection((IPointCollection)geometry);
                                        }
                                        else if (geometry is IPoint)
                                        {
                                            object value = Missing.Value;
                                            object obj   = Missing.Value;
                                            multipointClass.AddPoint((IPoint)geometry, ref value, ref obj);
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            geometry = item.Intersect(geometries[j], esriGeometryDimension.esriGeometry0Dimension);
                            if (geometry != null)
                            {
                                if (geometry is IPointCollection)
                                {
                                    multipointClass.AddPointCollection((IPointCollection)geometry);
                                }
                                else if (geometry is IPoint)
                                {
                                    object value1 = Missing.Value;
                                    object obj1   = Missing.Value;
                                    multipointClass.AddPoint((IPoint)geometry, ref value1, ref obj1);
                                }
                            }
                        }
                    }
                }
            }
            IHitTest hitTest     = (IHitTest)multipointClass;
            IPoint   pointClass1 = new ESRI.ArcGIS.Geometry.Point();

            if (
                hitTest.HitTest(ipoint_0, double_0, esriGeometryHitPartType.esriGeometryPartVertex, pointClass1, ref num,
                                ref num1, ref num2, ref flag) && num < double_0)
            {
                point = pointClass1;
            }
            return(point);
        }
Esempio n. 13
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;
                    }
                }
            }
        }