Creating a Geometry
In JADE .NET, there are several ways to create a JoobGeometry object, by using the:
-
JoobGeometry constructor to accept a string encoded in the WKT (Well Known Text) format
-
JoobGeometry constructor to accept a byte array encoded in the WKB (Well Known Binary) format
-
JoobGeometryBuilder class
Creating a geometry using WKT or WKB is quite straightforward — all you need to do is to supply a valid WKT string or a WKB byte array to a JoobGeometry constructor; for example:
public void CreateRing() { var wkt = "LineString (10 20, 30 15, 20 15, 10 10, 10 20)"; using (var geom = new JoobGeometry(wkt)) { ... } }
If an invalid WKT or WKB is provided, a JoobSpatialException is thrown. For details about the WKT and WKB formats, see the OGC specification Simple feature access - Part 1: Common. Geometry data do not always present themselves in WKT or WKB formats; instead, they may come with a series of coordinates. In this circumstance, you can use JoobGeometryBuilder to create a geometry one point at a time. The following are two examples of using JoobGeometryBuilder: the first creates a simple line string starting from the coordinate (10, 40) to the coordinate (30, 50), and the second creates a polygon with one interior ring.
public JoobGeometry CreateLineString() { var builder = new JoobGeometryBuilder(); builder.BeginGeometry(GeometryType.LineString); builder.BeginFigure(10, 40); builder.AddLine(30, 50); builder.EndFigure(); builder.EndGeometry(); return builder.GetConstructedGeometry(ClassPersistence.Persistent); } public JoobGeometry CreatePolygonWithOneInteriorRing() { var builder = new JoobGeometryBuilder(); builder.BeginGeometry(GeometryType.Polygon); builder.BeginFigure(1, 2); builder.AddLine(3, 4); builder.AddLine(4, 1); builder.AddLine(1, 2); builder.EndFigure(); builder.BeginFigure(2, 2); builder.AddLine(3, 3); builder.AddLine(3, 2); builder.AddLine(2, 2); builder.EndFigure(); builder.EndGeometry(); return builder.GetConstructedGeometry(ClassPersistence.Persistent); }
It is important to note that there is a finite-state machine embedded in JoobGeometryBuilder to ensure that a JoobGeometry can be built only if valid call sequences are issued. For example, calling BeginFigure without first calling BeginGeometry or when creating a polygon by calling EndFigure without issuing at least three calls to AddLine violate the state machine and result in an exception.
You can also use the JoobGeometryBuilder to create composite geometries such as MultiPoint and MultiLineString, or even nested composite geometries; for example, one GeometryCollection nested inside another GeometryCollection, as shown in the following example.
public JoobGeometry CreateNestedGeometryCollection() { var builder = new JoobGeometryBuilder(); builder.BeginGeometry(GeometryType.GeometryCollection); { builder.BeginGeometry(GeometryType.Point); builder.BeginFigure(1, 2); builder.EndFigure(); builder.EndGeometry(); builder.BeginGeometry(GeometryType.GeometryCollection); { builder.BeginGeometry(GeometryType.Polygon); builder.BeginFigure(1, 2); builder.AddLine(3, 4); builder.AddLine(4, 1); builder.AddLine(1, 2); builder.EndFigure(); builder.EndGeometry(); builder.BeginGeometry(GeometryType.LinearRing); builder.BeginFigure(2, 8); builder.AddLine(4, 2); builder.AddLine(4, 7); builder.AddLine(2, 8); builder.EndFigure(); builder.EndGeometry(); builder.BeginGeometry(GeometryType.MultiPolygon); { builder.BeginGeometry(GeometryType.Polygon); builder.BeginFigure(1, 2); builder.AddLine(3, 4); builder.AddLine(4, 1); builder.AddLine(1, 2); builder.EndFigure(); builder.EndGeometry(); builder.BeginGeometry(GeometryType.Polygon); builder.BeginFigure(2, 8); builder.AddLine(4, 2); builder.AddLine(4, 7); builder.AddLine(5, 10); builder.AddLine(2, 8); builder.EndFigure(); builder.EndGeometry(); } builder.EndGeometry(); } builder.EndGeometry(); } builder.EndGeometry(); return builder.GetConstructedGeometry(ClassPersistence.Persistent); }