public virtual IGeometry IntersectsSameDim(IGeometry pGeo, esriGeometryDimension pesriGeometryDimension) { IGeometry retGeo = null; retGeo = this.IntersectsSameDim(this.pFeature.Shape, pGeo, pesriGeometryDimension); return(retGeo); }
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); }
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"); } }
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 }); }
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)); } }
/// <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 = "传入的几何形状不是高级几何形状,不能获取交集。"; } }
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); }
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); }
//<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); } }
//<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); }
//<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 }