예제 #1
0
        private static IGeometry BuildMultiPatch(WktText wkt, ISpatialReference spatialReference)
        {
            var multiPatch = (IGeometryCollection) new MultiPatchClass();

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

            foreach (var polygonString in wkt.Token.Tokens)
            {
                bool isOuter = true;
                foreach (var ringString in polygonString.Tokens)
                {
                    var ring = BuildRing(ringString, wkt, spatialReference);
                    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);
        }
예제 #2
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);
        }
예제 #3
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);
        }
예제 #4
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);
        }
예제 #5
0
        private static IGeometry BuildPolyline(WktText wkt, ISpatialReference spatialReference)
        {
            var multiPath = (IGeometryCollection) new PolylineClass();

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

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

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

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return(geometry);
        }
예제 #6
0
        private static IGeometry BuildGeometryCollection(WktText wkt, ISpatialReference spatialReference)
        {
            var geometryBag = (IGeometryCollection) new GeometryBagClass();

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

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

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return(geometry);
        }
예제 #7
0
        private static IGeometry BuildMultiPoint(WktText wkt, ISpatialReference spatialReference)
        {
            var multiPoint = (IPointCollection) new MultipointClass();

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

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

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return(geometry);
        }
예제 #8
0
        private static IGeometry BuildGeometry(string s, ISpatialReference spatialReference)
        {
            var wkt = new WktText(s);

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

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

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

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

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

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

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

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

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

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

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

            default:
                throw new ArgumentOutOfRangeException("s", "Unsupported geometry type: " + wkt.Type);
            }
        }
예제 #9
0
        private static IGeometry BuildPolygon(WktText wkt, ISpatialReference spatialReference)
        {
            var multiRing = (IGeometryCollection) new PolygonClass();

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

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

            MakeZmAware(geometry, wkt.HasZ, wkt.HasM);
            return(geometry);
        }
예제 #10
0
 private static IGeometry BuildPoint(WktText wkt, ISpatialReference spatialReference)
 {
     return(BuildPoint(wkt.Token, wkt, spatialReference));
 }