コード例 #1
0
        public virtual IGeometry IntersectsSameDim(IGeometry pGeo, esriGeometryDimension pesriGeometryDimension)
        {
            IGeometry retGeo = null;

            retGeo = this.IntersectsSameDim(this.pFeature.Shape, pGeo, pesriGeometryDimension);
            return(retGeo);
        }
コード例 #2
0
        private static IGeometry TryGetIntersection([NotNull] IGeometry sourceGeometry,
                                                    [NotNull] IGeometry targetGeometry)
        {
            IGeometry targetToIntersect =
                targetGeometry.GeometryType == esriGeometryType.esriGeometryMultiPatch
                                        ? GeometryFactory.CreatePolygon(targetGeometry)
                                        : targetGeometry;

            esriGeometryDimension dimension =
                sourceGeometry is IPolygon
                                        ? esriGeometryDimension.esriGeometry2Dimension
                                        : esriGeometryDimension.esriGeometry1Dimension;

            IGeometry intersection = IntersectionUtils.Intersect(
                sourceGeometry, targetToIntersect, dimension);

            _msg.VerboseDebug("Simplifying...");

            GeometryUtils.Simplify(intersection);

            Marshal.ReleaseComObject(targetToIntersect);

            if (!intersection.IsEmpty)
            {
                return(intersection);
            }

            return(null);
        }
コード例 #3
0
        private static object GetDimension(esriGeometryDimension dimension)
        {
            switch (dimension)
            {
            case esriGeometryDimension.esriGeometry0Dimension:
                return(0);

            case esriGeometryDimension.esriGeometry1Dimension:
                return(1);

            case esriGeometryDimension.esriGeometry2Dimension:
                return(2);

            case esriGeometryDimension.esriGeometry25Dimension:
                return(2.5);

            case esriGeometryDimension.esriGeometry3Dimension:
                return(3);

            case esriGeometryDimension.esriGeometryNoDimension:
                return(DBNull.Value);

            default:
                throw new ArgumentOutOfRangeException(nameof(dimension), dimension,
                                                      @"invalid dimension");
            }
        }
コード例 #4
0
        private IList <IGeometry> CalculateOverlappingGeometries(
            IPolycurve sourceGeometry,
            IPolycurve overlapPolycurve)
        {
            esriGeometryDimension resultDimension =
                sourceGeometry.GeometryType == esriGeometryType.esriGeometryPolyline
                                        ? esriGeometryDimension.esriGeometry1Dimension
                                        : esriGeometryDimension.esriGeometry2Dimension;

            var intersection = (IPolycurve)
                               ((ITopologicalOperator)sourceGeometry).Intersect(overlapPolycurve,
                                                                                resultDimension);

            GeometryUtils.Simplify(intersection);

            if (intersection.IsEmpty)
            {
                return(new List <IGeometry>(0));
            }

            return(_explodeMultipartResult && IsMultipart(intersection)
                                       ? GeometryUtils.Explode(intersection)
                                       : new List <IGeometry> {
                intersection
            });
        }
コード例 #5
0
        public static string GetDimensionText(esriGeometryDimension dimension)
        {
            switch (dimension)
            {
            case esriGeometryDimension.esriGeometry0Dimension:
                return("0 (point)");

            case esriGeometryDimension.esriGeometry1Dimension:
                return("1 (linear)");

            case esriGeometryDimension.esriGeometry2Dimension:
                return("2 (area)");

            case esriGeometryDimension.esriGeometry25Dimension:
                return("2.5");

            case esriGeometryDimension.esriGeometry3Dimension:
                return("3");

            case esriGeometryDimension.esriGeometryNoDimension:
                return("none");

            default:
                throw new ArgumentOutOfRangeException(nameof(dimension));
            }
        }
コード例 #6
0
 /// <summary>
 /// 获取两个几何形状的交集,并传出相交后的几何形状和错误信息。
 /// </summary>
 /// <param name="geometry1">待相交的几何形状1</param>
 /// <param name="geometry2">待相交的几何形状2</param>
 /// <param name="Intersected">相交后的几何形状</param>
 /// <param name="ErrMsg">错误信息</param>
 public static void Intersect(IGeometry geometry1, IGeometry geometry2, out IGeometry Intersected, out string ErrMsg)
 {
     ErrMsg      = "";
     Intersected = null;
     if (GeometryUtility.IsHighLevelGeometry(geometry1) && GeometryUtility.IsHighLevelGeometry(geometry2))
     {
         if (!RelationalOperator.Disjoint(geometry1, geometry2))
         {
             esriGeometryDimension resultDimension = esriGeometryDimension.esriGeometryNoDimension;
             if (geometry1.Dimension <= geometry2.Dimension)
             {
                 resultDimension = geometry1.Dimension;
             }
             else
             {
                 resultDimension = geometry2.Dimension;
             }
             ITopologicalOperator topoOp   = (ITopologicalOperator)geometry1;
             IGeometry            geometry = topoOp.Intersect(geometry2, resultDimension);
             if (GeometryUtility.IsValidGeometry(geometry))
             {
                 try
                 {
                     Simplify(geometry);
                     Intersected = geometry;
                 }
                 catch (Exception ex)
                 {
                     ErrMsg = ex.Message;
                 }
             }
             else
             {
                 ErrMsg = "传入的几何形状获取交集失败。";
             }
         }
         else
         {
             ErrMsg = "传入的几何形状没有交集。";
         }
     }
     else
     {
         ErrMsg = "传入的几何形状不是高级几何形状,不能获取交集。";
     }
 }
コード例 #7
0
        private static IGeometry GetIntersection([NotNull] IGeometry geometry0,
                                                 [NotNull] IGeometry geometry1,
                                                 bool overlap)
        {
            Assert.ArgumentNotNull(geometry0, nameof(geometry0));
            Assert.ArgumentNotNull(geometry1, nameof(geometry1));

            // TODO revise implementation, move to IntersectionUtils

            esriGeometryType g0Type = geometry0.GeometryType;
            esriGeometryType g1Type = geometry1.GeometryType;

            if (g0Type == esriGeometryType.esriGeometryMultiPatch)
            {
                geometry0 = GeometryFactory.CreatePolygon((IMultiPatch)geometry0);
                g0Type    = esriGeometryType.esriGeometryPolygon;
            }

            if (g1Type == esriGeometryType.esriGeometryMultiPatch)
            {
                geometry1 = GeometryFactory.CreatePolygon((IMultiPatch)geometry1);
                g1Type    = esriGeometryType.esriGeometryPolygon;
            }

            esriGeometryDimension dimension =
                GetIntersectionDimension(g0Type, g1Type, overlap);

            GeometryUtils.AllowIndexing(geometry0);
            GeometryUtils.AllowIndexing(geometry1);

            IGeometry intersection = ((ITopologicalOperator)geometry0).Intersect(
                geometry1,
                dimension);

            if (!intersection.IsEmpty)
            {
                const bool allowReorder = true;
                GeometryUtils.Simplify(intersection, allowReorder);
            }

            return(intersection);
        }
コード例 #8
0
        public virtual IGeometry IntersectsSameDim(IGeometry byGeo, IGeometry pGeo, esriGeometryDimension pesriGeometryDimension)
        {
            IGeometry retGeo       = null;
            IGeometry TopGeometry1 = byGeo;
            IGeometry TopGeometry2 = pGeo;

            if (TopGeometry1 == null || TopGeometry2 == null || TopGeometry1.IsEmpty == true || TopGeometry2.IsEmpty == true)
            {
                retGeo = null;
                MessageBox.Show("空间叠加有一对象为空", "空间分析错误");
                return(retGeo);
            }
            if (TopGeometry1.Dimension != TopGeometry2.Dimension)
            {
                retGeo = null;
                MessageBox.Show("空间叠加两对象维数不同不能空间叠加分析", "空间分析错误");
                return(retGeo);
            }
            if (!(TopGeometry1 is ITopologicalOperator) && !(TopGeometry2 is ITopologicalOperator))
            {
                retGeo = null;
                MessageBox.Show("空间叠加有一对象不是高级对象(Point,Polygon,Polyline,MuliPoint,GemetryBag)", "空间分析错误");
                return(retGeo);
            }
            Topoperator = (ITopologicalOperator)TopGeometry2;
            Topoperator.Simplify();
            Topoperator = (ITopologicalOperator)TopGeometry1;
            Topoperator.Simplify();
            try
            {
                retGeo = Topoperator.Intersect(TopGeometry2, pesriGeometryDimension);
            }
            catch (Exception ee)
            {
                retGeo = null;
                System.Diagnostics.Debug.WriteLine(ee.ToString());
            }
            return(retGeo);
        }
コード例 #9
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);
            }
        }
コード例 #10
0
        //<CSCM>
        //********************************************************************************
        //** 函 数 名: InsertFeatIntoFeatClsByEnumIDs
        //** 版    权: CopyRight (C)
        //** 创 建 人: 杨旭斌
        //** 功能描述: 把EnumIDs中的要素插入到目标要素类中
        //** 创建日期:
        //** 修 改 人:
        //** 修改日期:
        //** 修改时间:20070818
        //** 参数列表: pDesFeatCls (IFeatureClass)
        //             pEnumIDs (IEnumIDs)
        //             pOriFeatCls "原要素类(把该要素类中的要素插入到目标要素类中)
        //** 版    本:1.0
        //*********************************************************************************
        //</CSCM>
        public static long InsertFeatIntoFeatClsByEnumIDs(ref IFeatureClass pDesFeatCls, ref IFeatureClass pOriFeatCls, ref IEnumIDs pEnumIDs, bool bIsCut, IGeometry pDomainGeometry, ref ISpatialReference pSpatialReference, ref Dictionary <string, string> pDicField, ref ProgressBar vProgressBar)
        {
            //bIsCut = false;
            //pDomainGeometry = null;
            //pSpatialReference = null;
            //pDicField = null;
            //vProgressBar = null;

            long     functionReturnValue = 0;
            IFeature pFeat = default(IFeature);
            //要素类,用于循环
            IFeatureCursor pDesFeatCursor = default(IFeatureCursor);
            //用新建要素类的游标,使用该游标向新要素类中插入要素,并写入数据库
            IFeatureBuffer pDesFeatBuffer = default(IFeatureBuffer);
            //新建要素类创建的要素缓冲区,

            int       iFeatCount = 0;
            IGeometry pGeometry  = default(IGeometry);
            long      lID        = 0;
            //Dim pGeometryCol As ESRI.ArcGIS.Geometry.IGeometryCollection
            //Dim j As Integer
            //Dim pSubGeometry As ESRI.ArcGIS.Geometry.IGeometry
            //Dim pOriPntCol As ESRI.ArcGIS.Geometry.IPointCollection
            //Dim pPntCol As ESRI.ArcGIS.Geometry.IPointCollection
            IPoint                pPnt                  = default(IPoint);
            IGeometry             pDesGeometry          = default(IGeometry);
            esriGeometryDimension EnumGeometryDimension = default(esriGeometryDimension);

            // ERROR: Not supported in C#: OnErrorStatement

            if (pDomainGeometry == null)
            {
                bIsCut = false;
            }

            if (pDesFeatCls.ShapeType == esriGeometryType.esriGeometryPolyline)
            {
                EnumGeometryDimension = esriGeometryDimension.esriGeometry1Dimension;
            }
            else if (pDesFeatCls.ShapeType == esriGeometryType.esriGeometryPolygon)
            {
                EnumGeometryDimension = esriGeometryDimension.esriGeometry2Dimension;
            }
            else
            {
                bIsCut = false;
            }

            pEnumIDs.Reset();
            lID = pEnumIDs.Next();
            if (lID != -1)
            {
                //从新建要素类中获得新游标,用于插入新的要素
                pDesFeatCursor = pDesFeatCls.Insert(true);
                //创建要素缓冲区,和insert cursor 配合,创建新要素
                pDesFeatBuffer = pDesFeatCls.CreateFeatureBuffer();
            }
            else
            {
                return(functionReturnValue);
            }

            if (lID > -1)
            {
                while (lID > -1)
                {
                    pFeat     = pOriFeatCls.GetFeature((int)lID);
                    pGeometry = pFeat.ShapeCopy;
                    if ((pGeometry != null))
                    {
                        if (pGeometry.IsEmpty == false)
                        {
                            //进行剪切或不剪切
                            if (bIsCut)
                            {
                                pDesGeometry = ClsGeometryOperator.CutFeatByGeometry(ref pGeometry, ref pDomainGeometry, ref EnumGeometryDimension);
                            }
                            else
                            {
                                pDesGeometry = pGeometry;
                            }
                            InsertOneFeatIntoCursor(ref pFeat, pDesGeometry, ref pDesFeatCursor, ref pDesFeatBuffer, pSpatialReference, ref pDicField);
                        }
                    }
                    lID = pEnumIDs.Next();

                    //每一千个要素就把缓冲区内的要素类写入数据库
                    if (iFeatCount >= 1000)
                    {
                        pDesFeatCursor.Flush();
                        System.Windows.Forms.Application.DoEvents();
                        iFeatCount = 0;
                    }

                    if ((vProgressBar != null))
                    {
                        vProgressBar.Value = vProgressBar.Value + 1;
                    }
                }

                if (iFeatCount % 1000 != 0)
                {
                    pDesFeatCursor.Flush();
                }
            }
            if (vProgressBar != null)
            {
                vProgressBar.Value   = 0;
                vProgressBar.Visible = false;
            }
            pDesFeatCursor = null;
            pDesFeatBuffer = null;
            return(functionReturnValue);
        }
コード例 #11
0
        //<CSCM>
        //********************************************************************************
        //** 函 数 名: InsertFeatIntoFeatClsByCursor
        //** 版    权: CopyRight (C)
        //** 创 建 人: 杨旭斌
        //** 功能描述: 通过FeatureCursor向目标要素类中插入要素
        //** 创建日期:20070818
        //** 修 改 人:
        //** 修改日期:
        //** 修改时间:
        //** 参数列表: pDesFeatCls (IFeatureClass)
        //             pFeatCursor (IFeatureCursor)
        //** 版    本:1.0
        //*********************************************************************************
        //</CSCM>
        public static bool InsertFeatIntoFeatClsByCursor(ref IFeatureClass pDesFeatCls, ref IFeatureCursor pFeatCursor, bool bIsCut, IGeometry pDomainGeometry, ref ISpatialReference pSpatialReference, Dictionary <string, string> pDicField)
        {
            //bIsCut = false;
            //pDomainGeometry = null;
            //pSpatialReference = null;
            //pDicField = null;
            //vProgressBar = null;

            bool functionReturnValue = false;
            //要素类,用于循环
            IFeature pFeat = default(IFeature);
            //用新建要素类的游标,使用该游标向新要素类中插入要素,并写入数据库
            IFeatureCursor pDesFeatCursor = default(IFeatureCursor);
            //新建要素类创建的要素缓冲区
            IFeatureBuffer pDesFeatBuffer = default(IFeatureBuffer);

            int                   iFeatCount            = 0;
            IGeometry             pGeometry             = default(IGeometry);
            esriGeometryDimension EnumGeometryDimension = default(esriGeometryDimension);
            IGeometry             pDesGeometry          = default(IGeometry);

            bool bTransferRight = true;

            //记录InsertOneFeatIntoCursor的返回值

            //On Error Resume Next
            if (pDomainGeometry == null)
            {
                bIsCut = false;
            }

            if (pDesFeatCls.ShapeType == esriGeometryType.esriGeometryPolyline)
            {
                EnumGeometryDimension = esriGeometryDimension.esriGeometry1Dimension;
            }
            else if (pDesFeatCls.ShapeType == esriGeometryType.esriGeometryPolygon)
            {
                EnumGeometryDimension = esriGeometryDimension.esriGeometry2Dimension;
            }
            else
            {
                bIsCut = false;
            }

            try
            {
                pFeat = pFeatCursor.NextFeature();
                if (pFeat != null)
                {
                    //从新建要素类中获得新游标,用于插入新的要素
                    pDesFeatCursor = pDesFeatCls.Insert(true);
                    //创建要素缓冲区,和insert cursor 配合,创建新要素
                    pDesFeatBuffer = pDesFeatCls.CreateFeatureBuffer();
                    while (pFeat != null)
                    {
                        pGeometry = pFeat.ShapeCopy;
                        if (pGeometry != null)
                        {
                            if (pGeometry.IsEmpty == false)
                            {
                                iFeatCount = iFeatCount + 1;

                                //进行剪切或不剪切
                                if (bIsCut)
                                {
                                    pDesGeometry = ClsGeometryOperator.CutFeatByGeometry(ref pGeometry, ref pDomainGeometry, ref EnumGeometryDimension);
                                }
                                else
                                {
                                    pDesGeometry = pGeometry;
                                }

                                bTransferRight = InsertOneFeatIntoCursor(ref pFeat, pDesGeometry, ref pDesFeatCursor, ref pDesFeatBuffer, pSpatialReference, ref pDicField);
                                //印骅 20081202 如果投影失败 则跳出函数
                                if (bTransferRight == false)
                                {
                                    return(functionReturnValue);
                                }
                                //每一千个要素就把缓冲区内的要素类写入数据库
                                if (iFeatCount >= 1000)
                                {
                                    pDesFeatCursor.Flush();
                                    iFeatCount = 0;
                                    System.Windows.Forms.Application.DoEvents();
                                }
                            }
                        }
                        pFeat = pFeatCursor.NextFeature();
                    }
                    if (iFeatCount % 1000 != 0)
                    {
                        pDesFeatCursor.Flush();
                    }
                    pDesFeatCursor = null;
                    pDesFeatBuffer = null;
                }
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                if (ex.ErrorCode == -2147216556)
                {
                    functionReturnValue = false;
                    //g_clsErrorHandle.DisplayInformation(string.Format("目标数据{0}正被其他程序使用,请检查", ((IDataset)pDesFeatCls).Name), false);
                    MessageBoxEx.Show(string.Format("目标数据{0}正被其他程序使用,请检查", ((IDataset)pDesFeatCls).Name), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            functionReturnValue = true;
            return(functionReturnValue);
            //正常退出,返回true
        }