Esempio n. 1
0
        public static GeometryOffsets BuildGeometry(FlatBufferBuilder builder, IGeometry geometry, GeometryType geometryType, byte dimensions)
        {
            var go = new GeometryOffsets();

            go.type = geometryType;

            if (geometry == null)
            {
                return(go);
            }

            if (geometryType == GeometryType.MultiLineString)
            {
                uint            end = 0;
                MultiLineString mls = (MultiLineString)geometry;
                if (mls.NumGeometries > 1)
                {
                    go.ends = new uint[mls.NumGeometries];
                    for (int i = 0; i < mls.NumGeometries; i++)
                    {
                        go.ends[i] = end += (uint)mls.Geometries[i].NumPoints;
                    }
                }
            }
            else if (geometryType == GeometryType.Polygon)
            {
                go.ends = CreateEnds(geometry as IPolygon, dimensions);
            }
            else if (geometryType == GeometryType.MultiPolygon)
            {
                MultiPolygon      mp            = (MultiPolygon)geometry;
                int               numGeometries = mp.NumGeometries;
                GeometryOffsets[] gos           = new GeometryOffsets[numGeometries];
                for (int i = 0; i < numGeometries; i++)
                {
                    Polygon p = (Polygon)mp.Geometries[i];
                    gos[i] = BuildGeometry(builder, p, GeometryType.Polygon, dimensions);
                }
                go.gos = gos;
                return(go);
            }

            var coordinates = geometry.Coordinates
                              .SelectMany(c => new double[] { c.X, c.Y })
                              .ToArray();

            go.coordsOffset = Geometry.CreateXyVector(builder, coordinates);

            if (go.ends != null)
            {
                go.endsOffset = Geometry.CreateEndsVector(builder, go.ends);
            }
            return(go);
        }
Esempio n. 2
0
        public static GeometryOffsets BuildGeometry(FlatBufferBuilder builder, IGeometry geometry, GeometryType geometryType, byte dimensions)
        {
            var go = new GeometryOffsets();

            var coordinates = geometry.Coordinates
                              .SelectMany(c => new double[] { c.X, c.Y })
                              .ToArray();

            go.coordsOffset = Geometry.CreateCoordsVector(builder, coordinates);

            var lengths = CreateLengths(geometry, dimensions);

            if (lengths != null)
            {
                go.lengthsOffset = Geometry.CreateLengthsVector(builder, lengths.ToArray());
            }

            var ringLengths = CreateRingLengths(geometry, geometryType, dimensions);

            if ((geometryType == GeometryType.Polygon && (geometry as IPolygon).InteriorRings.Length > 0) ||
                (geometryType == GeometryType.MultiPolygon))
            {
                go.ringLengthsOffset = Geometry.CreateRingLengthsVector(builder, ringLengths.ToArray());
            }

            if (geometryType == GeometryType.MultiPolygon && geometry.NumGeometries > 1)
            {
                var mp         = geometry as IMultiPolygon;
                var ringCounts = mp.Geometries
                                 .Select(g => g as IPolygon)
                                 .Select(p => (uint)p.InteriorRings.Length + 1);
                go.ringCountsOffset = Geometry.CreateRingCountsVector(builder, ringCounts.ToArray());
            }

            return(go);
        }