예제 #1
0
        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());
        }
예제 #2
0
        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);
        }