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); }
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); }