private GeoFilledRegion[] ParseWkt(string wkt, Guid resId) { var result = new List <GeoFilledRegion>(); wkt = wkt.Trim(); var sr = new StringReader(wkt); var rootType = ReadHeaderWkt(sr); if (rootType.Equals("MULTIPOLYGON", StringComparison.OrdinalIgnoreCase)) { GeoFilledRegion polygon = ReadPolygon(sr, resId); while (polygon != null) { result.Add(polygon); polygon = ReadPolygon(sr, resId); } } if (rootType.Equals("POLYGON", StringComparison.OrdinalIgnoreCase)) { GeoFilledRegion polygon = ReadPolygon(sr, resId); result.Add(polygon); } return(result.ToArray()); }
private GeoFilledRegion ReadPolygon(StringReader sr, Guid resId) { var sb = new StringBuilder(); int cc = 0; while (sr.Read() > 0) { if ((char)sr.Peek() == '(') { cc = 1; break; } if ((char)sr.Peek() == ')') { return(null); } } while (cc > 0 && sr.Read() > 0) { if ((char)sr.Peek() == '(') { cc++; } if ((char)sr.Peek() == ')') { cc--; } sb.Append((char)sr.Peek()); } GeoFilledRegion gfr = new GeoFilledRegion { ResId = resId }; List <IEnumerable <GeoPoint> > holes = new List <IEnumerable <GeoPoint> >(); gfr.HolesList = holes; var matches = polygonRegex.Matches(sb.ToString()); foreach (Match match in matches) { var polyText = match.Groups[0].Value; var coordsMatches = coorRegex.Matches(polyText); List <GeoPoint> coords = new List <GeoPoint>(); foreach (Match coord in coordsMatches) { coords.Add(new GeoPoint { X = double.Parse(coord.Groups[1].Value, CultureInfo.InvariantCulture), Y = double.Parse(coord.Groups[2].Value, CultureInfo.InvariantCulture) }); } if (gfr.OuterLine == null) { gfr.OuterLine = coords; } else { holes.Add(coords); } } return(gfr); }