private static void _PopulateSimpleType(IGeometrySink sink, FGeometry.IGeometry geometry) { sink.BeginGeometry(GeometryTypeUtils.Convert(geometry.DerivedType)); switch (geometry.DerivedType) { case FCommon.GeometryType.GeometryType_LineString: using (FGeometry.DirectPositionCollection positions = ((FGeometry.ILineString)geometry).Positions) CreateFigure(sink, positions); break; case FCommon.GeometryType.GeometryType_Point: using (FGeometry.DirectPositionCollection positions = new FGeometry.DirectPositionCollection()) using (FGeometry.IDirectPosition dp = ((FGeometry.IPoint)geometry).Position) { positions.Add(dp); CreateFigure(sink, positions); } break; case FCommon.GeometryType.GeometryType_Polygon: { var polygon = (FGeometry.IPolygon)geometry; using (FGeometry.ILinearRing exterior = polygon.ExteriorRing) using (FGeometry.DirectPositionCollection positions = exterior.Positions) CreateFigure(sink, positions); for (int i = 0; i < polygon.InteriorRingCount; ++i) { using (FGeometry.ILinearRing interior = polygon.GetInteriorRing(i)) using (FGeometry.DirectPositionCollection positions = interior.Positions) CreateFigure(sink, positions); } } break; default: throw new NotSupportedException( string.Format( CultureInfo.CurrentCulture, SR.UnsupportedGeometryTypeException, geometry.DerivedType ) ); } sink.EndGeometry(); }
private static void CreateFigure(IGeometrySink sink, FGeometry.DirectPositionCollection positions) { if ((positions == null) || (positions.Count == 0)) { return; } using (FGeometry.IDirectPosition p0 = positions[0]) { if (p0.Dimensionality > 2) { sink.BeginFigure(p0.X, p0.Y, p0.Z); } else { sink.BeginFigure(p0.X, p0.Y, null); } } for (int i = 1; i < positions.Count; ++i) { using (FGeometry.IDirectPosition pi = positions[i]) { if (pi.Dimensionality > 2) { sink.AddLine(pi.X, pi.Y, pi.Z); } else { sink.AddLine(pi.X, pi.Y, null); } } } sink.EndFigure(); }