private static IList<ISegmentString> ExtractSegmentStrings(IEnumerable<IGeometry> geoms)
        {
            var segStrings = new List<ISegmentString>();
            var filter = new GeometryComponentFilter(
                g => { if (g is ILineString) segStrings.Add(new NodedSegmentString(g.Coordinates, g)); });

            foreach (var geom in geoms)
                geom.Apply(filter);
            return segStrings;
        }
        static IList<ISegmentString> ExtractTaggedSegmentStrings(IGeometry geom, IPrecisionModel pm)
        {
            var segStrings = new List<ISegmentString>();
            var filter = new GeometryComponentFilter(
                delegate (IGeometry fgeom)
                {
                    // Extract linework for lineal components only
                    if (!(fgeom is ILineString)) return;
                    // skip empty lines
                    if (geom.NumPoints <= 0) return;
                    var roundPts = Round(((ILineString)geom).CoordinateSequence, pm);
                    segStrings.Add(new NodedSegmentString(roundPts, geom));
                });

            geom.Apply(filter);
            return segStrings;
        }