private void ComputeOverlay(SpatialFunction opCode) { // copy points from input Geometries. // This ensures that any Point geometries // in the input are considered for inclusion in the result set CopyPoints(0); CopyPoints(1); // node the input Geometries arg[0].ComputeSelfNodes(lineIntersector, false); arg[1].ComputeSelfNodes(lineIntersector, false); // compute intersections between edges of the two input geometries arg[0].ComputeEdgeIntersections(arg[1], lineIntersector, true); IList baseSplitEdges = new ArrayList(); arg[0].ComputeSplitEdges(baseSplitEdges); arg[1].ComputeSplitEdges(baseSplitEdges); // add the noded edges to this result graph InsertUniqueEdges(baseSplitEdges); ComputeLabelsFromDepths(); ReplaceCollapsedEdges(); if (!NodingValidatorDisabled) { var nv = new EdgeNodingValidator(edgeList.Edges); nv.checkValid(); } graph.AddEdges(edgeList.Edges); ComputeLabelling(); LabelIncompleteNodes(); /* * The ordering of building the result Geometries is important. * Areas must be built before lines, which must be built before points. * This is so that lines which are covered by areas are not included * explicitly, and similarly for points. */ FindResultAreaEdges(opCode); CancelDuplicateResultEdges(); var polyBuilder = new PolygonBuilder(geomFact); polyBuilder.Add(graph); resultPolyList = polyBuilder.Polygons; var lineBuilder = new LineBuilder(this, geomFact, ptLocator); resultLineList = lineBuilder.Build(opCode); var pointBuilder = new PointBuilder(this, geomFact, ptLocator); resultPointList = pointBuilder.Build(opCode); // gather the results from all calculations into a single Geometry for the result set resultGeom = ComputeGeometry(resultPointList, resultLineList, resultPolyList); }
private void ComputeOverlay(SpatialFunction opCode) { // copy points from input Geometries. // This ensures that any Point geometries // in the input are considered for inclusion in the result set CopyPoints(0); CopyPoints(1); // node the input Geometries arg[0].ComputeSelfNodes(lineIntersector, false); arg[1].ComputeSelfNodes(lineIntersector, false); // compute intersections between edges of the two input geometries arg[0].ComputeEdgeIntersections(arg[1], lineIntersector, true); IList <Edge> baseSplitEdges = new List <Edge>(); arg[0].ComputeSplitEdges(baseSplitEdges); arg[1].ComputeSplitEdges(baseSplitEdges); // add the noded edges to this result graph InsertUniqueEdges(baseSplitEdges); ComputeLabelsFromDepths(); ReplaceCollapsedEdges(); if (!NodingValidatorDisabled) { /* * Check that the noding completed correctly. * * This test is slow, but necessary in order to catch robustness failure * situations. * If an exception is thrown because of a noding failure, * then snapping will be performed, which will hopefully avoid the problem. * In the future hopefully a faster check can be developed. * */ var nv = new EdgeNodingValidator(_edgeList.Edges); nv.CheckValid(); } _graph.AddEdges(_edgeList.Edges); ComputeLabelling(); LabelIncompleteNodes(); /* * The ordering of building the result Geometries is important. * Areas must be built before lines, which must be built before points. * This is so that lines which are covered by areas are not included * explicitly, and similarly for points. */ FindResultAreaEdges(opCode); CancelDuplicateResultEdges(); var polyBuilder = new PolygonBuilder(_geomFact); polyBuilder.Add(_graph); _resultPolyList = polyBuilder.Polygons; var lineBuilder = new LineBuilder(this, _geomFact, _ptLocator); _resultLineList = lineBuilder.Build(opCode); var pointBuilder = new PointBuilder(this, _geomFact);//, _ptLocator); _resultPointList = pointBuilder.Build(opCode); // gather the results from all calculations into a single Geometry for the result set _resultGeom = ComputeGeometry(_resultPointList, _resultLineList, _resultPolyList, opCode); }