public IGeometry Node(IGeometry geom)
        {

            var geomList = new List<IGeometry>();
            geomList.Add(geom);
            var segStrings = ExtractSegmentStrings(geomList);
            //Noder sr = new SimpleSnapRounder(pm);
            var sr = new MCIndexSnapRounder(_pm);
            sr.ComputeNodes(segStrings);


            var nodedPtsMap = GetNodedPtsMap(segStrings);
            var lineReplacer = new GeometryLineReplacer(nodedPtsMap);
            var geomEditor = new GeometryEditor();
            var snapped = geomEditor.Edit(geom, lineReplacer);
            return snapped;

        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="geom"></param>
 /// <returns></returns>
 public IGeometry Reduce(IGeometry geom)
 {
     GeometryEditor geomEdit;
     if (_changePrecisionModel)
     {
         GeometryFactory newFactory = new GeometryFactory(_newPrecisionModel);
         geomEdit = new GeometryEditor(newFactory);
     }
     else
         // don't change point factory
         geomEdit = new GeometryEditor();
     return geomEdit.Edit(geom, new PrecisionReducerCoordinateOperation(this));
 }
        private IGeometry ReducePointwise(IGeometry geom)
        {
            GeometryEditor geomEdit;
            if (_changePrecisionModel)
            {
                var newFactory = CreateFactory(geom.Factory, _targetPrecModel);
                geomEdit = new GeometryEditor(newFactory);
            }
            else
                // don't change geometry factory
                geomEdit = new GeometryEditor();

            /**
             * For polygonal geometries, collapses are always removed, in order
             * to produce correct topology
             */
            bool finalRemoveCollapsed = _removeCollapsed;
            if (geom.Dimension >= Dimension.Surface)
                finalRemoveCollapsed = true;

            var reduceGeom = geomEdit.Edit(geom,
                    new PrecisionReducerCoordinateOperation(_targetPrecModel, finalRemoveCollapsed));

            return reduceGeom;
        }
        private static GeometryEditor CreateEditor(IGeometryFactory geomFactory, IPrecisionModel newPrecModel)
        {
            // no need to change if precision model is the same
            if (geomFactory.PrecisionModel == newPrecModel)
                return new GeometryEditor();

            // otherwise create a geometry editor which changes PrecisionModel
            var newFactory = CreateFactory(geomFactory, newPrecModel);
            var geomEdit = new GeometryEditor(newFactory);
            return geomEdit;
        }
 private IGeometry ReplaceLines(IGeometry geom, IList<ISegmentString> segStrings)
 {
     var nodedLinesMap = NodedLinesMap(segStrings);
     var lineReplacer = new GeometryCoordinateReplacer(nodedLinesMap);
     var geomEditor = new GeometryEditor();
     var snapped = geomEditor.Edit(geom, lineReplacer);
     return snapped;
 }
 /// <summary>
 /// Creates a deep copy of the input <see cref="IGeometry"/>.
 /// The <see cref="ICoordinateSequenceFactory"/> defined for this factory
 /// is used to copy the <see cref="ICoordinateSequence"/>s
 /// of the input geometry.
 /// <para/>
 /// This is a convenient way to change the <tt>CoordinateSequence</tt>
 /// used to represent a geometry, or to change the 
 /// factory used for a geometry.
 /// <para/>
 /// <see cref="IGeometry.Clone()"/> can also be used to make a deep copy,
 /// but it does not allow changing the CoordinateSequence type.
 /// </summary>
 /// <param name="g">The geometry</param>
 /// <returns>A deep copy of the input geometry, using the CoordinateSequence type of this factory</returns>
 /// <seealso cref="IGeometry.Clone"/>
 public IGeometry CreateGeometry(IGeometry g)
 {
     // NOTE: don't move lambda to a separate variable!
     //       make a variable and you've broke WinPhone build.       
     var operation = new GeometryEditor.CoordinateSequenceOperation((x, y) => _coordinateSequenceFactory.Create(x));
     GeometryEditor editor = new GeometryEditor(this);
     return editor.Edit(g, operation);
 }