Exemple #1
0
        private List <IPoint> SplitPolyline(IPolyline polyline, IPointCollection intersectpointsColl, IPoint presentCP)
        {
            IEnumVertex pEnumVertex = intersectpointsColl.EnumVertices;
            //IPolycurve2 has SplitAtPoints

            IPolycurve2 pPolyCurve = polyline as IPolycurve2;

            pPolyCurve.SplitAtPoints(pEnumVertex, false, true, -1);
            IGeometryCollection geoColl = pPolyCurve as IGeometryCollection;
            //MessageBox.Show(geoColl.GeometryCount.ToString());
            List <IPoint> ptlist = new List <IPoint>();
            // The results are pathclass
            IPath resultPath;

            for (int i = 0; i < geoColl.GeometryCount; i++)
            {
                object obj = Type.Missing;
                resultPath = new PathClass();
                resultPath = (IPath)geoColl.get_Geometry(i);
                IGeometryCollection lineColl = new PolylineClass();
                lineColl.AddGeometry(resultPath, ref obj, ref obj);
                IPolyline           line         = (IPolyline)lineColl;
                IRelationalOperator pRelOperator = (IRelationalOperator)line;
                if (pRelOperator.Touches(presentCP) || pRelOperator.Contains(presentCP))
                {
                    IPoint temPT1 = resultPath.FromPoint;
                    IPoint temPT2 = resultPath.ToPoint;
                    //pGeometryCollection.AddGeometry(temPT1);
                    //pGeometryCollection.AddGeometry(temPT2);
                    ptlist.Add(temPT1);
                    ptlist.Add(temPT2);
                }
            }
            return(ptlist);
        }
Exemple #2
0
        private void FeatureMerge(ArrayList arrFeature)
        {
            ArrayList arrayList = new ArrayList();

            for (int i = 0; i < arrFeature.Count; i++)
            {
                IFeature feature = (IFeature)arrFeature[i];
                if (!arrayList.Contains(feature))
                {
                    IRelationalOperator relationalOperator = (IRelationalOperator)feature.Shape;
                    IGeometry           geometry           = feature.Shape;
                    for (int j = 0; j < arrFeature.Count; j++)
                    {
                        IFeature feature2 = (IFeature)arrFeature[j];
                        if (feature2.OID != feature.OID && !arrayList.Contains(feature2))
                        {
                            IGeometry shape = feature2.Shape;
                            if (!relationalOperator.Disjoint(shape) || relationalOperator.Touches(shape))
                            {
                                geometry = CommonFunction.UnionGeometry(geometry, shape);
                                arrayList.Add(feature2);
                            }
                        }
                    }
                    feature.Shape = geometry;
                    feature.Store();
                }
            }
            for (int k = 0; k < arrayList.Count; k++)
            {
                (arrayList[k] as IFeature).Delete();
            }
        }
Exemple #3
0
        }//检查是否相交

        private double GetAngle(IGeometry pGeometry1, IGeometry pGeometry2)
        {
            double pAngle1;
            double pAngle2;
            double pAngle = 0;

            IGeometry pGPoint = new PointClass();

            IRelationalOperator  pRO = pGeometry1 as IRelationalOperator;
            ITopologicalOperator pTO = pGeometry1 as ITopologicalOperator;

            if (pRO.Touches(pGeometry2))
            {
                pGPoint = pTO.Intersect(pGeometry2, esriGeometryDimension.esriGeometry0Dimension);
            }

            IPolyline           pPolyline1 = pGeometry1 as IPolyline;
            IPoint              pPF1       = pPolyline1.FromPoint;
            IGeometry           pGeoPoint1 = pPF1 as IGeometry;
            IRelationalOperator pRO1       = pGeoPoint1 as IRelationalOperator;

            if (pRO1.Contains(pGPoint))
            {
                pAngle1 = this.AngleFromPoint(pGeometry1);
            }
            else
            {
                pAngle1 = this.AngleToPoint(pGeometry1);
            }

            IPolyline           pPolyline2 = pGeometry2 as IPolyline;
            IPoint              pPF2       = pPolyline2.FromPoint;
            IGeometry           pGeoPoint2 = pPF2 as IGeometry;
            IRelationalOperator pRO2       = pGeoPoint2 as IRelationalOperator;

            if (pRO2.Contains(pGPoint))
            {
                pAngle2 = this.AngleFromPoint(pGeometry2);
            }
            else
            {
                pAngle2 = this.AngleToPoint(pGeometry2);
            }
            if ((pAngle1 * pAngle2) >= 0)
            {
                pAngle = Math.Abs(pAngle2 - pAngle1);
            }
            if ((pAngle1 * pAngle2) < 0)
            {
                pAngle = Math.Abs(pAngle1) + Math.Abs(pAngle2);
                if (pAngle > Math.PI)
                {
                    pAngle = 2 * Math.PI - pAngle;
                }
            }
            return(pAngle);
        }//获取相交道路的夹角
Exemple #4
0
        public override void OnMouseDown(int Button, int Shift, int X, int Y)
        {
            if (Button != 1 || m_HookHelper.FocusMap.LayerCount <= 0)
            {
                return;
            }
            IMap        map        = m_HookHelper.FocusMap;
            IActiveView activeView = m_HookHelper.ActiveView;
            // 获取点击位置并抓化为点图形要素
            IPoint point = activeView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
            // 获取地图中的图层
            IFeatureLayer featureLayer = activeView.FocusMap.get_Layer(0) as IFeatureLayer;

            if (featureLayer == null)
            {
                return;
            }
            IFeatureClass featureCLass = featureLayer.FeatureClass;
            // 进行点击,选择要素
            ISpatialFilter spatialFilter = new SpatialFilterClass();

            spatialFilter.Geometry   = point;
            spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
            IFeatureCursor featureCursor = featureCLass.Search(spatialFilter, false);
            // 获得点击查询的要素
            IFeature feature = featureCursor.NextFeature();

            if (feature != null && feature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon)
            {
                map.ClearSelection();
                IRelationalOperator relationalOperator = feature.Shape as IRelationalOperator;
                // 设置被选择要素的颜色
                IRgbColor         rgbColor         = ColorTool.GetRgbColor(255, 0, 0);
                IFeatureSelection featureSelection = featureLayer as IFeatureSelection;
                featureSelection.SelectionColor = rgbColor;
                // 查找邻接要素,并之余地图的选择集中
                IFeatureCursor nearFeatureCursor = featureLayer.Search(null, false);
                IFeature       nearFeature       = nearFeatureCursor.NextFeature();

                // 遍历图层内所有要素进行邻接判定
                while (nearFeature != null)
                {
                    if (relationalOperator.Touches(nearFeature.Shape))
                    {
                        // 如果对比要素与当前选择要素邻接,则加入到地图选择集中
                        map.SelectFeature(featureLayer, nearFeature);
                    }
                    nearFeature = nearFeatureCursor.NextFeature();
                }
            }

            // 刷新地图
            activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, activeView.Extent);
        }
 /// <summary>
 /// sourceGeometry与targetGeometry是否相邻
 /// </summary>
 /// <param name="sourceGeometry">源</param>
 /// <param name="targetGeometry">目标</param>
 /// <returns></returns>
 public static bool IsTouch(IGeometry sourceGeometry, IGeometry targetGeometry)
 {
     try
     {
         IRelationalOperator relationalOperator = sourceGeometry as IRelationalOperator;
         return(relationalOperator.Touches(targetGeometry));
     }
     catch (Exception ex)
     {
         LOG.Error(ex);
     }
     return(false);
 }
Exemple #6
0
        public List <GeoStruct> BufferAnalyseNew(IPolyline pGeom, double dist, IFeatureLayer fealyr, IGeometry Reg = null)
        {
            List <GeoStruct> geoList = new List <GeoStruct>();

            ITopologicalOperator top          = pGeom as ITopologicalOperator;
            IGeometry            geom         = top.Buffer(dist);
            IFeatureCursor       searchCursor = SpatialSearch(geom, "1=1", fealyr);

            if (searchCursor != null)
            {
                IFeature fea = searchCursor.NextFeature();


                while (fea != null)
                {
                    GeoStruct geoTmp = new GeoStruct();

                    var fieldDict = new Dictionary <string, string>();
                    for (var i = 0; i < fea.Fields.FieldCount; i++)
                    {
                        var field = fea.Fields.Field[i];
                        if (field.Type != esriFieldType.esriFieldTypeGeometry)
                        {
                            fieldDict.Add(field.Name, fea.Value[i].ToString());
                        }
                        else
                        {
                            geoTmp.geo = fea.Shape;
                        }
                    }
                    geoTmp.geoinfos = fieldDict;
                    IRelationalOperator relation = Reg as IRelationalOperator;
                    bool   bin      = (relation.Overlaps(fea.Shape) || relation.Touches(fea.Shape) || relation.Contains(fea.Shape));
                    double distance = CalculateDistanceNew(pGeom, geoTmp.geo);
                    if (bin)
                    {
                        distance = 0.0;
                    }
                    if (distance < Global.searchlen)
                    {
                        geoTmp.dist = distance;
                        geoList.Add(geoTmp);
                    }
                    //geoTmp.dist = distance;
                    //geoList.Add(geoTmp);

                    fea = searchCursor.NextFeature();
                }
            }
            return(geoList);
        }
        private int method_3(IArray iarray_0, IPoint ipoint_0)
        {
            int num = 0;
            IRelationalOperator ipoint0 = (IRelationalOperator)ipoint_0;

            for (int i = 0; i < iarray_0.Count; i++)
            {
                if (ipoint0.Touches((IGeometry)iarray_0.Element[i]))
                {
                    num++;
                }
            }
            return(num);
        }
Exemple #8
0
        private static bool EvaluateRelation([NotNull] IRelationalOperator shapeRelOp,
                                             [NotNull] IGeometry relatedShape,
                                             [NotNull] string relationDescription)
        {
            if (IsInteriorIntersectionRelation(relationDescription))
            {
                // more robust: (not disjoint) and (not touches)
                // "disjoint" geometries should not make it here.

                // TODO consolidate optimization of touches with GeometryEngine
                return(!shapeRelOp.Touches(relatedShape));
            }

            return(shapeRelOp.Relation(relatedShape, relationDescription));
        }
Exemple #9
0
 /// <summary>
 /// 验证指定的要素是否在裁切范围内
 /// </summary>
 /// <param name="pFeatureGeometry"></param>
 /// <returns></returns>
 public virtual bool FeatureInCutRegion(IGeometry pFeatureGeometry)
 {
     try
     {
         if (pFeatureGeometry == null)
             return false;
         IRelationalOperator pRelation = m_CutGeometry as IRelationalOperator;
         if (pRelation.Crosses(pFeatureGeometry) || pRelation.Contains(pFeatureGeometry)
             || pRelation.Touches(pFeatureGeometry)|| pRelation.Overlaps(pFeatureGeometry)
             || pRelation.Within(pFeatureGeometry) || pRelation.Equals(pFeatureGeometry))
             return true;
         return false;
     }
     catch (Exception ex)
     {
         LogAPI.WriteLog("判断裁切范围时出错,系统将不对【" + StructureNode.TableName + "】进行裁切!\r\n");
         return false;
     }
 }
Exemple #10
0
        public static IFeature FindNextStartingFeature(IGeometry RegionGeometry)
        {
            List <DistanceFeatureClass> DistFeatureList = new List <DistanceFeatureClass>();
            IEnumLayer        pEnumLayer = Form1.pMap.Layers;
            ILayer            pLayer;
            IFeatureSelection pFeatureSelection = null;

            IWorkspaceFactory workspaceFactory       = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();
            IWorkspace        workspace              = workspaceFactory.OpenFromFile(System.IO.Path.GetTempPath(), 0);
            IFeatureWorkspace featureWorkspace       = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspace; // Explict Cast
            IFeatureClass     featureClass           = featureWorkspace.OpenFeatureClass("Temp_ConcaveHull");
            IFeatureCursor    AllRegionFeatureCursor = featureClass.Search(null, false);
            IFeature          AllRegionFeature       = AllRegionFeatureCursor.NextFeature();
            IGeometry         AllRegionGeometry      = AllRegionFeature.Shape;

            IPolygon            polygon           = (IPolygon)AllRegionGeometry;
            IGeometryCollection pGeomColl         = (IGeometryCollection)polygon;
            IGeometryCollection AllRegionPolyline = new PolylineClass();
            ISegmentCollection  PsegPath          = null;

            object obj = Type.Missing;

            for (int k = 0; k < pGeomColl.GeometryCount; k++)
            {
                PsegPath = new ESRI.ArcGIS.Geometry.PathClass();
                PsegPath.AddSegmentCollection((ISegmentCollection)pGeomColl.get_Geometry(k));
                AllRegionPolyline.AddGeometry((IGeometry)PsegPath, ref obj, ref obj);
            }

            IPolyline pPolyline = (IPolyline)AllRegionPolyline;

            //MessageBox.Show("..." + pPolyline.Length, "hi");
            //polygon.

            for (int i = 0; i < Form1.pMap.LayerCount; i++)
            {
                pLayer = pEnumLayer.Next();


                if (pLayer.Name.Equals(Form1.OperationLayer))
                {
                    IFeatureLayer pFeatureLayer = (IFeatureLayer)pLayer;
                    pFeatureSelection = (IFeatureSelection)pFeatureLayer;
                }
            }


            ISpatialFilter pSpatialFilter = new SpatialFilter();

            pSpatialFilter.GeometryField = "SHAPE";
            pSpatialFilter.SpatialRel    = esriSpatialRelEnum.esriSpatialRelIntersects;
            pSpatialFilter.WhereClause   = "SpltGropus = 0";

            ITopologicalOperator pTopologicalOperator = (ITopologicalOperator)RegionGeometry;
            IPolygon             pPolygon             = (IPolygon)pTopologicalOperator.Buffer(5);

            pSpatialFilter.Geometry = pPolygon;

            pFeatureSelection.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultAdd, false);

            ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;

            IQueryFilter pQueryFilter = new QueryFilter();

            pQueryFilter.WhereClause = "SpltGropus = 0";
            ICursor pCursor;

            pSelectionSet.Search(pQueryFilter, false, out pCursor);
            IFeatureCursor pFeatureCursor = (IFeatureCursor)pCursor;

            IFeature pFeature = pFeatureCursor.NextFeature();


            //sorting the feature according to the distance of the RerionGeometry

            while (pFeature != null)
            {
                IProximityOperator pProxOper = (IProximityOperator)pFeature.Shape;
                double             distance  = pProxOper.ReturnDistance(RegionGeometry);

                DistanceFeatureClass DistFeature = new DistanceFeatureClass(distance, pFeature);
                DistFeatureList.Add(DistFeature);

                pFeature = pFeatureCursor.NextFeature();
            }


            DistFeatureList = DistFeatureList.OrderBy(a => a.getDistance()).ToList();

            IRelationalOperator AllRegionFeatureGeom = (IRelationalOperator)pPolyline;
            IFeature            ReturnFeature        = null;

            for (int j = 0; j < DistFeatureList.Count; j++)
            {
                //IRelationalOperator RegionFeatureGeom = (IRelationalOperator)DistFeatureList[j].getFeature().Shape;
                //MessageBox.Show("..." + AllRegionFeatureGeom.Touches(DistFeatureList[j].getFeature().Shape), "hi");
                if (AllRegionFeatureGeom.Touches(DistFeatureList[j].getFeature().Shape) == true)
                {
                    ReturnFeature = DistFeatureList[j].getFeature();
                    break;
                }
            }
            //MessageBox.Show("..." + ReturnFeature.OID, "hi");
            return(ReturnFeature);
        }
        private IGeometry method_4(IArray iarray_0, IGeometry igeometry_0, IPoint ipoint_0, bool bool_1, ref bool bool_2)
        {
            IGeometry           geometry;
            IGeometry           geometry1;
            IRelationalOperator ipoint0          = (IRelationalOperator)ipoint_0;
            IGeometryCollection geometryBagClass = new GeometryBag() as IGeometryCollection;
            object value = Missing.Value;

            for (int i = 0; i < iarray_0.Count; i++)
            {
                if (!((IPolyline)iarray_0.Element[i]).IsClosed && ipoint0.Touches((IGeometry)iarray_0.Element[i]))
                {
                    geometryBagClass.AddGeometry((IGeometry)iarray_0.Element[i], ref value, ref value);
                }
            }
            int geometryCount = geometryBagClass.GeometryCount;

            if (geometryCount > 1)
            {
                geometryBagClass = this.method_5(geometryBagClass, !bool_1, ipoint_0);
                int num = 0;
                while (true)
                {
                    geometry1 = geometryBagClass.Geometry[num];
                    if (igeometry_0 == geometry1)
                    {
                        break;
                    }
                    num++;
                    if (num == geometryCount)
                    {
                        num = 0;
                    }
                }
                do
                {
                    num++;
                    if (num == geometryCount)
                    {
                        num = 0;
                    }
                    geometry1 = geometryBagClass.Geometry[num];
                    if (CommonHelper.distance(((ICurve)geometry1).FromPoint, ipoint_0) >=
                        CommonHelper.distance(((ICurve)geometry1).ToPoint, ipoint_0))
                    {
                        if (this.method_3(iarray_0, ((ICurve)geometry1).FromPoint) <= 1)
                        {
                            continue;
                        }
                        bool_2   = false;
                        geometry = geometry1;
                        return(geometry);
                    }
                    else
                    {
                        if (this.method_3(iarray_0, ((ICurve)geometry1).ToPoint) <= 1)
                        {
                            continue;
                        }
                        bool_2   = true;
                        geometry = geometry1;
                        return(geometry);
                    }
                } while (igeometry_0 != geometry1);
                geometry = null;
            }
            else
            {
                geometry = null;
            }
            return(geometry);
        }
Exemple #12
0
        }//得到shp文件里的每一个Geometry

        private bool CheckCrosses(IGeometry pGeometry1, IGeometry pGeometry2)
        {
            IRelationalOperator pRO = pGeometry1 as IRelationalOperator;

            return(pRO.Touches(pGeometry2));
        }//检查是否相交
Exemple #13
0
        /*
         * THIS FUNCTION IS used to determine if a specific polygon is touched by the specific feature in SelectionSet
         * INPUT : Under_Restriction ( area || compactness) SelectionSet
         *
         * Geometry::IRelationalOperator.touch()
         */
        public static bool Is_Touch(IGeometry selectedgeom, IGeometry input)
        {
            IRelationalOperator relop = selectedgeom as IRelationalOperator;

            return(relop.Touches(input));
        }
Exemple #14
0
        /// <summary>
        /// 合并多条多义线,如果合并的多义线不是简单的多义线则抛出异常
        /// </summary>
        /// <param name="pPolylines">多义线集</param>
        /// <returns>多义线</returns>
        public static IPolyline UnionPolylines(IPolyline[] pPolylines)
        {
            // 第一条线段
            int indexFirst                           = -1;
            int degree                               = 0;
            IRelationalOperator pRO                  = null;
            int                  nSelected           = pPolylines.Length;
            IPolyline            pRetPolyline        = new PolylineClass();
            ITopologicalOperator pTopoOper           = (ITopologicalOperator)pRetPolyline;
            IGeometryCollection  pGeometryCollection = new GeometryBagClass();

            for (int i = 0; i < pPolylines.Length; i++)
            {
                object o = Type.Missing;
                pGeometryCollection.AddGeometry(pPolylines[i],
                                                ref o, ref o);
            }
            pTopoOper.ConstructUnion((IEnumGeometry)pGeometryCollection);
            IGeometryCollection pGeometryColl = (IGeometryCollection)pTopoOper;

            if (pGeometryColl.GeometryCount > 1)
            {
                throw new Exception("线段的空间连接不正确");
            }

            return((IPolyline)pTopoOper);

            // AddGeometry
            // 数据检查
            //ConstructUnion

            /*
             * double tol = GeometryHelper.ConvertPixelsToMapUnits(pActiveView, 4);
             * IPoint pHitPoint = null;
             * double hitDist = 0;
             * int partIndex = 0;
             * int vertexIndex = 0;
             * int vertexOffset = 0;
             * bool vertex = false;
             * if (EditHelper.HitTest(tol, _pMenuPosition, pFeature, ref pHitPoint, ref hitDist, ref partIndex, ref vertexIndex, ref vertexOffset, ref vertex))
             * {
             *
             * }
             */
            for (int i = 0; i < nSelected; i++)
            {
                int nTouch = 0;
                pRO = (IRelationalOperator)pPolylines[i];
                IHitTest hittest = (IHitTest)pRO;
                for (int j = 0; j < nSelected; j++)
                {
                    if (i != j && pRO.Touches(pPolylines[j]))
                    {
                        nTouch++;
                    }
                }
                if (nTouch == 0 || nTouch > 2)
                {
                    throw new Exception("line touch error");
                }
                else if (nTouch == 1)
                {
                    if (indexFirst == -1)
                    {
                        indexFirst = i;
                    }

                    if (++degree > 2)
                    {
                        throw new Exception("multi patchs");
                    }
                }
            }
            // 依据第一条线topo有序
            if (indexFirst == -1)
            {
                throw new Exception("line circle");
            }

            IPolyline pTemp = pPolylines[indexFirst];

            pPolylines[indexFirst] = pPolylines[0];
            pPolylines[0]          = pTemp;
            IPolyline          pPolyline = new PolylineClass();
            ISegmentCollection pSegments = (ISegmentCollection)pPolyline;

            pSegments.AddSegmentCollection((ISegmentCollection)pPolylines[0]);
            for (int i = 0; i < nSelected - 1; i++)
            {
                pRO = (IRelationalOperator)pPolylines[i];
                for (int j = i + 1; j < nSelected; j++)
                {
                    if (pRO.Touches(pPolylines[j]))
                    {
                        pTemp             = pPolylines[j];
                        pPolylines[j]     = pPolylines[i + 1];
                        pPolylines[i + 1] = pTemp;
                        if (IdentialPoint(pPolylines[i].FromPoint, pPolylines[i + 1].ToPoint))
                        {
                            //pSegments.AddSegmentCollection();
                        }
                        break;
                    }
                }
            }
            return(null);
        }