コード例 #1
0
        private static IPoint BuildPoint(WktToken token, WktText wkt, ISpatialReference spatialReference)
        {
            var coordinates = token.Coords.ToArray();

            int partCount = coordinates.Length;

            if (!wkt.HasZ && !wkt.HasM && partCount != 2)
            {
                throw new ArgumentException("Mal-formed WKT, wrong number of elements, expecting x and y");
            }
            if (wkt.HasZ && !wkt.HasM && partCount != 3)
            {
                throw new ArgumentException("Mal-formed WKT, wrong number of elements, expecting x y z");
            }
            if (!wkt.HasZ && wkt.HasM && partCount != 3)
            {
                throw new ArgumentException("Mal-formed WKT, wrong number of elements, expecting x y m");
            }
            if (wkt.HasZ && wkt.HasM && partCount != 4)
            {
                throw new ArgumentException("Mal-formed WKT, wrong number of elements, expecting x y z m");
            }

            var point = (IPoint) new PointClass();

            if (spatialReference != null)
            {
                point.SpatialReference = spatialReference;
            }

            point.PutCoords(coordinates[0], coordinates[1]);

            if (wkt.HasZ)
            {
                point.Z = coordinates[2];
            }
            if (wkt.HasM && !wkt.HasZ)
            {
                point.M = coordinates[2];
            }
            if (wkt.HasZ && wkt.HasM)
            {
                point.M = coordinates[3];
            }

            MakeZmAware(point, wkt.HasZ, wkt.HasM);
            return(point);
        }
コード例 #2
0
        private static IRing BuildRing(WktToken token, WktText wkt, ISpatialReference spatialReference)
        {
            var ring = (IPointCollection) new RingClass();

            if (spatialReference != null)
            {
                ((IGeometry)ring).SpatialReference = spatialReference;
            }

            foreach (var point in token.Tokens)
            {
                ring.AddPoint(BuildPoint(point, wkt, spatialReference));
            }
            MakeZmAware((IGeometry)ring, wkt.HasZ, wkt.HasM);
            return((IRing)ring);
        }
コード例 #3
0
        private static IPath BuildPath(WktToken token, WktText wkt, ISpatialReference spatialReference)
        {
            var path = (IPointCollection) new PathClass();

            if (spatialReference != null)
            {
                ((IGeometry)path).SpatialReference = spatialReference;
            }

            foreach (var point in token.Tokens)
            {
                path.AddPoint(BuildPoint(point, wkt, spatialReference));
            }
            var geometry = path as IGeometry;

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return((IPath)path);
        }
コード例 #4
0
        private void ParsePrefix(string s)
        {
            int    startIndex = s.IndexOf('(');
            int    endIndex   = s.LastIndexOf(')');
            string prefix     = startIndex == -1 ? s : s.Substring(0, startIndex);

            HasZ            = false;
            HasM            = false;
            CoordinateCount = 2;
            prefix          = prefix.Trim().ToLower();
            if (prefix.EndsWith(" z"))
            {
                HasZ            = true;
                CoordinateCount = 3;
            }
            if (prefix.EndsWith(" m"))
            {
                HasM            = true;
                CoordinateCount = 3;
            }
            if (prefix.EndsWith(" zm"))
            {
                HasM            = true;
                HasZ            = true;
                CoordinateCount = 4;
            }

            Type = WktType.None;
            if (prefix.StartsWith("point"))
            {
                Type = WktType.Point;
            }
            if (prefix.StartsWith("linestring"))
            {
                Type = WktType.LineString;
            }
            if (prefix.StartsWith("polygon"))
            {
                Type = WktType.Polygon;
            }
            if (prefix.StartsWith("polyhedralsurface"))
            {
                Type = WktType.PolyhedralSurface;
            }
            if (prefix.StartsWith("triangle"))
            {
                Type = WktType.Triangle;
            }
            if (prefix.StartsWith("tin"))
            {
                Type = WktType.Tin;
            }
            if (prefix.StartsWith("multipoint"))
            {
                Type = WktType.MultiPoint;
            }
            if (prefix.StartsWith("multilinestring"))
            {
                Type = WktType.MultiLineString;
            }
            if (prefix.StartsWith("multipolygon"))
            {
                Type = WktType.MultiPolygon;
            }
            if (prefix.StartsWith("geometrycollection"))
            {
                Type = WktType.GeometryCollection;
            }

            Token = new WktToken(s, startIndex, endIndex);
        }