private static IGeometry BuildMultiPatch(WktText wkt, IObjectFactory objectFactory)
        {
            var multiPatch = (IGeometryCollection)objectFactory.Create("esriGeometry.MultiPatch");

            //IGeometryCollection multiPatch = new MultiPatchClass();

            foreach (var polygonString in wkt.Token.Tokens)
            {
                bool isOuter = true;
                foreach (var ringString in polygonString.Tokens)
                {
                    var ring = BuildRing(ringString, wkt, objectFactory);
                    multiPatch.AddGeometry(ring);
                    ((IMultiPatch)multiPatch).PutRingType(ring, isOuter
                                                                  ? esriMultiPatchRingType.esriMultiPatchOuterRing
                                                                  : esriMultiPatchRingType.esriMultiPatchInnerRing);
                    isOuter = false;
                }
            }
            ((ITopologicalOperator)multiPatch).Simplify();
            var geometry = multiPatch as IGeometry;

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return(geometry);
        }
        private static IRing BuildRing(WktToken token, WktText wkt, IObjectFactory objectFactory)
        {
            var ring = (IPointCollection)objectFactory.Create("esriGeometry.Ring");

            //IPointCollection multiPoint = new RingClass();
            foreach (var point in token.Tokens)
            {
                ring.AddPoint(BuildPoint(point, wkt, objectFactory));
            }
            MakeZmAware((IGeometry)ring, wkt.HasZ, wkt.HasM);
            return((IRing)ring);
        }
        private static IPath BuildPath(WktToken token, WktText wkt, IObjectFactory objectFactory)
        {
            var path = (IPointCollection)objectFactory.Create("esriGeometry.Path");

            //IPointCollection multiPoint = new PathClass();
            foreach (var point in token.Tokens)
            {
                path.AddPoint(BuildPoint(point, wkt, objectFactory));
            }
            var geometry = path as IGeometry;

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return((IPath)path);
        }
        private static IGeometry BuildPolyline(WktText wkt, IObjectFactory objectFactory)
        {
            var multiPath = (IGeometryCollection)objectFactory.Create("esriGeometry.Polyline");
            //IGeometryCollection multiPath = new PolylineClass();

            var path = BuildPath(wkt.Token, wkt, objectFactory);

            ((ITopologicalOperator)multiPath).Simplify();
            multiPath.AddGeometry(path);
            var geometry = multiPath as IGeometry;

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return(geometry);
        }
        private static IGeometry BuildGeometryCollection(WktText wkt, IObjectFactory objectFactory)
        {
            var geometryBag = (IGeometryCollection)objectFactory.Create("esriGeometry.GeometryBag");

            //IGeometryCollection geometryBag = new GeometryBagClass();

            foreach (var geomToken in wkt.Token.Tokens)
            {
                var geom = BuildGeometry(geomToken.ToString(), objectFactory);
                geometryBag.AddGeometry(geom);
            }
            var geometry = geometryBag as IGeometry;

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return(geometry);
        }
        private static IGeometry BuildMultiPoint(WktText wkt, IObjectFactory objectFactory)
        {
            var multiPoint = (IPointCollection)objectFactory.Create("esriGeometry.Multipoint");

            //IPointCollection multiPoint = new MultipointClass();

            foreach (var point in wkt.Token.Tokens)
            {
                multiPoint.AddPoint(BuildPoint(point, wkt, objectFactory));
            }
            ((ITopologicalOperator)multiPoint).Simplify();
            var geometry = multiPoint as IGeometry;

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return(geometry);
        }
        private static IGeometry BuildPolygon(WktText wkt, IObjectFactory objectFactory)
        {
            var multiRing = (IGeometryCollection)objectFactory.Create("esriGeometry.Polygon");

            //IGeometryCollection multiRing = new PolygonClass();

            foreach (var ringString in wkt.Token.Tokens)
            {
                var ring = BuildRing(ringString, wkt, objectFactory);
                multiRing.AddGeometry(ring);
            }
            ((ITopologicalOperator)multiRing).Simplify();
            var geometry = multiRing as IGeometry;

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return(geometry);
        }
        private static IPoint BuildPoint(WktToken token, WktText wkt, IObjectFactory objectFactory)
        {
            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)objectFactory.Create("esriGeometry.Point");

            //IPoint point = new PointClass();

            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);
        }
        private static IGeometry BuildGeometry(string s, IObjectFactory objectFactory)
        {
            var wkt = new WktText(s);

            switch (wkt.Type)
            {
            case WktType.None:
                return(null);

            case WktType.Point:
                return(BuildPoint(wkt, objectFactory));

            case WktType.LineString:
                return(BuildPolyline(wkt, objectFactory));

            case WktType.Polygon:
                return(BuildPolygon(wkt, objectFactory));

            case WktType.Triangle:
                return(BuildPolygon(wkt, objectFactory));

            case WktType.PolyhedralSurface:
                return(BuildMultiPatch(wkt, objectFactory));

            case WktType.Tin:
                return(BuildMultiPolygon(wkt, objectFactory));

            case WktType.MultiPoint:
                return(BuildMultiPoint(wkt, objectFactory));

            case WktType.MultiLineString:
                return(BuildMultiPolyline(wkt, objectFactory));

            case WktType.MultiPolygon:
                return(BuildMultiPolygon(wkt, objectFactory));

            case WktType.GeometryCollection:
                return(BuildGeometryCollection(wkt, objectFactory));

            default:
                throw new ArgumentOutOfRangeException("s", "Unsupported geometry type: " + wkt.Type);
            }
        }
 private static IGeometry BuildPoint(WktText wkt, IObjectFactory objectFactory)
 {
     return(BuildPoint(wkt.Token, wkt, objectFactory));
 }