using Aspose.Gis.Geometries; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Geo.Viewer.WPF { internal class GeometryProvider { /// /// Returns a geometry object of a single point made using preset values /// public IGeometry PrimitivePoint() { return Aspose.Gis.Geometries.Geometry.FromText("POINT(30 10)"); } /// /// Returns a geometry object of Linestring type made with a WKT string using preset values /// public IGeometry PrimitiveLinestring() { return Aspose.Gis.Geometries.Geometry.FromText("LINESTRING(30 10, 10 30, 40 40)"); } /// /// Returns a geometry object of Polygon type made with a WKT string using preset values /// public IGeometry PrimitivePolygon() { return Aspose.Gis.Geometries.Geometry.FromText("POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))"); } /// /// Returns a geometry object of the Polygon type with an inner circle made using preset values /// public IGeometry PrimitivePolygonWithHole() { return Aspose.Gis.Geometries.Geometry.FromText("POLYGON((35 10, 45 45, 15 40, 10 20, 35 10),(20 30, 35 35, 30 20, 20 30))"); } /// /// Returns a geometry object of multipul point made using preset values /// public IGeometry PrimitiveMultiPoint() { return Aspose.Gis.Geometries.Geometry.FromText("MULTIPOINT((10 40), (40 30), (20 20), (30 10))"); } /// /// Returns a geometry object of Linestring multitype made with a WKT string using preset values /// public IGeometry PrimitiveMultiLineString() { return Aspose.Gis.Geometries.Geometry.FromText("MULTILINESTRING((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))"); } /// /// Returns a geometry object of Polygon multitype made with a WKT string using preset values /// public IGeometry PrimitiveMultiPolygon() { return Aspose.Gis.Geometries.Geometry.FromText("MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))"); } /// /// Returns a geometry object of the Polygon multitype with an inner circle made using preset values /// public IGeometry PrimitiveMultiPolygonWithHole() { return Aspose.Gis.Geometries.Geometry.FromText("MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),((20 35, 10 30, 10 10, 30 5, 45 20, 20 35),(30 20, 20 15, 20 25, 30 20)))"); } /// /// Returns a geometry object of Polygon type made with a WKT string, formed according to the given parameters /// public IGeometry CreatePolygon(double length, double width) { //feature.Geometry = Geometry.FromText("POLYGON((0 0, 35 50, 70 0, 35 -50, 0 0))"); return Geometry.FromText(string.Format("POLYGON((0 0, {0} {1}, {2} 0, {0} {3}, 0 0))", Math.Round(length / 2), Math.Round(width / 2), length, -Math.Round(width / 2))); } /// /// Returns a geometry object of the Polygon type with an inner circle located at the "offset" value from the border /// public IGeometry CreatePolygonWithHole(double length, double width, double offset) { Polygon polygon = new Polygon(); LinearRing ring = new LinearRing(); ring.AddPoint(0, 0); ring.AddPoint(length / 2, width / 2); ring.AddPoint(length, 0); ring.AddPoint(length / 2, -width / 2); ring.AddPoint(0, 0); LinearRing hole = new LinearRing(); hole.AddPoint(offset, 0); hole.AddPoint(length / 2, width / 2 - offset); hole.AddPoint(length - offset, 0); hole.AddPoint(length / 2, -width / 2 + offset); hole.AddPoint(offset, 0); polygon.ExteriorRing = ring; polygon.AddInteriorRing(hole); return polygon; } /// /// Returns a geometry object of Polygon type formed as a diamond with one side missing as others equal to the passed parameters /// public IGeometry CreateUnclosedPolygon(double length, double width) { Polygon polygon = new Polygon(); LinearRing ring = new LinearRing(); ring.AddPoint(0, 0); ring.AddPoint(length / 2, width / 2); ring.AddPoint(length, 0); ring.AddPoint(length / 2, -width / 2); polygon.ExteriorRing = ring; return polygon; } /// /// Returns a geometry object of Polygon type formed as a hexagon with a side length equal to the passed value /// public IGeometry CreateHexagon(double length) { var hexagon = new Polygon(); LinearRing ring = new LinearRing(); var count = 8; for (int i = 0; i < count - 2; i++) { var angle = 2 * Math.PI * i / count; double y = length * Math.Sin(angle); double x = length * Math.Cos(angle); ring.AddPoint(x, y); } ring.AddPoint(length * Math.Cos(30 * (Math.PI / 180)), length * Math.Sin(30 * (Math.PI / 180))); hexagon.ExteriorRing = ring; return hexagon; } /// /// Returns a geometry object of Polygon type formed as a hexagon with one side missing as others equal to the passed value /// public IGeometry CreateUnclosedHexagon(double length) { var hexagon = new Polygon(); LinearRing ring = new LinearRing(); var count = 8; for (int i = 0; i < count - 2; i++) { var angle = 2 * Math.PI * i / count; double y = length * Math.Sin(angle); double x = length * Math.Cos(angle); ring.AddPoint(x, y); } hexagon.ExteriorRing = ring; return hexagon; } /// /// Returns a geometry object of a single point made using given coordinates and M value /// public IGeometry CreatePoint(double x, double y, double M = 40.3) { Point point = new Point(x, y) { M = M }; return point; } /// /// Returns a geometry object of CircularString type made using points, formed according to the given parameters /// public IGeometry CreateCircularString(double radius) { var circularString = new CircularString(); circularString.AddPoint(0, 0); circularString.AddPoint(radius, radius); circularString.AddPoint(radius * 2, 0); circularString.AddPoint(radius, -radius); circularString.AddPoint(0, 0); //return Aspose.Gis.Geometries.Geometry.FromText(string.Format("CIRCULARSTRING((0 0, {0} {0}, {1} 0, {0} {2}, 0 0))", radius, radius * 2, -radius)); return circularString; } /// /// Returns a geometry object of LineString type being a line, connecting a given List of Points /// public IGeometry CreatePolyline(string coordinates) { List points = CreateListOfPoints(coordinates); LineString line = new LineString(); foreach (var point in points) line.AddPoint(point); return line; } /// /// Forms a List of points using the correctly formatted string /// formating example: /// 0; 0, 30; 45, 30; 45, 60; 0, 60.001; 0.001, 60.001; 0, 60; 0.001, 90; 45 /// General form: /// x; y, x1; y2,... xn; yn /// private List CreateListOfPoints(string coordinates) { var points = new List(); foreach (var sub in coordinates.Split(',')) { string[] items = sub.Split(','); try { points.Add((Point)CreatePoint(double.Parse(items[0]), double.Parse(items[1]))); } catch (Exception ex) { Console.WriteLine(ex.Message + items.ToString()); } } return points; } } }