Skip to content

Commit f150f9e

Browse files
committed
Implemented more spatial methods; fixed XML documentation
1 parent 8f7801f commit f150f9e

11 files changed

+1014
-27
lines changed

LinqToDBPostGisNetTopologySuite.Tests/GeometryAccessorsTests.cs

Lines changed: 204 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,94 @@ public void Setup()
2121
}
2222

2323
[Test]
24-
public void TestSTArea()
24+
public void TestGeometryType()
2525
{
26-
// https://postgis.net/docs/manual-3.0/ST_Envelope.html
26+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
27+
{
28+
// TODO: shared method
29+
const string wkt = "LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)";
30+
db.Insert(new TestGeometryEntity(1, null));
31+
var geometry = db.TestGeometries.Select(g => GeometryInput.STGeomFromText(wkt)).Single();
32+
db.Update(new TestGeometryEntity(1, geometry));
33+
34+
Assert.AreEqual("LINESTRING", db.TestGeometries.Select(g => g.Geometry.GeometryType()).Single());
35+
}
36+
}
2737

38+
[Test]
39+
public void TestSTBoundary()
40+
{
2841
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
2942
{
43+
// TODO: shared method
44+
const string wkt1 = "LINESTRING(100 150,50 60, 70 80, 160 170)";
45+
db.Insert(new TestGeometryEntity(1, null));
46+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
47+
db.Update(new TestGeometryEntity(1, geometry1));
48+
49+
const string wkt2 = "POLYGON (( 10 130, 50 190, 110 190, 140 150, 150 80, 100 10, 20 40, 10 130), (70 40, 100 50, 120 80, 80 110, 50 90, 70 40))";
50+
db.Insert(new TestGeometryEntity(2, null));
51+
var geometry2 = db.TestGeometries.Where(g => g.Id == 2).Select(g => GeometryInput.STGeomFromText(wkt2)).Single();
52+
db.Update(new TestGeometryEntity(2, geometry2));
53+
54+
var boundary1 = db.TestGeometries
55+
.Where(g => g.Id == 1)
56+
.Select(g => g.Geometry.STBoundary().STAsText())
57+
.Single();
58+
Assert.AreEqual("MULTIPOINT(100 150,160 170)", boundary1);
59+
60+
var boundary2 = db.TestGeometries
61+
.Where(g => g.Id == 2)
62+
.Select(g => g.Geometry.STBoundary().STAsText())
63+
.Single();
64+
Assert.AreEqual("MULTILINESTRING((10 130,50 190,110 190,140 150,150 80,100 10,20 40,10 130),(70 40,100 50,120 80,80 110,50 90,70 40))", boundary2);
65+
}
66+
}
67+
68+
[Test]
69+
public void TestSTDimension()
70+
{
71+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
72+
{
73+
// TODO: shared method
74+
const string wkt = "GEOMETRYCOLLECTION(LINESTRING(1 1,0 0),POINT(0 0))";
75+
db.Insert(new TestGeometryEntity(1, null));
76+
var geometry = db.TestGeometries.Select(g => GeometryInput.STGeomFromText(wkt)).Single();
77+
db.Update(new TestGeometryEntity(1, geometry));
78+
79+
var dimension = db.TestGeometries
80+
.Select(g => g.Geometry.STDimension())
81+
.Single();
82+
83+
Assert.AreEqual(1, dimension);
84+
}
85+
}
86+
87+
[Test]
88+
public void TestSTEndPoint()
89+
{
90+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
91+
{
92+
// TODO: shared method
93+
const string wkt = "LINESTRING(1 1, 2 2, 3 3)";
94+
db.Insert(new TestGeometryEntity(1, null));
95+
var geometry = db.TestGeometries.Select(g => GeometryInput.STGeomFromText(wkt)).Single();
96+
db.Update(new TestGeometryEntity(1, geometry));
97+
98+
var endPoint = db.TestGeometries
99+
.Select(g => g.Geometry.STEndPoint().STAsText())
100+
.Single();
101+
102+
Assert.AreEqual("POINT(3 3)", endPoint);
103+
}
104+
}
105+
106+
[Test]
107+
public void TestSTEnvelope()
108+
{
109+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
110+
{
111+
// TODO: shared method
30112
const string wkt = "LINESTRING(0 0, 1 3)";
31113
db.Insert(new TestGeometryEntity(1, null));
32114
var geometry = db.TestGeometries.Select(g => GeometryInput.STGeomFromText(wkt)).Single();
@@ -39,5 +121,125 @@ public void TestSTArea()
39121
Assert.AreEqual("POLYGON((0 0,0 3,1 3,1 0,0 0))", envelope);
40122
}
41123
}
124+
125+
[Test]
126+
public void TestSTIsEmpty()
127+
{
128+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
129+
{
130+
// TODO: shared method
131+
const string wkt1 = "GEOMETRYCOLLECTION EMPTY";
132+
db.Insert(new TestGeometryEntity(1, null));
133+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
134+
db.Update(new TestGeometryEntity(1, geometry1));
135+
136+
const string wkt2 = "POLYGON((1 2, 3 4, 5 6, 1 2))";
137+
db.Insert(new TestGeometryEntity(2, null));
138+
var geometry2 = db.TestGeometries.Where(g => g.Id == 2).Select(g => GeometryInput.STGeomFromText(wkt2)).Single();
139+
db.Update(new TestGeometryEntity(2, geometry2));
140+
141+
db.Insert(new TestGeometryEntity(3, null));
142+
143+
Assert.IsTrue(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STIsEmpty()).Single());
144+
Assert.IsFalse(db.TestGeometries.Where(g => g.Id == 2).Select(g => g.Geometry.STIsEmpty()).Single());
145+
Assert.IsNull(db.TestGeometries.Where(g => g.Id == 3).Select(g => g.Geometry.STIsEmpty()).Single());
146+
}
147+
}
148+
149+
[Test]
150+
public void TestSTIsValid()
151+
{
152+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
153+
{
154+
// TODO: shared method
155+
const string wkt1 = "LINESTRING(0 0, 1 1)";
156+
db.Insert(new TestGeometryEntity(1, null));
157+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
158+
db.Update(new TestGeometryEntity(1, geometry1));
159+
160+
const string wkt2 = "POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))";
161+
db.Insert(new TestGeometryEntity(2, null));
162+
var geometry2 = db.TestGeometries.Where(g => g.Id == 2).Select(g => GeometryInput.STGeomFromText(wkt2)).Single();
163+
db.Update(new TestGeometryEntity(2, geometry2));
164+
165+
Assert.IsTrue(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STIsValid()).Single());
166+
Assert.IsFalse(db.TestGeometries.Where(g => g.Id == 2).Select(g => g.Geometry.STIsValid()).Single());
167+
}
168+
}
169+
170+
[Test]
171+
public void TestSTNumGeometries()
172+
{
173+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
174+
{
175+
// TODO: shared method
176+
const string wkt1 = "LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)";
177+
db.Insert(new TestGeometryEntity(1, null));
178+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
179+
db.Update(new TestGeometryEntity(1, geometry1));
180+
181+
const string wkt2 = "GEOMETRYCOLLECTION(MULTIPOINT(-2 3 , -2 2), LINESTRING(5 5, 10 10), POLYGON((-7 4.2, -7.1 5, -7.1 4.3, -7 4.2)))";
182+
db.Insert(new TestGeometryEntity(2, null));
183+
var geometry2 = db.TestGeometries.Where(g => g.Id == 2).Select(g => GeometryInput.STGeomFromText(wkt2)).Single();
184+
db.Update(new TestGeometryEntity(2, geometry2));
185+
186+
var num1 = db.TestGeometries
187+
.Where(g => g.Id == 1)
188+
.Select(g => g.Geometry.STNumGeometries())
189+
.Single();
190+
Assert.AreEqual(1, num1);
191+
192+
var num2 = db.TestGeometries
193+
.Where(g => g.Id == 2)
194+
.Select(g => g.Geometry.STNumGeometries())
195+
.Single();
196+
Assert.AreEqual(3, num2);
197+
}
198+
}
199+
200+
[Test]
201+
public void TestSTNumPoints()
202+
{
203+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
204+
{
205+
// TODO: shared method
206+
const string wkt = "LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)";
207+
db.Insert(new TestGeometryEntity(1, null));
208+
var geometry = db.TestGeometries.Select(g => GeometryInput.STGeomFromText(wkt)).Single();
209+
db.Update(new TestGeometryEntity(1, geometry));
210+
211+
Assert.AreEqual(4, db.TestGeometries.Select(g => g.Geometry.STNumPoints()).Single());
212+
}
213+
}
214+
215+
[Test]
216+
public void TestSTXYZM()
217+
{
218+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
219+
{
220+
// TODO: shared method
221+
const string wkt1 = "POINT(1 2 3 4)";
222+
db.Insert(new TestGeometryEntity(1, null));
223+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
224+
db.Update(new TestGeometryEntity(1, geometry1));
225+
226+
const string wkt2 = "POINT(1 2)";
227+
db.Insert(new TestGeometryEntity(2, null));
228+
var geometry2 = db.TestGeometries.Where(g => g.Id == 2).Select(g => GeometryInput.STGeomFromText(wkt2)).Single();
229+
db.Update(new TestGeometryEntity(2, geometry2));
230+
231+
var query1 = db.TestGeometries.Where(g => g.Id == 1);
232+
Assert.AreEqual(1, query1.Select(g => g.Geometry.STX()).Single());
233+
Assert.AreEqual(2, query1.Select(g => g.Geometry.STY()).Single());
234+
Assert.AreEqual(3, query1.Select(g => g.Geometry.STZ()).Single());
235+
Assert.AreEqual(4, query1.Select(g => g.Geometry.STM()).Single());
236+
237+
var query2 = db.TestGeometries.Where(g => g.Id == 2);
238+
Assert.AreEqual(1, query2.Select(g => g.Geometry.STX()).Single());
239+
Assert.AreEqual(2, query2.Select(g => g.Geometry.STY()).Single());
240+
Assert.IsNull(query2.Select(g => g.Geometry.STZ()).Single());
241+
Assert.IsNull(query2.Select(g => g.Geometry.STM()).Single());
242+
}
243+
}
42244
}
43245
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
using System.Linq;
2+
3+
using LinqToDB;
4+
using NUnit.Framework;
5+
using NTSG = NetTopologySuite.Geometries;
6+
7+
using LinqToDBPostGisNetTopologySuite.Tests.Entities;
8+
9+
namespace LinqToDBPostGisNetTopologySuite.Tests
10+
{
11+
[TestFixture]
12+
class GeometryProcessingTests : TestsBase
13+
{
14+
[SetUp]
15+
public void Setup()
16+
{
17+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
18+
{
19+
db.TestGeometries.Delete();
20+
}
21+
}
22+
23+
[Test]
24+
public void TestSTCentroid()
25+
{
26+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
27+
{
28+
const string wkt1 = "MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )";
29+
db.Insert(new TestGeometryEntity(1, null));
30+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
31+
db.Update(new TestGeometryEntity(1, geometry1));
32+
33+
var centroid1 = db.TestGeometries
34+
.Where(g => g.Id == 1)
35+
.Select(g => g.Geometry.STCentroid())
36+
.Single() as NTSG.Point;
37+
38+
Assert.AreEqual(2.30769230769231, centroid1.X, 1.0E-12);
39+
Assert.AreEqual(3.30769230769231, centroid1.Y, 1.0E-12);
40+
}
41+
}
42+
43+
[Test]
44+
public void TestSTConvexHull()
45+
{
46+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
47+
{
48+
const string wkt1 = "GEOMETRYCOLLECTION( MULTILINESTRING((100 190,10 8),(150 10, 20 30)), MULTIPOINT(50 5, 150 30, 50 10, 10 10) )";
49+
db.Insert(new TestGeometryEntity(1, null));
50+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
51+
db.Update(new TestGeometryEntity(1, geometry1));
52+
53+
var convexHull1 = db.TestGeometries
54+
.Where(g => g.Id == 1)
55+
.Select(g => g.Geometry.STConvexHull().STAsText())
56+
.Single();
57+
58+
Assert.AreEqual("POLYGON((50 5,10 8,10 10,100 190,150 30,150 10,50 5))", convexHull1);
59+
}
60+
}
61+
62+
[Test]
63+
public void TestSTDifference()
64+
{
65+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
66+
{
67+
// TODO: shared method
68+
const string wkt1 = "LINESTRING(50 100, 50 200)";
69+
db.Insert(new TestGeometryEntity(1, null));
70+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
71+
db.Update(new TestGeometryEntity(1, geometry1));
72+
73+
const string wkt2 = "LINESTRING(50 50, 50 150)";
74+
db.Insert(new TestGeometryEntity(2, null));
75+
var geometry2 = db.TestGeometries.Where(g => g.Id == 2).Select(g => GeometryInput.STGeomFromText(wkt2)).Single();
76+
db.Update(new TestGeometryEntity(2, geometry2));
77+
78+
79+
var difference = db.TestGeometries
80+
.Where(g => g.Id == 1)
81+
.Select(g => g.Geometry.STDifference(geometry2).STAsText())
82+
.Single();
83+
84+
Assert.AreEqual("LINESTRING(50 150,50 200)", difference);
85+
}
86+
}
87+
88+
89+
[Test]
90+
public void TestSTUnion()
91+
{
92+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
93+
{
94+
// TODO: shared method
95+
const string wkt1 = "POINT(1 2)";
96+
db.Insert(new TestGeometryEntity(1, null));
97+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
98+
db.Update(new TestGeometryEntity(1, geometry1));
99+
100+
const string wkt2 = "POINT(-2 3)";
101+
db.Insert(new TestGeometryEntity(2, null));
102+
var geometry2 = db.TestGeometries.Where(g => g.Id == 2).Select(g => GeometryInput.STGeomFromText(wkt2)).Single();
103+
db.Update(new TestGeometryEntity(2, geometry2));
104+
105+
var union = db.TestGeometries
106+
.Where(g => g.Id == 1)
107+
.Select(g => g.Geometry.STUnion(geometry2).STAsText())
108+
.Single();
109+
110+
Assert.AreEqual("MULTIPOINT(1 2,-2 3)", union);
111+
}
112+
}
113+
}
114+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Linq;
2+
3+
using LinqToDB;
4+
using NUnit.Framework;
5+
using NTSG = NetTopologySuite.Geometries;
6+
7+
using LinqToDBPostGisNetTopologySuite.Tests.Entities;
8+
9+
namespace LinqToDBPostGisNetTopologySuite.Tests
10+
{
11+
[TestFixture]
12+
class GeometryValidationTests : TestsBase
13+
{
14+
[SetUp]
15+
public void Setup()
16+
{
17+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
18+
{
19+
db.TestGeometries.Delete();
20+
}
21+
}
22+
23+
[Test]
24+
public void TestSTIsValid()
25+
{
26+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
27+
{
28+
// TODO: shared method
29+
const string wkt1 = "LINESTRING(0 0, 1 1)";
30+
db.Insert(new TestGeometryEntity(1, null));
31+
var geometry1 = db.TestGeometries.Where(g => g.Id == 1).Select(g => GeometryInput.STGeomFromText(wkt1)).Single();
32+
db.Update(new TestGeometryEntity(1, geometry1));
33+
34+
const string wkt2 = "POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))";
35+
db.Insert(new TestGeometryEntity(2, null));
36+
var geometry2 = db.TestGeometries.Where(g => g.Id == 2).Select(g => GeometryInput.STGeomFromText(wkt2)).Single();
37+
db.Update(new TestGeometryEntity(2, geometry2));
38+
39+
Assert.IsTrue(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STIsValid()).Single());
40+
Assert.IsFalse(db.TestGeometries.Where(g => g.Id == 2).Select(g => g.Geometry.STIsValid()).Single());
41+
}
42+
}
43+
}
44+
}

0 commit comments

Comments
 (0)