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); }
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(); } }
}//检查是否相交 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); }//获取相交道路的夹角
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); }
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); }
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)); }
/// <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; } }
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); }
}//得到shp文件里的每一个Geometry private bool CheckCrosses(IGeometry pGeometry1, IGeometry pGeometry2) { IRelationalOperator pRO = pGeometry1 as IRelationalOperator; return(pRO.Touches(pGeometry2)); }//检查是否相交
/* * 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)); }
/// <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); }